あなたはあなたのコードの簡潔さや読みやすさを好みますか? [閉まっている
https://softwareengineering.stackexchange.com/questions/1090
-
16-10-2019 - |
質問
言語のショートカットは、多くの場合、コードをより簡潔にするために使用できます。
たとえば、TernaryおよびNullの合体演算子はコードの量を減らすことができますが、おそらく読みやすさを損なうことになります。
C#:
Person newGuy = new Person();
if (boss == null) {
newGuy.Boss = GetDefaultBoss();
} else {
newGuy.Boss = boss;
}
機能的には次のとおりです。
Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();
しかし、明らかにはるかに冗長です。
Conciseness vs Readabilityに関しては、どこにラインを描きますか?
解決
両方。
あなたの最初の例は確かにより冗長であり、間違いなくより明示的です...しかし、それはまた、1つではなく5行をスキャンする必要があります。さらに悪いことに、それはその目的を強調しています - 値を割り当てる newGuy.Boss
.
2番目の例は、Null Coulescingオペレーターに不慣れな場合は1秒かかる場合がありますが、その目的については疑いの余地がありません。価値のソースを探しているより大きなルーチンをスキャンしている場合は、これを選ぶのはずっと簡単です。
さて、これを対比してください:
if (boss == null) {
newGuy.Boss = GetDefaultBoss();
newGuy.IsTemp = true;
newGuy.AddTask("orientation");
} else {
newGuy.Boss = boss;
newGuy.IsTemp = false;
}
...と:
newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");
後者の例は再びはるかに短くなりますが、今では同じテストによってトリガーされるタスクを明確にすることで目的を曖昧にしています。ここで、私は前者の冗長が正当化されていると感じています。
他のヒント
どちらも良い目標ですが、私はいつも味方します 読みやすさ 1つを選択することを余儀なくされたとき。
私はあなたの例が両方の読みやすさを改善すると主張します と 簡潔。ただし、考えてみてください。
if( a > b )
{
foo = bar
}
else
{
if( c.isThing() ){
foo = somethingElse;
}
else{
foo = someFurtherThing.GetFoo();
}
}
とは対照的に
foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();
後者は簡潔ですが、読み通すのは困難です。前者は冗長ですが、論理の流れは明らかです。
最終的に、Brevityは、画面にもっと適合する能力を除いて、あまり目的に役立ちません。読みやすさによりデバッグが容易になるため、一般的に推奨される必要があります。
一般的なルールは、簡潔さのために読みやすさを犠牲にすることは決してないと言うでしょうが、他のプログラマーがその主題に関する知識の欠如に基づいて読みやすさを判断することはありません。
簡潔さと読みやすさは反対ではありません。この答えのように、時には短くなると読みやすくなります。
私は読みやすさを好むと言うでしょうが、それは時には簡潔なコードを使用することを意味します。 (つまり、より大きな条件ブロック内の比較的単純な条件の場合。)
基本的に、それが不必要に理解するのが難しい場合は、それをしないでください。
コードは最初に書かれているよりも頻繁に変更されるため、読みやすさが簡潔さと競合する場所で最初に行われます。一方で:
構文ノイズとボイラープレートコードは、しばしば意図をあいまいにし、したがって読みやすさを傷つけます。より簡潔なコードも読みやすくなる場合があります。たとえば、Lambda関数または代表者/一流の関数と単一メソッドインターフェイスを実装する単一メソッドクラスを考えてください。
読みやすさは、言語とそのユニークな/高度な機能をかなりよく知っている合理的な経験豊富なプログラマーのコードがどれほど簡単であるかに基づいて評価する必要があります。
私がまだ言及されていないと思う一つの側面:何ですか あなたの 目標?
あなたが気にするのは仕事のセキュリティだけであるなら、他のすべてに対する簡潔さとコンパクトさを求めてください。コードのコメントもスキップします。
クールな新しいプロジェクトに取り組みながら、他の人に簡単にコードを配りできるようにしたい場合は、読みやすさ、明確さ、多くのしっかりしたコメントを求めてください。
注:上記は個人的には@damovisaではありません。それは、2つのポジションを選択する人のためです。
冗長なバージョンには利点があることが1つあります。
より多くのラインがあり、ほとんどのデバッガーはそうです ライン指向!表現の途中にブレークポイントを設定することは非常に困難ですが、通常、ブロックステートメント内に設定するのは簡単に簡単です。
言い換えれば、デバッガーがいつキックインしたいのなら、あなたはあなたの編集者にどちらを見たいですか boss == null
?
(それは私が?? - オペレーターが好きだと言った)
読みやすさが最初に来るはずです。長期のほとんどの人は、ほとんどの人に既存のコードの変更または拡張に費やしています。読みやすさは保守性の大きな部分です。
とはいえ、簡潔さは読みやすさに貢献できるものです。たとえば、あなたの質問では、2番目のスニペットはより読みやすく、より簡潔です。