Public Static Literals ... Are Not a Solution for Data Duplication

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

在我的应用程序中,我在一个地方有一个new String(array,"UTF-8")的代码,而在另一个地方也完全相同。实际上,可能我在很多地方都有这样的代码。而且每次都需要使用那个"UTF-8"常量来从字节数组创建一个String。如果能在某个地方定义一次并重复使用它,就像Apache Commons正在做的那样,这将非常方便;可以参考CharEncoding.UTF_8(那里还有许多其他的静态文字)。这些人设立了一个不好的例子!public static的“属性”和实用类一样糟糕。

这就是我所说的具体内容。

现在,当我需要从字节数组创建一个String时,我使用这个:

假设我想将一个String转换成字节数组:

看起来方便,对吧?这就是Apache Commons的设计者们所认为的(在Java世界中最受欢迎但实际上非常糟糕的库之一)。我鼓励你持有不同的想法。我不能告诉你停止使用Apache Commons,因为我们目前没有更好的替代方案(尚未!)。但是在你自己的代码中,不要使用公共静态属性-永远不要。即使这段代码对你来说看起来很方便,它也是一个非常糟糕的设计。

原因很类似于具有公共静态方法的实用类-它们是不可打破的硬编码依赖关系。一旦你使用了CharEncoding.UTF_8,你的对象就开始依赖这个数据,它的用户(你的对象的用户)无法打破这个依赖关系。你可能会说,这是你的意图,在"UTF-8"常量的情况下,确保只使用Unicode。在这个特定的例子中,这可能是真的,但是从一个更全局的角度来看,你会发现问题。

在我们继续之前,让我向你展示我心中的替代方案。这是我建议的将字节数组转换为String的方法:

这是伪代码,因为Java设计者将类String设为final,我们无法真正扩展它并创建UTF8String,但你可以理解这个概念。在真实世界中,它可能是这样的:

如您所见,我们在UTF8String类的某个地方封装了常量”UTF-8”,而其用户并不知道这个“字节数组到字符串”的转换是如何进行的。

通过引入UTF8String,我们解决了”UTF-8”字面量重复的问题。但我们以一种适当的面向对象的方式解决了它—我们将功能封装在一个类中,并让每个人实例化其对象并使用它们。我们解决了功能重复的问题,而不仅仅是数据重复。

将数据放入一个共享位置(CharEncoding.UTF_8)并不能真正解决重复问题;实际上,它使问题变得更糟,主要是因为它鼓励每个人使用相同的共享数据来复制功能。

我在这里的观点是,每当您发现应用程序中存在某些数据重复时,开始思考您正在复制的功能。您很容易找到一遍又一遍重复的代码。为这段代码创建一个新的类,并将数据作为私有属性(或私有静态属性)放在那里。这样,您将改善设计,并真正消除重复。

附注:您可以使用方法代替类,但不能使用静态字面量。

附注2:您也可以使用枚举,但只能按照这种方式使用。

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

sixnines availability badge   GitHub stars