定型コードを支持する1つの論点は、1か所でコードを変更しても、コードの1つのフローにしか影響しないということです。これは、多くの場合よりも、実際に変更を使用するコードのすべての部分に影響を与える必要があるという事実とのバランスを取る必要があります。しかし、私は議論をサポートするまれな例を見てきました。
あなたが言うコードの部分があるとしましょう
public ForTheBar(Foo foo)
{
Bar bar = foo.bar();
return bar.BeFooed();
}
これは、コードの約2箇所で使用されます。
ある日、誰かがやって来て、「OK、この道だけで、Fooingする前にバーをGrommitしてほしい」と言います。
そして、あなたは「まあこれは簡単だ」と思う。
public ForTheBar(Foo foo, bool shouldIGrommit)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
return bar.BeFooed();
}
その後、ユーザーはいくつかの新しい機能を追加し、FooTheBarにうまく適合すると考えています。そして、あなたはそれをFooする前にそのバーをグロミットするべきかどうかを彼らに忠実に尋ねると、彼らは「今回は違う」と言います。
したがって、上記のメソッドを呼び出すだけです。
しかし、ユーザーは「OK、待ってください。3番目のケースでは、BeFooedを呼び出す前にバーを落書きしてほしい」と言います。
問題ありません、私はそれができると思います。
public ForTheBar(Foo foo, bool shouldIGrommit, bool shouldIDoodle)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
if (shouldIDoodle)
{
bar.BeDoodled();
}
return bar.BeFooed();
}
突然、コードが定型化されなくなります。おそらく、繰り返される2行のコードを受け入れる必要があります。今では、2〜3行のコードが3つあり、これ以上繰り返されることはありません。
これはすべて、「これは一般的なケースではありませんが、発生した場合はリファクタリングできます」と反論します。
最近聞いたもう1つの議論は、定型コードがコードのナビゲートに役立つことがあるということです。私たちが議論していた例は、大量のボイラープレートマッピングコードを削除し、AutoMapperに置き換えた場所でした。さて、すべてが規約に基づいているため、IDEに「このプロパティはどこにあるのか」と言うことはできず、それを知っていると期待することはできません。
IoCコンテナについても同様のことを議論する人がいます。
私は彼らに同意するとは言いませんが、それでも公正な議論です。