我正在学习软件工程中的模式设计课程,在这里我试图理解与“耦合”和“凝聚力”相关的设计的好的和坏的方式。我无法理解下图中描述的概念。 图像中显示的代码示例对我来说是模棱两可的,所以我无法清楚地知道究竟是什么“问,不要告诉!”做法意味着!你能不能得到任何图像?如果是,请解释!
由于
答案 0 :(得分:3)
在第一次实现时,类的客户端代码与实现高度耦合,因为学生列表以某种SortedList
实现的事实被泄露。一旦从数百个其他地方使用该类,将其内部实现从SortedList
更改为其他地方变得困难或不可能。第二个实现隐藏了实现细节,导致更松散的耦合。
我相信这个原则更为人所知the law of Demeter。我从来没有听说它被描述为“请不要告诉。”
答案 1 :(得分:1)
我们不知道是什么,但这很好;没关系。重要的是你如何与它互动(它有什么方法)。为了便于说明,我们假设tum是X型。
在坏例子中,我们必须从tum获得SortedList,并开始使用SortedList。这很糟糕,因为你将X型与SortedList紧密耦合。将来,您可能不想使用SortedList(或它的子类)。如果您更改X以便它使用数组,数据库,Web服务器或其他任何东西,您将遇到许多潜在问题:
在更好的示例中,addStudentToLecture(...)隐藏了其实现细节。它可能使用SortedList,也可能是其他东西。任何想要添加学生的人都不需要知道如何使用SortedList,并且addStudentToLecture(...)的实现可以在不更改调用代码的情况下进行更改。
答案 2 :(得分:0)
在第一个(或不好的)示例中,您告诉该怎么做。
您详细说明了如何将学生添加到讲座中。这有几个问题。 tum
将其内部实现细节作为可变对象返回。客户端可以搞乱它,可能会破坏tum
类的不变量。也许这是最大的缺陷。除此之外,您还需要了解如何获取学生名单的详细信息以及如何添加学生的详细信息。如果这些细节中的任何一个发生变化,您的代码就会中断......
在第二个你不告诉如何做到这一点。您反而要求 tum
为您完成工作,但您没有详细说明如何执行此操作。这也意味着如果这些实现细节中的任何一个发生变化,您的代码仍然可以正常运行tum
实施可以独立更改。
希望这有帮助。