質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

きれいなコードとはどんなものでしょうか?

解決済

回答 8

投稿

  • 評価
  • クリップ 3
  • VIEW 2,717

score 2777

ソースが汚いという質問をみて、そういえはいろいろ詳しい人に聞いてみたかったことを思い出しました。

それほど困ってはいないのですが、”きれいなコード”という表現を聞くことあります。抽象的で何を指しているのかわからずこの言葉を聞くたびに軽く混乱してしまいます。

その時々で尋ねればいいのですが、ついでで訊くにはややこしい問題かもしれないと思い控えていました。

数学的な美しさがあるアルゴリズムに対して美しいと呼ぶのはわかります。これは”美しいコード”であって、”きれいなコード”と呼ぶときの文脈とは違って使っているように思えます。

”わかりやすいコード”が近いと思っていますが、そう呼べるのならそう呼ぶはずです。そんなに長い表現でもないとおもいます。(私は、いつもわかりやすい結果として、バグがないコードが書ければ充分と考えています。)

意見がばらけるのか、誰かの説明に高評価がつくのかもわかりませんが、いろいろな意見が聞けると嬉しいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 8

checkベストアンサー

+11

きれいなコードとはどんなものでしょうか?

実装のキレイさと、設計のキレイさがあります。


実装のキレイさは、『リーダブルコード』で述べられていた
理解するのにかかる時間の短さが尺度になります。

実務上は最終的に開発や保守のコストを減らせればいいので、
宗教論争に陥らない具体的なモノサシとして使えます。

たとえば、連番の変数名とか、関数が長過ぎるとか、
入れ子が深いとか、循環的複雑度が高いとか、どれも
理解するのに時間がかかるから、キレイでないのです。


設計のキレイさも、同じ考え方で理解時間を尺度にできますが、
設計の場合とくに、コード変更時の読む量の少なさが目安になると思います。

よく言われる、グローバル変数を追放するとか、高凝集・疎結合とか、
DRY原則とか、単一責任の原則とか、どれも突き詰めていくと、
コードを変更・修正・拡張したいときに、読む量を減らしたいわけです。

たとえば、グローバル変数を使いまくると最悪、一行目から全部読むハメになります。
すると仕様変更に弱くなったり、保守コストが高くなったりします。
だから、なるべくスコープを限定して、読まなくてもいい部分を増やそうと。

つまり、なるべく実装を読まずに済ませられるのが良い設計であり、
オブジェクト指向(のカプセル化)もその延長線上にあると考えます。


要するに、プログラミングは書くより読む方が大変なので、
楽に読めるのがキレイな書き方、インデントをつけなかったりして、
楽に書ける(が読むのは大変な)のがキタナイ書き方、という考え方です。

これは単純化し過ぎているきらいもありますが、
原則は単純な方が汎用的で守りやすいので、まずこれらを意識しています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/18 10:18

    コメント求めておきながら返信がおそくなりごめんなさい。

    ”きれい”には、”整頓された”という意味があるのですね。何人かの答えに合致します。そういった意識がなかったので、納得しました。ありがとうございます。

    ちょっと話は外れますが・・・

    私には、美しいと整理されたもののが同じベクトルにあるモノではない気がします。特に数学的な美しさを持ったもの、例えば、Yコンビネーターなどは1行でかけるがわかりやすく書くことが非常に難しいです。

    このことから、美しさはきれいさと同じベクトルを持っていますが、違うベクトルも持っているような気がします。文学でいえば、村上春樹はわかりやすい文章で難解なテーマを扱ったりしますが、詩人たちの読んだ詩にはわかりやすい文章とは程遠くそれゆえにか、より美しく感じるものがあります。必ずしも美しさはきれいさを内包するものではない気がします。

    私も印象は否定していません。多くの人が同じ印象を持つなら何らかの言語化されていない事柄が存在するのたど言えます。ただ、共有できないと(私がそうであるように)混乱してしまうのです。具体的なコードを前にして印象を語っていることがあるような気がしているのです。それこそ、私の印象ですが・・・

    キャンセル

  • 2016/11/18 10:47 編集

    >美しいと整理されたもののが同じベクトルにあるモノではない
    そうですね。詩や小説など芸術分野では、
    複雑だが美しいものもたくさんありますよね。

    「整理された」のベクトルの延長線上にあるのは、
    実用的な「便利さ」「使いやすさ」でしょうか。
    あるいは、デザイン的な美しさとか。

    >”整頓された”という意味
    「整理された」と「読みやすさ」の違いもこの際お話しします。

    美しさ → 分かりやすさ → 整理の度合い
    という順にシンプルな意味になるので、
    「整理された」という基準を好んで使います。

    整理の度合いは循環的複雑度など、
    客観的な指標を適用しやすいのも便利です。

    それと違って、分かりやすさ、読みやすさには、
    問題自体の複雑さや読む人の技量も関係します。

    >言語化されていない事柄
    その一方で、印象も併用します。プログラミングは工学的な分野なので、
    おっしゃる通り、非言語的な暗黙知に依存した部分があるからです。

    人力もAIも共存してるのが今のITの姿ですし、
    使えるものは何でも使って、使い分ける方針です。

    キャンセル

  • 2016/11/18 17:55

    有意義な話ありがとうございます。

    循環複雑度は計測したことがないので、機会があれば試してみます。

    また、”整理された”という尺度でコードを見たことがなかったので、意識してみようと思います。

    キャンセル

+5

読みやすく何をしているのか少し読むだけで簡単に頭に入るコードではないでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 10:17

    回答ありがとうございます。きれいな字と同じように誤解なく読みやすいということですね。
    ”読みやすいコード”と呼ばないのはなぜでしょうか?印象よりも正確な表現を好むのがプログラマーだと勝手におもっているので、なんとなく違和感があるのです。そんなことはないですか?

    キャンセル

  • 2016/11/11 10:24

    大抵読みやすいコードはインデントが完全で(それ以外だとまず読みづらい) どれも似たような完全な形をしていて変数の類も誰が見てもわかる名前になっていてやはり同じ機能には似たような名前がつけてあり個人差がなく統一された規格書のような様相を呈していて一目で「きれい」と感じられるためそう呼ぶ方が感覚的に違和感がないのでそう呼ぶのではないでしょうか
    「読みやすい」だと一目見た時の独特の完璧な印象が伝わりません

    キャンセル

  • 2016/11/11 10:58

    ”独特の完璧な印象”があるのが、”きれいなコード”とういことですね。
    私にはその感覚がないので、理解できない原因がわかった気がします。

    例えば、私はインデントについて、コーディング規約には沿うべきとは思いますが、同一ファイル内で一致していれば2文字だろうと4文字だろうとさほど気にしません。
    命名規則については、論理的に問題なければコレクションクラスの表現が、xxList/xxs/xxCollectionが混在していても気にしません。(もちろん継承があるものは親クラスの表現をまねるのは当然だとおもいます。)
    書式に関しては、Excel報告書を廃止して、プレーンテキストで提出するように変更しました。

    これらの点は周りと意見がずれていて気持ちが悪かった点です。

    キャンセル

+5

一言で言うなら、「統一感があるコード」でしょうか。
「わかりやすいコード」にも繋がることかもしれませんが、個人的には以下のような点がきれいなコードだと感じる部分ですね。

  • ネストに応じてインデントが適切に揃えられていること
  • 処理や内容毎(定数、変数、取得用/設定用メソッド、等)に集約し、区切られていること
  • 類似の処理は同じ記述で統一していること

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 10:25

    回答ありがとうございます。

    統一感はあるかもしれませんね。特にわかりやすさとは必ずしも一致しない場合もあり得ると思います。

    特に、Dosのバッチファイルを作るなど、文法が豊かでない環境でのコーディングの際には、統一感を出すときれいだと感じたことを思い出しました。

    キャンセル

+4

他の方の意見と被る点もありますが、敢えて日本語的な考え方をしてみます。

「きれい」という言葉の内、コードに対する用法として当てはまりそうなのは以下の通りです。
1.色・形などが華やかな美しさをもっているさま。
2.よごれがなく清潔なさま。
3.乱れたところがないさま。整然としているさま。

つまり「きれいなコード」という言葉には、
「数学的・論理的な美しさがあるコード」も
「余計なゴミ(例えばどこにも使われていない変数など)が無いコード」も
「インデントや命名規則がしっかり整頓されている(=読みやすい≒分かりやすい)コード」も
全て内包されている訳です。

どれか1点を強調したいならそれこそ「整頓されているコード」などと言うと思いますので、
「きれいなコード」と言われた時は上記全てをひっくるめて言っているんだな、
と私は認識しています。
(言葉の認識は個々人により差がありますので、真意を確かめたいなら言った相手に説明を求める他無いとは思いますが)

ちなみに「きれいだけど動かないコード」も存在し得るので、きれいさとバグがあるかどうかは別問題になるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 17:11

    回答ありがとうございます。

    なるほど、3点をひっくるめていると確かに”わかりやすいコード”でなくて、”うつくしいコード”という表現がいいですね。

    「きれいだけど動かないコード」も存在し得るというのも同意します。ただ、論理的で余分な部分がなく、しっかり整理できているコードが動かない場合、そうでなくて動かない場合に比べて動くようにするのはずいぶん簡単なことだと推測します。

    キャンセル

+3

’きれいな’というの事に’コード’に限らず仕事の面で考えると、

  1. あるべきところに配置されている。
    コードで言えば、機能別のモジュールがあり、集約されている。
    仕事で言えば、キャビネットがあり、机の引き出しの意味を知っている。共用のものは用途別に配置されている。
  2. まとまりがある。
    漠然としていますが、乱雑でない。
    仕事環境ではキングファイルなど特定の形でドキュメントがファイルされている。
  3. アクセスしやすい。
    コードで言えば、パラメーターのルールなどが直感的に分かりやすい。
    仕事で言えば、どの資料はどこ?って探したり考える時間が無駄なので。
  4. 一目で分かる。
    コードの場合、ある程度のまとまりをモジュール化して、エディターの画面に移動が少なくて済む。
    コメントは取扱い説明書と注意事項。
    仕事で言えば、視覚的に検索する範囲が少なく済む工夫。
  5. 使いやすい。
    コード的には自分も含めてだれでも分かる。(できるだけトリッキーでない)

重複する部分も多いですが、古典的なアセンブラやBASICなど'GOTO'多用して’スパゲティー’なんて呼ばれたコードが、構造化へ。C辺りから’小さく作って大きく動かす’と数画面で1つの関数、階層化して'main'などをコンパクトになんて流れは上記の基本思想からと考えています。

余談ですが机の引き出しの話、意外と知られていないのが元々の設計コンセプトでは、一番上の薄く幅広の部分は収納ではなくて作業切り替えの一時退避場所、右側の引き出しは上から’ステーショナリー’、’辞書類’、’ファイル収納’って役割がある。

コードだけでなくて、システムでも各フォルダー(ディレクトリー)の構造も上記の考え方からでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 11:14

    回答ありがとうございます。

    具体的な話でわかりやすいです。

    ただ、これらの点はすべて”わかりやすい”も同時に含んている気がするのです。”きれい”でも”わかりやすい”でもどっちでもいいよという話であれば全くその通りだと思います。

    机の引き出しの話、初めて聞いて驚きました。リファレンス系の本のサイズがあのサイズなのは、やはりその引き出しに入れる為なのでしょうね。

    キャンセル

+2

この2つは同じ計算をしています。

c := complex(1.0, 2.0)
fmt.Println(cmplx.Abs(c))  //[2.23606797749979]
f1 := 1.0
f2 := 2.0
fmt.Println(math.Sqrt(math.Pow(f1, 2) + math.Pow(f2, 2)))  //[2.23606797749979]


下は上よりも関数が入れ子になっていて、きれいでない印象を受けるかと思いますが、
ピタゴラスの定理とプログラムを知っていればなんの計算をしているのかひと目見てわかります。

逆に上は、複素数(虚数と実数を足したもの)を使用しているので、苦手意識を持つ人が多いです。
きれいでわかりにくいコードと、きれいでないけどわかりやすいコードといえるでしょう。

ここから考えるに、入れ子が少ない、一行が短いものがきれいなコード
逆に、一般的な書き方をするものがわかりやすいコードとなるのではないでしょうか。

他にも個人的には

  • 文字数が少ない
  • インデントが少ない
  • 行ごとの文字数の差がすくない
  • 同じコードが複数箇所に存在していない
  • 書き方が一貫している(同じ基本的に関数を呼び出す、)

こういったコードをきれいに感じます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/12 22:44

    知識を義務教育に限るというのは、どうかと思います。誰が読むかはもっと色々な偏りがあるはずで、それによって最適な表現は変わってくるはずです。(話題がずれて来ていますね。すみません。)

    ”きれい”というのは何を形容しているのかが、私には理解できないのです。当然、主観的な判断を含んでいることは理解出来ますが、どのような場合にそういうのかが解りません。

    コーディング規約を守り、適切な命名をしたら、”きれい”なのであれば反対は、「規約を守っていない」とか、「全体的に名前が不適切」など具体的な指摘があるだけで、”汚いコード”はないことになるので、不思議なのです。

    キャンセル

  • 2016/11/12 23:04

    その"具体的な指摘があること"と"汚いコードであること"は両立しないのでしょうか?

    キャンセル

  • 2016/11/13 23:04

    すみません。よく解りませんでした。

    説明が適切ではなかったかもしれないので、言い換えます。

    intelfikeさんが挙げているきれいなコードの条件は、基本的にコード規約て定義できる程度に具体的な内容で、規約が守れていればきれいと言って良いのでしょうか?(もちろん逆よりきれいです。)

    キャンセル

+1

私は、コードを「●●なコード」と表現する時は、
どのような自然科学的事実を基準として、そう表現したかを
合わせて表明すべきと考えました(理由は後述に補足しました)。
言い換えると、基準のないただの「●●なコード」と言った場合は、
確実にそうであるようなコードは実在しない、と考えました。

「きれいなコード」であれば
例えば「会社のコーディング規則にそっている」という事実を基準に「きれい」と表現した、などです。
基準のない「きれいなコード」は幻であり到達しえないので、目指すべきではないのでしょうね。

「わかりやすいコード」も「●●なコード」の一部でしょう。
こちらは個人の知性に大きく依存していると思われる為、
基準となる事実を示しにくいのではと考えています。
従って、基準を示しにくい「わかりやすいコード」と言うものは、
基準を頑張って考えるより、そもそも実在しえないと考えてしまったほうが良さそうに思います。
そう考えますと、技術的な事を語るべき場面では、
不適切な表現なのではと自戒の念を込めてそう思います。

よく、例えばオブジェクト指向プログラミングについての質問が出ると
「わかりやすい」という旨の回答を見かけますし、
そのように回答をしてしまいがちです。

しかし、これは例えばオブジェクト指向プログラミングは何者か、
という基準を示さずに(示せずに)個人の主観的な表現に逃げている可能性に気づき、
反省すべきなのだろうなと思いました。

~~~~~~~~~~~~~~
補足

「●●なコード」という「●●な」というものは形容詞です。
形容詞は本質的に主観的であり、
「●●と感じている」と表現した「ある特定の個人」が必ず存在しています。

「ある特定の個人」は、別の個人からすると他人です。
人間は他人の感じたこと(知覚)を、そのまま感じることは出来ません。

つまり、そういった知覚に関する情報(形容詞)を確実に共有する為には、
個人と結びついている知覚以外の情報、つまり検証可能な自然科学的な情報が必要であろうと結論付けました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/15 14:21

    回答ありがとうございます。

    私も同じ意見です。具体的に伝えてほしいのに形容詞をつたらえれると困惑してしまうのです。

    このサイトでは「オブジェクト指向で書きたいです」と書く人が多くあります。多くの人がどうしてオブジェクト指向で書きたいのかは書かずに質問していいて違和感を覚えます。なので毎回、オブジェクト指向でなくても問題がないこと、その点を踏まえてオブジェクト指向の良い部分を説明するようにしています。この点は同意してもらえるのではないでしょうか。

    ただし、形容詞は主観なので、コードを評するのに不適切かというとそうでもないと思います。

    というのも、主観的な評価であってもコードを読む人の一人で、コードはコードを読む人・メンテする人(利用者)のためにあります。(使い捨てのばあいはだれも見ないですみます。)主張を聞いた人から見れば、客観的な意見の一つです。

    利用者の多くが肯定的な意見を持つコーディングは推奨されるべきだと思います。そういった意味でどういった印象かを主観で表明することは必ずしも悪いことではないと思います。

    私の場合も、可能であればその根拠を示してもらって私も相手も納得するコードにしたいと考えています。そういった場合に、相手が持つ”きれいなコード”という言葉から連想されるものが想像できず質問をしているというわけです。

    キャンセル

+1

一言で言うと美学があるコードですかね
こう云う風に整理するという美学、ある一定のメソッドを使う為の美学等、
生き様といっては言い過ぎではありますが、
そのコードにおける一定の美学を感じられるかがキレイなコードの判定基準ですね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/18 11:09

    回答ありがとうございます。

    生きざまが入ってくるとちょっと怖いです。インデントの好みの話とか振りたくない感じですw。

    美学あるコードという意見ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る