Entry

三項演算子を進んで使うべきか問題について

2008年01月30日

あちこちのプログラミング本……というか,プログラミング作法本を読んでいて思うんですけれど,三項演算子を進んで使うべきかどうかで,地味に意見の対立があるように思えます。三項演算子というのは,こういうもん。

int value = some_flag ? some_value : -1;

これは次と同じ意味です。

int value;
if (some_flag) {
    value = some_value;
} else {
    value = -1;
}

`?' の前にある値(some_flag)が真のときは,`:' の前にある値(some_value)を評価して,偽の時は `:' の後にある値(-1)を評価する演算子です。条件に応じて初期化の初期値を変えるときなんかは,1行で書けるので,あたしゃよく使ってます。

で,これなんですけど,たしか『C++ Coding Standards』では推奨していた覚えがあります。ちょっと手元に出典がないんで,あやふやなんですが。

C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in‐depth series)
C++ Coding Standards ...
posted with amazlet on 08.01.30
ハーブ サッター アンドレイ アレキサンドレスク 浜田 真理 浜田 光之
ピアソンエデュケーション (2005/10)
売り上げランキング: 61219
おすすめ度の平均: 5.0
5 さすがのでき
5 上級者には心得集、中級者にはポインタとして
5 この二人以上にC++について語れますか?

一方で,巷には三項演算子は「わかりづらくなる」から禁止,という話も。これは特に,チーム開発に携わっている方から聞く話。三項演算子はルール(文法)ですから,知らなかったら意味を理解することができません。プログラミングの初心者さんでも,if-文は知っているもんだから,分かりやすい方法で書くべきだ,といった具合です。

チーム開発の場合,プログラミングの水準が割と単純(かつ(人によっては)冗長)になる傾向があるんじゃないかと思っていて,三項演算子も「複雑な構文」のひとつに数えられているんじゃないかと思うことがあります。OSS はそうでもないかな……。

複雑な構文というと,例えば,C のメモリ割り当てで,

if ((ptr = (struct some_struct *) malloc(sizeof(struct some_struct))) == NULL) {
    exit(-1);
}

こんな書き方をしちゃダメ,ってとこもあります。割とよく見るんですけどね。つまり,こう書け,と。

ptr = (struct some_struct *) malloc(sizeof(struct some_struct));
if (ptr == NULL) {
    exit(-1);
}

あるいは,こういうのもダメ。

while ((ch = getchar()) != EOF) {
    putchar(ch);
}

プログラムにはイディオムみたいなもんがあって,読む単位が個別の文法よりも広くなることがあります。例えば,「while ((ch = getchar()) != EOF) ……」だったら,「標準入力から1文字読んで……」みたいな理解はしないわけで,「標準入力から終端まで1文字ずつ処理する」といった「ひとつの」命令として理解すると思うんですね。もっとも,この単位は,人によってまちまちだから,どれが最適なイディオムか,ってな話はできないんだと思います。

ただ,ひとまとまりのイディオムをばらして,個別の文法に還元したら読みやすくなるか,といったら,それはそうとも限らない気がします。せっかくひとまとまりの単位があったのに,細かい単位に分けると,その分だけ論理を追う手間が増えるからです。冒頭の三項演算子と等価の if-文なんかは,「初期化処理」だけでなく,「何かしらの制御」を行っている可能性も考慮に入れて読まなくちゃいけなくなります。これが重なると読むのが非常に面倒っちい。

というわけで,三項演算子を使うのにも,それなりの理由がある,と……。結局,個別の文法が分かりやすくなったところで,それはそれで,オーバーヘッドになったりすんじゃないかなー……ということ。ぐにゃぐにゃ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN