字下げ(インデント)について
字下げ(インデント)についてです.何文字に設定すれば良いか,宗教論争的になる場合も多々あります.私見を述べます.
まず,字下げにを二種類に分けます.
- 制御構造を表す字下げ
- 見栄えを整える字下げ
本来,字下げとは「制御構造を表す」もののみを指すべきなのでしょう.しかし,コードが右にずれていれば全部字下げと認識している人もいるようなので,二種類に分けました.そして,「制御構造を表す字下げ」にはタブを,「見栄えを整える字下げ」には空白を使います.例をあげます.
main()
{
if(thisIsVeryLongLongNameFunctionWithManyArgument(FirstArgumentNameIsLong,
SecondArgumentNameIsSoLong,
ThirdArgumentNameIsLongToo){
doSomething();
}
else if(thisIsShort()){
doOther();
}
}
わかりやすいようにタブと空白を表示してみます.タブは‘→’空白は‘_’で表します.
main()
{
→if(thisIsVeryLongLongNameFunctionWithManyArgument(FirstArgumentNameIsLong,
→__________________________________________________SecondArgumentNameIsSoLong,
→__________________________________________________ThirdArgumentNameIsLongToo){
→→doSomething();
→}
→else if(thisIsShort()){
→→doOther();
→}
}
main()
の次にある{
から}
までの字下げはmain関数の制御構造を表す字下げですのでタブを使います.関数thisIsVeryLongNameFunctionWithManyArgument
の引数を合わせているのは見栄えを整えるための字下げです.したがって,空白を埋めます.関数doSomething()
の前の字下げはif
の制御構造を表すものなのでタブです.
制御構造を表す字下げなのか,見栄えを整える字下げなのか判断がつきにくい場合は,タブの文字数を変えてみましょう.その結果,表示が乱れた場所は,制御構造を表す字下げと見栄えを整える字下げを混同している可能性があります.例えば,上記プログラムのタブを4文字にしてみましょう.もし,タブと空白をきちんと使い分けていれば,こうなります.
main()
{
if(thisIsVeryLongLongNameFunctionWithManyArgument(FirstArgumentNameIsLong,
SecondArgumentNameIsSoLong,
ThirdArgumentNameIsLongToo){
doSomething();
}
else if(thisIsShort()){
doOther();
}
}
もし,制御構造を表す閉じカッコ}
の字下げが,タブではなく空白2文字だったらこうなります.
main()
{
if(thisIsVeryLongLongNameFunctionWithManyArgument(FirstArgumentNameIsLong,
SecondArgumentNameIsSoLong,
ThirdArgumentNameIsLongToo){
doSomething();
} //空白2文字の字下げなので,空白4文字で表示したタブとは合わない
else if(thisIsShort()){
doOther();
} //空白2文字の字下げなので,空白4文字で表示したタブとは合わない
}
「タブでは,エディタの設定によって表示する文字数が異なり,見栄えが違う」と言う人もいます.「エディタの設定によって表示する文字数が異なり,見栄えが違う」と何か問題があるのでしょうか?その人が,その文字数でタブを表示すれば見やすいと思って,そういう設定にしているのです.それを,そのソースを見ない別人が「その文字数では見にくい.オレのやり方が一番」と決めるのは傲慢です.
大切なのは,「プログラムの制御構造を表すため,字下げを行っている」という事実と「プログラムの制御構造を表す字下げをn文字で表示する」という表示方法を分けることです.そして,どのように表示すれば見やすいのかをそのソースを見る人が自由に(自己の責任で)設定できるようにすることです.