5

Java の他のオブジェクトに含まれるリストに関連するデメテルの法則について質問があります。私は次のクラスを持っています。

public class Conversation
{
    Person person;
    List<Message> conversationList;

    public List<Message> getConversationList()
    {
        return conversationList;
    }
}

このクラスの conversationList に新しい Message オブジェクトを追加するには、通常、次のようにします。

Conversationc = new Conversation();
c.getConversationList().add(new Message());

少し読んだ後、これはデメテルの法則に違反しているように見え、次のように会話にメソッドを追加すると、これに近づく「より良い」方法になります。

public List<Message> addMessageToList(Message msg)
{
    conversationList.add(msg);
}

しかし、これは私には完全にやり過ぎのようです。この状況でのベストプラクティスのアプローチは何ですか?

4

4 に答える 4

0

最初のアプローチでは、 の実装を変更することはできませんconversationList

メッセージを処理するためにまったく新しいクラスを使用することにしたと想像してMessagesManagerくださいList

しかし、public void addMessage(Message msg);では、使用できます

public void addMessageToList(Message msg)
{
    this.myMessagesManager.addMesasge(msg);
}

データモデルをカプセル化Conversationし、その で必要なことを行いMessagesます。他の誰も気にしません。

于 2014-06-26T10:53:33.140 に答える
0

どちらでもない。メソッドの名前は、オブジェクト インスタンスで実行されるアクションを表す必要があります。

あなたの場合、で始まる会話方法addはちょっとあいまいです。したがって、問題は、そのメッセージに対する今後のアクションは何かということです。

会話には、聞くか話すかの 2 つの側面があります。

converstion.listen(Message)またconversation.listenMessage(Message)

API (パブリック メソッド) を設計するときは、それを使用してみて、その動作を確認してください。

conversation.listen(whatTomSad());
vs
conversation.listenMessage(whatTomSad());

このレベルでは、決定するのは非常に困難です。私は最初のものを選択します。柔軟性と適切な API 抽象化も提供するためです。

私たちのAPIが成長し、サーバーだけでなくMessage.

ソリューションの場合、メソッドをオーバーロードするだけで、API をかなり拡張したままにしますが、ユーザーに採用を強制しません。メソッドの戻り値の型を簡単に変更できます。

conversation.listen(whatTomSad());
conversation.listen(whatTomSing())
vs
conversation.listenMessage(whatTomSad());
conversation.listenSong(whatTomSad();

単純化して結論付けます。メソッド名は、オブジェクトだけでなく、API のユーザー (開発者) が使用するコンテキストにも依存する必要があります。次のような属性が必要です: - 自己表現 - 驚くべきことではない - リファクタリングが容易

そのバランスをとるのはかなり複雑です。それを学ぶための最良の方法。他の開発者のコ​​ードを観察し、彼らの間違いから学びましょう。

于 2014-06-26T11:39:20.467 に答える