« HS2を修理に出してきた(再掲) | トップページ | 液晶ディスプレイ購入 »

2007.01.12

キミのコードが汚い理由

キミのコードが汚い理由

リスト1とリスト2
見比べてみると、リスト1の方がマシな感じがするんですが(^^;

もちろん、リスト1の方は稚拙な感じがするし、もっと良い書き方はあるけど、条件は明確でコードの目的もわかりやすいというメリットはある。

一方でリスト2の方はメッセージの作成部分を集約する事だけにこだわって条件が複雑となり、全体の見通しが非常に悪い。
それに変数名や設定する値にセンスが感じられない(^^;

そもそも
>これらはいずれも同じユニットテストに合格している。
>いずれのインプリメンテーションも間違ってはいない。
と書かれているけど、リスト2はバグってる(^^;

たとえばゲームカウントが2-2の場合を考えてトレースしてみれば良い。
本来なら「Set is tied at 2」となるべきだが、リスト2だと「Player2 leads 2-2」となる。
(ゲームカントが5以下でタイの場合は全て同じ)

# どちらのコードでも実際のテニスのゲームカウントとしては間違ってるという話もあるけど、それは置いといて・・・
コレはカン違いでした。削除

果たして、この粗雑なコードを作ってしまった筆者に欠けていたのは、時間だろうか?学習だろうか?熱意だろうか?(^^;

|

« HS2を修理に出してきた(再掲) | トップページ | 液晶ディスプレイ購入 »

パソコン・インターネット」カテゴリの記事

コメント

たしかにleaderなどの中間変数が持つ意味がパッと見に分かり辛いですね。
特にgamesWon[leader - 1]とgamesWon[leader == 1 ? 1 : 0]はあんまりなので
leaderは0か1にして、メッセージに組み込むときだけ+1してやる方がいいかも。

またリスト1の“一目見て分かる”ことのメリットは計り知れないと思います。


とは言え、最大の趣旨は「プレイヤー1とプレイヤー2、それぞれの場合において
いちいち逆の条件式を書き、同様のメッセージ表示部を2回書くより、どっちが勝って
いるかをあらかじめ判断し、"今勝っているのはプレイヤー" + leader + "です。"
とした方が記述が一度で済む」という点で、その発想は間違いじゃないと思います。

恐らく「片方が4点、片方が3点のときは特別なメッセージを表示する」
なんてのをもう何種類か追加したり、あるいはプレイヤーが多数存在する
ゲームだったりすると、リスト2形式の利点が出てくるのではないでしょうか。
少なくとも4人いるボードゲームで「トップから最下位に1000点やる」なんてイベントが
発生した時、同じコードを4P3=12個書くやつがいたら私は殴ります(笑)。
あとリスト1形式だとうっかり「プレイヤー1が勝っています。」
「プレイヤー2が勝っております。」みたいに、微妙に2つのメッセージの内容が
ずれてしまったりすることもあるかと。

さすがにこの例だとリスト1でも十分な気がしますが、恐らく筆者としてもテニスは
例に出しただけで、実際にはそういう複雑なシステムにおいて初心者がそういう
後先を考えないコピペコードを書いたのに出くわした経験が元になっているのでしょう
(私もそれに困らされたことがありますよ 汗)。であればこの文章自体を真っ向から
否定はできないかと。


ところで「テニスのゲームカウントとしては間違ってる」というのは?

投稿: yoh-yoh | 2007.01.13 06:24

4P2っすね…ダメだ(笑)。

投稿: yoh-yoh | 2007.01.13 11:23

>yoh-yohさん
>その発想は間違いじゃないと思います。
発想が間違いでなくても、こんな短いプログラムで、しかも他人様に教えてやろうという態度のプログラムにも関わらず、バグがあるって時点で論外でしょう(^^;
こんな簡単なバグが容易に見つけられないという時点で、プログラムとして「クリーン」ではない。

繰り返しておきますが、リスト1が「良い」のではありません。
リスト1より「良い」というリスト2のデキが余りにも悪すぎる(^^;
リスト1の問題点を理解した上でリスト2の考え方の方が良いよね~というのが理解できる人にしか理解できない例示では意味がありません。

>ところで「テニスのゲームカウントとしては間違ってる」というのは?
あぁ、これはカン違いでした。失礼。

投稿: <セルダン> | 2007.01.14 01:50

>リスト1より「良い」というリスト2のデキが余りにも悪すぎる
ああ、そこなんですね。考え方自体のよさを潰してしまうリスト2の酷さ(汗)。
納得しましたです。

投稿: yoh-yoh | 2007.01.14 07:00

>yoh-yohさん
ですです。

そもそも、最後に else が無いというのが非常にキモチ悪い(^^;
よ~く見ると、最後のelse ifに来る場合は、必ず判定条件を満たすんですが、だったらわざわざ条件書かないで単にelseでいいぢゃん・・・みたいな。

私なら、最初にタイの場合を判定して、次に勝利判定、最後にelseで途中という順にするかなぁ?
if( leadersGames == opponentsGames ) {
  タイ
} else if( (leadersGames ==7 ) ||
      (leadersGames == 6 && opponentsGames < 5))) {
  leader勝利
} else {
  途中
}
みたいな感じ。

投稿: <セルダン> | 2007.01.15 02:33

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: キミのコードが汚い理由:

« HS2を修理に出してきた(再掲) | トップページ | 液晶ディスプレイ購入 »