The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Cactoos 是一个我们几周前开始开发的面向对象的 Java 原语库。我们的目标是提出一个干净、更声明式的替代方案,以取代 JDK、Guava、Apache Commons 等库。我们希望使用对象而不是调用静态过程,以便更好地利用它们。让我们看看如何以 纯粹 的面向对象方式进行输入/输出操作。
免责声明:我在写作时使用的版本是 0.9。后续版本可能会有不同的类名称和完全不同的设计。
假设你想读取一个文件。以下是您可以在 JDK7 的工具类 Files
中使用静态方法 readAllBytes()
来实现的方法:
这段代码非常命令式——它立即读取文件内容,将其放入数组中。
使用Cactoos的方法如下:
请注意—目前还没有方法调用。只是三个类的三个构造函数组成了一个更大的对象。对象source
的类型是Bytes
,表示文件的内容。为了从中获取该内容,我们调用其方法asBytes()
。
这是文件系统被触及的时刻。正如您所看到的,这种方法完全是声明性的,因此具有面向对象的所有优势。
这里是另一个例子。假设您想将一些文本写入文件。在Cactoos中,您可以这样做。首先,您需要Input
对象:
那么你需要 Output
:
现在,我们想要将输入复制到输出。在纯面向对象编程中没有”复制”操作。而且,根本就不需要任何操作,只需要对象。我们有一个名为TeeInput的类,它是一个Input
,它会将你从中读取的所有内容复制到Output,类似于Apache Commons中的TeeInputStream,但封装起来。所以我们不是复制,而是创建一个Input
,如果你触摸它,它会复制。
现在,我们必须”触及”它。我们必须触摸它的每一个字节,以确保它们都被复制。如果我们只read()
第一个字节,只会将一个字节复制到文件中。触及它们所有的最好方法是逐字节计算tee
对象的大小。我们有一个对象来处理这个,它叫做LengthOfInput
。它封装了一个Input
,并且表现得像它的字节长度。
然后我们将其值取出,并进行文件写入操作:
因此,写入字符串到文件的整个操作将如下所示:
这是它在JDK7中的过程替代:
“为什么面向对象更好,即使它更长?”你问道。因为它完美地解耦了概念,而过程式编程将它们紧密地结合在了一起。
假设你正在设计一个类,该类的作用是加密一些文本并将其保存到文件中。下面是以过程式编程的方式设计它的示例(当然,这不是真正的加密):
运行良好,但当您决定将其扩展为还可以写入OutputStream
时会发生什么?您将如何修改这个类?之后它会变得多么丑陋?这是因为设计不是面向对象的。
以下是您可以使用Cactoos以面向对象的方式完成相同设计的方法:
如果我们希望接受 OutputStream
这个设计,我们该怎么做?我们只需要添加一个次要构造函数:
完成。这就是它的简单和优雅之处。
那是因为概念被完全分离,功能被封装。在过程化的示例中,对象的行为位于其外部的encode()
方法中。文件本身不知道如何写入,而是由外部过程Files.write()
来完成。
相反地,在面向对象设计中,FileAsOutput
知道如何写入,其他人不知道。文件写入功能被封装,这使得可以以任何可能的方式装饰对象,创建可重用和可替换的组合对象。
你现在看到面向对象编程的美了吗?
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:29