カスタムオブジェクトではメソッドは破壊的であるべきですか?

StackOverflow https://stackoverflow.com/questions/628049

  •  06-07-2019
  •  | 
  •  

質問

学校の課題として Java.Polynomial を実装する必要があります。メソッドの一部は次のとおりです add(多項式), 乗算(多項式)

のような場合には

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

voidを返して多項式の合計をpに保持する方がよいでしょうか?それとも多項式を返して p の元の値をそのまま保持する方が良いでしょうか?

私の本能は次のことをすべきだと言っています

  • p.add(q) を「破壊的」メソッドとして実装します...p の値に q を加算し、その合計を p に格納します。
  • また、多項式の合計を返す静的メソッド Polynomial.add(p,q) も実装します。

どう思いますか?

役に立ちましたか?

解決

個人的には、不変の型が大好きです。 p.add(q)の代わりに p.plus(q)を記述して、新しい多項式を返します。不変性は、スレッドセーフ(この場合は問題にならないように思えます)だけでなく、コードについての推論の観点からも、多くの目的で使用されています。参照を隠してしまえば、足下のオブジェクトの内容を何も変更できないことがわかっている場合、何が起こるかを予測するのははるかに簡単です。

他のヒント

これはスタイルの問題です。オブジェクトが不変で、メソッドが「破壊的」ではない場合、通常は優れています(そして「よりきれい」です)。 (ミューテーターではなく、副作用はありません)、新しい値を持つ新しいインスタンスを返します。

最もよく知られている不変クラスはStringです。

"多項式を返し、以前のpの値をそのままにしておく方が良い"

数値型を他の数値のように動作させると、寿命が延びます。

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

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

だから誰もそれを不変にするべきだと言っており、それを可変にする特別なパフォーマンス上の理由がない限り(1つの魔法の1つに10億の多項式を追加し、メモリ割り当てを望まない)、不変性行く方法です。

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

「破壊的」を実行してもメソッドを使用すると、関数チェーンを可能にするために新しい値を返す必要があります。そして、BigIntegerとBigDecimalで同じ問題に直面したとき、Sunは非破壊的であることを決定しました。

不変にし、インターフェースをBigIntegerと同じにします(可能な限り)。

voidを返して多項式の合計をpに保持する方がよいでしょうか?

悪くはありませんが、必ずしも良いというわけでもありません。

それとも多項式を返して p の元の値をそのまま保持する方が良いでしょうか?

より優れており、驚くことが少なくなり、コードの理解と保守が容易になります。(ただし、さらに変数を作成する必要があります)

多項式は変数に関して固定値を持っているため、不変であることが本当に理にかなっています。操作の新しい多項式を返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top