Object-oriented-python-design-pattern

提供:Dev Guides
移動先:案内検索

Pythonデザインパターン

概要

最新のソフトウェア開発では、複雑なビジネス要件に対処する必要があります。 また、将来の拡張性や保守性などの要因を考慮する必要があります。 これらの目標を達成するには、ソフトウェアシステムの適切な設計が不可欠です。 このようなシステムでは、設計パターンが重要な役割を果たします。

設計パターンを理解するために、以下の例を検討してみましょう-

  • すべての車のデザインは、基本的なデザインパターン、4つの車輪、ステアリングホイール、アクセルブレーククラッチなどのコアドライブシステムなどに従っています。

したがって、繰り返し構築/生産されるすべてのものは、必然的にそのデザインのパターンに従うものとします。 車、自転車、ピザ、ATM、その他何でも…ソファーベッドも。

ソフトウェアのロジック/メカニズム/テクニックをコーディングする標準的な方法になりつつあるデザインは、ソフトウェアデザインパターンとして知られるか、研究されるようになりました。

デザインパターンが重要な理由

デザインパターンを使用する利点は次のとおりです-

  • 実証済みのアプローチにより、一般的な設計上の問題を解決できます。
  • よく文書化されているため、理解にあいまいさはありません。
  • 全体的な開発時間を短縮します。
  • 他の方法よりも簡単に、将来の拡張や修正に対処できます。
  • 一般的な問題の解決策であることが証明されているため、システムのエラーを減らすことができます。

設計パターンの分類

GoF(Gang of Four)デザインパターンは、創造的、構造的、および行動的な3つのカテゴリに分類されます。

創造パターン

創造的な設計パターンは、オブジェクト作成ロジックをシステムの他の部分から分離します。 オブジェクトを作成する代わりに、作成パターンがオブジェクトを作成します。 作成パターンには、Abstract Factory、Builder、Factory Method、Prototype、Singletonが含まれます。

創造的なパターンは、言語の動的な性質のため、Pythonでは一般的に使用されません。 また、言語自体は、十分にエレガントな方法で作成するために必要なすべての柔軟性を提供します。シングルトンやファクトリーなど、上に何かを実装する必要はほとんどありません。

また、これらのパターンは、新しい演算子を使用してオブジェクトを直接インスタンス化するのではなく、作成ロジックを非表示にしながらオブジェクトを作成する方法を提供します。

構造パターン

ゼロから始めるのではなく、既存のクラスのセットを使用してより大きな構造を構築する必要がある場合があります。 そこで構造クラスパターンが継承を使用して新しい構造を構築します。 構造オブジェクトパターンは、構成/集計を使用して新しい機能を取得します。 アダプタ、ブリッジ、コンポジット、デコレータ、ファサード、フライウェイト、プロキシは構造パターンです。 クラス階層を整理する最良の方法を提供します。

行動パターン

動作パターンは、オブジェクト間の通信を処理する最良の方法を提供します。 パターンは、このカテゴリに分類されます。ビジター、責任の連鎖、コマンド、インタープリター、イテレーター、メディエーター、メメント、オブザーバー、ステート、ストラテジー、およびテンプレートメソッドは行動パターンです。

これらはシステムの動作を表すため、一般的にソフトウェアシステムの機能を説明するために使用されます。

一般的に使用されるデザインパターン

シングルトン

これは、すべてのデザインパターンの中で最も物議をかもし、有名なものの1つです。 過度にオブジェクト指向の言語で使用され、従来のオブジェクト指向プログラミングの重要な部分です。

シングルトンパターンは、

  • ロギングを実装する必要がある場合。 ロガーインスタンスは、システムのすべてのコンポーネントで共有されます。
  • システム内のさまざまなコンポーネントすべてで情報のキャッシュを維持および共有する必要があるため、構成ファイルはこれを使用しています。 *データベースへの接続の管理。

これがUML図です。

UML図

class Logger(object):
   def __new__(cls,* args, **kwargs):
      if not hasattr(cls, '_logger'):
      cls._logger = super(Logger, cls).__new__(cls, *args, **kwargs)
return cls._logger

この例では、ロガーはシングルトンです。

newが呼び出されると、通常、そのクラスの新しいインスタンスが構築されます。 オーバーライドする場合、まずシングルトンインスタンスが作成されたかどうかを確認します。 そうでない場合は、スーパーコールを使用して作成します。 したがって、Loggerでコンストラクターを呼び出すと、常にまったく同じインスタンスが取得されます。

>>>
>>> obj1 = Logger()
>>> obj2 = Logger()
>>> obj1 == obj2
True
>>>
>>> obj1
<__main__.Logger object at 0x03224090>
>>> obj2
<__main__.Logger object at 0x03224090>