誰かがProperty Container
とは何か、または少なくともインターネット上のパターンに関する情報をどこで入手できるか説明してください?
この記事 のFundamental
パターンの1つとして存在することがわかりました。残念ながら、対応する英語の記事には記載されていません。唯一のことは、私が以下でほぼ翻訳しようとしたウィキペディアの短い説明です:
このパターンを使用すると、新しいプロパティでクラスを拡張する代わりに、コンテナ内(クラス内)のクラスにプロパティを追加できます。
PHP/C#/ C++またはJavaで短い例が可能であれば、それは理解に非常に役立ちます。
追伸:「SanFrancisco(TM)Design Patterns:Blueprints for Business Software」に記載されているようですが、アクセスできません。 Googleが役に立たないか、間違ったキーワードで検索しています...
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")
最も簡単な説明は、「プロパティのサービスロケータ」またはより短い「データロケータ」です。
そして、それはOOPの観点からのアンチパターンでもあります。それは主な概念を破るので、カプセル化して型の安全性を低下させます。現代の開発傾向がまったく逆である場合:弱い型付けから強い型へ(例えばJavaScript -> TypeScript)。
関数型プログラミングの観点から言えば、本質的に変更可能な構造としてはさらに悪いです。
しかし、手続き型プログラミングでは、拡張可能なプラットフォームを実装する方法です。
私の経験では、これがオブジェクトの汎用ストレージとして適用されるのを見てきました。
オブジェクトは、ハッシュテーブルまたはリストに格納されている他の「プロパティ」オブジェクトとの関係を持っているか、またはオブジェクトにキーを値に関連付ける内部ハッシュテーブルを持っているだけです。
これにより、設計時に考慮されなかったデータを実行時に追加できます。これは本当に良い場合もあれば、悪い場合もあります。
良い例:オブジェクトは拡張可能に設計されており、顧客やユーザーが定義した任意のデータが含まれている可能性があります。それが人生の目的であれば、これは強力なことです。
悪い例:オブジェクトは、それがすべきではないという懸念を抱くかもしれません。追加のストレージにより、オブジェクトの状態と責任に関連するさまざまなアンチパターンの使用が促進される場合があります。
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().
}
私は自分のPHP「プロパティコンテナ」のデザインパターンの実装を記述しました。( https://codereview.stackexchange.com/q/43485/36845 )
「回答」の投稿で提案された推奨事項も必ず確認してください。