Python上級

上級 Pythonで学ぶデザインパターン|ケーススタディ編

導入

デザインパターンは、ソフトウェア設計における再利用可能な解決策を提供します。特に、実務での開発においては、特定の状況に応じた適切なパターンを選択することが求められます。本記事では、架空のプロジェクトを通じて、デザインパターンの適用例を示します。

教科書レベルの解説(デザインパターン)

重要な概念の整理

デザインパターンには、生成に関するパターン、構造に関するパターン、振る舞いに関するパターンの3つのカテゴリがあります。生成パターンはオブジェクトの生成に関わるもので、構造パターンはオブジェクトの組織化、振る舞いパターンはオブジェクトの相互作用を扱います。これらのパターンを適切に理解し、プロジェクトの要件に応じて選択することが重要です。

コード例(Python)


class Notification:
    def send(self):
        raise NotImplementedError("Subclasses should implement this!")

class EmailNotification(Notification):
    def send(self):
        return "Sending an email notification."

class SMSNotification(Notification):
    def send(self):
        return "Sending an SMS notification."

class NotificationFactory:
    @staticmethod
    def create_notification(notification_type):
        if notification_type == "email":
            return EmailNotification()
        elif notification_type == "sms":
            return SMSNotification()
        else:
            raise ValueError("Unknown notification type.")

# Client code
notification = NotificationFactory.create_notification("email")
print(notification.send())

コードの行ごとの解説

  1. クラス Notification: 通知の基本クラス。send メソッドはサブクラスで実装されることを示す。
  2. クラス EmailNotification: Notification クラスを継承し、メール通知を送信する具体的な実装。
  3. クラス SMSNotification: Notification クラスを継承し、SMS通知を送信する具体的な実装。
  4. クラス NotificationFactory: 通知オブジェクトを生成するファクトリークラス。create_notification メソッドで通知のタイプに応じたオブジェクトを返す。
  5. クライアントコード: NotificationFactory を使用して、指定されたタイプの通知を作成し、その send メソッドを呼び出す。

ケーススタディ編

ある企業が新たに通知システムを構築するプロジェクトに取り組んでいます。このシステムでは、ユーザーに対してメールやSMSで通知を送信する機能が求められています。開発チームは、デザインパターンの一つであるファクトリーパターンを採用することに決めました。ファクトリーパターンは、オブジェクトの生成を専門のクラスに委譲することで、クライアントコードを簡潔に保つことができます。

しかし、初期の設計においては、通知の種類が増えることを考慮していませんでした。後にプッシュ通知やアプリ内通知が必要になった際、NotificationFactoryに新たな条件分岐を追加する必要が生じました。このような変更に対処するために、戦略パターンを取り入れ、通知タイプを拡張可能な形で実装することが求められます。

まとめ

  • デザインパターンを適用することで、コードの再利用性と可読性が向上する。
  • ファクトリーパターンは、オブジェクト生成の責任を分離し、クライアントコードをシンプルに保つ。
  • 将来的な拡張を見越して、設計時に柔軟性を持たせることが重要。