gpt4 book ai didi

java - 得墨忒耳法则 - 为什么我需要使用 setter/getter ?

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:13 25 4
gpt4 key购买 nike

我有一个关于 Demeter 法则与 Java 中其他对象中包含的列表相关的问题。我有以下类(class)。

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

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

要在此类中向 conversationList 添加一个新的 Message 对象,我通常会执行如下操作。

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

经过一番阅读后,这似乎违反了得墨忒耳法则,向 Converstaion 添加如下方法,将是解决此问题的“更好”方法。

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

然而,这对我来说似乎完全矫枉过正。在这种情况下,最佳做法是什么?

最佳答案

However this seems like complete overkill to me.

啊,我记得我刚开始的时候反复问过自己这个问题——当时封装这个词是我为了测试而学到的,但并不真正理解它的“必要性”。

我这么说是因为封装是我们在这里谈论的 - 一个词回答你的问题:

通过 getter 访问 conversationList - 这就是您在此处发布的第二个模式的名称 - 封装您的对话类中的对话列表。当您编写的程序具有三到四个类并且具有既简单又固定的要求时,很难理解为什么这很重要:当您仍在思考这些小程序的工作原理时,整个概念“添加一个 getter”而不是直接访问字段似乎只是多了一件事,多了一件你并不真正理解的事情,为什么你必须这样做,多了一个地方你可以搞砸一些东西向上。

当然,当您变得更加自信时,这种感觉就会消失,并且会发生的其他事情是您将开始考虑和处理更大、更复杂的应用程序,并且其需求会发生变化(两者都在现实中和他们的看法中)随着时间的推移,这通常意味着你的程序需要改变——这就是封装开始变得非常有意义的时候:

现在:假装你的老师改变了他明天给你的作业,给你一直在做的这个程序添加了一个无法预料的要求(顺便说一句,我认为这对老师来说是一件聪明的事)。想象一下,满足该要求的唯一方法是将对话列表保存在 Map 而不是 List 中,这样您就可以将它们中的每一个映射到某个其他值.

如果您一直在使用“您的第一种方法”——调用 conversationsList.add() 以在许多不同的类中直接访问该字段,那么您将不得不遍历并更改每个类这些类调用 conversations.put() 而不是 .add()

但如果您一直在使用第二种方法 - 通过 getter 访问您的集合 - 那么您可以根据需要显着更改该集合,并且您只需对 getter 进行一项更改:

 public void addMessageToList(Message msg)
{
this.myMessagesManager.put(msg, new ArrayList<SomeValue>);
//or .put(msg, null) or whatever
}

您的其他类永远不会知道任何更改,这很棒,因为这意味着您编写的代码更少,而且特别很棒,因为它让您不必做很多最糟糕的事情编码 - 当您对其中一个类进行这些小的更改时,通常会涉及到捕获由于您犯的小错误而引起的所有错误。

(另请参阅 my answer to this question 以获得更好的说明)

关于java - 得墨忒耳法则 - 为什么我需要使用 setter/getter ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24428394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com