関数に適切な名前が付けられていても、関数の呼び出しが読みにくくなることがあります。
そのことは、引数の目的や機能が明確でない場合に起こりがちです。
本記事では、関数の呼び出しを読みやすくするためのテクニックを紹介します。
多数のパラメータに注意
関数の引数が増えると、関数の呼び出しが読みにくくなる傾向があります。
多数のパラメータを持つ関数は、適切な抽象化レイヤーやモジュール化が不十分である可能性を示しています。
関数のパラメータ数が多くなると、関数の呼び出しが読みにくくなるだけではありません。
そもそも、関数の責務が多く、単一責任の原則に反している可能性があるのです。
ただし、パラメータの数に厳密な制限はなく、状況に応じて判断する必要があります。
一般的には、以下のような目安があります。
4つ以下のパラメータ
理想的な状態です。関数の目的が明確で、引数の意味も理解しやすいでしょう。
5つ〜7つのパラメータ
関数の責務が多くなっている可能性があります。
関数を分割できないか検討しましょう。
ただし、関連するパラメータをグループ化することで、可読性を維持できる場合もあります。
8つ以上のパラメータ
関数の責務が多すぎる可能性が高いです。
関数を複数の関数に分割することを強く検討しましょう。
ただし、これはあくまでも目安であり、関数の目的や文脈によって異なります。
例えば、設定情報を扱う関数では、多数のパラメータが必要になることがあります。
このような場合は、設定情報をグループ化したり、設定用のクラスを作成したりすることで、可読性を維持できます。
class DatabaseConfig: def __init__(self, host, port, username, password, database): self.host = host self.port = port self.username = username self.password = password self.database = database def connect_to_database(config): # データベースに接続する処理 pass config = DatabaseConfig("localhost", 3306, "user", "password", "my_database") connect_to_database(config)
上記の例では、DatabaseConfigクラスを作成し、関連するパラメータをグループ化しています。
これにより、connect_to_database関数のパラメータ数を減らし、可読性を向上させています。
関数のパラメータ数が多くなる場合は、次のような対応を検討しましょう。
- 関数の責務を見直し
- 必要に応じた関数の分割
- パラメータのグループ化
引数の意味が不明な場合
以下のコードは、支払いを処理する関数の呼び出し例です。
def process_payment(amount, method, account): # 支払いを処理する pass process_payment(1000, 2, "A1234")
この関数呼び出しでは、methodが2、accountが”A1234″であることは分かります。
しかし、これらの引数の意味は関数の定義を確認しなければ明確ではありません。
解決策1: 名前付き引数を使用する
Pythonでは、名前付き引数を使用して関数の呼び出しを読みやすくできます。
def process_payment(amount, method, account): # 支払いを処理する pass process_payment(amount=1000, method=2, account="A1234")
引数に名前を付けることで、各引数の意味が明確になります。
また、引数の順序に関係なく指定できるため、可読性が向上します。
デフォルト値を持つ引数を使用することで、引数の省略も可能になります。
def process_payment(amount, method, account="A1234"): # 支払いを処理する pass process_payment(1000, 2) # accountは省略可能
解決策2: 説明的な型を使用する
関数の引数に説明的な型を使うことで、関数の呼び出しを読みやすくできます。
class PaymentMethod: CREDIT_CARD = 1 BANK_TRANSFER = 2 CASH = 3 def process_payment(amount, method, account): # 支払いを処理する pass process_payment(1000, PaymentMethod.BANK_TRANSFER, "A1234")
クラスや列挙型を使って、引数の意味を明確にします。
適切な解決策がない場合
読みやすい関数の呼び出しを保証する適切な方法がない場合もあります。
class Rectangle: def __init__(self, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 rect = Rectangle(10, 20, 100, 50)
このような場合、インラインコメントを使って各引数の意味を説明することが最善の方法です。
rect = Rectangle( 10, # 左上のx座標 20, # 左上のy座標 100, # 右下のx座標 50, # 右下のy座標 )
ただし、コメントが正しく保たれる保証はありません。
IDEの機能に頼らない
一部のIDEは関数の引数名を呼び出し元に表示する機能を持っています。
例えば、PyCharmだと次のように表示されます。
しかし、すべてのエンジニアがそのようなIDEを使っているとは限りません。
コードの読みやすさを高めるための方法としてIDEの機能に頼るべきではないと言えます。
なお、PyCharmは無料で利用可能ですけどね。
まとめ
関数の呼び出しを読みやすくするためには、名前付き引数や説明的な型を使うことが効果的です。
Pythonでは名前付き引数とデフォルト値を持つ引数を活用できます。
適切な解決策がない場合は、インラインコメントを使って引数の意味を説明しましょう。
また、IDEの機能に頼るのではなく、コード自体の読みやすさを高める努力が重要です。
関数の呼び出しを読みやすくすることで、コードの理解がしやすくなり、保守性が向上します。
常に読みやすいコードを書くことを心がけましょう。