演算子の前後の改行[終了]


29

SunのJavaコードの規則では、演算子の前に改行を配置することが提案されていますが、他の多くのガイドラインは改行に同意しません。明らかな長所と短所はないので、これらのスタイルの1つを別のスタイルよりも使用する利点はありますか?

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

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

両方の規則を示す簡単なコード例を投稿してください。
マイケル

まず、私はこのようなものを使用して状況を回避しようとする:download.oracle.com/javase/1.4.2/docs/api/java/lang/...
仕事を

リンクが壊れています。
フロリアンF 14

回答:


14

一行にしておき、意図を明らかにする変数名(および関数)の観点から読みやすさを考えます。

面倒になったら、リファクタリングします。

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

subtotal = price * (100 + tax_ratio) / 100`

tax = price * tax_ratio / 100
subtotal = price + tax

2
左側の式は間違っています。パーセントであるか小数であるかに応じて、どちらかprice * (100 + tax_ratio) / 100またはちょうどprice * (1 + tax_ratio)でなければなりませんtax_ratio
ラッフルウィンド14

4
これは質問に答えません。これらのタイプの返信に対する法律があるはずです。
エドワードD'Souza

@ EdwardD'Souza私も同じように感じています。しかし、なぜ答えは受け入れられましたか?
ルディ・フィッサーズ

@RudyVissersの答えは、問題をより深いレベルで解決します。そもそも改行する必要があるという問題を解決します。その観点から、OPはそれを彼または彼女の問題に対する答えと考えることができますが、コミュニティWikiであるという観点からはまだ適切ではありません。
エドワードD'Souza

ちょっと、私はもうここにはいませんが、本当に簡単です-もしあなたがそのような状況に自分自身を見つけたら、おそらくあなたはそれを間違っているでしょう、あなたはむしろコードをリファクタリングすることを考えるべきです単に私がケアではなく、コードをわかりやすく、シンプル&私を助けるために他の人のために簡単にそれを作るで何をすべきか、もうそのようなことを気にしない
カミルTomšík

36

可読性が議論であると想像できます

result = longidentifier +
   short -
   alittlelonger -
   c;

result = longidentifier
   + short
   - alittlelonger
   - c;

2番目の例では、演算子がきちんと並んでおり、変数が方程式に入る記号を簡単に確認できます。これは二項演算子にも意味があると思いますが、ブレースなどを使用すると、より明確なことを行う必要があります。


4
あなたが言ったように、それがはるかに読みやすいので、演算子が重要な状況(数式など)の場合、2番を選択します。しかし、文字列の場合、演算子は「無意味」なので、最初のオプションを選択します。文字列をまとめること以外は何もしません。文字列は重要なビットなので、最初のオプションを好むでしょう。
ニクラスH

どちらの場合にもメリットがあります。どちらの場合も、すべてを1つの非常に長い行に配置するよりも優れています。私の好みは、開始時に開始ブラケットを使用し(必要ではない場合)、その下にすべてを揃えることです。それははるかに明白になります。
すぐに

35

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

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

Googleスタイルガイド

代入演算子以外で行が切れると、記号の前に切れ目が来ます。

サンコーディング規約

演算子の前で中断する

Checkstyle Operator Wrap checkデフォルト値はnlです。

演算子は改行する必要があります


2
わかりやすくするために私の回答を更新しました+ Sunのコーディング規約。
ceilfors 14

google.github.io/styleguide/javaguide.html(回答のリンクが壊れています)
マーティンPfeffer

10

コードでは、演算子の後にブレークを配置する傾向があります。

foo = some_long_expression() +
      some_other_long_expression();

ここで、行の終わりにあるぶら下がり演算子は、コードが続くことを読者に伝える大きな手がかりです。ステートメントターミネータを持たない言語では、そのぶら下がり演算子は、コンパイラ/インタープリタがコードを継続するための十分な手がかりとして機能します(そうでなければ、Iい継続行構造を使用する必要があります)。

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


少なくとも一部の言語(Pythonなど)では、行が続くことを示すヒントとして後続のバイナリ演算子を使用しませんが、それ以上が必要です。通常、括弧内の改行はカウントされないため、明示的な(エラーが発生しやすい)行継続文字は必要ないことに注意してください。

3

あなたが一貫性を保っている限り、どちらの方法でも本当の利点がないことを知ってください。これは、コードのマージと空白を考慮する場合に特に重要です。


3

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

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

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

2

長い算術方程式の場合、通常、次の2つのいずれかを実行します。

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

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

私は通常、加算と減算のみを含む方程式に対してこれを行います。演算子のスコープをひどく混乱させる可能性のある乗算と除算のタイプミスをするのは非常に簡単です。

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

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

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


2

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

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


0

式を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

1
この答えは、既に述べたことに新しいものを追加するものではありません。
マーティンピーターズ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.