, Все шаблоны разработки должны использоваться с осторожностью. По-моему необходимо осуществить рефакторинг к шаблонам , когда существует допустимая причина сделать так вместо того, чтобы реализовать шаблон сразу же. Общая проблема с использованием шаблонов состоит в том, что они добавляют сложность. Злоупотребление шаблонами подает данную заявку или систему, громоздкую, чтобы далее разработать и поддержать.
Большую часть времени, существует простое решение, и Вы не должны будете применять определенный шаблон. Хорошее эмпирическое правило должно использовать шаблон каждый раз, когда части кода имеют тенденцию быть замененными или должны часто изменяться и готовиться брать протест сложного кода при использовании шаблона.
Помнят, что Ваша цель должна быть простотой и использовать шаблон, если Вы видите практическую потребность поддерживать изменение в Вашем коде.
на спорное может походить использовать шаблоны, если они могут очевидно привести к сверхспроектированным и сложным решениям. Однако вместо этого намного более интересно для программиста читать на [1 113] методы проектирования и принципы , которые закладывают основу большинству шаблонов. На самом деле один из моего любимые книги по 'шаблонам разработки' подчеркивают это путем повторения на том, какие принципы применимы на рассматриваемом шаблоне. Они достаточно просты быть полезными, чем шаблоны с точки зрения уместности. Некоторые принципы являются достаточно общими для затрагивания больше, чем объектно-ориентированное программирование (OOP), такой как принцип замены Лисков , пока можно создать модули кода.
существует множество принципов разработки, но описанные в первая глава книги GoF довольно полезны для запуска с.
Впущенный те снижаются на Вас некоторое время. Нужно отметить что, когда GoF был записан интерфейс средства что-либо, что является абстракцией (который также означает суперклассы), чтобы не быть перепутанным с интерфейсом как тип в Java или C#. Второй принцип прибывает из наблюдаемого злоупотребления наследованием, которое является печально все еще распространено сегодня .
Оттуда можно читать на ТВЕРДЫЕ принципы , который был сообщен Robert Cecil Martin (иначе. Дядя Bob) . Интервьюируемый Дядя Scott Hanselman Входит подкаст об этих принципах :
Эти принципы являются хорошим началом, чтобы читать на и обсудить с Вашими коллегами. Можно найти, что принципы вплетают друг в друга и в другие процессы такой как [1 110] разделение внедрения зависимости проблем и . После выполнения TDD некоторое время также можно найти, что эти принципы прибывают естественно на практике, поскольку необходимо следовать за ними до некоторой степени для создания , изолировал и повторяемый модульные тесты.
Тот, что авторы самих Шаблонов разработки, самых взволнованных о, были шаблоном "Посетителя".
Это - "необходимое зло" - но часто по используемому, и потребность в нем часто показывает более фундаментальный дефект в Вашем дизайне.
альтернативное название шаблона "Посетителя" является "Мультиотправкой", потому что Шаблон "посетитель" - то, что Вы заканчиваете с тем, когда Вы хотите использовать язык OO отправки единственного типа для выбора кода для использования на основе типа два (или больше) различные объекты.
классический пример, являющийся этим, у Вас есть пересечение между двумя формами, но существует еще более простой случай, это часто пропускается: сравнение равенства двух неоднородных объектов.
Так или иначе, часто Вы заканчиваете с чем-то вроде этого:
interface IShape
{
double intersectWith(Triangle t);
double intersectWith(Rectangle r);
double intersectWith(Circle c);
}
проблема с этим состоит в том, что Вы связали вместе все свои реализации "IShape". Вы подразумевали, что каждый раз, когда Вы хотите добавить новую форму к иерархии, необходимо будет изменить все другие реализации "Формы" также.
Иногда, это - корректный минимальный дизайн - но продумайте его. Ваш дизайн действительно мандат, что необходимо ли диспетчеризировать на двух типах? Вы готовы записать каждый комбинаторный взрыв мультиметодов?
Часто, путем представления другого понятия можно сократить количество комбинаций, которые Вы на самом деле оказываетесь перед необходимостью писать:
interface IShape
{
Area getArea();
}
class Area
{
public double intersectWith(Area otherArea);
...
}
, Конечно, это зависит - иногда действительно необходимо записать код для обработки всех тех различных случаев - но стоит взять паузу и иметь думание прежде, чем сделать решающий шаг и использовать Посетителя. Это могло бы сохранить Вас много боли позже.
Одиночные элементы - класс с помощью одиночного элемента X имеет зависимость от него, это трудно видеть и трудно изолировать для тестирования.
Они используются очень часто, потому что они удобны и легки понять, но они могут действительно усложнить тестирование.
Видят , Одиночные элементы являются Патологическими Лгунами .
Я полагаю, что Шаблонный шаблон Метода обычно является очень опасным шаблоном.
Я не думаю, что необходимо избежать Шаблонов разработки (DP), и я не думаю, что необходимо вынудить себя использовать РАЗНОСТИ ПОТЕНЦИАЛОВ при планировании архитектуры. Мы должны только использовать РАЗНОСТИ ПОТЕНЦИАЛОВ, когда они естественный появляются из нашего планирования.
, Если мы определяем от запуска, что мы хотим использовать данный DP, многие наши будущие проектные решения будут влиянием тем выбором без гарантии, что DP, который мы выбрали, подходит для наших потребностей.
Одна вещь, которую мы также не должны делать, рассматривать DP как неизменный объект, мы должны адаптировать шаблон к нашим потребностям.
Так, суммирование, я не думаю, что мы должны избежать РАЗНОСТЕЙ ПОТЕНЦИАЛОВ, мы должны охватить их, когда они уже формируются в нашей архитектуре.
Я думаю, что Активная Запись является злоупотребившим шаблоном, который поощряет смешивать бизнес-логику с кодом постоянства. Это не делает очень хорошего задания сокрытия реализации устройства хранения данных от образцового слоя и связывает модели с базой данных. Существует много альтернатив (описано в PoEAA), таких как Шлюз Данных Таблицы, Шлюз Данных строки и Картопостроитель Данных, которые часто предоставляют лучшее решение и конечно помогают предоставить лучшую абстракцию устройству хранения данных. Кроме того, Ваша модель не должна потребность , чтобы быть сохраненной в базе данных; что относительно того, чтобы хранить их как XML или получить доступ к ним использующий веб-сервисы? Как легкий это должно было бы изменить механизм хранения Ваших моделей?
Однако Активная Запись не всегда плохо и идеально подходит для более простых приложений, где другие опции были бы излишеством.
Я надеюсь, что не буду избит слишком много для этого. Christer Ericsson написал две статьи ( одна , два ) по теме шаблонов разработки в его оперативный блог обнаружения коллизий. Его тон является довольно резким, и возможно немного провокационным, но человек знает свой материал, таким образом, я не отклонил бы его как бред сумасшедшего.
Я полагаю, что шаблон "наблюдатель" имеет много для ответа за, он работает в очень общих случаях, но поскольку системы становятся более сложными, это становится кошмаром, нуждаясь в OnBefore (), OnAfter () уведомления, и часто отправляя асинхронных задач избежать повторной входимости. Намного лучшее решение состоит в том, чтобы разработать систему автоматического анализа зависимости, что инструменты все доступы к объекту (с барьерами чтения) во время вычислений и автоматически создают край в графе зависимостей.
Дополнение к сообщению Spoike, Рефакторинг к Шаблонам является хорошим чтением.
Итератор - еще один шаблон GoF, которого следует избегать, или, по крайней мере, использовать его только тогда, когда нет альтернатив.
Альтернативами являются:
цикл for-each. Эта конструкция присутствует в большинстве основных языков и может быть использована для избегания итераторов в большинстве случаев.
селекторы а-ля LINQ или jQuery. Их следует использовать, когда for-each не подходит, поскольку не все объекты из контейнера должны быть обработаны. В отличие от итераторов, селекторы позволяют в одном месте указать, какой тип объектов должен быть обработан.
Некоторые говорят, что сервисный локатор - это антишаблон.