プログラミングにおける字下げスタイル(ブロックの改行)に関して
プログラミングにおいての争いは常に絶えない。
言語, エディター, OS, ブラウザの宗教問題やインデントのタブ問題など様々な争いの一つに字下げスタイル(ブロックの括弧の位置)問題がある。
字下げスタイル(ブロックの括弧の位置)問題とは
C, C++, C#, Javaなどの主要な言語でfor文, while文などの処理対象を示す括弧やキーワードで囲まれた領域(ブロック)を字下げ(改行)してから始めるか、しないで始めるかなどのスタイルの好みの問題である。
字下げをしない書き方をK&Rのスタイル, 字下げをする書き方をBSD/オールマン・スタイルと呼ぶ。(厳密にはもう少し細かく分かれることもある。その辺はWikipediaが詳しいので参考にすると良い。)
例えば、C言語で0~9まで標準出力するコードは以下のようになる。
1 2 3 4 5 |
/* BSD/オールマン・スタイル */ for(i=0;i<10;i++) { printf("%d\n",i); } |
1 2 3 4 |
/* K&Rのスタイル */ for(i=0;i<10;i++){ printf("%d\n",i); } |
このように微妙に書き方が異なり、それによって争いが生じる。
※厳密にはK&Rスタイルでは関数のみ改行を行うことがある
では、どちらが良いのか
いきなり結論からいってしまうと、これはあくまで主観だが改行しない方(K&Rのスタイル)が良いと思う。
理由はシンプルで、改行するとスクロール量が多くなってしまうからである。
下にC言語でのint型の変数aが正負どちらなのかを出力するプログラムの例を示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* BSD/オールマン・スタイル */ if(a>0) { printf("%dは正の数です\n",i); } else if(a<0) { printf("%dは負の数です\n",i); } else { printf("値は0です\n"); } |
1 2 3 4 5 6 7 8 |
/* K&Rのスタイル */ if(a>0){ printf("%dは正の数です\n",i); }else if(a<0){ printf("%dは負の数です\n",i); }else{ printf("値は0です\n"); } |
この例では明らかに行数に差が出ている。
画面が大きく、コードの量が大して多くない場合はそこまで困らないが、そうでない時、改行が多いとコードを読み書きするのにいちいちスクロールしなければならない。特にSSHの接続先などの回線が細い場所でコードを編集する場合や低性能なマシン上で編集するときなどにこのスクロールのコストは大きい。
1画面の情報量は多いほうが良い。これが人々が解像度の高いディスプレイを使いたがる理由の1つだ。ブロック単位で改行するのはこの思想に反している。
さらに言えば、改行を余計に入れることでファイルサイズは大きくなってしまう。(大した量ではないが)
ブロック単位で改行をする方がブロックが見やすいという主張があるが、それはその書き方に慣れているからであって、私にとっては改行していない方(K&Rスタイル)が見やすいと感じる。
個人的な思いだが
私からすると、改行する書き方(BSD/オールマン・スタイル)が変に思われて仕方がない(K&Rスタイルの関数でだけ改行すること関しても同様に変だと思う)。
まだブロックが括弧({})で表されていれば読めなくもないのだが、それがキーワード(do〜endなど)で表される場合、以下の例(Ruby)ように可読性は悪くなる。
※厳密に「BSD/オールマン・スタイル」/「K&Rスタイル」と呼べるかどうかはわからない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# BSD/オールマン・スタイル if a>0 then puts("#{i}は正の数です"); elsif a<0 then puts("#{i}は負の数です"); else puts("値は0です"); end # これらは次のように書き換えられる(K&Rスタイル) if a>0 then puts("#{i}は正の数です"); elsif a<0 then puts("#{i}は負の数です"); else puts("値は0です"); end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# BSD/オールマン・スタイル list.each do |item| puts(item) end loop do puts("Hello") end # これらは次のように書き換えられる(K&Rスタイル) list.each do |item| puts(item) end loop do puts("Hello") end |
特にif then〜elsif then〜else〜endではelseだけthenがつかないため、バランスが悪く、非常に不格好である。
昔は、改行しないスタイル(K&Rスタイル)を見ることが多かったが、最近になって改行する人(BSD/オールマン・スタイル)が多くなったように感じる。
この原因はVisualStudioにあると思う。VisualStudioのデフォルトのブロックのフォーマットが改行するようになっているので、それをそのまま使う人が多いのではないか。そして、その変更方法が意外と面倒くさい。
簡単にこの記事を以下にまとめる。
-
ブロックごとに改行をすること(BSD/オールマン・スタイル)はしないとき(K&Rスタイル)に比べて
- 1画面の情報量が少なくなり、スクロール量が多くなる
- ファイルサイズが大きくなる
- 見た目が気持ち悪い
ので、やめましょう。
VisualStudioでの設定の変更方法
VisualStudioのデフォルトのブロックのフォーマットが改行する(BSD/オールマン・スタイル)ようになっているので、その改行をしない(K&Rスタイル)設定にする方法をここに記す。ここではVisualStudio2017を例に用いるが、おそらく他のバージョンでも大差はないと思われる。
- メニューの「ツール」 -> 「オプション」を選択
- 「テキストエディター」を展開
- 設定したい言語を展開
- 「コードスタイル」 -> 「書式設定」 を展開し、「改行」を選択
- 全てのチェックを外す
- 「OK」を押す
少々面倒くさいが、これで設定完了!
下の画像はC#での設定例。
同じカテゴリー(技術メモ)の他の記事を表示
全記事を表示
タグ: プログラミング