8

クラスが実装するインターフェイスに基づいてロジックを実行した場所がいくつかあります。これが間違っている場合とそうでない場合がある理由はありますか?(汚れた感じ)

これを行う理由は、これらを決定するためにクラスのプロパティやメソッドを追加する必要がないためです。基本的に、クラス定義では、実行できることと実行できないことを明示的に記述できます。

1つのユースケースはajax呼び出しであり、ログインが必要なものとそうでないものがあります。

class ajax_ads extends ajax_controller implements no_login {

}

また、インターフェースにはメソッドがなく、この目的で使用されます。

interface no_login {}

次に、ベースコントローラーで:

$controller = controller::factory()
if( !($controller instanceof no_login) && !$controller->LoggedIn()){
    return $controller->redirect(/*login page*/); 
}

instance_ofは軽量で使いやすいようで、問題なく動作しますが、インターフェイスの目的を完全に悪用しているように感じます。

だから私は尋ねます、ロジックを決定するためにインターフェースを使用しているのは悪い考え、悪いおっと、または「大丈夫」ですか?

4

3 に答える 3

8

When you need an if or a switch to determine the state an object should be, it's usually a good sign you are in need of polymorphism.

In your case, there should be one abstract class: Ajax_Ads, and two extending classes: No_Login_Ajax_Ads extends Ajax_Ads, and Login_Ajax_Ads extends Ajax_Ads. And you instantiate the one you require based on the state of the program, this could be done with a factory.

For more information, watch the following lecture: The Clean Code Talks -- Inheritance, Polymorphism, & Testing

于 2012-10-12T22:10:33.733 に答える
0

マイナス面はわかりませんが、インターフェース構文の誤用のように感じます。ajax_ads で単純なメソッドを実装してみませんか。

class ajax_ads
{
    ...
    public function requiresLogin() { return false; }
}

そして交換

if ($controller instanceof no_login) ...

if (!$controller->requiresLogin()) ...

このアプローチは、 traitとほぼ同じ簡潔さに短縮できます。

于 2012-10-12T22:12:22.127 に答える