Python上級

上級 Pythonで学ぶリファクタリング|アンチパターン編

導入

リファクタリングは、コードの可読性や保守性を向上させるための重要な手法です。特に上級エンジニアにとって、リファクタリングは単なる改善ではなく、プロジェクトの成功に直結する要素となります。本記事では、リファクタリングの過程で遭遇しやすいアンチパターンに焦点を当て、具体的なシチュエーションを通じて改善方法を探ります。

教科書レベルの解説(リファクタリング)

重要な概念の整理

リファクタリングは、既存のコードを機能を変えずに改善するプロセスです。目的は、コードの理解を容易にし、将来的な変更やバグ修正を簡単にすることです。リファクタリングには、冗長なコードの削除、メソッドの分割、クラスの再構成などが含まれます。

コード例(Python)


def calculate_discounted_price(price, discount):
    if discount < 0 or discount > 100:
        return price
    return price - (price * discount / 100)

def process_order(order):
    total = 0
    for item in order:
        total += calculate_discounted_price(item['price'], item['discount'])
    return total

コードの行ごとの解説

  1. 関数calculate_discounted_priceは、価格と割引を受け取り、割引後の価格を計算します。
  2. 割引が不正な値の場合、元の価格を返します。
  3. process_order関数は、注文のリストを受け取り、各アイテムの割引後の価格を合計します。

アンチパターン編

上記のコードには、いくつかの潜在的な問題があります。特に、割引のバリデーションが不十分です。現在の実装では、割引が不正な場合、元の価格を返すだけですが、これでは意図しない結果を引き起こす可能性があります。たとえば、割引がマイナスの場合、顧客に不正な価格を提示することになります。

改善方法として、割引のバリデーションを強化し、エラーハンドリングを追加することが考えられます。以下のように修正することで、より堅牢な実装になります。


def calculate_discounted_price(price, discount):
    if discount < 0 or discount > 100:
        raise ValueError("Discount must be between 0 and 100.")
    return price - (price * discount / 100)

def process_order(order):
    total = 0
    for item in order:
        total += calculate_discounted_price(item['price'], item['discount'])
    return total

上記の修正により、割引が不正な場合には明示的にエラーを発生させるため、呼び出し元で適切に処理することが可能になります。このように、エラーハンドリングを強化することで、コードの信頼性を向上させることができます。

まとめ

  • リファクタリングはコードの保守性を高めるための重要な手法である。
  • アンチパターンを理解し、具体的な改善策を講じることで、より堅牢なコードを書くことができる。