コードの簡潔さや読みやすさを好みますか?[閉まっている]


21

言語のショートカットを使用して、コードをより簡潔にすることができます。

たとえば、三項およびヌルの合体演算子はコードの量を減らすことができますが、間違いなく読みやすさを損ないます:

C#の場合:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

機能的に同等です:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

しかし、明らかにもっと冗長です。

簡潔さと読みやすさの点では、どこで線を引きますか?


3
これは主観的な質問であり、何かを実装した人は自分のやり方が理にかなっていると言い、それを読んでいる人はそれは意味がないと言い、別の人はそれを読んでいると言いますが、私は別の方法を好みます。これは単に好みです。
クリス

20
2番目のバージョンの方が読みやすいと思います。
ヴァイバフ

2
あなたは簡潔さと簡潔さを混同しています。簡潔さは読みやすさを向上させます。簡潔さはそれを損なう。
フェルッチョ

1
@ThorbjørnRavnAndersen:通常、C#コードの対象読者は「C#の背景を持つ開発者」です。私が見てきたことから、ここのprogrammers.seに関するコンセンサスは、誰かがそれらに精通していないかもしれないという理由だけで、有用な言語機能の使用を避けるべきではないようです。(programmers.stackexchange.com/q/101513/33843も参照してください
Heinzi

1
duplicate ?: Programmers.stackexchange.com/q/58630/15464 ..ああ、これは古いです。:)
スティーブンジュリス

回答:


63

両方。

あなたの最初の例は確かにより冗長で、間違いなくより明確です...しかし、それはまた、1行ではなく5行をスキャンすることを必要とします。さらに悪いことに、それはその目的を強調しません-に値を割り当てますnewGuy.Boss

あなたの2番目の例は、null合体演算子に慣れていない場合は1秒かかりますが、その目的については間違いなく、値のソースを探してより大きなルーチンをスキャンしている場合、これを簡単に選択できるようにしてください。

今、これを対比してください:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

... with:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

後者の例もやはりはるかに短いですが、同じテストによってトリガーされたタスクが明確に見えるようにすることで、目的がわかりにくくなりました。ここでは、前者の冗長性が正当化されていると感じています。


3
素晴らしい答えです!-目的に関することほど冗長ではありません。
ダモビサ

2
@Damovisa:まさに-コードの目標はコミュニケーションであり、これを可能な限り簡潔に(ただしそれ以上)してはならない一般的な理由はありません。
Shog9

1
nullの合体演算子を学習するには1秒以上かかりますが、それを知らない場合は学習する必要があります。
ケースバッシュ

2
ああ「??」Javaではいいでしょう。

最後の例はコードの面では短くなっていますが、実際bossには冗長な例では1回だけではなく3回評価されています。これは、短くするためだけにコードを短くするのが悪い考えであるもう1つの理由です。読みやすさ/保守性(複雑なコードの場合)であれ、パフォーマンス(内部ループの重要なセクションの場合など)であれ、簡潔さは主要な目的の2番目であると思います。言い換えれば、1bpsの接続でコードを送信する予定がない限り、簡潔にするために純粋に最適化しないでください;)
user193130 14年

16

両方とも良い目標ですが、どちらかを選択せざるを得ない場合は、常に可読性を維持します。

私はあなたの例が読みやすさ簡潔さの両方を改善すると主張します。ただし、以下を考慮してください。

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();

後者は簡潔ですが、読み通すのは困難です。前者は冗長ですが、論理の流れは明確です。

最終的に、簡潔さは、画面にもっと収まる能力以外の目的にはあまり役立ちません。読みやすさはデバッグを容易にするため、一般的に推奨されます。


11
適切なフォーマットは、2番目の例の読みやすさを簡単に改善できます。これは不公平な比較です。このようにフォーマットされたとき、私はそれがそんなに悪いのかどうかまったくわかりません。
スティーブンジュリス

コードサンプルは同等ではありません?? whatever.something。最初のサンプルはありません。
ジョンB.ランベ

11

原則として、簡潔さのために読みやすさを犠牲にすることは決してありませんが、その主題に関する知識の不足を別のプログラマーに基づいて読みやすさを判断することはありません。

簡潔さと読みやすさは反対ではありません。この答えのように、短いほうが読みやすい場合があります。


4
+1は、他のプログラマの知識不足を想定していないためです。この例では、2番目のオプションは、null合体演算子に精通していない場合にのみ読みにくくなります。私は同僚が言語構文を知らないという仮定に基づいてコードを書くことは決してありません。彼らが何を??意味するのか知らなくても、私がそれを使ってそれを学べば、私たちは両方の恩恵を受けました。それはmsdn.comの「??演算子」を入力するのは難しいようにし、そうではありません
ティム・グッドマン

4

私は読みやすさを好みますが、それは時々簡潔なコードを使用することを意味します。(つまり、より大きな条件ブロック内の比較的単純な条件の3項です。)

基本的に、理解するのが不必要に難しい場合は、しないでください。


3

コードは最初に書かれたよりも頻繁に変更されるため、簡潔さと矛盾する場合は、可読性が最初になります。一方:

  1. 構文ノイズと定型コードは、意図をあいまいにして読みやすさを損なうことがよくあります。簡潔なコードの方が読みやすい場合もあります。たとえば、ラムダ関数またはデリゲート/ファーストクラス関数と、シングルメソッドインターフェイスを実装するシングルメソッドクラスを考えてください。

  2. 最小の共通分母のみを知っているやっかいな能力を持つコードモンキーではなく、言語とその独自の/高度な機能を十分に理解しているかなり経験豊富なプログラマーにとって、コードの読みやすさに基づいて読みやすさを評価する必要があります。


2

私がまだ言及していないと思われる一面:あなたの目標は何ですか?

仕事のセキュリティだけが気になるなら、他のすべてよりも簡潔さとコンパクトさを求めてください。コードへのコメントもスキップします。

クールな新しいプロジェクトで作業しているときにコードを簡単に他の人に引き渡すことができるようにしたい場合は、読みやすさ、明快さ、しっかりしたコメントを求めてください。

注:上記は個人に関するものではありません、@ Damovisa。2つのポジションの間で選択する人のためです。


それは仕事の安全保障のように聞こえますが、プログラマになりたいのなら、それは間違った会社の仕事の安全保障です...;)
Alois Mahdal

2

冗長バージョンには利点として1つあります。

より多くの行があり、ほとんどのデバッガーは行指向です!式の途中にブレークポイントを設定することは非常に困難ですが、通常はブロックステートメント内に設定するのは簡単です。

言い換えれば、デバッガーをいつ起動させるかをエディターで確認したいのはboss == nullどれですか?

(つまり、私は??-演算子が好きだと言った)


0

読みやすさは最初に来る必要があり、長期的にはほとんどの人が既存のコードの変更または拡張に最も時間を費やします-読みやすさは保守性の大部分です。

とはいえ、簡潔さは読みやすさに貢献できるものです。たとえば、あなたの質問では、2番目のスニペットはより読みやすく、簡潔です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.