2つのコントローラー間で共有する必要のあるロジックがある場合、どこに保持しますか?


10

2つの別々のコントローラーで必要な単一目的機能のセットがあります。現在、重複したコードがあり、それを取り除きたいと思っています。このコードはコントローラーの一部であり、私のサービスレイヤーには属していません。どこに置きますか?


CakePHPはそれらをコンポーネントと呼びます:book.cakephp.org/2.0/en/controllers/components.html多分それはいくつかのインスピレーションです
Luc Franken

回答:


12

あなたはそれがあなたが共有しているのがどんな種類の論理であるかについては言いませんでした。つまり、このコントローラロジックまたはヘルパー関数ですか?オブジェクト指向言語でこれに対処する2つの方法は、継承と構成です。2つのコントローラー間で共有アクションがある場合、継承は意味があります。残りの部分は構図が理にかなっています。継承を使用する例は、分割線の下の私の元の答えにあります。

フレームワークに応じて、ユーティリティクラスまたはヘルパークラスを持つことは珍しくありません。たとえば、JavaおよびC#のWebフレームワークでは、ユーティリティ用のパッケージ/名前空間がある場合があります。Ruby on Railsでは、Helperコントローラーとビューの間でロジックを共有するクラスを利用している可能性があります。基本的には、次のようになります。

// NOTE: group similar functions
static class LoginUtility
{
    static bool IsLoggedIn(Request request) { /* ... */ }
}

または、インスタンス化するクラスにすることもできます。上記の静的クラスパターンの鍵は、関数を純粋な関数にすることです。つまり、ジョブを実行するために必要なすべての状態を渡し、関数はシステム内の他の静的状態を参照しません。

どちらの場合でも、各コントローラーで次のようにアクセスします。

void MyAction()
{
    if (LoginUtiltiy.IsLoggedIn(Request))
    {
        // Do something ...
    }
}

元の回答

それが答えに影響を与える可能性があるので、あなたはあなたのプラットフォームが何であったかを言いませんでした。 それがオブジェクト指向言語であると仮定すると、最も一般的なアプローチは、両方のコントローラーが拡張する基本クラスを作成することです。たとえば、Ruby on Railsでは次のようになります。

class BaseController < ApplicationController
    def my_special_function
        # ...
    end
end

class Controller1 < BaseController
    # ...
end

class Controller2 < BaseController
    # ...
end

アイデアを他の言語に翻訳することもできます。同じアプローチがASP.NET MVC、Apache Wicket、Grails、または他のほぼすべてのオブジェクト指向のWebフレームワークで機能します。言語がオブジェクト指向でない場合は、フレームワークがどのように設計されているかによって、最善のアプローチが決まるかどうかに依存します。


3
別の方法は、ロジックを別のクラスにカプセル化し、そのクラスをインスタンス化して、両方のコントローラーからロジックを呼び出すことです。
クラミ

5
うん、私は常に継承よりも構成を好む
リノ

1
継承の層を追加するのではなく、Kramiiの提案に従ってください。しかし、彼の実際の質問は、解決策のどこにそのクラスが行くのかであったと思います。
誰も

1
それは機能とフレームワークが何であるかに依存します。レールでは、ヘルパークラスに属している可能性があります。ASP.NETまたはJavaでは、そのタイプの関数用のユーティリティクラスがある場合があります。それは実際にコントローラーがどれだけ近くに住む必要があるかによります。
Berin Loritsch

コントローラのロジックです。私はたまたまそれを2か所で必要とします。私が今持っているのは、ロジックを1つの場所に配置するために使用する拡張クラスです。
エリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.