Шаблоны разработки для предотвращения [закрытый]

104
задан Community 23 May 2017 в 12:34
поделиться

11 ответов

Шаблоны сложны

, Все шаблоны разработки должны использоваться с осторожностью. По-моему необходимо осуществить рефакторинг к шаблонам , когда существует допустимая причина сделать так вместо того, чтобы реализовать шаблон сразу же. Общая проблема с использованием шаблонов состоит в том, что они добавляют сложность. Злоупотребление шаблонами подает данную заявку или систему, громоздкую, чтобы далее разработать и поддержать.

Большую часть времени, существует простое решение, и Вы не должны будете применять определенный шаблон. Хорошее эмпирическое правило должно использовать шаблон каждый раз, когда части кода имеют тенденцию быть замененными или должны часто изменяться и готовиться брать протест сложного кода при использовании шаблона.

Помнят, что Ваша цель должна быть простотой и использовать шаблон, если Вы видите практическую потребность поддерживать изменение в Вашем коде.

Принципы по шаблонам

на спорное может походить использовать шаблоны, если они могут очевидно привести к сверхспроектированным и сложным решениям. Однако вместо этого намного более интересно для программиста читать на [1 113] методы проектирования и принципы , которые закладывают основу большинству шаблонов. На самом деле один из моего любимые книги по 'шаблонам разработки' подчеркивают это путем повторения на том, какие принципы применимы на рассматриваемом шаблоне. Они достаточно просты быть полезными, чем шаблоны с точки зрения уместности. Некоторые принципы являются достаточно общими для затрагивания больше, чем объектно-ориентированное программирование (OOP), такой как принцип замены Лисков , пока можно создать модули кода.

существует множество принципов разработки, но описанные в первая глава книги GoF довольно полезны для запуска с.

  • Программа к 'интерфейсу', не 'реализация'. (Банда Четыре 1995:18)
  • Польза 'возражают составу' по 'наследованию классов'. (Банда Четыре 1995:20)

Впущенный те снижаются на Вас некоторое время. Нужно отметить что, когда GoF был записан интерфейс средства что-либо, что является абстракцией (который также означает суперклассы), чтобы не быть перепутанным с интерфейсом как тип в Java или C#. Второй принцип прибывает из наблюдаемого злоупотребления наследованием, которое является печально все еще распространено сегодня .

Оттуда можно читать на ТВЕРДЫЕ принципы , который был сообщен Robert Cecil Martin (иначе. Дядя Bob) . Интервьюируемый Дядя Scott Hanselman Входит подкаст об этих принципах :

  • принцип S Ответственности за огонь
  • перо O Закрытый Принцип
  • принцип L iskov Замены
  • я nterface Принцип Сегрегации
  • принцип D ependency Инверсии

Эти принципы являются хорошим началом, чтобы читать на и обсудить с Вашими коллегами. Можно найти, что принципы вплетают друг в друга и в другие процессы такой как [1 110] разделение внедрения зависимости проблем и . После выполнения TDD некоторое время также можно найти, что эти принципы прибывают естественно на практике, поскольку необходимо следовать за ними до некоторой степени для создания , изолировал и повторяемый модульные тесты.

146
ответ дан 11 revs, 2 users 95% 24 November 2019 в 04:08
поделиться

Тот, что авторы самих Шаблонов разработки, самых взволнованных о, были шаблоном "Посетителя".

Это - "необходимое зло" - но часто по используемому, и потребность в нем часто показывает более фундаментальный дефект в Вашем дизайне.

альтернативное название шаблона "Посетителя" является "Мультиотправкой", потому что Шаблон "посетитель" - то, что Вы заканчиваете с тем, когда Вы хотите использовать язык 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);
    ...
}

, Конечно, это зависит - иногда действительно необходимо записать код для обработки всех тех различных случаев - но стоит взять паузу и иметь думание прежде, чем сделать решающий шаг и использовать Посетителя. Это могло бы сохранить Вас много боли позже.

21
ответ дан Paul Hollingsworth 24 November 2019 в 04:08
поделиться

Одиночные элементы - класс с помощью одиночного элемента X имеет зависимость от него, это трудно видеть и трудно изолировать для тестирования.

Они используются очень часто, потому что они удобны и легки понять, но они могут действительно усложнить тестирование.

Видят , Одиночные элементы являются Патологическими Лгунами .

16
ответ дан orip 24 November 2019 в 04:08
поделиться

Я полагаю, что Шаблонный шаблон Метода обычно является очень опасным шаблоном.

  • Много времен это израсходовало Вашу иерархию наследования по "неправильным причинам".
  • Базовые классы имеют тенденцию стать замусоренными всеми видами кода unerelated.
  • Это вынуждает Вас заблокировать вниз дизайн, часто довольно рано в процессе разработки. (Преждевременная блокировка вниз в большом количестве случаев)
  • Изменение этого на более позднем этапе становится просто более трудным и более твердым.
14
ответ дан krosenvold 24 November 2019 в 04:08
поделиться

Я не думаю, что необходимо избежать Шаблонов разработки (DP), и я не думаю, что необходимо вынудить себя использовать РАЗНОСТИ ПОТЕНЦИАЛОВ при планировании архитектуры. Мы должны только использовать РАЗНОСТИ ПОТЕНЦИАЛОВ, когда они естественный появляются из нашего планирования.

, Если мы определяем от запуска, что мы хотим использовать данный DP, многие наши будущие проектные решения будут влиянием тем выбором без гарантии, что DP, который мы выбрали, подходит для наших потребностей.

Одна вещь, которую мы также не должны делать, рассматривать DP как неизменный объект, мы должны адаптировать шаблон к нашим потребностям.

Так, суммирование, я не думаю, что мы должны избежать РАЗНОСТЕЙ ПОТЕНЦИАЛОВ, мы должны охватить их, когда они уже формируются в нашей архитектуре.

9
ответ дан Megacan 24 November 2019 в 04:08
поделиться

Я думаю, что Активная Запись является злоупотребившим шаблоном, который поощряет смешивать бизнес-логику с кодом постоянства. Это не делает очень хорошего задания сокрытия реализации устройства хранения данных от образцового слоя и связывает модели с базой данных. Существует много альтернатив (описано в PoEAA), таких как Шлюз Данных Таблицы, Шлюз Данных строки и Картопостроитель Данных, которые часто предоставляют лучшее решение и конечно помогают предоставить лучшую абстракцию устройству хранения данных. Кроме того, Ваша модель не должна потребность , чтобы быть сохраненной в базе данных; что относительно того, чтобы хранить их как XML или получить доступ к ним использующий веб-сервисы? Как легкий это должно было бы изменить механизм хранения Ваших моделей?

Однако Активная Запись не всегда плохо и идеально подходит для более простых приложений, где другие опции были бы излишеством.

7
ответ дан Tim Wardle 24 November 2019 в 04:08
поделиться

Я надеюсь, что не буду избит слишком много для этого. Christer Ericsson написал две статьи ( одна , два ) по теме шаблонов разработки в его оперативный блог обнаружения коллизий. Его тон является довольно резким, и возможно немного провокационным, но человек знает свой материал, таким образом, я не отклонил бы его как бред сумасшедшего.

5
ответ дан falstro 24 November 2019 в 04:08
поделиться

Я полагаю, что шаблон "наблюдатель" имеет много для ответа за, он работает в очень общих случаях, но поскольку системы становятся более сложными, это становится кошмаром, нуждаясь в OnBefore (), OnAfter () уведомления, и часто отправляя асинхронных задач избежать повторной входимости. Намного лучшее решение состоит в том, чтобы разработать систему автоматического анализа зависимости, что инструменты все доступы к объекту (с барьерами чтения) во время вычислений и автоматически создают край в графе зависимостей.

2
ответ дан Jesse Pepper 24 November 2019 в 04:08
поделиться

Дополнение к сообщению Spoike, Рефакторинг к Шаблонам является хорошим чтением.

2
ответ дан Adeel Ansari 24 November 2019 в 04:08
поделиться

Итератор - еще один шаблон GoF, которого следует избегать, или, по крайней мере, использовать его только тогда, когда нет альтернатив.

Альтернативами являются:

  1. цикл for-each. Эта конструкция присутствует в большинстве основных языков и может быть использована для избегания итераторов в большинстве случаев.

  2. селекторы а-ля LINQ или jQuery. Их следует использовать, когда for-each не подходит, поскольку не все объекты из контейнера должны быть обработаны. В отличие от итераторов, селекторы позволяют в одном месте указать, какой тип объектов должен быть обработан.

0
ответ дан 24 November 2019 в 04:08
поделиться

Некоторые говорят, что сервисный локатор - это антишаблон.

5
ответ дан 24 November 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: