Object-Oriented Declarative Input/Output in Cactoos

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 原语库。我们的目标是提出一个干净、更声明式的替代方案,以取代 JDKGuavaApache 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

sixnines availability badge   GitHub stars