![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,103
|
![]()
Получили мы объект посредством вызова фабричного метода как указатель на интерфейс. Как тогда удалить этот объект, когда он станет ненужным?
|
![]() |
![]() |
![]() |
#12 | |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]() Цитата:
То есть если нужно удалять объект через интерфейсы, то можно включить виртуальный деструктор. А если не надо, то вот таким способом это запретить. Мне думается что понятие интерфейса подразумевает, что мы не будет удалять объект через интерфейсы, так как смысла в этом нет. Ведь интерфейс создан для управления и ему лишь временно передаётся возможность управления объектом. Что будет если использовать более одного интерфейса на объекте, потом удалить одним из них объект и попытаться использоваться другой интерфейс. Будет ошибка. |
|
![]() |
![]() |
![]() |
#13 | ||
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
Переходим к следующему шаблону проектирования так же принадлжащему к типу основных шаблонов (Fundamental)
* Delegation pattern/Шаблон делегирования Оригинальничать не будем, потому сразу определение из вики: Цитата:
Цитата:
Как уже было сказано, шаблон делегирования, так же известный как техника программирования включение-делегирование, ухудшает чистоту абстракций. Но здесь так же стоит отметить, что подобное негативное влияние можно сократить, а можно наоборот увеличить этот эффект. Под увеличением подразумеваются смешанные классы. Они очень сильно вредят чётким абстракциям. Плюс заключается в возможности перестроения чужих алгоритмов под свои собственные. Таким образом можно перенести целые наборы библиотек. Именно так был построен .NET Framework, ведь рефлектор наглядно показывает, что шаблон делегирования используется в нём чуть ли не чаще, чем всё остальное. Аналогичным образом строится Mono, непроделегированные методы можно просто объявить неиспользуемыми. Если проследить рефлектором историю изменения, то от версии 1.1 к версии 2.0 данная техника программирования стала использоваться для ухудшения абстракций самого дотнета. Хотя речь совсем не о том, в какую сторону двигается майкрософт, а о C++. Простейший пример делегирования: Код:
Код:
Конечно, недостаток в том, что приходится переключать весь класс. Так же подобных результатов можно добиться указателями на функции, а не только интерфейсами. Как бы то ни было к шаблону делегирования это не относится. Последний раз редактировалось atomicxp; 13.06.2009 в 17:44. Причина: Delegation pattern/Шаблон делегирования |
||
![]() |
![]() |
![]() |
#14 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
Далее по плану следует Immutable/Неизменяемый объект. Для начала нужно сказать, что неизменяемость объекта достигается различными путями. Как только объект был инициализирован, он уже не должен изменятся с точки зрения пользователя этого объекта, и не важно, чем это выражено. Объект может быть как частично, так и полностью незименямым. Иногда это достигается ключевым словом const, в других случаях закрытыми полями и методом доступа с запретом изменять значения объекта.
Простейший случай использования: Код:
|
![]() |
![]() |
![]() |
#15 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,103
|
![]()
Если добавить в объект коллекцию (массив, список,...), то уже не всё так тривиально будет. Если изменить коллекцию, то изменится ли состояние объекта? Можно ли для константного объекта изменять отдельные элементы коллекции или нет? и т.д. Но всё это будет уже зависеть от конкретной задачи
![]() |
![]() |
![]() |
![]() |
#16 | |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]() Цитата:
![]() Не знаю насколько оно точно соответствует принятым понятиям, хотя и прочёл книгу про UML. Как раз эта одна из целей, которой нужно добиться, а именно чёткое соответствие графического вида и конкретной реализации. Причём дело не в детализации, графический вид может иметь её в меньшей степени, а в неукоснительном следовании уже принятым понятиям. Стереотипы традиционно выделяются в <<>>, а # так понял означает закрытый. Стереотип <<Immutable>> в данном случае отнёс вовсе не к классу, а к методу. Иными словами шаблоны проектирования бывают разными и относятся к разным частям класса. Поскольку уже было рассмотрено три шаблона, то возникает вопрос, можно ли комбинировать какие-либо из них. Если взять тот же интерфейс, то его стереотип был бы записан наверху, заместо слова <<stereotype>> находилось бы <<Interface>>. А вот шаблон делегирования и неизменяемости относятся к методам, особенно если исходить, что включённые (агрегированные) объекты брать всегда используя методы, а сами объекты делать закрытыми или защищёнными. Иными словами пользоваться свойствами (присвоение или извлечение объекта с проверкой), ведь даже там где они имеют другой вид, например, .NET, на самом деле создаются методы с приставкой get/set. Может ли в методе быть <<immutable delegation>>, очевидно да. Даже в таких размытых шаблонах проектирования можно добиться определённости. Причём как видно, шаблоны этих же категорий, а так же многих других, имеют более чёткое определение и вообще не комбинируются вместе. |
|
![]() |
![]() |
![]() |
#17 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
Основные шаблоны (Fundamental)
* Delegation pattern/Шаблон делегирования * Functional design/Шаблон функционального дизайна * Immutable/Неизменяемый объект * Interface * Marker interface * Property Container Property Container/Контейнер свойств Ниже представлен простейший пример с закрытым значением поля, который хранит свойство. Два метода, один называется accessor, имеет приставку get и извлекает значение. Другой называется mutator, имеет приставку set и изменяет значение. Код:
|
![]() |
![]() |
![]() |
#18 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,103
|
![]()
Таки для наглядности в "мутаторе" можно проверку какую-нибудь всеже написать:
Код:
![]() |
![]() |
![]() |
![]() |
#19 | |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]() Цитата:
В нём так же будут использоваться посторонние элементы, такие как сравнитель (comparer, comparator) и так далее, которые тоже являются частью некой системы. Для простоты, конечно, можно написать, что-то вроде, если недопустимое условие бросить исключение, а дальше просто описать извлечение или присвоение данных, но это был бы не лучший выход в свете рассмотрения шаблонов, ведь применяя их нужно действовать совсем по другому. Основной смысл моих рассуждений выделить шаблоны проектирования и согласовать их с конкретной реализацией на языке C++ для кроссплатформенного программирования. Если что-то выходит за рамки рассматриваемого шаблона, то лучше это не писать. |
|
![]() |
![]() |
![]() |
#20 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
Осталось обсудить два шаблона проектирования:
* Functional design/Шаблон функционального дизайна * Marker interface/Разметочный интерфейс Шаблон функционального дизайна гласит, что класс должен отвечать за минимальную область деятельности. Любители смешанных классов (миксов) нарушают этот фундаментальный принцип, уменьшая степень абстракции. В конце концов если смешанные классы перерастают в божественные, ни о какой абстракции системы говорить не приходится. Такую технику программирования можно воспринимать как псевдо объекто-ориентированное программирование. Существует ряд рекомендованных правил для этого шаблона. Одно из них правило семи - в классе нужно стараться держать не более семи элементов. Контейнер свойств из двух методов можно воспринимать как один элемент. Даже если они ссылаются на включённый (агрегированный) класс, это все равно не три элемента, а один. Если элементов стало больше семи, то это не значит, что нужно немедленно начать всё делить. Это значит, что надо задуматься над реализацией, возможно в ней что-то неправильно, и она нуждается в перепроектировании. Так же стоит следить за чистотой реализации, не допускать чрезмерного смешения шаблонов проектирования, которые для этого не предназначены. Разметочный интерфейс позволяет получить дополнительные данные о классах, то есть метаданные (данные о данных). В некоторых системах текущий шаблон проектирования известен как рефлексия. Реализовывается различными способами, например, атрибутами. Что касается C++, то пока мне трудно назвать лучший способ их реализации, а вариантов довольно много. Хотя напрашивается очевидный вывод использовать для этого интерфейсы, реализация которых уже была описана выше, с проверкой на их существование. Впрочем пока оставлю это на обсуждение. Если кто думает, что знает, какая из реализаций лучше и приемлемей, чем другая, пусть запостит в эту тему код. |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Паттерны проектирования | shinauri | PHP | 0 | 17.07.2012 17:06 |
Консольный текстовый редактор и паттерны | delias | C# (си шарп) | 0 | 22.04.2011 00:41 |
паттерны для детсада | pproger | Общие вопросы по программированию, компьютерный форум | 4 | 11.04.2011 19:40 |
паттерны проектирования | prokach | Общие вопросы C/C++ | 3 | 18.01.2011 22:23 |