階層化ソリューション、懸念の分離などに関するアドバイスが必要
質問
階層化されたアプリケーションがあるか、少なくとも次のように分類されたアプリケーションに移行中です:
- インターフェイス(ユーザーインターフェイスまたはアプリケーションインターフェイス、つまりwebserviceなど)
- ビジネスロジック
- データアクセス
この質問の残りをより具体的にするために、特定のインスタンスを説明します。
ユーザーインターフェイスがあり、その背後にコントローラーオブジェクト(ビジネスロジック層)があります。このコントローラーは、別のオブジェクト(データアクセスレイヤー)を介してデータベースと通信します。
特定のコンテキストでは、ユーザーインターフェイスを使用して、実行する操作を関連付ける従業員を選択できます。ユーザー(コントローラーの外の世界)が選択できる従業員に関するルールがあるため、コントローラーはこのために2つのことを提供します:
- 選択可能な従業員のリストを含む読み取り可能なプロパティ
- 現在選択されている従業員を含む読み取り/書き込み可能なプロパティ
ユーザーインターフェイスはリストを読み取り、それを使用してコンボボックスにデータを入力します。
このアプリケーションのバージョン1では、コンボボックスには従業員の識別番号+従業員の名前が含まれています。
すべては順調です...
...バージョン1.1まで、バグ修正。ユーザーは、どちらがどれであるかをアプリケーションが簡単に判断できないため、 Jimmy Olson と Jimmy Olson を選択できないと不平を言っています。彼は、営業部門と開発部門に1人ずつJimmyがいることを知っているので、この1.1バージョンの修正は、コンボボックスにスラッシュと部門名を追加するだけです。バージョン2では、コンボボックスを列をサポートするコンボボックスに置き換えてスラッシュを削除することを選択しますが、1.1では、これがさらなるバグのリスクを最小限に抑えるために選択されます。
つまり、コンボボックスには次のものが含まれます。
- 1-ジミーオルソン/セールス
- 2-ジミーオルソン/開発
-
- 他の人々
ただし、ユーザーインターフェイスコードにはSQLコードがなく、その部門を把握する方法もないため、コントローラーに移動してコードを確認する必要があります。管理者は部門を必要とせず、正直なところ、従業員の名前さえ必要とせず、識別番号で十分です。したがって、コントローラーには部門を要求したり、何かをしたりするものは何もありません。そのため、データアクセスレイヤーに移動し、そこでSQLを変更する必要があります。
この解決策は、率直に言って臭いがします。
このコントローラーに複数のインターフェースがあり、要件が異なる場合、3つの解決策があります:
- 複数のインターフェース(2層離れた)の(増加/多様な)ニーズに対応するようにデータアクセスレイヤーを変更します。つまり、すべてのインターフェースが必要なすべてのデータを取得しますが、すべてのデータも取得します。他のインターフェースのいずれかに必要
- ユーザーインターフェイスがデータアクセスレイヤー(まだ2レイヤー離れている)に必要な情報を伝えるものを追加します
- どういうわけか、関連するコントローラーまたはアクセスレイヤーを変更せずに、ユーザーインターフェイスレイヤーが必要なデータを取得できるようになります。これは、どこかにデータアクセスコードを追加する必要があるようです。
上記の解決策のどれも気分が悪い。
私が不思議に思っているのは、コースから完全に外れているのでしょうか?どうしますか?上記3の下に4番目と5番目の解決策はありますか?
この質問ごとに:懸念の分離、受け入れられた答えには次の引用が含まれています:
関心事の分離は、これらの関心事それぞれのコードを別々に保つことです。インターフェイスを変更しても、ビジネスロジックコードを変更する必要はありません。逆も同様です。
これは単に、すべてのコントローラー/データアクセスレイヤーを意味します
解決
見方では、2つの可能性があります:
- 下位層に all を送信させます 彼らが持っている情報 おそらくXMLドキュメントとしての人、 の消費者の多くが その情報はすべてを必要としません。
- 高レベルのAPIを提供する ドリルダウンして取得するレイヤー 必要な情報。だから あなたが与える場合、その方法があります インターフェースはビジネスに質問できます データベース層に問い合わせる層 ユーザーIDが与えられた部門。
どちらにもトレードオフがあります。最初のものは、より多くの情報を公開します。おそらく、その情報に対する権利を持っていない消費者に公開されます。 2番目の方法では、トランザクションごとに渡される情報ははるかに少なくなりますが、より多くのトランザクションが必要になります。最初のものは、より多くの情報があるたびにAPIを変更する必要はありませんが、XMLを変更します。 2番目は、既存のAPIのインターフェースを同じに保ちますが、必要に応じて新しいAPIを提供します。などなど。