我有一些大的(超过3个字段)对象,它们可以而且应该是不可变的.每次遇到这种情况时,我倾向于使用长参数列表创建构造函数可恶.它感觉不对,难以使用,可读性受损.
如果字段是某种类似列表的集合类型则更糟糕.一个简单的方法addSibling(S s)可以简化对象的创建,但会使对象变得可变.
在这种情况下你们有什么用?我在使用Scala和Java,但我认为只要语言是面向对象的,问题就是语言不可知.
我能想到的解决方案:
感谢您的输入!
我正在尝试构建一个框架,允许人们通过实现接口来扩展我们的核心功能.下面是这个界面的一个愚蠢的例子.
public interface MyInterface
{
IData GetData(string p1, char p2, double p3);
}
Run Code Online (Sandbox Code Playgroud)
最近,我们决定修改这个界面(我知道我不应该破坏依赖代码,但事实是我们还没有任何第三方实现这个界面,所以我们有机会进行"重做"正确实现此接口).
我们需要在此界面中再添加2个参数,以使我们的软件正常工作.我们想到的两种方法就是将它们添加到签名中,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, bool p4, DateTime p5);
}
Run Code Online (Sandbox Code Playgroud)
或者通过创建这样的参数对象
public class MyParameters
{
public bool p4 { get; set; }
public DateTime p5 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并将它们添加到方法的末尾,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, MyParameters p4);
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找某种指导,以哪种方式是"最"正确的方法.我可以在两个类别中看到利弊,但我不希望我的偏见让我走错了路.
我的一些主要担忧是:
我甚至不知道在线询问什么问题来获得这个问题的指导.我有一种感觉,答案是"它取决于"(关于如何将相关的p1-p5与GetData()函数的目的相关联),但有人可以指出我应该要求的一系列问题来帮助我评估一种解决方案是否优于另一种?
相关: 帖子1 …
所以我一直在阅读Joshua Bloch撰写的Effective Java,并注意到我在工作中遇到的两点.
第1点: 制作setter方法以使代码更具可读性.在他的例子中,我们有一个带有一个非常庞大的构造函数的类.当人们实例化这个类时,很难说出所有参数都在发生什么.因此,他建议制作一个简约的构造函数,并为所有其他选项设置setter方法,因此不是......
MyClass clazz = new MyClass(a,b,c,d,e,f,g);
你会写....
MyClass clazz = new MyClass(a,b,c);
clazz.setDitto(d);
clazz.setEcho(E);
clazz.setFunzies(F);
clazz.setGumballs(克);
作为可读代码的巨大支持者,我非常喜欢.
第2点: 一般来说,他建议使用不可变类.他深入研究了为什么不可变类比拥有可能处于几个不同状态的类要好得多.我可以肯定地说他把这个想法卖给了我,我迫不及待地想把我从现在开始写的大部分课程变成一成不变的,除了....
当你有一个带有巨大构造函数的不可变类时会发生什么?你不能为它制作setter方法; 这将破坏不变性.我试着浏览本书的其余部分,但我不认为他为此提供了解决方案.
有可能使用一次性使用setter方法,但只是一个setter方法可用于一个被认为是不变的类的事实令人沮丧,即使它只是在你后续尝试时抛出异常.
有没有人对如何处理这个问题有任何好的想法?我目前正在处理这个问题,我有一个带有巨大构造函数的Immutable类,我想重构一些更易读的东西,而不会破坏不变性.