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

複雑なコードは悪いコードか 184

ストーリー by hylom
他人が見て分からないコードは悪いコードです 部門より
eggy 曰く、

プログラミングにおいて簡潔に書かれているコードが良いコードであり、一方で複雑なコードを書いたプログラマーには技量が無く、複雑なコードはどんな馬鹿でも書けると思われがちである。だがDr. Dobb'sの編集長Andrew Binstock氏は、こうした二分法的な考え方はいかがなものかと批判している(本家/.Dr. Dobb's記事)。

Binstock氏は、複雑なコードを書くのは難しく、どんな馬鹿でも書けるものではない、そして複雑な問題には複雑なコードが必要なのだと述べている。複雑なコードを、下手に書かれたコードと同一視するのは間違いであるとしている。

Binstock氏の定義によれば、簡潔さとは理性的で中立的であることなのだという。つまり、簡潔に書かれたコードとは、潜んでいる複雑さを説明する限りにおいては複雑にもなりえるため、簡潔に書かれたコードが極めて複雑である場合もあるのだ。良いか、悪いか、といった二分法的な考え方はプログラミングには内在しないとのこと。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Super KUMASAN (34209) on 2013年07月03日 6時12分 (#2413539)

    「一画面に収まらない関数はダメ」とか、「ネストが深ければダメ」とか、これって処理内容を無視した評価基準ではないでしょうか。
    処理内容によっては、そういったやり方がベストな場合もあると思います。

    オブジェクト指向にしてもそうです。
    アクセッサを使わずに、変数をpublicで公開しても良い場合もあると思います。
    変数のチェックをしない場合のアクセッサには、どれほどの意味があるのでしょうか?
    多態性を使わずにswitchで切り替えたほうがシンプルな場合もあります。
    staticなpublic関数?大いに結構じゃないですか、シンプルで最もオーバーヘッドが小さな実装法だと思います。

    画一的な基準で評価するのは工学的アプローチと言えますが、ソフトウェアは芸術的・職人的な側面もありますから。

    • 1行は80桁、1関数は50行、1ファイルは500行というのを杓子定規的に当てはめ、外れる場合は例外申請しろと・・・・
      結果、殆どの関数が50行で足りない物が結構出て来たなぁ
      親コメント
    • by Anonymous Coward on 2013年07月03日 7時57分 (#2413562)

      一画面というのは変な基準だと思いますが
      ネストが深いのは改善すべきだと私の心のメトリックスは言ってます。
      ネストを浅くする何らかのロジック変更が効率がよくわかりやすくなることが多いです。
      経験上ね。

      親コメント
    • by Anonymous Coward on 2013年07月03日 8時35分 (#2413582)

      「一画面に収まる」は前世紀ではそれなりに意味のある基準でした。パンチカードでプログラムを入力していた頃は物理的に80桁に収めねばなりませんでしたし、コーディングやメンテを粗末なキャラクタ端末とviで行なっていた頃は80桁を超えて行が折り返してしまうとまともに編集出来ない場合がありました。今となっては何の意味もないわけですが。

      親コメント
    • by Anonymous Coward on 2013年07月03日 9時41分 (#2413631)

      ほかはともかく、アクセッサに関しては同意できないなぁ……。
      アクセッサを経由しないメンバ変数へのアクセスを許すと、仕様変更に弱くなりますから。
      不具合の追及も困難ですし。

      親コメント
      • 「こんな事もあろうかと」と言いたいがために、あるかどうかわからない将来の拡張に備えて、余分なコードを追加するというのはむやみにコードが間延びして、良くないです。拡張が必要になった時に、ごっそり書き換えれば済む話です。

        だから、パラメータを右から左に渡すだけのアクセッサーには反対です。(逆に、値チェック以上の重たい処理をアクセッサーに入れるのも別の理由でダメ)

        ただし、不特定多数に公開されるライブラリーにおいてはこの限りではなく、予防的にアクセッサーにするのはありだと思います。

        そもそも、オブジェクト指向技術は基本的にライブラリーを作る場合に必要な技術であり、普通のプログラムでの使用は、弊害のほうが大きのではないかと思います。

        親コメント
    • >変数のチェックをしない場合のアクセッサには、どれほどの意味があるのでしょうか?

      ブレークポイント設定できる。
      え?ウォッチ式でいいじゃんって?

      --
      屍体メモ [windy.cx]
      親コメント
  • 「他の条件が同じならば」が抜けてるから、そういうズレた議論になるんだと思う。

    単純なものを実現するコードより、複雑なものを実現するコードの方が複雑になるのは当たり前。
    しかし「他の条件が同じならば」「同じことを実現するには」簡潔でシンプルな方が良い。

    世の中には簡単なことを実現するにも、無駄に長くて複雑でデバッグも修正も出来ないコードを
    書く人がいるんだよ。そういうコードは、スパゲッティコードとか呼ばれたりするんだけどね。

  • by Anonymous Coward on 2013年07月03日 6時56分 (#2413543)

    理解できない・・・と怒り出す人ですね

  • int FuncA(int);
    int FuncB(int);
    int FuncC(int);
    ...
    int (*Func[])(int) = {FuncA, FuncB, FuncC, ...};
    ...
    rc = Func[State](Param);

    なんてコードは、新入から「このコードは複雑で何をしてるか分からない。switchの方が分かり易くて簡単だ。」なんて言われます。
    256個のcaseが並んだswitchには驚かされますね。(関数と変数は異なるもので、関数の配列は考えられないといった思考のようです。)

    どんなコードが「複雑なコード」に思えるかは人によって違うので、「複雑なコード=悪いコード」と固定することは出来ませんね。

    # switchでは実行速度にばらつきが出て修正となりました。
    # この件では、私「複雑なコード=悪いコード」、新人「複雑なコード≠悪いコード」だったと。

  • by iwakuralain (33086) on 2013年07月03日 10時16分 (#2413655)

    見易ければ

  • 問題の複雑さとコードの簡潔さが一致しない例として、
    malloc があったのを思い出しました。

    K&R の実装では、60行程度で実装してますが、
    この K&R の実装に性能面で勝つためには、とても複雑な実装になります。
    例: glibc malloc 実装の解説スライド [slideshare.net]

    これは、「簡潔なコードに隠されている問題の複雑さ」という K&R の実装と、
    「複雑な問題には複雑なコードが必要」という glibc malloc の実装の一例が
    対比しやすい例だと思います。

  • その元同僚は、前の職場で数少ない「価値観の合う友人」であり、「感覚が近い」人間でした。

    そんな彼が、「今なんでカミングアウト」と言って教えてくれたのが、
    僕が色々あって休職している間、アプリの改修依頼をしてくれたのが彼だったという事でした。
    そんな彼曰く
    「ただ単にコピペを繰り返しただけですよw」
    でもそれって、「そのソースを理解出来てる」からこそ出来るんだよね。
    話を聞いていけばいくほど、「僕の意図したロジック」をちゃんと理解していた事が分かってきて。
    めっちゃ嬉しかったなぁ。

    僕が復職した時には、彼は既に他の職場に転職していたので、当時は全く知らなくて。
    復職した時に聞いていたのは、「他の部の人達が、めっちゃ大変だった」って話くらいで。
    当時は話を深く聞く事はなかったけど、やっぱり理解できなかったらしい。

    やっぱり、「自分に合うコード」=「綺麗(正解)なコード」って訳じゃないんだなって思いました。

  • by Anonymous Coward on 2013年07月03日 8時23分 (#2413575)

    なんかで読んだ例題で「近代オリンピックの開催年数をすべて表示する」というのがあって、与えられる仕様が以下のとおりー。

    ・夏季オリンピックは1896年から4年毎で開催
    ・冬季オリンピックは1924年から4年毎で開催。ただし、1992年の次は1994年から4年毎に開催
    ・1916年、1940年、1944年は戦争のため開催なし

    人によって実装はまちまちだけど、これを誰が見ても分かりやすくメンテナンスしやすいコードを書くにはちょっと経験がいるかも。
    模範解答は膝を打った。

    まぁ実際の開発の仕事ではもっと複雑だろうけど。

    • by Anonymous Coward on 2013年07月03日 8時34分 (#2413581)

      "http://ja.wikipedia.org/wiki/近代オリンピック"

      親コメント
    • 此の手の問題は、最後の「ただし……開催なし」があるかどうかで難易度が大きく変わると思うのですが、単純に計算した開催年をすべて表示した後、
      「ただし、1916年、1940年、1944年は除外する」
      とか表示しても、それは正解にはならないのですよね、きっと。
      --
      ¶「だますのなら、最後までだまさなきゃね」/ 罵声に包まれて、君はほほえむ。
      親コメント
  • by Anonymous Coward on 2013年07月03日 8時52分 (#2413596)

    天才が書いたコードは、複雑で読みにくいが良くきれいに動く。
    秀才が書いたコードは、きれいで読みやすく、ちゃんと動く。
    凡人が書いたコードは、ぐちゃぐちゃで読みにくいし、しばしば誤動作する。

    天才にはならなくてもいいけど、秀才レベルのコーディングはしたいものだ。

  • by Anonymous Coward on 2013年07月03日 6時10分 (#2413538)

    いきなり結論を出しちゃダメだ。

typodupeerror

ハッカーとクラッカーの違い。大してないと思います -- あるアレゲ

読み込み中...