8

...などを含むオブジェクトを含むオブジェクトの名前または特定のルールはありますか。私は、オブジェクトが5〜10層の深さで実行されることが多い複雑なシステムで作業しています。これが行われる理由の1つは、サーバーからクライアントに一度に大量のデータを渡すことですが、これを行うためのより良い方法はありますか?

編集:それはいくつかのアンチパターンの組み合わせのようです。ドメインモデルをクリーンアップする必要があります。次のアンチパターンが匂いです。トレインレックパターン、およびキッチンシンクマップ以外のすべて

4

4 に答える 4

7

この種のオブジェクトツリーの名前はわかりません。しかし、よく知られているアンチパターンは、コードが過度のメソッドチェーンを使用するときに発生するTrainWreckPatternです

objA.getChildB().getChildC().getChildD()....getChildZ().performSomeAction();

すべてをラップするのは大体の目安です

.getChildC().getChildD()....getChildZ().performSomeAction();

上のメソッドに

objA.getChildB()

このメソッドを呼び出しましょうperformSomeActionDeepDownTheObjectTree()

于 2012-11-05T08:51:09.020 に答える
5

これは、ドメインモデルが酸っぱくなったように見えます(アンチパターン名ではありません、ところで:)これは、明確に定義されたドメインモデルのようなものがあるという幻想から生じています。実際には、エレガントにモデル化できる問題ドメインのいくつかの側面がありますが、より詳細なレベルでは、例外の例外と特殊なケースの特殊なケースがあり、それぞれが単一のサービスメソッドに固有であり、このエレガンスを破壊します。

多くのネストされたオブジェクトの外観は、多くの場合、すべてのインスタンス変数がさまざまなコンテキストで再利用されることを期待して、ドメインモデルをさらに細かく「粉砕」する継続的なプロセスの結果です。すべてのドメイン属性を再利用するという独断的な命令が意味をなさなくなるという限界点があります。

これから抜け出す方法は、万能のドメインモデルを作成するのをやめ、各サービス呼び出し用に特別に設計されたオブジェクトを使用することです。これらのオブジェクトは、明確に定義されたドメインオブジェクトの一部に依存している場合がありますが、特定の情報を個別に追加し、他のサービス呼び出しに干渉しない方法で追加します。

于 2012-11-05T08:55:47.157 に答える
3

この用語は「オブジェクト指向」であり、問​​題のごく一部をカプセル化するオブジェクトのクラスを定義することにより、大きな複雑な問題を小さな問題に分解します。オブジェクトが相互作用する方法はメッセージの受け渡しであり、オブジェクトはメッセージを渡す他のオブジェクトを、それらに含まれるオブジェクトから開始することによって見つけます。

問題が大きく複雑になるほど、問題を管理可能な部分に分解するために必要な作業が増えるため、より多くのオブジェクトのレイヤーが得られます。小さな単純な問題がひどく多数のオブジェクトに分解されることがありますが、それはオブジェクト指向自体をアンチパターンにしません。


主な問題は、無関係なデータを含めるだけでなく、ネストによってデータオブジェクトが大きくなりすぎることです。例:鳥を並べ替えている場合、単純な鳥のオブジェクトではなく、羽、くちばし、possibleParasites、air、possibleHousesNestsCanBeIn、foodTypesを含むオブジェクトの鳥を受け取ります。食品の種類には果物、昆虫、ワーム、種子、種子にはオーク、ニレが含まれます、アザミ、possibleAnimalsThatCanEatSeedsなど– </ p>

キッチンシンクマップのアンチパターン以外のすべてがおそらく最も適しています。

多くの複雑なルールを含む複雑なプロセスを考えると、すべて(ビジネスロジック、関連する手順と関連しない手順など)がマップに押し込まれます。

これを解決する最善の方法は、のような強く型付けされたインターフェースを指定するフィルタリング操作を使用することですinterface BirdList extends Iterable<Bird> {}。クエリシステムは、そのインターフェースをサポートするのに十分なデータに裏打ちされた実装を提供します。

APIは、BirdListやなどのさまざまなインターフェースを提供できます。クライアントは必要なインターフェースのリストを作成でき、クエリシステムはそれらを分析してデータをフェッチし、プロキシクラスを使用してクエリを公開する実装クラスをアセンブルします。タイプセーフな方法になります。BirdFeedingHabitMapBirdNestingHabitMap

于 2012-11-05T08:53:31.890 に答える
2

…などを含むオブジェクトを含むオブジェクト

リストと呼ばれ、完全に問題ありません;)

しかし、あなたは正しいです、メソッド呼び出しの長いシーケンスはほとんど問題なく、不適切な親密さと呼ばれるきれいなコードの臭いです。

不適切な親密さは、ルールincrease coupling, decrease cohesionに反する可能性があります。law of demetertell, don't ask

参考文献:これらの用語を調べると、膨大な数の答えが見つかります。特に優れているのは、Cohesion and Couplingと、RobertC.Martinによる著書AgileSoftwareDevelopment、Principles、Patterns、andPracticesです。

于 2012-11-05T08:58:25.913 に答える