How Much Your Objects Encapsulate?

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

你更喜欢哪一行,第一行还是第二行?

有什么区别?第一个类HTTP封装了一个URL,而第二个类将其作为read()方法的参数。从技术上讲,这两个对象完全做同样的事情:读取Google主页的内容。哪一个是正确的设计?通常我不喜欢说这样的话,但在这种情况下,我必须说——这取决于情况。

正如我们之前讨论的,一个好的对象是现实生活实体的代表。这样的实体存在于对象的生活环境之外。对象知道如何访问它并与它进行通信。

在上面的例子中,那个现实生活实体是什么?每个类都给出了自己的答案。答案是由其构造函数接受的参数列表给出的。第一个类接受一个URL作为其构造函数的参数。这告诉我们,该类的对象在构造后将表示一个网页。第二个类不接受参数,这告诉我们,它的对象将表示……宇宙。

我认为这个原则适用于面向对象编程中的所有类——为了理解对象表示的现实生活实体,看看它的构造函数。传递给构造函数并由对象封装的所有参数都标识了对象访问和管理的现实生活实体。

当然,我说的是好的对象,它们是不可变的,没有设置器和获取器。

请注意,我说的是由对象封装的参数。即使下面的类有一个无参数的构造函数,它也不代表宇宙:

这个类有两个构造函数。其中一个是主要的,另一个是辅助的。我们对主要的构造函数感兴趣,它实现了参数的封装。

现在,问题是哪个更好:代表一个网页还是代表宇宙?这取决于情况,但我认为一般来说,我们代表的现实生活实体越小,我们给对象的设计就越坚实和有凝聚力。

另一方面,有时我们必须拥有一个代表宇宙的对象。例如,我们可能有这样的情况:

这并不是一个优雅的设计,但它展示了何时可能需要代表整个宇宙。这个HTTP类的对象可以从整个互联网上读取任何网页(它几乎和宇宙一样大,是吧?),并且它可以检查整个互联网是否可访问。显然,在这种情况下,我们不需要它来封装任何东西。

我认为代表宇宙的对象并不是好的对象,主要是因为只有一个宇宙;为什么我们需要许多它的代表呢?

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 16:56

sixnines availability badge   GitHub stars