2013-02-22 80 views
0

多年來,我一直在寫一個辦公室管理應用程序(在和關閉)。我需要重寫它,因爲代碼已經變得無法維護,所以我會選擇一個PHP框架並將業務邏輯重寫爲類。php:程序對象 - 結構?

現在我陷入了這個基本問題:我是否仍然需要返回結果,如果是,我該如何捕獲結果?一些僞作清楚我的問題:

function a($1, $2, $3) { 
doThis(if ... return TRUE; if ... return FALSE;); 
if (doThis() != TRUE) { return; } 
doThat(); 
} 

VS

class example { 
private $1; 
private $2; 
private $3; 
public function go() { $this->doThis(); $this->doThat(); } 
private function doThis(){} 
private function doThat(){} 
} 
$a = new example; 
$a->go(); 

如何停止的旅途()的執行 - 如果方法doThis() - 方法不能按預期執行?我認爲如果某個屬性設置爲false,我不應該返回布爾值並檢查每個方法的內部嗎?或者,如果出現問題,我只是簡單地拋出異常,如果一切正常,什麼都不做?我知道...

Thx!

+0

這不能用一個真實的例子來回答。你應該只拋出異常錯誤。 – PeeHaa 2013-02-22 10:48:14

回答

1

例外情況是exceptional behaviour,所以不要因爲您的代碼不處於首選狀態而拋出異常。當談到編寫面向對象編程時,有些人仍然使用面向對象的框架來編寫程序,顯然你想避免這種情況,簡單的經驗法則是不寫God-objects

現在我猜你想要做的是調用兩個函數,應該以特定的順序調用,有幾種方法可以做到這一點,它實際上歸結爲,什麼樣的類你有。比方說,你有型Person的對象,那麼你可能想打電話從別的地方上的人不同的方法:

$john = new Person(); 
$john->tryToWakeUp(); 
if($john->isAwake) { 
    $john->brushTeeth(); 
} else { 
    echo "John is still sleeping!"; 
} 

在另一方面,你可能有這可能會想要做的類型Engine的對象幾個東西在內部進行某些動作,比如開始:

class Engine { 
    public function start() { 
     $this->checkFuel(); 
     if($this->hasFuel()) { 
      try { 
        $this->initializeSomethingThatHasToDoWithEngineStartUp();     
      } catch (EngineException $ee) { 
        $this->engineState = BAD_ENGINE; 
        Logger::log("Engine did not start"); 
      } 
     } 
    } 
} 

我建議你對面向對象的設計念起來擺弄它,你嘗試把所有的業務規則之前,因爲這有可能是一半通過你的方式會意識到你設計的一切都是錯誤的。面向對象的設計並不容易,但它確實有意義編輯:(它應該是有意義的

+0

THX - 我確實指的是「引擎」類型的對象。難道在你的例子中'hasFuel'應該是一個屬性而不是一個方法嗎?如果checkFuel方法最終將hasFuel屬性設置爲TRUE或FALSE,那對我來說是有意義的。 – zenlord 2013-02-22 12:25:39

+0

它可能或者它也可能是引擎檢查坦克'有燃料'。這取決於你的設計。 :) – 2013-02-22 12:35:49

0

那麼最常見的就是回報。

class example { 
    private $1; 
    private $2; 
    private $3; 
    public function go() { 
     $this->doThis() 
     return; // stops current method. doThat is not fired now 
     $this->doThat(); 
    } 
    private function doThis(){} 
    private function doThat(){} 
} 
$a = new example; 
$a->go(); 
+0

是的,但決定是否應該停止方法'go()'取決於doThis()的結果。在執行doThat()之前,設置doThis()中的私有屬性並檢查是否設置了該屬性... – zenlord 2013-02-22 12:35:12