私たちのコードベースは、私のような古いプログラマーと新しいプログラマーであり、均一性のために行われた方法ですぐにそれを行うことを学びます。私たちはどこかから始めなければならないと考えて、私は自分自身にそれとしてデータホルダークラスをリファクタリングしました:
- セッターメソッドを削除し、すべてのフィールドを作成しました
final
(final
公理的には "良い"です)。結局のところ、セッターはコンストラクターでのみ使用されていたため、副作用はありませんでした。 - Builderクラスを導入しました
コンストラクター(そもそもリファクタリングを促したもの)が約3行のコードにわたるため、Builderクラスが必要でした。それは持っている多くのパラメータを。
運が良ければ、チームメイトが別のモジュールで作業していて、たまたまセッターが必要でした。なぜなら、必要な値がフローのさまざまなポイントで利用可能になったからです。したがって、コードは次のようになりました。
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
セッターを取り除くことでフィールドが不変のままになることを可能にするため(以前に不変性についての不満を聞いたことがあります)、またビルダーはオブジェクトの作成をトランザクション可能にするため、代わりにビルダーを使用する必要があると主張しました。次の擬似コードをスケッチしました。
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
その例外が発生すると、bar
データが破損しますが、ビルダーでは回避できます。
public Bar foo(){
Builder builder=new Builder();
try{
builder.setA(a);
//dangerous stuff;
builder.setB(b);
//more dangerous stuff
builder.setC(c);
return builder.build();
}catch(){}
return null;
}
私のチームメイトは、問題の例外は決して発生しないと反論しました。これはそのコードの特定の領域にとっては十分に公平ですが、ツリーのフォレストが欠落していると思います。
妥協案は、古いソリューションに戻すことでした。つまり、パラメーターのないコンストラクターを使用し、必要に応じてすべてをセッターで設定しました。理論的根拠は、このソリューションがKISSの原則に従っていることで、これは私の違反です。
私はこの会社には初めて(6か月未満)いますが、この会社を失ったことを完全に認識しています。私が持っている質問は:
- 「古い方法」の代わりにビルダーを使用する別の議論はありますか?
- 私が提案する変更は本当に価値がありますか?
でも本当に
- 何か新しいことに挑戦することを提唱する際に、そのような議論をより適切に提示するためのヒントはありますか?
setA
ですか?