0

何年もの間、私はオフィス管理アプリで(オンとオフを問わず)書いています。コードが保守できなくなったので書き直す必要があるため、PHP フレームワークを選択し、ビジネス ロジックをクラスに書き直します。

今、私はこの基本的な質問に行き詰まっています:結果を返す必要がありますか?もしそうなら、どうすればその結果を取得できますか? 私の質問を明確にするためのいくつかの疑似コード:

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

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() メソッドが期待どおりに実行されない場合、どうすれば go() メソッドの実行を停止できますか? 特定のプロパティがfalseに設定されている場合、ブール値を返してすべてのメソッド内をチェックするべきではないと思いますか? それとも、何か問題が発生した場合に単に例外をスローし、すべてが問題ない場合は何もしませんか?

これはかなり基本的なことです...

どうも!

4

1 に答える 1

1

例外は のためexceptional behaviourのものなので、コードが好ましい状態にないという理由だけで例外をスローしないでください。OOP の作成に関しては、オブジェクト指向フレームワークを使用しながら手続き型を作成できる人もいますが、これは明らかに避けたいことです。単純な経験則は、God-objectsを作成しないことです。

今私が推測しているのは、特定の順序で呼び出す必要がある 2 つの関数を呼び出すことです。これを行うにはいくつかの方法があり、実際には、どのような種類のクラスがあるかということになります。次のタイプのオブジェクトがあるとします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");
            }
        }
    }
}

すべてのビジネス ルールを変換しようとする前に、オブジェクト指向設計について調べて、いろいろと試してみることをお勧めします。オブジェクト指向設計は簡単ではありませんが、理にかなっていますEDIT:(理にかなっているはずです)

于 2013-02-22T10:28:29.557 に答える