ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
プログラミングのはなし

パラメータに代入してはいけない!

関数の内部で、受け取ったパラメータ(仮引き数)に平気で代入しているコードをよく見かけます。まずは悪い例を見て下さい。

SAMPLE
CODE
int f( int a, int b )
    a += b;
    return a;
}

要するに足し算をしているだけなので、関数にする意味は全くないのですが、例はシンプルな方が良いでしょう?だから return a+b; でいいじゃないかなどというツッコミはやめてください。

さて、問題なのは、パラメータである a に代入しているということです。しかし、上のコードを見ただけではなぜそれが悪いのかわからないかもしれません。それは、もう一つの重要な問題が潜んでいるからです。すなわち、識別子に適切な名前をつけていないということです。ともかく、まずはこちらの問題を解決してしまいましょう。

SAMPLE
CODE
int Add( int LHS, int RHS )
    LHS += RHS;
    return LHS;
}

これでだいぶましになりました。関数が足し算のためのものであるということが明確になりましたし、それぞれのパラメータの意味もわかります。LHS は Left Hand Side(左側)の略、RHS は Right Hand Side(右側)の略です。

問題はパラメータ LHS に対して代入が行われているということでした。そして、識別子に適切な名前をつけることによって、もはやなぜそれが問題なのかが浮きぼりにされました(わかりますか?)。

LHS という変数は「左側の値を格納する」という目的の為に存在している変数のはずです。そこに右側の値を足した結果を代入してしまっては、意味が変わってしまいます。それが問題なのです。今はごく短いプログラムなので良いですが、もっと大きな関数でこのようなことをするとかなりの混乱をきたすでしょう。そんな関数をあとになって改造することになった場合を考えてみて下さい。せっかく変数にわかりやすい名前がついていても、その値が表す意味が名前とかけ離れていたのでは逆効果ですね。

そこで、つぎのようにします。

SAMPLE
CODE
int Add( int LHS, int RHS )
    int nAdded = LHS + RHS;
    return nAdded;
}
これなら変数名とその値との間に矛盾がないし、なにより理解しやすいですね。

(「プログラミングのはなし」は1998年1月から1999年1月にかけて作成されたコンテンツです。)