Help us understand the problem. What is going on with this article?

【社内勉強会】「リーダブルコード」の紹介

More than 1 year has passed since last update.

【社内勉強会】「リーダブルコード」の紹介

by yuji38kwmt
1 / 19

0.はじめに


対象者

  • プログラマ(C++, Python, Java, JavaScript)

リーダブルコード」とは

参考図書.jpeg


伝えたいこと

  • 「リーダブルコード」から、以下の観点で事例をピックアップ
    • レビュでよく指摘する項目
    • 説明しやすい項目
  • 「リーダブルコード」を読むきっかけにして欲しい。本の方が体系的で分かりやすい。書いてある内容はすべて重要。

注意事項

  • 基本的にタイトルのみを掲載していて、サンプルコードは載せていない。完全に理解するには本を読む必要がある。
  • [補足]と書かれた内容は、「リーダブルコード」に掲載されていない内容

「リーダブルコード」の目次

1章 理解しやすいコード

第I部 表面上の改善
2章 名前に情報を詰め込む
3章 誤解されない名前
4章 美しさ
5章 コメントすべきことを知る
6章 コメントは正確で簡潔に

第II部 ループとロジックの単純化
7章 制御フローを読みやすくする
8章 巨大な式を分割する
9章 変数と読みやすさ

※10章以降は紹介しないので、省略


「リーダブルコード」の紹介


1章 理解しやすいコード

  • コードは理解しやすくなければならない。

    • コードを書く上でのいちばん大切な原則
  • コードは他の人が最短期間で理解できるように書かなければならない。

    • 「読みやすさの基本定理」
  • 「理解するまでにかかる時間」は、その他の目標とは全く競合しない

    • 理解しやすいコードは、優れた設計やテストのしやすさにつながることが多い。

2章 名前に情報を詰め込む

2.2 tmpやretvalなどの汎用的な名前は避ける

  • retvalという名前には情報がない。変数の値を表すような名前を使おう。
  • tmpという名前は、生存期間が短くて、一時的な補完が最も大切な変数にだけ使おう。

2.5 名前の長さを決める

  • スコープが小さければ短い名前でもいい

2.6 名前のフォーマットで情報を伝える

  • アンダースコア・ダッシュ・大文字を使って、名前に情報を詰め込むことができる。

  • [補足] Javaのフォーマットは後述参照


3章 誤解されない名前

  • 名前が「他の意味と間違えられることはないだろうか?」と何度も自問自答する
  • 限界値を示すときは minとmaxを使う
  • 範囲を示すときは firstと lastを使う
  • 包括/排他的範囲には beginと endを使う

補足


3.6 ブール値の名前

trueとfalseの意味を明確にしなければいけない。

以下の変数は、2つの解釈の仕方がある。

bool read_password = true;
  • パスワードをこれから読み取る必要がある。
  • パスワードをすでに読み取っている

need_passworduser_is_authenticateを使った方がよい。

  • ブール値の変数名は、頭にis・has・can・shouldなどをつけて分かりやすくすることが多い。

4章 美しさ

3つの原則

  • 読み手が慣れているパターンと一貫性のあるレイアウトを使う。
  • 似ているコードは似ているように見せる
  • 関連するコードをまとめてブロックする。

5章 コメントすべきことを知る

5.2 コメントするべきでは「ない」こと

  • コードからすぐにわかることをコメントに描かない
  • ひどい名前はコメントをつけずに名前を変える
    • 「優れたコード > ひどいコード + 優れたコメント」

5.3 自分の考えを記録する

  • なぜコードが他のやり方ではなくこうなっているのか(「監督のコメンタリー」)
  • 定数の値にまつわる「背景」

[個人的見解]

ソースだけでなく、データベースのテーブル名や列名にも、背景を書いた方がよさそう。


7.5 関数から早く返す

関数で複数のreturn分を使ってはいけないと思っている人がいる。アホくさ。関数から早く返すことはいいことだ。むしろ望ましいときもある。

関数の出口を1つにしたいというのは、何らかのクリーンアップコードを確実に実行したいからだろう。現代の言語では、こうした仕組みがより洗練された形で提供されている。

Javaだとtry...finallyがクリーンアップコードのイディオム。

[補足] 「関数の末尾以外の return 禁止」の発生元

MISRA-Cという「C言語のためのソフトウェア設計標準規格」が発生元らしい。

http://d.hatena.ne.jp/eel3/20121225/1356443485


9.2 変数のスコープを縮める

  • 変数のことが見えるコード行数をできるだけ減らす。
  • 定義の位置を下げる。
    • 変数の定義は変数を使う直前に移動する
    • 元々のC言語では、関数やブロックの先頭で変数を定義する必要があった。

付録


Javaの一般的な命名ルール

  • クラス名: 大文字始まりのキャメルケース
  • 変数: 小文字始まりのキャメルケース
  • 定数: 全て大文字で、スネークケース(アンダースコア区切り)
  • パッケージ: 全て小文字
  • 変数は名詞、メソッドは動詞で命名する

参考になるコーディング規約


コーディング規約に関する個人的見解

  • 他の言語の事情を持ち込まない

    • C言語のルールをJavaに持ち込まない
    • インデントスタイルなども含む
  • 時代を意識する


参考サイト

http://qiita.com/AKB428/items/20e81ccc8d9998b5535d

yuji38kwmt
愛知のIT企業で修行しております。2018年4月に転職しました。 基本的に自分用のメモとして、記事を書いております。 所属先の見解とは一切関係ありません。 https://qiita.com/yuji38kwmt/items/a474ad97e0d86f6081a2
kurusugawa
「いいソフトウェアを楽に作る」技術を追求する企業。今は、機械学習、画像認識中心。
http://kurusugawa.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away