Python中級

中級 Pythonで学ぶリファクタリング|練習問題編

導入

リファクタリングは、既存のコードを改善し、可読性や保守性を向上させる手法です。特に大規模なプロジェクトでは、コードの複雑さが増し、変更が難しくなることがあります。このセクションでは、特定のシチュエーションにおけるリファクタリングの重要性を探り、実践的なアプローチを学んでいきます。

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

重要な概念の整理

リファクタリングは単なるコードの整理ではなく、システム全体の設計を見直す機会でもあります。特に、重複コードや長いメソッドは、後々のバグの温床となることが多いです。リファクタリングの際には、以下のポイントを考慮します:

  • コードの重複を削減する
  • メソッドを短く保つ
  • 変数名や関数名を明確にする
  • テストカバレッジを確保する

コード例(Python)


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

def calculate_total(prices, discount):
    total = 0
    for price in prices:
        total += calculate_discounted_price(price, discount)
    return total

コードの行ごとの解説

  1. 最初の関数は、割引後の価格を計算します。
  2. 割引がない場合は、元の価格を返します。
  3. 次の関数では、複数の価格に対して割引を適用し、合計を計算します。
  4. このコードは機能しますが、重複したロジックや可読性の問題があります。

練習問題編

以下の練習問題に取り組んで、リファクタリングの理解を深めてください。

  1. 問題1: 上記のコードをリファクタリングして、重複コードを削除してください。
  2. 問題2: 変数名や関数名をより明確に変更してください。
  3. 問題3: テストケースを追加して、リファクタリング後のコードが正しく動作することを確認してください。

模範解答と解説

以下に問題の模範解答とその解説を示します。

  1. 解答1:
    
    def apply_discount(price, discount):
        return price - (price * discount / 100) if discount > 0 else price
    
    def calculate_total(prices, discount):
        return sum(apply_discount(price, discount) for price in prices)
    

    このリファクタリングにより、割引適用のロジックが一つの関数に集約され、可読性が向上しました。

  2. 解答2: 上記の解答で、関数名をより明確にすることで、意図が伝わりやすくなりました。
  3. 解答3: テストケースの例:
    
    def test_apply_discount():
        assert apply_discount(100, 20) == 80
        assert apply_discount(100, 0) == 100
    

    このテストにより、リファクタリング後のコードが期待通りに動作することを確認できます。

まとめ

  • リファクタリングは、コードの可読性と保守性を向上させる重要な手法です。
  • 重複コードの削減や明確な命名が、リファクタリングの鍵となります。