Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
Заблокирован

Паттерны проектирования языкозависимы

28.02.2017, 18:58. Показов 4121. Ответов 59

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

Во первых, разгребание кучи кода, специфичного для какого то убогонького язычка отвлекает от сути, и приводит к лишней трате времени. К примеру, эквивалент примера паттерна "Прокси" с википедии на Io в 2 строки
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//////// implementation ///////////////
 
Proxy := Object clone do(
   forward := method( target doMessage(call message) )
)
 
////////// example ////////////////////
 
Math := Object clone do(
   add := method(x, y, x + y)
   sub := method(x, y, x - y)
   mul := method(x, y, x * y)
   div := method(x, y, x / y)
)
 
 
p := Proxy clone do(
   target := Math clone
   add := method(x, y, "go out")
)
 
p do(
 writeln(add(4, 2))   #>>>> go out
 writeln(sub(4, 2))   #>>>> 2
 writeln(mul(4, 2))   #>>>> 8
 writeln(div(4, 2))   #>>>> 2
)
К тому же это более обобщенная и удобная реализация, нежели, например на питоне.

Вот паттерн Observer
Code
1
2
3
4
5
6
7
8
Observer := Object clone do(
   onMessage := method(arg, arg println) // default reaction, just print
)
Subject := List clone do(
   subscribe := getSlot("push")
   unsubscribe := getSlot("remove")
   notify := method(arg, self foreach(o, o onMessage(arg)))
)
Кроме того, многие паттрны "изобретены" именно для того, чтобы преодолеть ограничения языков, в основном статических, и де-факто вообще не нужны.

Вот тут есть кое-что об этом от Питера Норвига.

http://norvig.com/design-patte... tterns.pdf

Так что, следует 10 раз подумать, прежде чем лезть на амбразуру, а надо ли оно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.02.2017, 18:58
Ответы с готовыми решениями:

Актуальны ли паттерны проектирования
всем привет, Актуальны ли паттерны проектирования и как вы оцениваете их в будущем

Паттерны (шаблоны) проектирования
Доброго время суток. Надо реальная программа с описанием используемых паттернов в ней. Можите пожалуста скинуть ссылки где это можна...

Где взять Паттерны проектирования?
Товарищи, подскажите пожалуйста, где можно скачать книгу 'Приемы объектно-ориентированного проектирования. Паттерны проектирования' Эрих...

59
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
02.03.2017, 01:32
Цитата Сообщение от oopguru Посмотреть сообщение
Не обязательно, но в данном случае, я создал отдельный класс Proxy, что является более мощным решением.
Но это "решение" не делает того, что делает "тупой хардкор", который Вы написали. Какое отношение Ваш класс Proxy имеет к шаблону Прокси? Вместо "тупого хардкора" Ваш класс Proxy использовать нельзя, вместе с "тупым хардкором" его использовать в лучшем случае бессмысленно.

Добавлено через 3 минуты
Цитата Сообщение от oopguru Посмотреть сообщение
Все остальное будет перенаправлено в Math автоматически.
Вы видите разницу между
Python
1
return self.math.mul(x, y)
и
Python
1
2
3
        if not self.math:
            self.math = Math()
        return self.math.mul(x, y)
Каким образом первый код может заменить второй?
0
Заблокирован
02.03.2017, 01:37
Цитата Сообщение от Shamil1 Посмотреть сообщение
Но это "решение" не делает того, что делает "тупой хардкор", который Вы написали
делает именно то. В общем, Вы либо код не можете прочитать (пример же в стартовом посте, абсолютно аналогичный), либо вообще данный шаблон не понимаете, что наиболее вероятно. Последний раз: суть шаблона в перехвате и обработке запроса с последующим возможным перенаправлением. На этом вопрос закрыт.

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

Добавлено через 2 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
self.math = Math()
это сути шаблона не касается. В моем примере этот экземпляр создается сразу. Нигде нет требования, чтобы он создавался именно при вызове какого-то метода, хотя это сделать тоже несложно. Этот объект может быть вообще за пределами класса, и шариться между разными объектами, никаких ограничений на этот счет нет
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
02.03.2017, 02:14
Цитата Сообщение от oopguru Посмотреть сообщение
это сути шаблона не касается
В этом суть шаблона... Это пример виртуального прокси, суть которого в управлении временем жизни реального объекта. Суть того примера в том, что экземпляр создаётся не сразу. Создание объекта Math - очень затратная операция, и именно из-за этого используется виртуальный Прокси.

Цитата Сообщение от oopguru Посмотреть сообщение
пример же в стартовом посте, абсолютно аналогичный
Пример же в первом посте вообще ужасный. В частности строка
Code
1
 add := method(x, y, "go out")
противоречит сути шаблона. Клиент не должен видеть разницы между вызовом реального объекта и его заместителя. То есть, замещающая функция из прокси должна возвращать тот же результат (отличаться только побочным эффектом).

Цитата Сообщение от oopguru Посмотреть сообщение
Вы не отреагировали на мое предложение
Вы с одним вопросом разобраться не можете. Не понимаете, что я пишу, или делаете вид, что не понимаете. Не вижу смысла начинать дискуссию по другому вопросу, пока не закончена дискуссия по предыдущему. Какой смысл сравнивать реализации прокси, если у нас с Вами разные представления о том, что этот шаблон делает и для чего он нужен?
0
Заблокирован
02.03.2017, 02:25
Цитата Сообщение от Shamil1 Посмотреть сообщение
Клиент не должен видеть разницы между вызовом реального объекта и его заместителя. То есть, замещающая функция из прокси должна возвращать тот же результат (отличаться только побочным эффектом)
Есть пруф?
0
Эксперт .NET
 Аватар для Usaga
14350 / 9453 / 1360
Регистрация: 21.01.2016
Сообщений: 35,636
02.03.2017, 06:07
Цитата Сообщение от oopguru Посмотреть сообщение
Вот, к примеру, зачем паттерн "одиночка" языку, в котором и так есть объект с глобальным доступом? Вы когда-нибудь видели чтобы такое использовали, и зачем?
Не совсем понял вопроса. Видел ли я\использовал ли паттерн "одиночка"? Да, бывает, но не часто.

Во-первых, это меня не напрягает, во-вторых я не брошусь переписывать все проекты с C# (который меня и моих коллег полностью устраивает) на Io"Любой другой uber-язык". Отчасти потому, что от того, что он свою функцию выполняет, отчасти от того, что абсолютно любой язык неизбежно имеет свои собственные недостатки.

Я это понимаю так: если в вашем Io\(или ещё чего) не нужно реализовывать паттерны "одиночка", "команда", "медиатор", "что-то ещё" + есть куча мега-плюшек, то это за счёт того, что в нём неизбежно придётся реализовывать паттерны "конь педальный", "свистопердок" и "пятачок".

Т.е. идеального языка как не было так и нет. А писать код надо уже сегодня.

Цитата Сообщение от oopguru Посмотреть сообщение
Любой динамический язык
Ну уж увольте.

Так что да, многие паттерны может и призваны компенсировать недостатки языков программирования, но это не такая и проблема, на самом-то деле.
0
Эксперт .NET
 Аватар для Usaga
14350 / 9453 / 1360
Регистрация: 21.01.2016
Сообщений: 35,636
02.03.2017, 06:12
Цитата Сообщение от oopguru Посмотреть сообщение
Есть пруф?
Вообще-то, это должно быть очевидно хотя бы из того же названия.

Но и википедия об этом заявляет прямо (если она для вас достаточно авторитетна, чтобы ей верить):
Миниатюры
Паттерны проектирования языкозависимы  
0
Заблокирован
02.03.2017, 06:56
Цитата Сообщение от Usaga Посмотреть сообщение
Вообще-то, это должно быть очевидно хотя бы из того же названия.
Вообще то из названия следует совершенно обратное. Прокси-сервер, к примеру, проксирует любые запросы. В некоторых языках, например в JS есть нативный класс Proxy, который не обязан иметь общий с проксируемым объектом интерфейс
Цитата Сообщение от Usaga Посмотреть сообщение
Но и википедия об этом заявляет прямо
во-первых, идентичный != одинаковый
во-вторых
Цитата Сообщение от Usaga Посмотреть сообщение
если она для вас достаточно авторитетна, чтобы ей верить
нет, не достаточно, так как там может писать любой школьник все что ему вздумается

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

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
но это не такая и проблема, на самом-то деле.
это Вам так только кажется. Из-за недостатка гибкости Вы просто не можете писать прототипы, и, тем более, сколько нибудь сложные приложения.
0
Эксперт .NET
 Аватар для Usaga
14350 / 9453 / 1360
Регистрация: 21.01.2016
Сообщений: 35,636
02.03.2017, 07:01
Цитата Сообщение от oopguru Посмотреть сообщение
В некоторых языках, например в JS есть нативный класс Proxy, который не обязан иметь общий с проксируемым объектом интерфейс
Разве?

Цитата Сообщение от oopguru Посмотреть сообщение
идентичный != одинаковый
Это как?..

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

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

Добавлено через 1 минуту
Цитата Сообщение от oopguru Посмотреть сообщение
Из-за недостатка гибкости Вы просто не можете писать прототипы, и, тем более, сколько нибудь сложные приложения.
Чем же тогда я последние два года занимался? Или может наличие гибкости как раз и позволяет мне успешно пользоваться "убогиньким" языком без особых проблем для психики?..
0
Заблокирован
02.03.2017, 07:21
Цитата Сообщение от Usaga Посмотреть сообщение
Разве?
Определенно
Цитата Сообщение от Usaga Посмотреть сообщение
Это как?
примерно так, что для того чтобы два слона были идентичными, им не обязательно иметь одинаковый вес и размер хобота
Цитата Сообщение от Usaga Посмотреть сообщение
А его реализация как раз и основывается на решаемой задаче, нет?
реализация не важна, важно лишь требуемое поведение.
Цитата Сообщение от Usaga Посмотреть сообщение
Идея паттерна "прокси" - создать суррогат, неотличимый с точки зрения потребителя ожидающего нечно, под что этот суррогат "косит
Если это даже так, то это условие не требует полного совпадения в интерфейсе.
Цитата Сообщение от Usaga Посмотреть сообщение
Или может наличие гибкости как раз и позволяет мне успешно пользоваться "убогиньким" языком без особых проблем для психики?..
разве что, гибкости пальцев, чтобы по клаве ловчей шмякать
0
Эксперт .NET
 Аватар для Usaga
14350 / 9453 / 1360
Регистрация: 21.01.2016
Сообщений: 35,636
02.03.2017, 07:32
Цитата Сообщение от oopguru Посмотреть сообщение
Если это даже так, то это условие не требует полного совпадения в интерфейсе.
Требует. Суррогат не должен ничем выдавать свою суррогатную сущность. Т.е. введение данной штуки не должно приводить к изменению уже существующего кода, чтобы адаптировать его к этому суррогату. Если такие изменения нужны - то речь идёт не о суррогате.

Цитата Сообщение от oopguru Посмотреть сообщение
разве что, гибкости пальцев, чтобы по клаве ловчей шмякать
Ну, "шмякать" по клаве в процессе работы, это не тоже самое, что абстрактные рассуждения вести на форумах

Добавлено через 3 минуты
Цитата Сообщение от oopguru Посмотреть сообщение
примерно так, что для того чтобы два слона были идентичными, им не обязательно иметь одинаковый вес и размер хобота
Ну офигеть аналогия..

oopguru, вы случаем не забаненный ранее asmquest? Уж больно схожа манера общаться и приводить жидкие и мутные аргументы в пользу своего невнятного мнения?
0
Заблокирован
02.03.2017, 08:41
Цитата Сообщение от Usaga Посмотреть сообщение
Требует. Суррогат не должен ничем выдавать свою суррогатную сущность
Вот, в вашем случае он как раз и выдаст, если вы будете писать на нормальном языке, позволяющем рантайм-модификацию классов или экземпляров. Вы, например, доопределяете метод в целевом объекте, а в вашем прокси-объекте он не определен, и приехали. Быдлоязычков это все конечно не особо касается.
0
Эксперт .NET
 Аватар для Usaga
14350 / 9453 / 1360
Регистрация: 21.01.2016
Сообщений: 35,636
02.03.2017, 08:51
Цитата Сообщение от oopguru Посмотреть сообщение
Вот, в вашем случае он как раз и выдаст, если вы будете писать на нормальном языке, позволяющем рантайм-модификацию классов или экземпляров. Вы, например, доопределяете метод в целевом объекте, а в вашем прокси-объекте он не определен, и приехали. Быдлоязычков это все конечно не особо касается.
Ну а что помешает в прокси доопределить метод? В "быдлоязычках" ведь это придётся сделать, если интерфейс скрываемого объекта изменился.
0
Заблокирован
02.03.2017, 09:08
Цитата Сообщение от Usaga Посмотреть сообщение
В "быдлоязычках" ведь это придётся сделать, если интерфейс скрываемого объекта изменился.
Вот именно. Нет возможности абстрагироваться от реализации, надо всегда знать, где и что переопределено, и дополнительно переопределять прокси. Закат солнца вручную, как обычно
0
Эксперт .NET
 Аватар для Usaga
14350 / 9453 / 1360
Регистрация: 21.01.2016
Сообщений: 35,636
02.03.2017, 09:15
Цитата Сообщение от oopguru Посмотреть сообщение
Вот именно. Нет возможности абстрагироваться от реализации, надо всегда знать, где и что переопределено, и дополнительно переопределять прокси. Закат солнца вручную, как обычно
А ваш Io позволяет создавать прокси "невидимый" для потребителей и при этом не знать что и где переопределено?
0
Заблокирован
02.03.2017, 09:25
Цитата Сообщение от Usaga Посмотреть сообщение
А ваш Io позволяет создавать прокси "невидимый" для потребителей и при этом не знать что и где переопределено?
что значит "невидимый для потребителя"?
0
Эксперт .NET
 Аватар для Usaga
14350 / 9453 / 1360
Регистрация: 21.01.2016
Сообщений: 35,636
02.03.2017, 09:30
Цитата Сообщение от oopguru Посмотреть сообщение
легко.
Отлично! Я за вас рад.

Что теперь?

Добавлено через 4 минуты
Цитата Сообщение от oopguru Посмотреть сообщение
что значит "невидимый для потребителя"?
Значит, что потребитель не знает, что он имеет дело с "болванкой", а не настоящим объектом.
0
Заблокирован
02.03.2017, 09:35
Цитата Сообщение от Usaga Посмотреть сообщение
Значит, что потребитель не знает, что он имеет дело с "болванкой", а не настоящим объектом.
как это понять? он должен обращаться по имени к прокси или к целевому объекту?
0
Эксперт .NET
 Аватар для Usaga
14350 / 9453 / 1360
Регистрация: 21.01.2016
Сообщений: 35,636
02.03.2017, 09:39
Цитата Сообщение от oopguru Посмотреть сообщение
как это понять?
Просто: потребитель не должен знать, что работает с ненастоящим объектом. В этом и фишка прокси\суррогата.
0
Заблокирован
02.03.2017, 09:56
Цитата Сообщение от Usaga Посмотреть сообщение
Просто: потребитель не должен знать, что работает с ненастоящим объектом. В этом и фишка прокси\суррогата.
Вот в этом жаваскриптовском коде клиент "знает" с кем он работает?
JavaScript
1
2
3
4
5
6
7
8
9
target = {foo: 100}
 
proxy = new Proxy(target, {get: function(target, message){
   return target[message]
}})
 
client = function(){return proxy.foo}
 
console.log( client() ) #>>>>100
0
Эксперт .NET
 Аватар для Usaga
14350 / 9453 / 1360
Регистрация: 21.01.2016
Сообщений: 35,636
02.03.2017, 10:46
oopguru, нет, не знает. В данном случае, что target, что proxy имеют (требуемое) свойство foo, а значит идентичны с точки зрения клиента.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2017, 10:46

Паттерны проектирования
Посоветуйте информацию об изучении паттернов iterator, abstract factory, singleton, decorator на python никогда их не использовал, буду...

Паттерны проектирования
Господа, скажите пожалуйста, что есть такое паттерны проектирования??? Поначалу я думал, что это способ написания кода, то есть каким...

Паттерны проектирования для Си
Доброго времени суток. Подскажите, плз, по поводу паттернов проектирования для си. Существуют ли подобные паттрены? Есть книги на...

Паттерны проектирования (Фабрики)
Добрый вечер. Есть игра "Морской бой" из учебника Павловской Т.А . Задача: добавить в ней какой-либо шаблон проектирования. Я...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru