プログラムの可読性は、チームでの開発において非常に重要です。以下は、私の経験をもとにリーダブルコードのポイントを、具体的な例と共に解説します。
1. 明瞭な命名
変数や関数の命名
-
悪い例:
image -
良い例:
image_file_path -
理由:
imageだけでは、画像データそのものか、そのパスか、その名前かが分かりにくい。具体的な名前にすることで意味が明確になる。
ファイルの命名
-
悪い例:
userprofile_name -
良い例:
userprofile_path -
理由:ファイルのパスを示す場合、
_nameよりも_pathの方が適切。
関数名の工夫
-
悪い例:
check_if_exists() -
良い例:
is_object_exists() -
理由:関数がブーリアンを返す場合、
isを接頭辞にすることで直感的に理解しやすくなる。
2. コードの構造
ネストの深さ:
- 悪い例:
if user_logged_in:
if user_has_permission:
# 実行する処理
- 良い例:
if not user_logged_in:
return
if not user_has_permission:
return
# 実行する処理
- 理由:ネストが少ない方が読みやすい。
データ構造の利用:
-
悪い例:
person = ["Alice", 25, "Engineer"] -
良い例:
class Person:
def __init__(self, name, age, job):
self.name = name
self.age = age
self.job = job
person = Person("Alice", 25, "Engineer")
- 理由:クラスを使用することで、属性ごとに名前を付けてデータを管理でき、可読性が高まる。
3. 関数の設計
関数の戻り値:
-
悪い例:
get_data() -
良い例:
get_user_profile_data() -
理由:関数の名前から、どのようなデータを返すのかが明確になる。
関数の使用:
- 悪い例:
exists = check_object_exists(object)
if exists:
# 処理
良い例:
if check_object_exists(object):
# 処理
- 理由:コードがシンプルになり、何を評価しているかも分かりやすい。
4. システムの設計
ディレクトリやパラメータの構造:
-
悪い例:
/app/moduleA/code/files/userdata/... -
良い例:'/app/user/data/...'
-
理由:ディレクトリの構造をシンプルにすることで、ファイルの場所を探しやすくなる。
環境変数:
-
例:Djangoを使用する場合、データベースの接続情報やAPIキーなどをsettings.pyに直接書くのではなく、環境変数から取得する。
-
理由:環境ごとに設定を変更しやすく、セキュリティも向上する。
5. パフォーマンスと安全性
計算量:
-
注意点:ループ処理の中で、外部APIの呼び出しやデータベースのクエリを大量に行わない。
-
理由:計算量が増加し、システムのパフォーマンスが低下する可能性がある。
リソースの利用:
- 良い例:
with open('file.txt', 'r') as f:
data = f.read()
- 理由:with構文を使用することで、ファイルやデータベースの接続などのリソースを確実に解放できる。
6. ドキュメント
docstringの記述:
def add(a, b):
"""
二つの数値を加算する。
:param a: 加算する数値1
:param b: 加算する数値2
:return: 加算結果
"""
return a + b
- 理由:docstringを記述することで、関数の目的や使用方法が一目で分かり、他の開発者が利用しやすくなる。
まとめ
こうしてまとめてみると、どれも当たり前すぎて書くまでも無いと思える内容ですが、全て実際に注意を受けた部分です。一度に大量にコードを書いたり、癖であったりなど、要因はいくつか考えられますがプルリクエストを出す前に一度確認をすべきだと思いました。