web-dev-qa-db-ja.com

なぜswitchステートメントに奇妙なインデントがありますか?

なぜ私見では「case」のインデントが欠落しているのですか-switchステートメントのキーワードは良いスタイルと見なされますか?

ほぼすべてのIDEで、「case」キーワードのインデントはデフォルトのフォーマットオプションではないようです。

switch (i){
case 0:
    break;
case 1:
    break;
}

私はこの形式をより直感的に見つけていますが:

switch (i){
    case 0:
        break;
    case 1:
        break;
}

この背後にある論理はありますか?

66
fasseg

ケースは論理的なラベルです。多くの人は、ラベルを自分が入っているブロックと同じインデントレベルに配置します。私の意見では、そのようにするとテキスト全体を読みやすくなります。

スクロールできるタイムラインと比較します。タイムライン自体にマーカーがあり、コンテンツにインデントされていません。その後、目をベースラインから離さずに、ラベル/マーカーの場所をすばやく指摘できます。

4ワード:no block、indentation.

ケースはブロックを開いていません。 CまたはC++では、switchブロックの先頭に変数宣言を配置することもできます(ただし、静的変数を除き、初期化子は呼び出されません。これは落とし穴です)。 Duffのデバイス のように、switchを使用すると、多くの奇妙なことができます。

したがって、ケースは単なるラベルであるため、インデントすることは直感的ではなく、ほとんどのスタイルでインデントしないことが選択されたスタイルです。

25
kriss

1999年の公式Oracle Java TMプログラミング言語 のコード規約)(= 7.8)では、caseステートメントがswitchステートメント全体に対してインデントされないswitchスタイルを推奨しています。 。

これは主観的な選択ですが、Sunは誰もが1つのスタイルに固執する方が良いと判断し、これを選びました。

10
Johan Kotlinski

さまざまなインデントスタイルから選択できます。私の知る限り、インデントスタイルを一貫して使用している限り、他のスタイルよりも優れたスタイルとはみなされません。私にとって、caseラベルのインデントはより読みやすく、クラス内のprivateprotectedおよびpublicラベルについても同じですが、my IDEは、私の方法ではインデントを行いません。

5
mingos

おそらく、if statmentsで表される論理的に同等のインデントレベルを維持するためでしょうか。あれは:

switch(i){
case 0:
  //do something 1
case 1:
  //do something 2
}

論理的に同等のように見えるでしょう:

if(i==0){
  //do something 1
}else if(i==1){
  //do something 2
}
4
rodion