パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

酷いコードを収集する「ウンコード・マニア」」記事へのコメント

  • 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

          糞コードはSwitch文から生まれる
          使う時は細心の注意を払う必要があります

          可読性、メンテナンス性をぶち壊す根源

      • by Anonymous Coward

        別に大きなswitch文でも問題ないと思う。見やすいシンプルな条件なら。
        小細工をしたほうが悪くなるコードってのもあるもんだ。

        テストケースも、逆に作りやすいはず。
        「いちいちチェックしたくない」と言うことは、もともと貴方はテストの網羅性を考慮してない。
        その発想にはちょっとゾッとしました。

        • by Anonymous Coward

          仕様書からテーブルをつくって
          テーブルから関数テーブルとテストケースを自動生成するんです.

          > テストケースも、逆に作りやすいはず。

          大きなswitch文でコード書いて,
          それからテストケース書いてると,それこそ網羅性が維持できないですよ.ぞっとしませんか?

    • by Anonymous Coward

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

    • by Anonymous Coward

      >関数の最後が『return 0;』でも、正常なら最後まで通るコードなら問題ないと思うけど。

      戻り先で値を読んでの処理をしない場合でも,コーディングの規約として明示的に0を戻り値とすることにしている~ということも考えられるけど
      コードの断片だけを見せられても,まともな議論が出来ない

    • by Anonymous Coward

      switch文の最適化なら今時どのコンパイラでもやってくれますけど、
      意味的に等価なelif分岐を同様に扱ってくれないことはままありますね。

      「128個」という数字に何を察するか。読み手の技量と経験しだいで達筆も落書きになります。

    • by Anonymous Coward

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

      もし、 [JavaScript] とっても長いswitch/case文 [unkode-mania.net]のことを言っているのであれば、

      var rnd = Math.floor(Math.random() * 128) ;

      rndは0〜127の128通りであるにもかかわらず、case 0case 128
      129個caseが並ぶswitch文は、やっぱり問題だと思

      • by Anonymous Coward

        まったくですな。
        javascript のランダム関数って 1 を返すのかと思ってググって確認してしまいましたよ。

        # デフォルトのまま、現在時刻を seed に使っていることにも一言いいたい。

        • by Anonymous Coward

          # デフォルトのまま、現在時刻を seed に使っていることにも一言いいたい。

          何か問題でも?

          • by Anonymous Coward

            ありそうな seed のあたりをつけやすいですよね。
            まあ用途次第で、それほどランダムであることにこだわらないのなら十分でしょうが。

    • by Anonymous Coward

      判断条件が8個くらいしかないのに4個でswitch-caseが終わっていて、しかもdefault処理書いてないから
      残り4個の時にはめちゃくちゃな値が入るという素敵なコードを見たことが・・・
      見つけたときには思わずモニターに向けてツッコミを入れてしまいました。
      #しかもリリース済みバージョン。

      • by Anonymous Coward
        gccなら普通に警告出してくれますけどね。

        基本的にbreakの漏れがないのかを判断し辛いものはswitchで書くべきではないし、全ての条件において共通の変数に値を代入するだけなら配列でよい(ウンコードにあるのはまさにそれ)。

        関数テーブルに置き換えるのは、処理速度の面で抵抗がある場合もあるけど、長大なswitch文は局所性が悪くなり、キャッシュのヒットミスを増加させるので、switch文で書くメリットは少ない。このあたりは関数のインライン化と同様に考えると判断しやすい。

        でも、switch文で分かりやすく書ける場合もあるから、そういうときはswitch文を使うべき。稀だけどね。
    • by Anonymous Coward

      20年ぐらい前、プログラムをまず紙に書いてた頃に関数名が連番なプロジェクトを見たことありますね。
      時代でしょ

私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson

処理中...