Jun 06, 2012

コーディングスタイル

自分のコーディングスタイル晒しの続き。

空白
linux コーディング規約とは若干異なっている。
基本的に余計な空白はなるべく入れない様にしているので、 ifswitchcasefordowhile の後ろに空白は入れない。 それ以外は linux コーディング規約とほぼ同様だと思う。
2 項演算子や3 項演算子の演算子の前後には空白を入れるが、 例外的に for 文の中では演算子の前後に空白を入れていない。
    /* 2 項演算子 */
    i = j * 2;

    /* 3 項演算子 */
    x = x < y ? x : y;

    /* if 文 */
    if(condition)
        do_condition();

    /* for 文 */
    for(i=0; i<max; i++)
        do_loop();
            

名前の選択
これも linux コーディング規約に賛成。
例えばループのインデックスに利用するローカル変数は ij で十分だと思う。
基本的にローカル変数は単純な名前で十分意味が通じると思うし、 変数名を工夫して可読性を高める必要があるのであれば、 そもそも関数のサイズやロジックを見直す必要があると思う。
それから、変数名に長めの英単語や英単語の組み合わせを使う場合に 特に我々が気をつけたいのはスペルミスだと思う。 他人に見られる可能性があるならせめて正しいスペルにするべき。 変な名前の変数だと逆に意味不明になりかねないし、 そもそも見る方も見られる方も恥ずかしい。
ハンガリアン記法に反対している部分も大賛成で、 コンパイラ言語ではコンパイラが正しく判断してくれる情報を わざわざ変数名に付けても得られる事は殆どないと思う。

typedef
linux コーディング規約とは若干異なっていて、 基本的には typedef で実態を隠蔽する方法を多用する。
fopen (3)fclose (3) の様に パラメタを全て隠蔽した上で閉じたインタフェイスを提供した方が 使い方や記述がすっきりするのは勿論の事、 保守性も可読性も向上すると思っているので、 基本的には typedef したインタフェイス設計をする事が多い。
当然 typedef した場合はメンバーを完全に隠蔽するので、 例えば構造体を typedef した場合に、 構造体のメンバーに直接アクセスする様な事は絶対にしない。

関数
これも linux コーディング規約に賛成。
そもそも数学的な関数とは 入力値に対して一意な値を決定する規則の事なので、 プログラミングにおける関数も同様に、 単純に単一の事だけを実行して値を返すべきだと思う。
そのためにも関数の大きさはできれば 10 ~ 20 行程度、 長くても 50 行以内にはまとめたいと思う。

goto 文
これも linux コーディング規約に賛成。
何が何でも goto を嫌う人もいるが、 場合や使い方によってはとても便利だし可読性も高くなる。
linux コーディング規約では終了処理の共通化が上げられているが、 他にも多重ループの内側から全てのループを抜ける際などにも便利。
    while(condition1){
        while(condition2){
            if(anyconditions){
                do_something();
                break;
            }
            else if(otherconditions){
                do_anything();
                goto END;
            }
        }
    }
END:
    next_statement;
            
たとえば上記の処理を goto 使わないで実現すると、 変なフラグ変数を利用して内側のループ終了で フラグを判定する処理などが必要になるので却って煩雑になる。 なお、別解としてループ全体を関数とする方法もあり、 処理によっては関数化の方がより一層エレガントな場合もある。

最初に c に触れた時に参考にしたのは『初めての C』だったが、 この書籍はずぶの素人への入門としてはそれほど悪くなかった様に思う。 その後、『プログラミング言語 C』(いわゆる K & R) で 基本的なコーディングスタイルなどをほぼ独習した形なので、 それなりに独自のスタイルでコーディングしているのだと改めて思う。 独自のスタイルな事の言い訳ではないのだが、 自分のスタイルで統一した書き方のソースであれば、 多少独特な書き方でもそれほど見づらくはないと思う。
特にコーディングに自由度が高い c の場合、 絶対的に正しいスタイルなど存在しないと思うので、 常識的な範囲でそれぞれが独自のスタイルを作れば良いのではないだろうか。

追記

本文中での 3 項演算子 は一般名称として ternary operator の意味で 2 項演算子(binary operator) との対比として使用している。
c では条件演算子(conditional operator) `?:' が 唯一の 3項演算子なので 条件演算子 `?:' の事を 3 項演算子と呼ぶ人も多くいる様だが、 厳密には意味が異なるので要注意。

Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.