Каковы преимущества и недостатки шаблона свойств?

Стив Йегге описывает Шаблон свойств в блоге своего.

Для кого-то, использующего статический язык, такой как С# или Java, каковы преимущества и недостатки этого подхода? В каких проектах вы хотели бы использовать шаблон свойств, и когда вы хотите его избежать?

Ответ 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. Производительность может быть плохим, особенно с наивной реализацией. Проверка типов и безопасность наносят удар, а ваши объекты сложнее рассуждать, потому что вы точно не знаете, какие свойства на них.

Ответ 2

Шаблон свойств особенно полезен (или, это было для меня), когда вы хотите создать прототипы объектов или иметь структуру разработки, которая несколько заставляет вас иметь итеративное развертывание вашего API/Интерфейса.

Если вы начинаете с идеи некоторых свойств объекта, то вы их создаете. Позже вы обнаружите (и вы ожидали этого открытия...), что ваше понимание предметной области было недостаточным, вы создаете новый дизайн/поведение объекта, основанный на прототипе первого объекта. И так далее. Вики-страница на эту тему имеет очень хорошее описание предмета в сочетании со статическими типизированными языками, но я бы рекомендовал вам изучить JavaScript или Lua, если вы действительно серьезно относитесь к разработке прототипов. Свойства прототипов не изменяются в статических типизированных языках, и этот факт в конечном итоге укусит вас по дороге.

Изменить: О, и я вижу, что вы ссылаетесь на отличный пост по этому вопросу. Yegges использует/объясняет предмет, конечно, делает меня карликом. Прочитайте его через пару раз, и преимущества/последствия использования шаблона свойств на языке, таком как java, должны быть очень понятны вам.

Edit.2: ссылка на статью в Википедии: http://en.wikipedia.org/wiki/Prototype_pattern

Ответ 3

Для кого-то, использующего Java, когда я читаю статью, я бы сказал, что вы не можете использовать шаблон свойств для любых проектов, потому что цитата:

Java предлагает практически нулевую поддержку шаблона свойств.

То же самое было бы верно для С# по тем же причинам. Когда я пришел к этому заявлению, я почувствовал себя немного утешительно, потому что я, конечно же, не нашел возможности их сочетать.

Итак, я не уверен, что понимаю ваш вопрос. Но спасибо за ссылку - повысьте вопрос только для этого. Теперь я понимаю некоторые вещи, которые я натолкнул немного лучше.