2

我必须实施 Java.Polynomial 作为学校作业。部分方法是add(polynomial)multiply(polynomial)等。

在类似的情况下

p.add(q); // computes p + q

返回 void 并将多项式的总和保留在 p 中会更好吗?还是返回多项式并保持以前的 p 值不变更好?

我的直觉告诉我应该做以下事情

  • 将 p.add(q) 实现为“破坏性”方法...它将 q 添加到 p 的值并将总和存储在 p
  • 还实现了一个静态方法 Polynomial.add(p,q),它返回多项式的总和。

你怎么看?

4

8 回答 8

7

就我个人而言,我真的很喜欢不可变类型。我会写p.plus(q)而不是p.add(q)让它返回一个新的多项式。不变性有很多好处,不仅在线程安全方面(听起来在这种情况下它不会成为问题),而且在对代码的推理方面。如果你知道一旦你隐藏了对它的引用,就没有任何东西可以改变你脚下对象的内容,那么预测会发生什么会容易得多。

于 2009-03-09T21:14:26.340 回答
6

这是风格问题。当对象是不可变的时通常会更好(并且“更整洁”),因此方法不是“破坏性的”(它们不是变异器,它们没有副作用)而是返回具有新值的新实例。

最著名的不可变类是 String。

于 2009-03-09T21:13:53.580 回答
3

“最好返回一个多项式并保持以前的 p 值不变”

如果你让你的数字类型表现得像其他数字一样,生活会更好。

当您必须通过减少内存分配来优化性能时,“破坏性”操作是必不可少的。

权衡是由于变量中看起来更复杂的状态变化,您的处理变得不透明。您不希望隐藏状态更改;你希望你对变量的赋值是一个大的、明显的一流的、带有-an-=的东西。

于 2009-03-09T21:13:07.780 回答
3

所以每个人都说你应该让它不可变,除非有非常具体的性能原因让它可变(你将在一个魔术多项式上添加十亿多项式并且不想要内存分配),不可变是一种方式去。

如果您有真正的性能原因,您可能想要一个破坏性和非破坏性版本,但请记住——这会导致混淆。我认为您关于重载添加的想法是否具有破坏性或不基于数量将使事情变得非常非常混乱。如果您愿意,最好让一切都成为非破坏性的,并制作一个 addDestructive(poly p) 方法。

于 2009-03-09T21:19:14.817 回答
2

即使您使用“破坏性”方法,您仍然希望返回新值以允许函数链接。而且,对于它的价值,当面对 BigInteger 和 BigDecimal 的相同问题时,Sun 决定采用非破坏性。

于 2009-03-09T21:15:45.760 回答
1

使其不可变,并使接口与 BigInteger 相同(尽可能适用)。

于 2009-03-09T22:08:06.913 回答
1

返回 void 并将多项式的总和保留在 p 中会更好吗?

不错,也不一定更好。

还是返回多项式并保持以前的 p 值不变更好?

更好,更少的惊喜和更容易理解和维护的代码。(尽管您将不得不创建更多变量)

于 2009-03-09T22:11:32.773 回答
1

多项式在其变量方面具有固定值,因此只有使其不可变才真正有意义。为您的操作返回一个新的多项式。

于 2009-03-09T22:30:28.297 回答