这让我开始思考:就面向对象设计的一般规则而言,String类是设计良好的类吗? 实际上,它是否违反了单一责任原则或demeter的法律,并且是否与应用程序的所有其他部分紧密耦合? 它是上帝的对象吗?
回答此问题的简单方法是根据“单一职责原则”查看字符串 ,而做到这一点的最佳方法是计算其拥有的方法调用的数量并弄清楚它们的作用。
如果这样做,您会发现Java的String类中有66个方法调用,并且您可能会得出这样高的数字可能是God Object的第一个迹象。
接下来,如果您查看这66个方法调用,则可以将它们分为几个不同的责任领域。 例如,有:
转换方式
- getBytes(...)
- getChars(...)
- 的价值(...)
- toUpperCase(...)
- toLowerCase(...)
- toCharArray(...)
分割String的方法
- 子串(...)
- 分裂(...)
- subSequence(...)
等效方法
- 等于(...)
- 火柴(...)
- 相比于(...)
搜索方式
- 指数(..)
- lastIndexOf(...)
- charAt(...)
- 包含(...)
组合方法
- 附加(...)
- concat(..)
- +
- + =
……还有更多。
使用上面的列表,您现在可以为类似于以下内容的String编写CRC卡:“ String负责将其自身与其他String组合以创建新的String ,并将其自身转换为其他对象或对象数组并进行拆分本身分成不同的部分,并将其与其他String对象进行比较,并对其进行搜索”
坚持法律原则,上面的列表显示String的方法调用至少分为五个责任领域,这意味着从书上讲,违反了单一责任原则。
得出合理的结论,那么您可以重构String使其看起来像这样……。
但是,这就是问题,为什么Java的String类不是由一些数据和一堆在其上操作的类组成的? 答案既是见解又是多方面的。 首先,历史……随着时间的流逝,Java以及String类的发展也是如此。 随着Java版本号的不断提高,这些方法也被逐行添加。 第二,实用主义。 当前设计中的String对象可能会违反“单一职责规则”,但这并不重要,将其保留原样并继续编写重要的程序会更容易。 最后,我认为这很重要,我们通常都知道String是什么。 它的名称和含义是常用的。 如果我们必须定义String负责使用CRC卡的方式,那么我们将编写如下内容:“ String负责成为s String ”。
字符串可能有66种方法,但我相信,按照一般共识,它不是上帝的对象。 但是,软件只是一种意见问题,因此,我将让您回答我在本博客开头提出的其他问题,并让您下定决心……
参考: Java的String类是上帝对象吗? 来自我们的JCG合作伙伴 调试队长博客的 Roger Hughes。
翻译自: https://www.javacodegeeks.com/2012/02/is-javas-string-class-god-object.html