値オブジェクトでチェーンチェーン
-
22-09-2019 - |
質問
値オブジェクトでメソッドチェーンパターンを使用することは許容可能ですか?このソリューションが実装されているケースはありますか?
欠点は考えられませんが、あなたの主張を聞きたいです。
解決
結論:この慣行は完全に受け入れられます。
これは一般的に、不変のオブジェクトを持っているときに起こることだと思います。元のオブジェクトを変異させる代わりに、新しいオブジェクトが指定された値で作成され、返されます。メソッドチェーンでこれを行うことと反対の議論は、可変性と不変のオブジェクトを使用することとほぼ同じです。
私が持っている唯一の懸念は、これがクラスの発信者に明らかにされていることです - 彼らはチェーンズオブジェクトとのアイデンティティの平等に依存することはできません、そして、呼び出しが元のオブジェクトを変更していないことを明らかにする必要があります。彼らが実際に呼び出しをチェックしていたとしても、彼らは仲介物を割り当てていないので、このリスクはあまりありません。重要なのは彼らが彼らだということです それだけ メソッドチェーンの最後のオブジェクトを使用します。
Java.lang.Stringを例として使用するには、これを行う文字列のクライアントを使用するには:
myString.trim().replace("a", "b").substring(3, 9);
...何も意味がなく、一般的にプログラマーの誤解を示しています。何 したほうがいい これはこれです:
String myNewString = myString.trim().replace("a", "b").substring(3, 9);
...そして使用します myNewString
後続の操作で。興味深いことに、Javaの静的分析ツールであるFindBugsは、この誤解のインスタンスを検出し、可能性のあるバグとして報告できます。
クライアントの理解が主なケースです。その他の欠点には、値オブジェクトの作成が非常に費用がかかる場合、各チェーンの新しいオブジェクトをパフォーマンスヒットにすることが含まれます。これが問題である可能性があるかどうかは、独自のシナリオから伝えることができるはずです。この場合、各メソッドチェーンで新しいオブジェクトを作成するのではなく、ビルダーパターンを実装することができます。
それらとは別に、私は他の問題を考えることができません。
他のヒント
Javaクラスの多くは、不変の価値オブジェクトを提供します。 java.lang.string、java.math.biginteger、およびjava.math.bigdecimalは不変の価値オブジェクトであり、その方法は新しいオブジェクトを返します。最大の欠点は、それが新しい人がそれが不変であることを理解しておらず、彼らがオリジナルを変えていると思うということです。
一部の言語は、他の言語よりも不変性を強調しています。 Rubyの文字列は可変であり、コレクションは多くの場合、コピーを返すバージョンと既存のコピーを変異させる別のバージョンを提供します(たとえば、配列#sortとarray#sort!)。 Clojureでは、不変性が標準です。