我必须将Java.Polynomial实现为学校作业。部分方法是 add(多项式),乘法(多项式)等。
在类似
的情况下p.add(q); // computes p + q
最好返回void并将多项式的总和保持在p?还是更好地返回多项式并保持p的前值保持不变?
我的直觉告诉我,我应该做以下
答案 0 :(得分:7)
我个人非常喜欢不可变类型。我会写p.plus(q)
而不是p.add(q)
并使其返回一个新的多项式。不变性对它有很大帮助,不仅仅是在线程安全方面(这听起来在这种情况下不会成为问题),而且在推理代码方面也是如此。如果你知道一旦你隐藏了对它的引用,没有任何东西可以改变你脚下的物体的内容,那么预测会发生什么会更加容易。
答案 1 :(得分:6)
这是一种风格问题。当对象不可变时,它通常更好(和“更整洁”),因此方法不是“破坏性的”(它们不是变异器,它们没有副作用)但是返回带有新值的新实例。
最着名的不可变类是String。
答案 2 :(得分:3)
“最好返回多项式并保持p的前一个值完整”
如果您使数字类型的行为与其他数字相同,则生活会更好。
当你必须通过减少内存分配来优化性能时,“破坏性”操作是必不可少的。
权衡是由于变量中更复杂的状态变化,您的处理变得不透明。你不希望隐藏状态改变;你希望你对变量的值赋值是一个很大的,明显的一流的,有一种东西。
答案 3 :(得分:3)
所以每个人都说你应该让它变成不可变的,除非有非常具体的性能原因使它变得可变(你将为一个魔法数据添加十亿个多项式并且不想要内存分配),不变性是要走的路。
如果您有真正的性能原因,您可能希望拥有破坏性和非破坏性版本,但请记住 - 这会导致混淆。我认为你的重载的想法增加是破坏性的或不是基于arity将使事情非常,非常混乱。如果您愿意,最好使所有内容都具有非破坏性,并制作addDestructive(poly p)方法。
答案 4 :(得分:2)
即使您执行“破坏性”方法,您仍然希望返回新值以允许函数链接。并且,对于它的价值,当面对BigInteger和BigDecimal的同样问题时,Sun决定采用非破坏性的方式。
答案 5 :(得分:1)
使其不可变,并使界面与BigInteger相同(尽可能适用)。
答案 6 :(得分:1)
最好返回void并将多项式的总和保持在p?
不错,也不一定好。
还是更好地返回多项式并保持p的前值保持不变?
更好,更少的惊喜和代码更容易理解和维护。 (尽管你必须创建更多的变量)
答案 7 :(得分:1)
多项式就其变量而言具有固定值,因此它只是真正有意义才是不可变的。为您的操作返回一个新的多项式。