オブジェクト指向コーディング – オブジェクトマネージャを使うかどうか

domain-driven-design oop

あなたの意見をお願いします建築スタイルのポイント:

私のORMは私のシステムのユーザーに対応するUserオブジェクトを与えてくれました。 GetByUsername()、Authenticate()、VerifyLoginPassword()など、ユーザーを処理するための一連のメソッドを開発したいと思いました。 しかし、これらのメソッドのいくつかは実際にはUserクラスに属していないと私には感じます。 GetByUsername()は少なくともUserの静的メソッドのように感じますが、別のクラスがある方が「きれい」ではないでしょうか。「UserManager」と言って、これらのユーザー管理タイプのタスクを提供してくれますか。 たとえば、認証を行うのがセキュリティシステムである場合、UserインスタンスにAuthenticate()メソッドを含めるのは少し奇妙に思えますか。

私が心配しているのは、Userクラスがstructにすぎないという点までこのモデルに従うことになり、そして私のUser ManagerとSecurity Managerクラスが実際にすべてのメソッドを実行することです。 これらすべてのマネージャクラスが軽量オブジェクトを操作するのは、それほど「OO」とは言えません。

この哲学的問題に関する先行技術へのどんな考えまたはリンクも評価されるでしょう!

  9  5


ベストアンサー

それはあなたが「犬であること」としてオブジェクトを定義することを越えて動いていてそして*役割、責任、および行動*に関してオブジェクト定義に動いているその時点であなたのように聞こえます。

私はあなたがその移行をするのを手助けするために、そして本当に “get it“するためにこの本をお勧めします:

私はあなたの具体的な質問に対する答えを持っていません。なぜならそれはあなたが本当に “全体像”について学ぶべき基本的な設計上の決定だからです。この本はあなたに責任駆動設計の原則とテクニックにおける良い基礎を与えるでしょう。

楽しい、

ロバートC. カルタイーノ

6


Martin Fowlerには、いくつかの役に立つhttp://martinfowler.com/articles/injection.html [この件に関する意見]があります。

__
基本的な選択は、Service LocatorとDependency Injectionの間です。 最初のポイントは、両方の実装が素朴な例で欠けている基本的な分離を提供するということです – 両方の場合でアプリケーションコードはサービスインターフェースの具体的な実装から独立しています。 2つのパターンの重要な違いは、その実装がアプリケーションクラスにどのように提供されるかという点です。 サービスロケータでは、アプリケーションクラスはロケータへのメッセージによって明示的にそれを要求します。 インジェクションでは、明示的な要求はありません。サービスはアプリケーションクラスに表示されます。つまり、制御の逆転です。

制御の反転はフレームワークの一般的な機能ですが、それは代償を払うものです。 あなたがデバッグしようとしているとき、それは理解するのが難しい傾向にあり、問題を引き起こします。 それで、私はそれが必要でない限り、全体として私はそれを避けることを好みます。 これは悪いことだと言っているわけではありません。それは、より直接的な代替手段に対して正当化する必要があるということです。
__

3


_
これらすべてのマネージャクラスが軽量オブジェクトを操作するのは、それほど「OO」とは言えません。
_

これが「OO」であるかどうかはわかりませんが、私にとっては、MVCと懸念の分離のようなものです。 非常に軽量なビジネスクラス(それらは単なるデータコンテナです)と、それからそれらを移動させるリポジトリオブジェクトを持つことは一般的なパターンです。

3


あなたはあなたのUserクラスからすべての機能をリファクタリングし続けることができますが、あなたが言ったようにあなたはそれに何も残されずに終わるかもしれません。 この時点で、作成した他のすべてのクラスを評価してから、これらのクラスごとに個別の判断を行い、これらのクラスにまったく新しいクラスを保証するのに十分な機能があるかどうかを判断できます。

これらのクラスのいくつかが小さすぎると判断した場合は、それらの機能をUserクラスに戻すことができます。 たとえば、UserValidationクラスに1つのメソッドしか含まれていなくても、UserにValidate関数を使用しても問題ありません。

1


これらのメソッドがユーザーオブジェクトに属していない可能性があると言ったら、あなたはお金を出していると思います。 Get / Search / Saveメソッドは議論の余地がありますが、私はそれらがビジネスオブジェクト自体にあるべきではなく、リポジトリ(リポジトリパターン)を使用するか、またはhttp:// ayendeを介して行うべきであるという意見です。リポジトリでORMを抽象化したくない場合は、com / Blog / archive / 2009/04/17 / repository-is-the-new-singleton.aspx [クエリオブジェクト]を選択してください。

認証に関しては、認証を担当するクラスのセットを用意し、それをユーザーオブジェクトから完全に除外することをお勧めします。 このクラスのセットは、ユーザーオブジェクトを認識している可能性がありますが、資格情報などの契約を認識している必要があります。

1


説明している状況は、オブジェクトがリポジトリに保存するためにセルフサービスまたはアダプタのどちらのパターンに従っているかに関係しています。 データベース)。

セルフサービスでは、オブジェクトは「+ myObjectInstance.Save()」のように「自分自身」を保存しますが、アダプターパターンは「 myObjectAdapter.Save(myObjectInstance)+」になります。

アダプタフォームは、リポジトリ機能をオブジェクトから削除するため、よく使用されます。

0


私はこれを違うやり方で置くのが好きです。 関与するビジネスロジックがないので、これらのメソッドは実際にはドメインに属していません。 コマンドとクエリの分離原則を使いたい

GetByUsername() – ビジネスロジックを必要としないクエリ

Authenticate()、VerifyLoginPassword() – これらはドメイン内で行われることは想定されていない検証ロジックです。この文書を参照してください。http://bjarte.com/post/224749430/set-based-validation-in-the- cqrs-architecture [ドメイン内のSet based validation]

0


タイトルとURLをコピーしました