2011-01-22 11 views
0

私は、PHPのページをリファクタリングして、将来的に拡張と保守をやや簡単にし、かなり単純な問題に取り掛かりました。リファクタリングされたPHPコードで実行を停止しますか?

私は(3

largemethodに一つの方法を分割しているが)このようなものになっています:

nowsmallmethod(){ 
    doSomeChecks(); 
    assignProduct(); 
    giveFeedbacktoUser(); 
} 

これは、すべて良いですが、よく、私が午前問題はdoSomeChecks(です) ;

doSomeChecks(){ 
if(something that shouldnt be true is true){ 
    return Controller->redirectBk(); 
} 
} 

問題の核心は、nowsmallmethod()が完了したときにコントローラ-redirectBkが最初にリダイレクトすることです。つまり、テストに失敗した場合でもユーザーに製品が割り当てられます。私はSilverstripeと呼ばれるPHPフレームワークを使用しているので、Controller-> redirectBk()の動作を実際に変更することはできません。私が自分のメソッドでチェックをしなかったなら、 "return Controller-> redirectBk();"実行を停止してリダイレクトします。 テストが失敗したときにnowsmallmethod()で実行を停止する最良の方法は?私はエラーのステータスコードを返すことができ、実行を停止することができたが、それは醜い方法と思われる。よりエレガントな方法はありませんか?もう一つのオプションはdoSomeChecks()、return(return $ controller-> redirectBk())でこれを返すことができますが、これは有効なPHP構文ではなく、特に読みにくいものではありません。どんな助けでも大変に感謝します。

週末をお楽しみください! 乾杯 ニック

答えて

1
nowsmallmethod() { 
    if (doSomeChecks()) { 
    assignProduct(); 
    giveFeedbacktoUser(); 
    } 
} 

そしてdoSomeChecksいずれかのリダイレクトが起こるかないでしょうかどうかに基づいて、trueまたはfalseを返します。

また、dieまたはthrowとすることもできますが、あなたの場合は通常の条件がより適切であると想定しています。そのような状況に対処するために

+0

これは実際には機能的にはエラーコードを返すことと同じです。私はちょうど良い方法があるかもしれないと思ったが、そうでないかもしれない。この場合、失敗したテストは$ controller-> redirectBk()を設定し、falseを返す必要があります。あなたの提案を歓迎する – Nick

1

使用例外:

<?php 
try { 
    // some code 
    if (!$check) { 
     throw new Exception('Check has failed!'); 
    } 
    // code after 'throw' will not be executed 
} 
catch(Exception $e) { 
    //this is executed when exception is caught 
} 
?> 

例外が子法にスローされた場合、スタックは戻って非常に最初のtry/catchブロックにロールバックされます。 http://php.net/manual/en/language.exceptions.php

また、トランザクションのメカニズムと例外を組み合わせて、データベースの整合性を処理することもできます。

+0

例外は、リソースを取得しようとする場所などの異常な状況に対するものです。私はこれが当てはまるとは思わない。 – smentek

+0

ご意見ありがとうございました。いくつかの例外チェック、セキュリティテストなどがありますが、大半はユーザーフィードバックのセッションメッセージを設定し、そのメッセージを単にユーザーに返します。彼らは例外にはあまり適していません。 – Nick

関連する問題