空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

隙間に思う。

プログラムを書いていると,コード中に入れるスペースをどうすべきかで,悩むことがある。社内には勿論規約というものがあるのだが,スペースに数に関しては個人の感覚によるところが大きく,議論を煮詰めるとその人の人格否定にまで及んでしまうので,触れないことになっている。周囲のコードに馴染めば何でもいいというのが実際のところなのだが,とりあえず,私の for 文の歴史を振り返ってみる。

  • 学生時代(教科書通りの ANSI スタイル)
for (int i = 0; i < 9; ++i)
{
    :
}
  • 入社一年目(VC6 のスコープの問題で泣く泣く int を外に出す。社内に隙間を空ける風潮があったので,従ってみる)
int i;

for ( i = 0; i < 9; ++i )
{
    :
}
  • 入社二年目(for 文の中に限り,演算子の間にスペースを入れないことにする。なんかクリクリしていい感じ)
int i;

for ( i=0; i<9; ++i )
{
    :
}
  • 入社三年目(括弧の前後にスペースを入れるのはそもそも嫌い。社内の風潮に反してスペースを入れなくなる(笑)。同時に演算子の間のスペースを復活。そうしないと,何だか貧乏くさく思えて。改行節約のため,毛嫌いしていた C,Java 式中括弧も導入。記述コストと見栄えのバランスを考えると,理想に近い。VC6 からも卒業)
for (int i = 0; i < 9; ++i) {
    :
}

この記法の欠点は

for (LongNameClass::InnerContainer::const_iterator itLongIteratorName = m_veryLongContainerInstance.begin(); itLongIteratorName != m_veryLongContainerInstance.end(); ++itLongIteratorName)
   :

みたいなシチュエーションで,どうしても for 文の中で改行が必要になったとき,

for (LongNameClass::InnerContainer::const_iterator itLongIteratorName = m_veryLongContainerInstance.begin();
     itLongIteratorName != m_veryLongContainerInstance.end();
     ++itLongIteratorName) {
    :
}

同じルールだと,ちょっと見にくくなっちゃう。こういう時だけ例外的にどうしても中括弧のあとに改行が必要になり

for (LongNameClass::InnerContainer::const_iterator itLongIteratorName = m_veryLongContainerInstance.begin();
     itLongIteratorName != m_veryLongContainerInstance.end();
     ++itLongIteratorName)
{
    :
}

と,以前の形式を使う必要があるということかな。

一時期は「名前を見ればそれが何を意味しているか分かるように」シンボルを命名するのが流行ったので,当時のプロジェクトにはこういう長ったらしい名前が多いんだけど,最近は「記述コスト」がプログラマのやる気に影響することが分かってきたので,シンプルになりつつある傾向がある。

  • そして2007年の私
for (int i = 0; i < 9; ++i) {
  :
}

インデントが 2 になりそうな予感。インデントは各プロジェクトの規約でキッチリ決まっているものなので,個人のプロジェクト以外は出番はないかもしれないけれど。