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

どのようなコードをエレガントだと感じる? 124

ストーリー by headless
コード鑑賞 部門より
本家/.「Ask Slashdot: What Do You Consider Elegant Code?」より

コンピューターが使われるようになってから、失敗したプロジェクトや決して修正されないバグ、機密情報の漏洩、スパゲッティコード、その他日々使用する重要な機器やシステムを操作するプログラムの欠陥なども数多い。一方、よく設計され、完璧にコーディングされた知的に高度なプログラムを読み解いていくのは面白いものだ。自分ではポータブルGPSユニットが衛星を見つけて位置情報を計算するコードを見るのが好きだ。そこで、コードの公開されているコンパクトでエレガントなプログラムの例があれば教えてほしい。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 万能細胞のようなコード (スコア:4, おもしろおかしい)

    by Anonymous Coward on 2014年03月30日 18時44分 (#2572049)

    #include "/dev/tty"

    これはあらゆるプログラムと成り得る万能コードです。
    コンパイルする人に「じゃ、よろしく」とプレッシャーをかけることで発動します。
    但しコンパイルする人のスキルに影響するのと再現性が意外と低いという問題があります。
    コンパイルする際に適当なコードをコピペするだけで批判の対象となる問題もあります。

  • by Anonymous Coward on 2014年03月30日 19時13分 (#2572070)

    アルゴリズムのエレガントさと、コードのエレガントさでは異なるわけですが、どちらを求めてるのでしょうか。
    GPSの位置計算などとかかれていることから、元投稿者の求めているものはアルゴリズムとしてのエレガントさではないかと推測するのですが。

  • by z_cubic (20952) on 2014年03月30日 19時08分 (#2572068)

    汎用のデジカメRaw現像ソフト。
    デコード部分のコードにコンパクトでパズルチックなものが多い。

    富豪的プログラミングの名のもとに直接的なコードしか書けない自分には,
    なかなか参考には出来ないもののこういう世界もあるんだなと考えさせられる。

    ちなみに,外部ライブラリを除けば単一ファイルで完結するソフトで,最新版の行数は9,519行と異常に長いのも特徴的。

    • Re:dcraw.c (スコア:3, 興味深い)

      by Minno86 (40623) on 2014年03月30日 19時24分 (#2572078)
      > コンパクトでパズルチックなものが多い。
      今を去ること数十年前、アセンブラ(というよりマシン語)で
      事故^h^h自己書き換えをする処理を見たときとか
      レジスタに0代入より、自レジスタとXORの方が1クロック速いとか見たとき
      ちょっと感動した記憶があります
      親コメント
      • by miyuri (33181) on 2014年03月30日 20時58分 (#2572113) 日記

        レジスタに0代入より、自レジスタとXORの方が1クロック速い

        クロックは同じで、命令が短いっていう印象。

        xorというとビット反転に使うけど、プログラミングを始めた頃、BASICでA=1-Aとして0と1を切り替えていたのを見たとき
        ちょっと感動した記憶があります

        親コメント
        • by Egtra (38265) on 2014年03月30日 22時02分 (#2572145)

          ええ、初めは命令長の短さから使われ出したと思います。ところが、今時のx86 CPUだとxorでの0クリアは特別扱いされるので実際に速くなるはずです、こういう例もあるということで。

          ASCII.jp:インテルCPU進化論 細かく変わって性能向上Sandy Bridge (5/5)|ロードマップでわかる!当世プロセッサー事情 [ascii.jp]

          親コメント
        • by Ryo.F (3896) on 2014年03月30日 23時05分 (#2572168) 日記

          レジスタに0代入より、自レジスタとXORの方が1クロック速い

          クロックは同じで、命令が短いっていう印象。

          Z80あたりの8bit CPUだと、

          XOR A ; A=A^A

          は4クロック、

          LD A,0 ; A=n

          は7クロックで、実際にXOR Aの方が速い。
          その理由は、命令が1バイト短いから。パイプラインも無いしねえ。

          親コメント
          • by saratoga (23467) on 2014年03月31日 8時26分 (#2572270) 日記

            マシン語が想像できれば、応用が利きますよね。インストラクションセットによって違いますが、一般的には
            1)「値」を使うとコードに値が埋め込まれるのでコードが長くなる。当然、フェッチにもサイクルが増える。
            2)算術命令でも論理命令でもオペコードが少ない方が速い
            3)フラグが変化する命令はサイクルが長い場合もあるので、できればフラグ変化なしの命令を選ぶ
            ぐらいは通用しそう。
            実際は、コンパイラがどんなコード吐いてるか調べるのは実効速度に効くループの一番底ぐらいですけど。

            親コメント
            • by taka2 (14791) on 2014年03月31日 11時56分 (#2572377) ホームページ 日記

              > 1)「値」を使うとコードに値が埋め込まれるのでコードが長くなる。当然、フェッチにもサイクルが増える。

              ところがどっこい。RISC系のアーキテクチャだと、即値ロード命令はその即値がオペコードに埋め込まれたものになってたりしますので、「コードが長くなる」ことはありません。
              ただし、「レジスタは32bit」「オペコードも全命令32bit」「即値代入で指定できるのは16bit」といった感じなので、その範囲を超えた値の即値代入は、複数回のロードに分割する必要があったりしますが…
              以下MIPSの例ですが、
              MIPSには即値ロード命令はありません。そのかわり、「値がゼロ固定のレジスタ0」なんてのもあったり(読み込みとして即値ゼロの代わり。書き込み先に使えば結果は保存されずフラグチェックだけができる)するので、R0との即値演算という形で
              R1クリアは、「R1 = R0 + 即値0」と記述したりします。
              なんか回りくどい命令記述ですが、でもそれでも1ワードの1命令で実行1クロック、とかになったりしますからねえ。
              #そういう即値指定ができるから、INCもDECも独立した命令は存在せず、通常の即値加算命令が使えたりとか。

              Z80でアセンブラでコードをゴリゴリ書いて「XOR A が常識だろ」なんて考えていた身からすると、ちょっとカルチャーショックなアーキテクチャですね。

              親コメント
  • by crypt (12091) on 2014年03月30日 20時35分 (#2572108)

    コメントなし、700行の関数。でもエレガント。
    https://github.com/udp/json-parser [github.com]

  • は全てエレガントなんです

  • by miyuri (33181) on 2014年03月30日 21時02分 (#2572114) 日記

    高級言語であれニモニックレベルであれ、分岐が少ないとエレガントに感じる。

  • by ahg (42322) on 2014年03月30日 22時00分 (#2572144)

    ・問題が適切に定義されている
    ・それに則って分かりやすいマインドモデルが作られている
    ・マインドモデルが適切にコード化されている

    無理なく相手に伝わるコードがエレガントだと感じます

  • 「私は全てのコードを覚えている」
    #以下略
    --
    永世小学六年生神アイドル支持者(バランス取らなくっちゃなぁっ!!)
  • by Anonymous Coward on 2014年03月30日 18時17分 (#2572032)

    関心事の分離がキチンとされて、そこそこのカバレッジの単体テストとスモークテストがしっかりあるヤツがいいです

  • by Anonymous Coward on 2014年03月30日 19時22分 (#2572075)

    自分が書いたものよりも、計算量のオーダーが小さいものを見たとき。
    もっとお手軽に、ループの数や使用メモリが少ないだけでもエレガントだと感じます。

  • by USH (8040) on 2014年03月31日 0時03分 (#2572185) 日記

    クラスの構造定義(インスタンス変数とかクラス階層の定義)を見ただけで、その機能を彷彿とさせるもの。

    扱うデータの対象がきちんと整理されていれば、データ構造もわかりやすくなるはず。

  • 白が美しいと。

    http://compsoc.dur.ac.uk/whitespace/ [dur.ac.uk]

    #基本は踏襲

    --
    マクロの基本は検索置換(by y.mikome)
  • by Anonymous Coward on 2014年03月31日 1時40分 (#2572223)

    センス以前に変数とかの名前が揃ってる
    といってもVF00Aみたいな変なルールで揃えてるやつじゃないよ
    m_ ではじまるやつとかハンガリアン記法とか頭大文字とか小文字の_繋ぎとか、そういうのが入り混じってると嫌。

  • 若い奴から見たら、この程度でいいのかよって思われるぐらいの何の変哲も無いコードが
    結局一番良いコードだと思う。

    それと似てるけど、チーム内で既知のパターン(というかイディオムというか)をちゃんと理解して
    使ってることだね。
    どうにも納得行かないところは、チーム内で連携して改善案を提案してみんなに使ってもらう。

    みんながそういう意識で作業していけば、自ずと(少なくともチーム内では)エレガントなコードに
    なると思われる。
    なにしろ、コードは1人で書くわけじゃないから悲しいことに1人だけ気を付けてもしょうがないんだよね…。

  • by PEEK (27419) on 2014年03月31日 14時02分 (#2572460) 日記

    黒魔術にはまっていて、よく似た妹が格闘技をしている。

    #それはエレガントなお嬢様

    --
    らじゃったのだ
  • by Anonymous Coward on 2014年03月30日 18時22分 (#2572036)

    コメントが丁寧に書いてあって、無駄に過去の変更点が残されたりしてないコード
    特に、実装中に仕様変更が入ったりして、ドキュメントからは漏れてるような、ビジネスロジック上の特異なものがコメントされてる事

    • by Anonymous Coward on 2014年03月30日 18時39分 (#2572044)

      >誰が見てもわかるコード
      そんなものはない。

      一方で「作った本人以外には読めないコード」というのも確かにあるんだけどね。

      親コメント
      • by Anonymous Coward on 2014年03月30日 19時06分 (#2572063)

        何がしたくてどんな過程でなぜこう実装したのか意図がわかるコード

        要件や挙動は察しがついても
        「どーしてこーした」がさっぱりわからんソースがある
        コメントはそっちを補足しろよと言いたくなる

        難読は我慢しても
        正解がどうにも追えないのはキツすぎる

        親コメント
        • by Anonymous Coward

          なぜこうしたのかって普通Redmineとかそっちに書かない?

      • >「作った本人以外には読めないコード」
         作った本人にも読めないコードが一番エレガントかも。

        # ある意味、最適化の極だから。。。

        --
        notice : I ignore an anonymous contribution.
        親コメント
    • by Anonymous Coward

      そして、納品間際にドキュメントがメンテされて...
      なかったりして、どつぼにハマって...

      # そして、へたれプラグラマは、呪詛の呪文にたけていくのでした...

  • by Anonymous Coward on 2014年03月30日 18時41分 (#2572046)

    力業でプログラムは書けても、Boidとかライフゲームとか、そういう発想は模倣こそ可能でも自分から生み出すのは無理だと思うわけです。

  • by Anonymous Coward on 2014年03月30日 19時43分 (#2572085)

    変数の宣言と使用箇所が近い

    と、ぱっと見でもまともな人が書いたようにみえる

typodupeerror

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...