Неподавленные шаблоны дизайна -- design-patterns поле с участием oop поле с участием anti-patterns пол Связанный проблема

Misused design patterns


19
vote

проблема

русский

Есть ли в канонической банде из четырех списков, любые шаблоны дизайна, которые вы часто находите неправильно используемыми, неправильно поняты или чрезмерными (кроме высокочистки Singleton)? Другими словами, есть ли шаблон дизайна, который вы посоветуете, чтобы дважды подумать, прежде чем использовать? (А почему?)

Английский оригинал

Are there, in the canonical Gang of Four list, any design patterns that you often find misused, misunderstood or overused (other than the highly debated Singleton)? In other words, is there a design pattern you would advise to think twice before using? (And why?)

</div
        
 
 

Список ответов

17
 
vote

Синглтон Узор .. Глобальное государство часто приводит к проблемам при тестировании

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

 

The singleton pattern .. global state often leads to problems when testing

Any code depending on the singleton gets harder and harder to test because that dependency isn't easily mocked..

</div
 
 
       
       
15
 
vote

Фабрики ...

Я перевал в проекте до того, как каждый один <код> MyObject в системе был эквивалентный <код> MyObjectFactory для создания новых экземпляров. Там не было понятия абстракции или расширенные классы ... просто простым старым классом & AMP; ClassXFactory.

И никто не мог объяснить, почему ... "Это было просто так, как все всегда было сделано"

 

Factory Patterns...

I was parachuted into a project before where every single MyObject in the system had an equivalent MyObjectFactory for generating new instances. There was no concept of abstraction or extended classes... just plain old ClassX & ClassXFactory.

And no-one could explain why... "It was just the way things had always been done"

</div
 
 
   
   
9
 
vote

единственный (помимо вышеупомянутого синглтона и его партнера в преступлении, фабрику) не будет GOF, это было бы сетремистыми и получатель при применении к народным свойствам объекта.

Setters и Getters, применяемые к переменным элементами, функционально идентичны переменным участника. Getter без установки больше похоже на публичную финальную переменную члена - но в этот момент почему бы не просто использовать публичную конечную переменную члена, они не более наносятся ...

Единственное отличие состоит в том, что вы «можете» перехватить звонок и переопределить его, но люди редко делают. Чаще всего используется в качестве костыля для процедурных программистов, чтобы избежать программирования OO (что является настоящей причиной, это анти-шаблон).

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

Есть несколько исключений, которые я могу подумать:

Сетрители используются для упрощения конструкции объектов. Иногда необходимо создать объект, затем установить другие значения впоследствии. Эти значения должны быть неизменными (вы не должны иметь возможность звонить дважды) для безопасности.

Getters используются для доступа к содержащимся объектам. Поскольку содержащиеся объекты обычно способны застраховать свою целостность, делиться им великолепно. Соседниты, как правило, плохо в этом случае, вы не хотите, чтобы объект с определенным состоянием переменулся прямо под вашим носом, он облегчает свою целостность намного сложнее.

Java Beans Используется для компонентов экрана: Да, не может понять лучший способ реализации этих «шариков недвижимости». Отражение пригодится для этого компонента, шаблоны полезны - это вроде хаки, но работает.

DAO / DTO BEAL Объекты. Честно говоря, я думаю, что это использование IFFY из шаблона, но они шаблон . Он делает манипулирование свойствами через метаданные вместо кода гораздо сложнее, чем должно быть, так как он должен быть отражающим. Свойства бобов всегда привязаны к некоторому внешнему источнику (формат базы данных, формат передачи данных, свойства компонента, ...) Так почему же мы дублируем работу определения каждой части?

Редактировать: украден из комментариев Kyoryu, довел до поста, потому что это действительно идеальное резюме того, что я говорил и мог быть пропущен в комментариях. Поскольку, поскольку не все, кажется, получают концепцию, которые добавляют доступ к языку только кодифицируют плохую структуру дизайна OO:

Короткие версии -

 <код> if (account1.balance > 1000) {     account1.balance = account1.balance - 1000;     account2.balance = account2.balance + 1000; }; = BAD CODE.   account2.deposit(account1.withdraw(1000)); = GOOD CODE.    

Второй не требует аксессуаров ... - Kyoryu (Слегка модифицировано Биллом К, потому что у меня немного больше места, чем он в его комментарии).

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

Просто чтобы белкурировать точку еще больше, обратите внимание, что с стилем «хорошего кода» довольно очевидно, что вывод. WithDraw может быть объектом транзакции, который содержит информацию о всей транзакции, включая его успех, источник и назначение и ведение журнала способность. Как это произошло для того, кто пишет свой код в стиле «плохой код»?

Кроме того, как бы вы обрабатываете плохой код даже использовать такой объект? Это просто беспорядок.

 

The only one (besides the aforementioned Singleton and its partner in crime, the Factory) wouldn't be a GoF, it would be setters and getters when applied to an object's native properties.

Setters and getters applied to member variables are functionally identical to public member variables. A getter without a setter is more like a public final member variable--but at that point why not just use a public final member variable, they do no more harm...

The only difference is that you "could" intercept the call and override it, but people rarely do. More often it's used as a crutch for procedural programmers to avoid OO programming (which is the real reason it's an anti-pattern).

With a setter and/or getter you are still exposing your inner member structure to the outside world (for instance, you'll have to refactor other classes if you find you need to change a int to a long) and you are almost assuring that some code that should be inside your object is instead being placed outside.

There are a few exceptions I can think of:

Setters used to simplify an objects construction. Sometimes it's necessary to create an object then set other values in afterwards. These values should be immutable (you shouldn't be able to call set twice) for safety.

Getters used to access contained objects. Since the contained objects are usually able to insure their own integrity, sharing them is great. Setters are generally bad in this case, you don't want an object with a specific state swapped-out right underneath your nose, it makes assuring your own integrity much more difficult.

Java Beans used for screen components: Yeah, can't figure out a better way to implement these "property balls". Reflection comes in handy for this component, the patterns are useful--it's kinda hacky but works.

DAO/DTO Bean objects. Honestly I think these are an iffy usage of the pattern, but they are the pattern. It makes manipulation of the properties via meta-data instead of code much more difficult than it should be since it has to be reflective. The beans properties are always tied to some outside source (database format, data transfer format, component properties, ...) so why are we duplicating the work of defining each part?

Edit: Stolen from kyoryu's comment, brought up to the post because It's really a perfect summary of what I was saying and could be missed in the comments. Needed since not everybody seems to get the concept that adding accessors to the language only codifies a bad OO design pattern:

Short version -

if (account1.balance > 1000) {     account1.balance = account1.balance - 1000;     account2.balance = account2.balance + 1000; }; = BAD CODE.   account2.deposit(account1.withdraw(1000)); = GOOD CODE.  

The second one doesn't require accessors... – kyoryu (Slightly modified by bill k because I have a little more room than he did in his comment).

The second one moves the test and some other math inside Account rather than duplicating it throughout the code every place you might make a transfer.

Just to belabor the point EVEN MORE, note that with the "GOOD CODE" style it's pretty obvious that the output of .withdraw could be a Transaction object that contains information about the entire transaction including its success, source and destination and logging ability. How would this have occurred to someone who writes their code in "BAD CODE" style?

Also how would you refactor BAD CODE to even use such an object? It's just a mess.

</div
 
 
     
     
4
 
vote

На самом деле, то, что я вижу чаще всего, это отсутствие использования соответствующего шаблона. Типичный сценарий: ME: «Эй, модуль A a Уже есть кусок кода, который проходит через набор объектов и выполняет операцию базы данных x на них, почему вы не использовали этот код?» Кодер: «Ну, но мне пришлось делать операцию на этих объектах». Я: «Как насчет использования рефакторинга, чтобы использовать шаблон команды для выполнения x или y в зависимости от обстоятельств?»

Я когда-то видел использование узора темы-наблюдателя, выйти из руки. Он был реализован между процессами, использующими базу данных, чтобы постоянно хранить эту тему. Из-за чистого количества обновлений объекта, а также количество наблюдателей, нагрузка на базу данных была огромной, и вызвала непредвиденное замедление системы.

 

Actually, what I see most often is the lack of use of an appropriate pattern. Typical scenario: me: "Hey, module A already has a piece of code that loops through a set of objects and performs database operation X on them, why didn't you reuse that code?" coder: "well, but I had to do operation Y on those objects." me: "what about using refactoring it to use the Command pattern to execute X or Y as appropriate?"

I once saw usage of the Subject-Observer pattern get out of hand. It was implemented between processes using the database to persistently store the Subject. Because of the sheer number of updates to the subject, and the number of observers, the load on the database was tremendous, and caused an unforeseen system-wide slowdown.

</div
 
 
4
 
vote

Я бы также сказал фабрика. Подобный опыт как Eoin. В моем случае проект имел тонны заводов, потому что некоторые люди думали, что вы могли бы использовать объект A для локальной реализации и объекта B для удаленного, и он был абстрагирован через завод (что является разумной вещью).

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

.
 

I would also say the factory pattern. Similar experience as Eoin. In my case the project had tons of factories because some people thought you might have used object A for a local implementation and object B for remote one and it was abstracted via a factory (which is a sensible thing to do).

But the "remote" implementation has never been needed or implemented or even foreseen in the future... and also, less-skilled engineers started adopting the pattern for lots of other things just as a cookie cutter...

</div
 
 
 
 
3
 
vote

все.

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

Это не о том, чтобы не использовать тогда, это именно то, что вы сказали на этом вопросе, «подумать дважды перед использованием». Хорошо понять, что вы делаете и почему. Если вы этого не хотите, поговорите с кем-то, кто может тренировать вас на этом - помимо читать много. Остерегайтесь тех, которые знают все шаблоны, но не могут объяснить вас четко, что / почему любого из них - специально о том, что оно под сомнение.

 

ALL.

Don't take me wrong here, I find them to be a great base and when understood well very helpful. It takes so much out of you to acquire the design skills to know well when and how to apply them in the code. Actually, that's the overall case for the skills to create clean code.

Its not about not using then, is exactly what you said in the question "think twice before using". Understand well what you are doing and why. If you don't, talk to someone that can coach you on that - besides reading a lot. Beware of the ones that know all the patterns but can't explain you clearly the what/why of any of them - specially of the one in question.

</div
 
 
   
   
2
 
vote

Большой, который я вижу, - это синглтон, где не хватает ухода, а уход за уходом приносят к тому, как и когда должен быть вызван деструктор синглтона.

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

только мой 0,02.

ура,

Роб

 

The big one I see is the singleton pattern where not enough care and dilligence is applied as to how and when a singleton's destructor should be called.

For such a ubiquitous pattern there is hardly any discussion about the proper process to decide when a singleton must die.

Just my 0.02.

cheers,

Rob

</div
 
 
2
 
vote

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

 

The Mediator pattern definitely has the potential to be misused if all sorts of logic gets globbed into one huge class.

</div
 
 
2
 
vote

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

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

 

Actually, I would say design patterns in general are overused when a KISS (Keep It Simple, Stupid Keep it Short and Simple) solution is all that's needed.

Design patterns are great for making a system flexible, but at the cost of making the implementation more complex. This is only a worthwhile trade off when the flexibility will provide a practical advantage.

</div
 
 
   
   
1
 
vote

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

 

The observer pattern is pretty useless in C# because it has events.

</div
 
 
         
         
1
 
vote

Я просто хотел добавить еще один комментарий После просмотра некоторых из «всех шаблонов плохой» ответы.

Если вы половина достойного программиста, работающего над умеренно сложными проблемами, почти все ваттеры должны были представить себе в одну точку или другую как «очевидное» решение проблемы.

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

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

Если есть кто-то из них, вы уже не знали, вы, вероятно, просто никогда не нуждались в этом.

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

 

I just wanted to add another comment after seeing some of the "All patterns are bad" answers.

If you are a half decent programmer working on moderately challenging problems, nearly all the patters should have presented themselves to you at one point or another as the "Obvious" solution to a problem.

The only real point of the Design Patterns book was to put names to what we all do every day so we could communicate better.

I suppose if you are a newish programmer, it would be very helpful to read through them so that the day you need one you don't have to figure it out on your own, it's already in your toolbox, but in general--any of these could be figured out by a Gang of One (anyOne!).

If there are any of these you didn't already know, you probably just never needed it.

It is pretty useful to put names to the patters and formalize them a little though, I'm not complaining about the book at all. If you don't see the occasional need for nearly all of the patterns here, you just aren't working on very hard code (or you duplicate code a lot, something I consider THE cardinal sin).

</div
 
 
 
 
0
 
vote

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

Второе, часть шаблона для концепции концепции Дизайн шаблон От начала включали разделы для «применимости» и «последствия» - игнорируйте их по своему страхому риску. «Знание» узор не просто означает, что вы знаете, как кодировать его на языке по вашему выбору - это также означает знать, когда его использовать, и какие недостатки используют его, могут повлечь за собой.

 

First, "it depends" on the language - some structures in some languages lessen the need for certain design patterns.

Second, part of the template for the concept of a Design Pattern from the start has included sections for "Applicability" and "Consequences" - ignore these at your own risk. "Knowing" a pattern doesn't just mean you know how to code it in the language of your choice - it also means knowing when to use it, and what drawbacks using it may entail.

</div
 
 
0
 
vote

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

.

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

 

Only use a pattern when its called for. You can't predict the future, so while you might put a pattern in to make the design flexible, what happens when the product takes a different direction and your pattern becomes the very thing that's keeping you from implementing what your users want?

Keep designs as simple as possible to start with. When you know more about how your design needs to change, use the appropriate pattern and not before.

</div
 
 
0
 
vote

<Сильный> Узор репозитория

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

Сколько здесь людей видели репозитории, построенные как объекты доступа к данным?

 

REPOSITORY PATTERN

Most people start using this pattern right after reading the Domain Driven Design book by Eric Evans.

How many folks here have seen repositories constructed like data access objects?

</div
 
 
0
 
vote

Вы не можете иметь прямой ответ на этот вопрос. Это в основном субъективно и зависит от требования к применению.

  1. Большинство людей цитируют, что Singleton_Pattern это плохо, но это не плохо для каждого Пользователь и проект. Для моего требования к проекту это служит цели. Мне нужен один ConnectionManager для обработки управлений сеансов между клиентом и приложением, а Singleton делает работу блестяще.

  2. Вы дали третью сторону банку с хорошей документацией. Банка содержит иерархию наследования. Теперь вы должны добавить операцию на каждом ребенке. Поскольку у вас нет исходного кода, вы не можете это сделать. Теперь вы можете получить пользу, используя Visitor_Pattern . Но если у вас есть исходный код с вами, вы не можете использовать <код> Visitor Pattern. Вы можете просто добавить новую операцию в родительском и каждого ребенка. Отсутствие исходного кода не подразумевает, что я неправильно разработал <код> Visitor шаблон.

  3. Я хочу ограничить связь между различными объектами. Я пойду вперед с помощью Alludher mediator_pattern для коммуникации объекта. Я хочу ограничить воздействие клиента моей системе, чтобы скрыть сложность. Я пойду вперед с faceade_pattern . Это не значит, что я несмотря на эти шаблоны. Этот же пример можно продлевать на другие шаблоны, такие как Proxy_Pattern etc.

 

You can't have straight answer for this question. It's mostly subjective and depends on application requirement.

  1. Most of the people quoted that Singleton_pattern is bad but it's not bad for every user and project. For my project requirement, it serves the purpose. I need one ConnectionManager to handle session management between Client and Application and Singleton does the job brilliantly.

  2. You have given a third party jar with good documentation. The jar contains inheritance hierarchy. Now you have to add a operation on each child. Since you don't have source code, you can't do it. Now you can benefit by using Visitor_pattern. But if you have source code with you, you may not use Visitor pattern at all. You can simple add new operation in parent and each child. Lack of source code does not imply that I am misusingVisitor pattern.

  3. I want to limit communication between various objects. I will go-ahead with implement Mediator_pattern for object communication. I want to limit the client exposure to my system to hide the complexity. I will go-ahead with Facade_pattern. That does not mean that I am Misusing these patterns. This same example can be extended to other patterns like Proxy_pattern etc.

</div
 
 

Связанный проблема

0  Примеры последовательности и запуска запросов  ( Sequence and run query examples ) 
Я хотел бы получить несколько указателей и / или пример кода, о том, как использовать F # / функциональное программирование для поиска повторяющихся значений ...

4  Мой приложение ASP.NET MVC анемично  ( My asp net mvc application is anemic ) 
Я читаю Fowlers Описание анемического домена, и я считаю, что у меня такие симптомы. У меня есть несколько объектов, не делая ничего, кроме как передавать дан...

0  Что такое преимущество использования следующего рисунка, как описано в Docks Developer  ( What is the advantage of using following pattern as described in developer docs ) 
Я проходил через документы разработчика для привязки данных. Я нашел следующий фрагмент: <код> private var _binding: ResultProfileBinding? = null // This pr...

0  Проблема дизайна - создание шрифта Global (C ++, Marmalade)  ( Design issue making a font global c marmalade ) 
У меня есть проект Marmalade C ++, где встроенный в шрифте не масштабируется на экран. Чтобы справиться с этим вопросом, я делаю пользовательский шрифт, котор...

6  Объектно-ориентированный дизайн шаблон, чтобы избежать, если / затем / иначе заявления  ( Object oriented design pattern to avoid if then else statements ) 
Потому что я относительную новую, чтобы Ооп / C # Я не знаю правильный шаблон, чтобы решить это: Я должен построить архитектуру плагинов для разных поставщи...

2  Шаблон дизайна, чтобы выразить этот «контейнер» над полученным классом из контейнера базового класса  ( Design pattern to express that container over derived class is derived from co ) 
У меня есть класс <код> Track , который содержит набор <код> Point s и представляет местоположение человека во времени. Чтобы получить этот результат, я запу...

4  Интерфейс интерфейса <T> Использование C #  ( Interface of interfacet using c sharp ) 
Я не знаю, является ли следующее странно, но на самом деле нужен интерфейс для интерфейса и LT; T & GT; Для того, чтобы сохранить его в списке без указать кон...

1  Должна ли модель сделать вызовы услуг для получения данных  ( Should model make service calls to get data ) 
Мы создаем веб-сайт, используя шаблон MVC. До сих пор все страницы, которые мы построили использованные модели, которые должны были работать на справочных дан...

0  SQL новый столбец с шаблоном матча  ( Sql new column with pattern match ) 
У меня есть столбец с тингом URL, который выглядит так, как это http://www.somedomain.edu/rootsite1/somethy/something/ или http://www.somedomain.edu/sites...

0  Архитектура лука - методы области домена, которые требуют информации от инфраструктуры  ( Onion architecture domain model methods that require information from infrastr ) 
Я просто начинаю с DDD и внедряя архитектуру лука. Я делаю систему приглашения, где Super пользователь может пригласить другого пользователя по электронной ...

1  Как лучше разработать программу с расширенными и определенными методами, называемыми  ( How to better design a program with extended and specific methods being called ) 
Трудно сделать фразу, что я хочу в названии, но вот что я пытаюсь построить: Я создал серию StaticAPI классов для каждого Webservice, который я хочу потре...

48  Учетные модели проектирования программного обеспечения [Закрыто]  ( Accounting software design patterns ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос Off-Topic . В настоящее время он не принимае...

0  Воспользуйтесь стратегической структурой Сервисный слой с использованием пружинных данных JPA  ( Implement strategy pattern service layer using spring data jpa ) 
У нас есть следующая структура БД для многих модулей в БД. DB Table A - главная таблица, и есть несколько расширений этой таблицы (B, C, D и т. Д.), Без пер...

2  Сервер отдыха, Delphi и Web Services - необходимо совет  ( Rest server delphi and web services advice needed ) 
Я смотрю на совет о том, как лучше подходить к новому проекту, мне нужно развивать. С самого начала я должен добавить, у меня есть 0 опыт работы с веб-разрабо...

6  Общий родитель универсального ребенка C #  ( Generic parent of generic child c sharp ) 
У меня есть контейнер для родительского класса, который может содержать любой тип узла, в котором узел представляет собой подкласс универсального класса, спец...

Связанный проблема

0  Примеры последовательности и запуска запросов 
4  Мой приложение ASP.NET MVC анемично 
0  Что такое преимущество использования следующего рисунка, как описано в Docks Developer 
0  Проблема дизайна - создание шрифта Global (C ++, Marmalade) 
6  Объектно-ориентированный дизайн шаблон, чтобы избежать, если / затем / иначе заявления 
2  Шаблон дизайна, чтобы выразить этот «контейнер» над полученным классом из контейнера базового класса 
4  Интерфейс интерфейса <T> Использование C # 
1  Должна ли модель сделать вызовы услуг для получения данных 
0  SQL новый столбец с шаблоном матча 
0  Архитектура лука - методы области домена, которые требуют информации от инфраструктуры 
1  Как лучше разработать программу с расширенными и определенными методами, называемыми 
48  Учетные модели проектирования программного обеспечения [Закрыто] 
0  Воспользуйтесь стратегической структурой Сервисный слой с использованием пружинных данных JPA 
2  Сервер отдыха, Delphi и Web Services - необходимо совет 
6  Общий родитель универсального ребенка C #