web-dev-qa-db-ja.com

演算子の前/後の改行

SunのJavaコード規約では、演算子の前に改行を置くことを推奨していますが、他の多くのガイドラインはそれに同意していません。明らかな長所と短所は見られないので、これらのスタイルのいずれかを使用する利点があります。別?

String longVarName = a + b + c + d +
          e + f;

String longVarName = a + b + c + d
          + e + f;
31
Nutel

私はそれを1行に残し、意図を明らかにする変数名(および関数)の観点から読みやすさについて考えます。

乱雑になったら、次はrefactorです。

  • 変数の名前を変更する
  • 新しい変数/関数を導入する

subtotal = price * (100 + tax_ratio) / 100

vs.

tax = price * tax_ratio / 100
subtotal = price + tax
16
Kamil Tomšík

私は通常、最も一般的に使用されるスタイルガイドラインまたは特定のコーディング標準ツールに従います。一般的に使用されるスタイルを使用する利点は、他の人のコードを読んだり、スタイルガイドラインが設定されているオープンソースプロジェクトに参加したりするときに利点があります。

私が見た最も一般的なスタイルは、質問の2番目のスタイルです。それらのリストについては、以下を参照してください。

Googleスタイルガイド

非代入演算子で行が分割されると、改行は記号の前に来ます。

Sunコーディング規約

オペレーターの前で休憩

Checkstyle Operator Wrap check 's default value is nl:

オペレーターは改行する必要があります

37
ceilfors

読みやすさが議論であると想像できます

result = longidentifier +
   short -
   alittlelonger -
   c;

versus

result = longidentifier
   + short
   - alittlelonger
   - c;

2番目の例では、演算子がうまく並んでおり、変数が方程式に入る符号を簡単に確認できます。これは二項演算子についても理にかなっていると思いますが、中括弧などを使用する場合は、より明確なものを実行する必要があります。

37

コードでは、演算子の後に改行を入れる傾向があります。

foo = some_long_expression() +
      some_other_long_expression();

ここで、行末のぶら下がり演算子は、コードが続いていることを読者に示す大きな手がかりです。ステートメントターミネータを持たない言語では、ダングリングオペレーターは、コードが継続するコンパイラー/インタープリターへの十分な手掛かりとして機能します(それ以外の場合は、醜い継続行構成を使用する必要があります)。

その式を文書化するとき(文書化が必要な場合)、私は演算子の前に区切りを置く傾向があります。

10
David Hammen

行は、ブレークしたいステートメントの解析ツリーの最も高い記号で始まる必要があると思います。式で最も重要な演算子を強調表示します。 elseを前の行の終わりではなく行の最初に置くのと同じ理由です。

次の例では、左マージンをスキャンして、ステートメントの構造をOR 3つの式で表しています。

if (ch>='A' && ch<='Z'
    || ch>='a' && ch<='z'
    || ch>='0' && ch<='9')
{...}

以下、||演算子はそれほど強調されていません。 ||それは明白ではありません||式の。特に線の長さが異なる場合。

if (ch>='A' && ch<='Z' ||
    ch>='a' && ch<='z' ||
    ch>='0' && ch<='9')
{...}

参考までに、これは非常に間違っています。 ||演算子は強調表示されていません。

if ( ch>='A' && ch<='Z' || ch>='a'
     && ch<='z' || ch>='0' && ch<='9')
{...}

行の先頭にコンマを付けるのも好きですが、あまり見かけません。私は共有コードでそれをすることを控えます。

var note:Object =
    { key: key
    , type: 'P'
    , text: someLongProcedureCallGettingTheUserInitials()
       + ": " + getTheTextThatWasTyped()
    };
3
Florian F

首尾一貫している限り、どちらにしても本当の利点はないことを知ってください。これは、コードのマージと空白を考慮するときに特に重要です。

3
Martijn Verburg

長い算術方程式の場合、私は通常2つのことの1つを行います。

すべてを1行に残します。

foo = bar + baz - fizz + buzz + alpha - beta;

私は通常、これをonly加算および減算を含む方程式に対して実行します。演算子のスコープを著しく混乱させる可能性のある乗算および除算を含むタイプミスを作成するのは非常に簡単です。

私が使用する2番目の形式はプログレッシブ演算子です。

foo = bar;
foo += baz;
foo -= fizz;
foo += buzz;
foo /= alpha - beta;
foo *= spiff;

目立った方法でパフォーマンスを改善できることが証明されない限り、1行に短縮する理由はありません。さらに、どこで何が起こっているかについてのあいまいさはなく、/演算子と*演算子の括弧を間違える機会はほとんどありません。

2
zzzzBov

行の先頭に連結文字(または任意の演算子)を配置すると、読みやすくなります。各行の先頭に注目してコードをスキャンします。行が演算子で始まる場合、読者はその1文字をスキャンすることにより、その行が前のステートメントの続きであることを認識できます。

長い数式は常にタイプセットされるため、新しい行はそれぞれ演算子で始まります。コードがこの規則に従わなければならない理由はありません。

2
kevin cline

式を1行にして、長くなりすぎる場合は、より小さな式に分割します。

days = ((year * months_per_year) + month) * days_per_month + day

になる:

months = year * months_per_year + month
days = months * days_per_month + day

これが不可能な場合は、演算子の前で中断する方が読みやすく、演算子を前の代入のすぐ下から開始するようにします(変数の下に置くと、考え直しなければならないため、目的がわずらわしいです。物事を読みやすくすることです):

random = years * months_per_year 
         + month * days_per_month 
         + day * hours_per_day 
         + hour * minutes_per_hour 
         + minute * seconds_per_minute 
         + second
0
Joel