Togetter「#俺が見たクソコード選手権 まとめ」の補足


Togetterで先日まとめた「#俺が見たクソコード選手権 まとめ」についての話です。

Taken by nebulux76, Flickr

Taken by nebulux76, Flickr

そこそこ反響があったのですが、「書いてある中身がよくわからない」という反応もいくらかあったので、一部抜粋してちょっとだけ補足してみたいと思います。

なるべく書いた側の身になって考えてみたいと思います。

何かコメントで見当はずれなところがありましたらご指摘よろしくお願いします。私もいわゆるクソコードを書いてしまうことがよくあるので。


掃除機で同じ所を何度もかけるようなノリですね。過去に何があったんでしょうか。

一応、マルチスレッドの処理などを適当に書いてしまうと、代入した変数の値が適当なタイミングで勝手に書き変わってしまうことがあります。

もっとも、その場合でも変数にvolatile宣言をしておかないと最適化で取り除かれてしまいますが。


絶対に実行されないコード。適当な変数が定数になったとき、機械的に置換していくとこういう記述が出てくるおそれがあります。

普通のコンパイラならWarning出してくれるような?


なぜか変数の値でわけて即値で代入しようとしています。nにxの値を代入すれば終わりなのですが。

xが場合分け用の変数か何かだったんでしょうか。2,3種類の分岐ならまだわかりますが、「ずっと続く…」というところに執念を感じますね。


おそらく「ソースコード中のマジックナンバーはよくない」という言葉を字面通りに解釈してしまった結果です。

マクロでdefineすると単にコンパイルの前段階で数字に直されてしまうので、コンパイラから見た状態は数字が書いてあるのとまったく同じことになります。

そもそも、マジックナンバーがよくないといわれる理由は可読性であったり保守性であったりといった人間に対しての話で、コンパイラに対してではありません。


謎です。いろいろ考えてみましたが、コメントの有無で結果が変わることって原理的にありえるのでしょうか。

コメントアウトの意味かな?


きっと昔は2だったのでしょう。

コメントが保守性を下げてしまった結果。


Hello Worldの変数を使った…使っていない版。

変数名というのはあまり具体的な名前にしすぎると今回のように変数としての雰囲気がなくなってしまいますが、ひどく抽象的にしてしまうと何の変数かわからなくなりますし、ちょっと悩むことがあります。

意図した処理はされませんが、意図した動作はします。


point = mode = 2; と書くときっと思っていたよう動きます。気持ちが伝わってくるので好きです。


stdioをstudioと書いてしまう例。私もはじめはなんでuないんだろう?って思っていました。

stdioは “standard input/output” の略です。「えすてぃーでぃーあいおー」って読むしか道はないのでしょうか。


組み込みだと「気持ち遅らせる」ためにこう書いてしまうことがあります。

どっちかというと、なぜここで遅らせなければならなかったのかというのが気になります。

マルチスレッドの同期などが目的だとするとなかなか恐ろしいです。


randで0が生成された瞬間にエラーを出しますが、そのようなことは「あまり」起きません。おおこわい。

値の分布も一様でないですし、なかなか不思議な文だと思います。


受け取った引数の値を即廃棄。

これだけ見ると変ですが、インターフェースを変えずに実装だけ変えるとこういう事態は起きえます。


動的型付けな言語で苦心して数値型にした例。

言語名とコメントに書いた文章そのままで検索エンジンにかければきっと欲しい結果が得られたと思います。


まとめ

よくある間違いから、その人なりに苦心して生み出したオリジナル謎コードまでいろいろとありました。

私にとっては、人間の直感とプログラミング言語の雰囲気はずれているのだなと思うところがありました。機械への命令を記述する一連の決まり事のことを指してプログラミング「言語」と呼びますが、それはどうしても人間が人間へ伝えるものとは大きく異なってしまうようです。

最後に、私の好きなツイートを引用しておきたいと思います。

プログラミングが、入門者にとっていろいろとやさしい環境になるといいですね。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です