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

したがって、誰もがそれを不変にする必要があると言っています、そしてそれを可変にするための非常に特定のパフォーマンス上の理由がない限り(単一の魔法のものに10億の多項式を追加し、メモリ割り当てを望まない)、不変性が方法ですトーゴ。

真のパフォーマンス上の理由がある場合は、破壊的バージョンと非破壊的バージョンが必要になる場合がありますが、これは混乱を招くことを忘れないでください。オーバーロードするというあなたの考えは、破壊的であるか、またはアリティに基づいていないことを追加すると、物事が非常に混乱するようになると思います。必要に応じて、すべてを非破壊にし、addDestructive(poly p)メソッドを作成することをお勧めします。

于 2009-03-09T21:19:14.817 に答える
3

「多項式を返し、元の p の値をそのままにしておく方がよい」

数値型を他の数値のように振る舞わせれば、生活はより良くなります。

メモリ割り当てを減らしてパフォーマンスを最適化する必要がある場合、「破壊的な」操作は必要悪です。

トレードオフは、変数の状態変化がより複雑に見えるため、処理が不透明になることです。非表示の状態の変更は必要ありません。変数への値の代入は、大きくて明白なファーストクラスの with-an-= のようなものにしたいと考えています。

于 2009-03-09T21:13:07.780 に答える
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 に答える