我想知道在严格的OOP方面,为字符串或整数或更复杂的对象(在我的例子中是BitSet类)添加内置类型的功能的最佳方法是什么.
更具体一点 - 我有两个场景:
现在我想知道实现这个的最佳实践是什么.
我可以创建一个从BitSet扩展的新类"BitSetEx"并添加我的方法.但我不喜欢这个想法,因为这个新类需要描述名称和"BitSetWithConversionMethods"听起来真的很傻.
现在我可以编写一个只包含执行转换的静态方法的类.
我有很多想法,但我不知道OOP意义上的"最佳".
那么有人能回答我这个问题吗?
这里有几种方法:
首先,你可以为班级起一个更好的名称extends BitSet
。不,BitsetWithConversionMethods
这不是一个好名字,但也许ConvertibleBitSet
是这样的。这是否传达了该类的意图和用法?如果是的话,这是一个好名字。同样,您可能有 a HashableString
(请记住,您不能扩展String
,正如安东尼在另一个答案中指出的那样)。XableY
这种用(or XingY
, likeBufferingPort
或)命名子类的方法SigningEmailSender
有时对于描述新行为的添加很有用。
也就是说,我认为你的问题(无法找到名字)有一个公平的暗示,这可能不是一个好的设计决策,而且它试图做太多事情。一个类应该“做一件事”,这通常是一个很好的设计原则。显然,根据抽象级别,可以扩展到包括任何内容,但值得考虑:“操作多个位的设置/取消设置状态”和“将位模式转换为另一种格式”算作一个事物?我认为(特别是暗示你很难想出一个名字)它们可能是两种不同的职责。如果是这样,拥有两个类最终会更干净,更容易维护(另一条规则是“一个类应该有一个改变的理由”;一个同时进行操作和转换的类至少有两个改变的理由),更容易测试隔离等
因此,在不了解您的设计的情况下,我建议可能有两个课程;在这个BitSet
例子中,有 aBitSet
和(比如说)aBitSetConverter
负责转换。如果你想变得非常奇特,甚至可能:
interface BitSetConverter<T> {
T convert(BitSet in);
BitSet parse(T in);
}
Run Code Online (Sandbox Code Playgroud)
那么你可能有:
BitSetConverter<Integer> intConverter = ...;
Integer i = intConverter.convert(myBitSet);
BitSet new = intConverter.parse(12345);
Run Code Online (Sandbox Code Playgroud)
这确实隔离了您的更改,使每个不同的转换器都可以测试,等等。
(当然,一旦你这样做了,你可能想看看guava并考虑使用Function,例如 aFunction<BitSet, Integer>
对于一种情况,对于Function<Integer, BitSet>
另一种情况。然后你获得了一个Function
可能有用的支持代码的整个生态系统)