関数の引数がnullを許容する場合、その引数が与えられなかったときの関数の動作が不明確になります。
そして、それはコードの読み手に誤解を与える可能性があります。
本記事では、nullを許容する引数による誤解を避けるための方法について説明します。
nullを許容する引数の問題点
以下の例は、message 引数にnullを許容している場合の問題を示しています。
def display_important_message(message: Optional[str]): if message: print(f"[重要] {message}") else: # messageがNoneの場合は何もしない pass
この関数は、message 引数がNoneである可能性を考慮しています。
message がNoneの場合、関数は何も行わずに終了します。
問題は、この関数を呼び出すコードの読み手が、message にnullが渡される可能性を認識していない場合です。
関数名が display_important_message であるため、読み手は重要なメッセージが常に表示されると期待するかもしれません。
しかし、実際には message がnullの場合、何も表示されません。
このような設計は、関数の動作を誤解させる可能性があります。
解決策: 呼び出し元でnullチェックを行う
この問題を解決するには、関数の呼び出し元でnullチェックを行い、適切な値を渡すようにします。
以下は、display_important_message 関数の呼び出し方を改善した例です。
message = get_important_message() if message is not None: display_important_message(message) else: # messageがnullの場合のエラー処理 handle_missing_message_error()
この例では、get_important_message 関数から重要なメッセージを取得しています。
その後、message がnullでないことを確認してから、display_important_message 関数を呼び出しています。
message がnullの場合は、適切なエラー処理(handle_missing_message_error 関数)を行います。
これにより、重要なメッセージが表示されないことを明示的に処理できます。
呼び出し元でnullチェックを行うことで、display_important_message 関数の動作が明確になります。
関数の読み手は、message がnullの場合の処理が呼び出し元で行われていることを理解できます。
ただし、この解決策にはトレードオフがあります。呼び出し元のコードが若干長くなり、nullチェックの責任が呼び出し元に移ります。
しかし、関数の動作を明確にし、誤解を避けるためには、このようなトレードオフは許容されるべきです。
まとめ
関数の引数がnullを許容する場合、コードの読み手に誤解を与える可能性があります。
その引数が与えられなかったときの関数の動作が不明確になるからです。
この問題を解決するには、関数の呼び出し元でnullチェックを行い、適切な値を渡すようにします。
呼び出し元でnullチェックを行うことで、関数の動作が明確になり、誤解を避けることができます。
ただし、呼び出し元のコードが若干長くなるというトレードオフがあります。
関数の設計では、読み手に意図を明確に伝えることが重要です。
nullを許容する引数を使用する場合は、呼び出し元でのnullチェックを徹底することで、コードの品質を向上させることができます。
常にコードの読み手のことを考え、誤解を招かない関数の設計を心がけましょう。