Endowsの日記: Endows の へっぽこプログラマ日誌 第9回 4
日記 by
Endows
01 int func(int a, int b){
02
03 int ret_val = 1;
05
06 if( (ret_val = (a == b)) == 1 ){
07 /* 処理 */
08 }
09
10 return ret_val;
11 }
…の06行目のような書き方を、さも当然のように感じてしまう私は普通でしょうか、それともヤバイでしょうか。
それはちょっとイヤ (スコア:1)
if などには、代入を含めないほうが好きです。
1行で書いちゃうと読みにくいので。
Endowsさんの例だと、
ret_val = a == b;
if (ret_val) {
と書いてあるほうが、比較対照が明確になって良いかと。
Re:それはちょっとイヤ (スコア:1)
> 突然ですがすみません。
いえいえ、大歓迎です。できればたくさんの方にご意見を伺いたかったので。
> if などには、代入を含めないほうが好きです。
> 1行で書いちゃうと読みにくいので。
やはりそういう意見のほうが多そうな感じですね。
さすがに元の書き方はどうか、ということで書きなおした第2案は、確か次のようにしたと記憶してます。
int ret_val = 1;
...
if(a != b){
ret_val = 0;
else{
/* 処理 */
}
う~ん、なぜここまで複雑怪奇な書き方ができるのかと小一時間問い詰めたい。
なんか、私の書くソースコードって、誰も保守したがらないんじゃないかと思えてきます…。
Re:それはちょっとイヤ (スコア:1)
1つ上のコメントを書きながら『なぜこのようなソースを書くのか』を考えた結果、次のような結論が得られました。
上の例だと、まず自然言語で、
『a==b のときは ret_val を 1 にして処理をする。そうでないときは ret_val を 0 にして処理はしない。』
と考える。 (この時点で既に複雑で冗長。) 同時に頭の中では1つ上のコメントのようなソースを書いている、と。
で、この文で分岐条件である a==b を if の () の中に固定してしまう。それから「 a==b の返す値と ret_val に入れる値は同じなんだよな…」等考えた結果、
『 a==b の返す値を ret_val に代入し、それが 1 のときは …』
というふうに、a==b の周りに色々オプションが付いて条件部分を肥大化させてしまう、と。
『1. a==b の返す値を ret_val に代入
2. ret_val が 1 のときは…』
という方向に持っていければ、 ejusun さんの示されたすっきりした書き方になったのですが、いずれにせよ頭が硬いというかなんというか。
私の書いたソースって、誰も保守したがらないものになりそうな気が… (汗
Re:それはちょっとイヤ (スコア:1)
やはり、会社で書いていると、メンテナンスとか後々のことを考えちゃいます。
ぼくも昔は、なんでも1行にまとめちゃうヒトだったのですが、強制(矯正?)されました。
「読みやすく書こう」とか思っているうちに、だんだんとそうなっていくんじゃないかなーと思います。