tkcomcom1is tkcomcom1is 2013-03-06 23:16:29

[C++] パッと見ても分からない このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

こんなコードを見つけたので、場合分けを書きだして書き直したらこのようになりました。ちなみに、元々のコメントは何も無し。
でも、何か意図があるようで怖かったので、結局元に戻しました。(チキン)

※変数名や関数名は変えていますが、元々のコードでは一応それなりに意味のある名前になっています。

/* 注:flag2はBOOL型のメンバ変数だった。 */

BOOL flag1 = hogehogeFunction();
if (flag1) {
   flag2 = (flag2==TRUE) ? FALSE : TRUE;
}
if (flag2) {
   flag1 = TRUE;
}

/* 書き直したものが↓ */
BOOL flag1 = hogehogeFunction();
flag2 = flag1 ^ flag2;
flag1 = flag1 || flag2;

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(11)

#1 keiichiroh keiichiroh 2013-03-06 09:42:05  

書き直しはテストしたのかと。

#2 InternalServerE InternalServerE 2013-03-06 22:24:09  

書き直し後のコードは果たして「パッと見て分かる」んだろうか。
可読性やら保守性の観点で言うなら、元コードの方がナンボかマシに見えてしまうなぁ。確かに汚いけど、設計書をそのままコードに落としたんだろうなあ、というニュアンスは伝わってくるので、まだ読む気になる。

少なくとも、書き直し後のコードは投稿者さん自身が書き間違えてるくらいだから、ね。。

#3 tkcomcom1is tkcomcom1is 2013-03-06 23:19:00  

>keiichirohさん、InternalServerEさん
テストはしていませんし、仰る通り保守性のことを考えたら手を加えるとまずい気がしたので、実際のコードでは弄ってはいません。
一見後者だとシンプルには思ったのですが、結局どっちをとっても「パッと見ても分からなかった」ですし、後者はコメントが足しにくいと感じたことも事実です。

あと誤植に関して、ご指摘ありがとうございます。恥ずかしながら、修正しました。

#4 DsYochibe DsYochibe 2013-03-06 23:27:12  

BOOL型と言っているのが実はint型のdefineで、関数の戻り値がTRUE,FALSE以外の何かになることがあったりしたらウンコだなと思いました。

#5 InternalServerE InternalServerE 2013-03-07 07:04:25  

第三案。これがどんな要件や仕様を満たそうとしているのかともかく、やってることは単刀直入に伝わるかと。
1つの変数を複数の用途に使いまわすこともなくなるし。

BOOL flag1;
if (hogehogeFunction()) {
  flag1 = TRUE;   //常に真
  flag2 = !flag2; //真偽を逆転
} else {
  flag1 = flag2;  //flag2の値を代入
}
#6 Miraranran Miraranran 2013-03-09 11:08:31  

ifで切って「手を付けない」のが複雑にしてる気が。hogehogeFunctionの中や、このコード以前の部分でのflag2の扱いまで踏み込まないとリファクタリングはできないような。

#7 pi_pi_9_85 pi_pi_9_85 2013-03-10 05:54:42  

書き換えの方が網羅が容易になるかも…と思いました。

#9 bayerischecreme bayerischecreme 2013-04-09 12:29:27  

C++ならboolにしたい

#10 panzer_jagdiron panzer_jagdiron 2013-05-21 20:06:39  

自分の場合書き直し後のほうがいいと思う。コメントは必須だけどね。

#11 pragmanaka pragmanaka 2013-08-20 14:56:53  

真は0以外

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[その他] HOW TO ABC..

このエントリーをはてなブックマークに追加

実際にあった某システムの超重要なマスター...

create table item_master (
 A varchar(2...

鑑賞する »

[C++] お前は何も分かっちゃいない

このエントリーをはてなブックマークに追加

誰が std 名前空間内に好き放題書いて...

//「using namespace std」は厳禁なので!!
namespa...

鑑賞する »

[Java] 連番

このエントリーをはてなブックマークに追加

もはや人間が読むものではない。

...

package com.renban.erq053.czp008;

/**...

鑑賞する »