パスワードを忘れた? アカウント作成
6009472 story
プログラミング

酷いコードを収集する「ウンコード・マニア」 143

ストーリー by hylom
笑えないコード多数 部門より
あるAnonymous Coward 曰く、

ウンコード・マニア」という、「クソなコード」を収集・観賞するというサイトが最近オープンした模様。

「人気ウンコード」には、関数の最後が『return 0;』であったためにどんな単体テストも通ってしまうコードや、128個のcaseが並ぶswitch文、大量の再発明された車輪、謎の連番で命名されたクラス名/メンバ変数名など、リアルにクソなコードが並んでいる。

笑えるコードであればいいのだが、センスもなくただただコードを書いた人が残念だというコードばかりなのでチェックするのも苦痛である。それでも興味のある方はどうぞ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 色々なところで取り上げられてきてるためか大分不安定になってますね。
    負荷が高いんでしょうか。

  • by Anonymous Coward on 2012年08月14日 18時37分 (#2211899)

    嗚呼、まじかる☆さゆりんは逝ってしまったorz

  • オープンしたばかりとはいえ、Rubyの例が一つもないとは。

    載っていないからといって、Rubyはクソコードがないかというとそうでもない。
    自分自身が過去に書いたRubyスクリプトを今見直したら結構ひどかった。

    例1:
    配列にfillメソッドがあるのに、for文で全配列に同じ値を入れる初期化関数

    例2:
    Rubyらしい書き方といえばイテレータによる繰り返し。
    しかし、ベンチマークを取ったら繰り返しはイテレータではなく、C言語に近いfor文を書いた方がベンチマークでの速度がアップすることに気づいてからは、配列は基本的にイテレータで書いていた。
    ただし、連想配列に対してはfor文を適用する方法を知らなかったからイテレータというふうに使い分けていた。
  • by Anonymous Coward on 2012年08月14日 23時20分 (#2212036)

    こういうコードの断片の著作権ってどうなるんだっけ?
    と思ってたら注釈がありました。
    http://unkode-mania.net/about [unkode-mania.net]
    > ただし、投稿するウンコードは自分で創作したものだけにして下さい。
    全部「創作」だったのか・・・

  • by Anonymous Coward on 2012年08月14日 18時26分 (#2211892)

    何がいいかでソースコードを語って欲しい。

    # 昔、ボツの杜というのがあってな

    • 駄目なコードは例を出すのが簡単だけど、
      非の打ち所のない理想的なお手本を作るのは非現実的だからね。

      糞コードから議論を始めるのは、極めて現実的な手法だと思う。

      親コメント
    • じゃあ、最高なコード、サイコード・マニアを開催しようぜ。

      まずは冪集合 powerset を求めるこの Haskell コード。初めて見たとき驚愕した。

      powerset :: [a] -> [[a]]
      powerset xs = filterM (\x -> [True, False]) xs

      ( http://learnyouahaskell.com/for-a-few-monads-more#useful-monadic-functions [learnyouahaskell.com] )

      これだけ。filterM は標準ライブラリ関数。使うとこうなる。

      g

      • by Anonymous Coward

        その例は強力なリストモナドをしょぼく使っているのでサイコーとは思わない
        filterMの引数がconstじゃろ

        • by Anonymous Coward

          じゃあちょっとリファクタリングして

          powerset = filterM $ const [True, False]

          でどうかな。

          かっこいいリストモナドのサンプルも頼む。

  • by Anonymous Coward on 2012年08月14日 19時20分 (#2211930)

    昔、
    Cプログラミング診断室
    http://www.amazon.co.jp/dp/4774117870/ [amazon.co.jp]
    というのを読むといいと勧められて読んだのですが、なんか作者の意地の悪さというか、批判の
    しかたがいやーな感じでどうも評価できませんでした。
    ダメなコードがなぜ生まれるのか、もっと体系的にまとめているのかと思っていたんだけど、
    例もバラバラというか、酷いコードを見せては罵るみたいなパターンで。

    別宮某の誤訳指摘本と同じで、こういうのって作者と一緒になって自分が上の立場から
    悪口をいう快感を味合わさせるものになりがちな気がします。

  • by Anonymous Coward on 2012年08月14日 19時32分 (#2211939)
    判断条件が128個あるなら128個のcaseが並ぶswitch文は問題ないと思うけど。
    関数の最後が『return 0;』でも、正常なら最後まで通るコードなら問題ないと思うけど。
    謎の連番で命名されたクラス名/メンバ変数名でも、命名の取り決めがちゃんとあれば問題ないと思うけど。
    • by annoymouse coward (11178) on 2012年08月14日 22時11分 (#2212015) 日記

      > 判断条件が128個あるなら128個のcaseが並ぶswitch文は問題ないと思うけど

      C/C++だと,分岐が128個もあるような大きなswitch 文は
      関数テーブルつかって書きなおす方が保守しやすくなる,
      ってよく言われてます.

      すくなくとも私は 128個もcaseが並んでいたら,その時点でそのコードを読む気力が無くなります.
      これ全パターンデバッグできてるの?break とか抜けたりしてないの?等,いちいちチェックしたくないので.

      親コメント
      • by CowardDuck (25674) on 2012年08月14日 22時49分 (#2212028)

        > C/C++だと,分岐が128個もあるような大きなswitch 文は
        > 関数テーブルつかって書きなおす方が保守しやすくなる,
        > ってよく言われてます.

        関数テーブルを使うと甚だしい性能劣化を
        招くこともある。(勿論、そうでない場合もある)

        break の抜けをチェックしてでも性能をあげなきゃ
        いけない状況も往々にしてある。

        ケースバイケースだよ。 # これを言いたかった。

        それから全パターンデバッグについては
        関数テーブルを使う場合でも試験するのが当然。

        親コメント
    • by Anonymous Coward

      イベントループはcaseがたくさん並んでいるもんだよね。

typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...