Martin FowlerのRefactoring bookで一般的なコードのにおいについて読んでいます。その文脈で、私はコードベースで見ているパターンについて疑問に思っていました、そしてそれが客観的にそれをアンチパターンと考えることができるかどうか。
パターンは、オブジェクトが1つ以上のメソッドへの引数として渡されるものであり、それらはすべてオブジェクトの状態を変更しますが、いずれもオブジェクトを返しません。そのため、(この場合は)C#/。NETの参照によるパスに依存しています。
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
(特にメソッドに適切な名前が付けられていない場合)そのようなメソッドを調べて、オブジェクトの状態が変化したかどうかを理解する必要があることがわかりました。複数レベルの呼び出しスタックを追跡する必要があるため、コードの理解がより複雑になります。
このようなコードを改善して、新しい状態の別の(クローンされた)オブジェクト、または呼び出しサイトでオブジェクトを変更するために必要なものを返すことを提案したいと思います。
var something1 = new Thing();
// ...
// Let's return a new instance of Thing
var something2 = Foo(something1);
// Let's use out param to 'return' other info about the operation
int result;
var something3 = Bar(something2, out result);
// If necessary, let's capture and make explicit complex changes
var changes = Baz(something3)
something3.Apply(changes);
私には最初のパターンが仮定に基づいて選択されているようです
- 作業量が少ない、または必要なコード行が少ない
- オブジェクトを変更し、他の情報を返すことができること
- のインスタンスが少ないため、より効率的です
Thing
。
私は代替案を示しますが、それを提案するには、元の解決策に反対する議論が必要です。元のソリューションがアンチパターンであるという主張をするために、もしあれば、どのような議論ができますか?
そして、もしあれば、私の代替ソリューションで何が間違っていますか?