Ответ 1
В последнее время я довольно часто копался в этом шаблоне, и могу сказать, что найти информацию об этом довольно сложно. Yegge называет его прототипом или свойствами, но оба из них довольно сильно злоупотребляют и хорошо известны как два других, разных шаблона. Некоторые люди ссылаются на такие системы, как тот, который предлагает Йегге как "строгий [sic] typed", так что другой путь исследования.
Это действительно опрятная идея, и она имеет много преимуществ в некоторых приложениях и много ошибок в других. То, что вы получаете, по сути, является очень гибким средством построения "типов" во время выполнения, но вы теряете на многих языках сильную проверку для этого. Самый простой способ реализовать это будет как Dictionary<string,string>
. Затем вы должны использовать приведения, чтобы вернуть свои строковые значения в качестве фактических значений. Ключом к тому, чтобы такой дизайн управлялся, - это никогда не ссылаться напрямую на свойство в коде, если вы можете его избежать. Такие вещи, как theProtoObject["owner"] = "protoman"
, убьют вас, если изменится "каноническое" имя этого слота. Это также может привести к таким проблемам, как JavaScript (который использует этот шаблон под своей объектной моделью), где, если вы пропустили имя ключа, вы добавите новый слот.
Скорее всего, обновление, которое вы, вероятно, сделаете в производственной системе, - это использование каких-то специализированных типов для значений и своего рода "тяжелый ключ" для ключа, поэтому вы можете получить немного дополнительной информации и безопасности информацию о вашей модели.
Я видел несколько приложений, которые его используют. Один неожиданный пример ударил меня недавно, глядя на открытый исходный код в моей отрасли: страхование цитаты. OpenQuote - очень гибкий проект для цитирования страхования любого общего типа. Он написан на Java, но если вы знаете С#, он должен хорошо читать. В основе этого лежит объект Type
, который содержит этот бит кода:
/** A dynamic collection of attributes describing type */
private List<Attribute> attribute = new ArrayList<Attribute>();
А что такое Attribute
? Это:
* An attribute is defined as "One of numerous aspects, as of a subject". Generally, another
* type will own a (composite) collection of Attributes which help describe it.
Таким образом, в основном Attribute
представляет собой пару пар ключ-значение, содержащую уникальный идентификатор строки (имя поля) и строковое значение, а также перечисление типов в сочетании с некоторым регулярным выражением для проверки и обработки значений. Таким образом, он может хранить значения многих типов и преобразовывать их обратно в значения java, обеспечивая при этом некоторую безопасность.
Затем он начинает строить многие типы моделей, специфичных для домена, поверх этого ядра. Таким образом, объект страховой политики может рассматриваться как имеющий гибкий, расширяемый список преимуществ на нем, который может быть добавлен или удален или изменен во время выполнения. Каждое преимущество может иметь свойства, расширенные или уменьшенные на них.
Таким образом, пример используемого шаблона и достойный вариант использования: страховые полисы могут быть очень гибкими по прихоти андеррайтеров до момента продажи, поэтому для этого хорошо подходит гибкая модель.
Недостатки - это в значительной степени то, что кончается Yegge. Производительность может быть плохим, особенно с наивной реализацией. Проверка типов и безопасность наносят удар, а ваши объекты сложнее рассуждать, потому что вы точно не знаете, какие свойства на них.