web-dev-qa-db-ja.com

「プロパティコンテナ」のデザインパターンの詳細な定義

誰かがProperty Containerとは何か、または少なくともインターネット上のパターンに関する情報をどこで入手できるか説明してください

この記事Fundamentalパターンの1つとして存在することがわかりました。残念ながら、対応する英語の記事には記載されていません。唯一のことは、私が以下でほぼ翻訳しようとしたウィキペディアの短い説明です:

このパターンを使用すると、新しいプロパティでクラスを拡張する代わりに、コンテナ内(クラス内)のクラスにプロパティを追加できます。

PHP/C#/ C++またはJavaで短い例が可能であれば、それは理解に非常に役立ちます。

追伸:「SanFrancisco(TM)Design Patterns:Blueprints for Business Software」に記載されているようですが、アクセスできません。 Googleが役に立たないか、間違ったキーワードで検索しています...

4
Dmytro Dzyubak

Property Containerは、クラス定義を編集せずに実行時にプロパティをカスタマイズできるクラスです。

この記事 は、私が見つけた唯一の完全な例です。その中で、彼らはカスタマイズ可能なMovieクラスの例を使用しています。

PropertyContainer基本クラスは、クラスに格納されているプロパティを追加/削除/取得するメソッドを提供します。基本的には、HashMapのように機能します。

PropertyContainer:
   + addPropertyBy()
   + removeProperty()
   + getPropertyBy()
   + getPropertyKeys()

次に、Movieから継承するPropertyContainerクラスがあります。

Movie extends PropertyContainer:
   - rating
   - available
   - description
   - title
   - id
   - price

   + [getters and setters for private properties]

後で、1つのプロジェクトのreleasedateクラスにMovieをプロパティとして追加する必要がある場合、クラスを更新する代わりに、実行時に追加することができます。

Movie m = new Movie()
m.addPropertyBy("3/5/14", "releasedate")
2
Darrick Herwehe

最も簡単な説明は、「プロパティのサービスロケータ」またはより短い「データロケータ」です。

そして、それはOOPの観点からのアンチパターンでもあります。それは主な概念を破るので、カプセル化して型の安全性を低下させます。現代の開発傾向がまったく逆である場合:弱い型付けから強い型へ(例えばJavaScript -> TypeScript)。

関数型プログラミングの観点から言えば、本質的に変更可能な構造としてはさらに悪いです。

しかし、手続き型プログラミングでは、拡張可能なプラットフォームを実装する方法です。

1
SerG

私の経験では、これがオブジェクトの汎用ストレージとして適用されるのを見てきました。

オブジェクトは、ハッシュテーブルまたはリストに格納されている他の「プロパティ」オブジェクトとの関係を持っているか、またはオブジェクトにキーを値に関連付ける内部ハッシュテーブルを持っているだけです。

これにより、設計時に考慮されなかったデータを実行時に追加できます。これは本当に良い場合もあれば、悪い場合もあります。

良い例:オブジェクトは拡張可能に設計されており、顧客やユーザーが定義した任意のデータが含まれている可能性があります。それが人生の目的であれば、これは強力なことです。

悪い例:オブジェクトは、それがすべきではないという懸念を抱くかもしれません。追加のストレージにより、オブジェクトの状態と責任に関連するさまざまなアンチパターンの使用が促進される場合があります。

Javaの例:

import Java.util.*;

public class Example {
  private Map<String, Object> properties = new HashMap<>();

  public void setProperty(String key, Object value) {
    properties.put(key, value);
  }

  public Object getProperty(String key) {
    return properties.get(key);
  }

  // Might also want to expose other methods such as containsKey() or clear().
}
1
user22815

私は自分のPHP「プロパティコンテナ」のデザインパターンの実装を記述しました。( https://codereview.stackexchange.com/q/43485/36845

「回答」の投稿で提案された推奨事項も必ず確認してください。

0
Dmytro Dzyubak