Бригада четырех - шаблоны проектирования - эти образцы образцов закодированы устаревшим образом? - PullRequest
20 голосов
/ 21 апреля 2011

Итак, чтобы прояснить мой вопрос ... каждый шаблон в печально известной книге GoF - Шаблоны проектирования Элементы многоразового объектно-ориентированного программного обеспечения - имеет свои примеры кода на C ++.

Они актуальны?Или в наше время код на C ++ выглядит совсем иначе?

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

Ответы [ 2 ]

16 голосов
/ 21 апреля 2011

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

Я хотел бы увидеть некоторые реализации шаблонов, использующие преимущества методов метапрограммирования. Я сильно подозреваю, что некоторые шаблоны, такие как Bridge, Adapter и, возможно, Facade, гораздо менее утомительны для реализации с помощью метапрограммирования. Из другого ответа и прочтения описания это выглядит так: Современный дизайн C ++: применены общие шаблоны программирования и проектирования может быть хорошей книгой для такого рода вещей. Я не могу лично за это поручиться.

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

Вот несколько примеров того, какие умные указатели можно использовать в различных контекстах. В этих примерах предполагается, что у вас есть C ++, который включает в себя расширения TR1 (Технический отчет 1):

Если у вас есть указатель на то, что полностью принадлежит объекту, указывающему на него, используйте ::std::auto_ptr (или ::std::unique_ptr в C ++ 1x). Помните, что ::std::auto_ptr нельзя хранить в контейнерах STL, но у ::std::unique_ptr нет этой проблемы. Примерами могут быть шаблон «Компонент» (если не было поделено двух подкомпонентов), шаблон «Фасад» и шаблон «Адаптер». Кроме того, шаблон Factory, вероятно, должен выдавать ::std::auto_ptr s (или ::std::unique_ptr s в C ++ 1x), если нет действительно веской причины для создания ::std::shared_ptr s.

Если у вас есть указатель на то, что имеет общее владение, используется ::std::tr1::shared_ptr. Например, шаблон Flyweight. Кроме того, в некоторых случаях шаблон компонента также может иметь это свойство. Это также может быть полезно в паттерне Bridge.

Если у вас есть указатель на то, что не принадлежит вам логически, тогда ::std::tr1::weak_ptr - путь. Имейте в виду, что если вы используете ::std::tr1::weak_ptr, вам также следует использовать ::std::tr1::shared_ptr для всех объектов, которые логически владеют (или совместно владеют) указанным объектом. Примером этого является шаблон Observer.

10 голосов
/ 21 апреля 2011

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

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

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

Кроме того, верно и то, что за последнее десятилетие способ написания кода на C ++ сильно изменился.Таким образом, вы можете объединить эти новые методы со старой идеей / шаблонами, представленными в книге GOF.Например, Андрей Александреску использовал шаблоны для реализации многих шаблонов ( старые шаблоны) в своей книге:

Современный дизайн C ++: универсальное программирование и шаблоны проектированияПрикладной

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