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

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

28.02.2017, 18:58. Показов 4366. Ответов 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
Заблокирован
02.03.2017, 10:54
Студворк — интернет-сервис помощи студентам
Usaga, В таком случае нет проблем с
Цитата Сообщение от Usaga Посмотреть сообщение
позволяет создавать прокси "невидимый" для потребителей и при этом не знать что и где переопределено?
позволяет, да
0
Эксперт .NET
 Аватар для Usaga
14789 / 9562 / 1367
Регистрация: 21.01.2016
Сообщений: 36,058
02.03.2017, 10:55
Цитата Сообщение от oopguru Посмотреть сообщение
В таком случае нет проблем с
Хм. Получается, вы сам не уверены на что должно быть похоже "Прокси" и как оно работает?..
0
Заблокирован
02.03.2017, 10:58
Цитата Сообщение от Usaga Посмотреть сообщение
что proxy имеют (требуемое) свойство foo, а значит идентичны с точки зрения клиента.
правда, proxy в данном случае не имеет собственного свойства foo, он имеет те свойства, которые имеет его target

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Получается, вы сам не уверены на что должно быть похоже "Прокси" и как оно работает?.
получается, что никто этого вообще не знает, включая Вас.
0
Эксперт .NET
 Аватар для Usaga
14789 / 9562 / 1367
Регистрация: 21.01.2016
Сообщений: 36,058
02.03.2017, 11:14
Цитата Сообщение от oopguru Посмотреть сообщение
правда, proxy в данном случае не имеет собственного свойства foo, он имеет те свойства, которые имеет его target
Это не играет роли. return target[message] пробрасывает свойство target, но может и другое что-то прокидывать. Или просто делать дополнительную работу превращаясь в декоратор.

Цитата Сообщение от oopguru Посмотреть сообщение
получается, что никто этого вообще не знает, включая Вас.
Нет, не получается так.
0
Заблокирован
02.03.2017, 12:07
Цитата Сообщение от Usaga Посмотреть сообщение
Это не играет роли.
в таком случае, что удивительного в том что Io
Цитата Сообщение от Usaga Посмотреть сообщение
позволяет создавать прокси "невидимый" для потребителей и при этом не знать что и где переопределено?
?
0
Эксперт .NET
 Аватар для Usaga
14789 / 9562 / 1367
Регистрация: 21.01.2016
Сообщений: 36,058
02.03.2017, 12:21
Цитата Сообщение от oopguru Посмотреть сообщение
в таком случае, что удивительного в том что Io
Ну классно, что я могу сказать.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.03.2017, 12:25
Цитата Сообщение от oopguru Посмотреть сообщение
Есть пруф?
занавес...
Миниатюры
Паттерны проектирования языкозависимы  
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
02.03.2017, 16:34
Надеюсь, уже никто не сомневается в том, что пример кода из стартового сообщения
код на IO
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
)
не имеет никакого отношения к шаблону Прокси. Поэтому можно перейти ко второму вопросу.

ТС считает, что это супер крутой код, который нельзя написать на большинстве других языков. И поэтому IO такой крутой. Это заблуждение. Такой код можно написать на большинстве языков. Например, вот аналог этого кода на C#:
C#
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
28
29
30
class Math
{
    public double Add(double x, double y) => x + y;
    public double Sub(double x, double y) => x - y;
    public double Mul(double x, double y) => x * y;
    public double Div(double x, double y) => x / y;
}
 
class Proxy : DynamicObject
{
    private object target = new Math();
 
    public string Add(double x, double y) => "go out";
 
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        result = target.GetType().GetMethod(binder.Name).Invoke(target, args);
        return true;
    }
}
 
void Main()
{
    dynamic ex = new Proxy();
 
    Console.WriteLine($"Add: {ex.Add(4, 2)}"); //Add: go out
    Console.WriteLine($"Sub: {ex.Sub(4, 2)}"); //Sub: 2
    Console.WriteLine($"Mul: {ex.Mul(4, 2)}"); //Mul: 8
    Console.WriteLine($"Div: {ex.Div(4, 2)}"); //Div: 2
}
Практически, один в один с примером на Io. И даже лучше, потому что клиент не может вызвать методы реального объекта, минуя наш "прокси".
C#
1
ex.target.Add(4,2); // ошибка времени исполнения
Впрочем, это не существенно, так как код на Io можно переписать так, чтобы нельзя было обратиться к target напрямую.
А вот что существенно, так это то, что так мало кто пишет. Этот код обладает рядом недостатков, по сравнению с "тупым хардкором" через интерфейсы, и в большинстве случаев эти недостатки перевешивают его достоинства.

Итак, на "убогоньком" C# можно писать так, как на крутом Io. У меня встречный вопрос: а можно ли на крутом Io написать то, что легко пишется на C#? Возьмём простейший пример: решение системы линейных уравнений Ax = b в целых числах. Пусть матрица размером 300 на 300, все числа целые и умещаются в 32 бита со знаком. Вопрос: может ли ТС написать на Io программу которая будет работать медленнее той, что я напишу на C#, не более чем в 100 раз? (требуется найти точное решение).
2
Заблокирован
02.03.2017, 19:33
Shamil1,
Ваш пример -- убогая, смешная и нелепая пародия. Например, мой target не обязан быть экземпляром Math, а Вы его захардкорили в класс. Во вторых, мой класс произвольно расширяем, а Ваш нет. В третьих, у Вас Add захардкорен, что является вообще сущей клоунадой, и напрочь перечеркивает идею. Есть еще куча всего, но я на этот детский пример отвлекаться не хочу. Жду от Вас тот прокси, который я озвучил, этот вопрос Вы почему-то очень тщательно обходите стороной.

Добавлено через 3 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
умещаются в 32 бита со знаком
я перекладыванием байтиков на высокоуровневом языке заниматься не люблю. Это не ко мне. Меня интересуют в данном случае только вопросы ООП и проектирования
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
02.03.2017, 20:20
Цитата Сообщение от oopguru Посмотреть сообщение
Ваш пример -- убогая, смешная и нелепая пародия.
Мой код делает то же, что и Ваш. Разрабатывать пульт управления самолётом, когда требуется простой переключатель, это плохая практика. Если бы Ваш код делал больше, то и мой бы делал больше.

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

Цитата Сообщение от oopguru Посмотреть сообщение
Меня интересуют в данном случае только вопросы ООП и проектирования
То есть, эффективность Ваших программ Вас не интересует. Вам важно только написать так, чтобы Вам это казалось "тру", а насколько хорошо программа будет работать и насколько удобно будет её поддерживать, Вас не интересует?
0
Заблокирован
02.03.2017, 20:55
Цитата Сообщение от Shamil1 Посмотреть сообщение
Мой код делает то же, что и Ваш. Разрабатывать пульт управления самолётом, когда требуется простой переключатель, это плохая практика. Если бы Ваш код делал больше, то и мой бы делал больше.
дело не в том, что мой код делает в конкретном примере, а то,на что моя реализация способна. Если Вам это не ясно, то мне вас жаль. Всегда можно написать частный случай, реализующий один из вариантов работы алгоритма, но дело не в этом случае, а в самом алгоритме. Eg если вася знает, как посчитать 2*2, это не означает что он знает всю математику.
Цитата Сообщение от Shamil1 Посмотреть сообщение
Поэтому Вы код покажите
позже покажу, сейчас занят

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

Добавлено через 3 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
эффективность
И отвыкайте смешивать скорость выполнения с эффективностью, это разные вещи.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
02.03.2017, 21:15
Цитата Сообщение от oopguru Посмотреть сообщение
на что моя реализация способна
Ваша реализация способна на то же, что и моя. А что Вы там себе в голове напридумывали и не озвучили какие-то требования... так телепаты в отпуске. То, что у Вас вывод чисел "захардкожен" в десятичном виде, это является недостатком программы?
Если Вы пишите программу для сложения двух целых чисел, Вы считаете разумным делать так, чтобы она могла выполнять любую операцию для любого количества любых чисел, даже если при этом она станет работать в 100 раз медленнее?

Все Ваши оценки из предыдущего сообщения - это лишь Ваше субъективное и совсем не авторитетное мнение. Какими объективными критериями Вы пользуетесь, когда делаете вывод, что один код лучше другого?
0
Заблокирован
02.03.2017, 21:39
Цитата Сообщение от Shamil1 Посмотреть сообщение
Ваша реализация способна на то же, что и моя
Ваша реализация ни на что не способна,она реализует частный случай.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
02.03.2017, 22:00
Цитата Сообщение от oopguru Посмотреть сообщение
Ваша реализация ни на что не способна,она реализует частный случай.
Не способна переводить с чва на лъани-буга? А разве надо? Если программа на что-то неспособна, то это достоинство программы или недостаток?

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

Если моя программа на что-то не способна, то это потому, что это и не требовалось.

Любая задача из тех, что способны решать современные программы, является частным случаем другой, более общей задачи. Поэтому любая существующая программа реализует частный случай. И моя тоже.
1
Заблокирован
02.03.2017, 22:41
Shamil1, если Вам не по нраву обобщения, то лучше не использовать ООП. Есть другие языки для описания частных случаев.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
02.03.2017, 23:05
Обобщение не достаётся бесплатно. За него приходится расплачиваться эффективностью (написания, работы, сопровождения). Поэтому "более обще" не значит "лучше". Любая программа - это баланс между обобщением и конкретизацией.
0
Заблокирован
02.03.2017, 23:11
Цитата Сообщение от Shamil1 Посмотреть сообщение
это баланс между обобщением и конкретизацией.
Вот этим и отличаются квази-ооп языки, что там баланс смещен в сторону конкретизации, а возможности к обобщению ограничены почти до нуля by design
0
Эксперт .NET
 Аватар для Usaga
14789 / 9562 / 1367
Регистрация: 21.01.2016
Сообщений: 36,058
03.03.2017, 06:21
Цитата Сообщение от oopguru Посмотреть сообщение
Ваш пример -- убогая, смешная и нелепая пародия. Например, мой target не обязан быть экземпляром Math, а Вы его захардкорили в класс. Во вторых, мой класс произвольно расширяем, а Ваш нет. В третьих, у Вас Add захардкорен, что является вообще сущей клоунадой, и напрочь перечеркивает идею. Есть еще куча всего, но я на этот детский пример отвлекаться не хочу. Жду от Вас тот прокси, который я озвучил, этот вопрос Вы почему-то очень тщательно обходите стороной.
Вполне себе нормальный прокси (не считая того, что основан не рефлексии, чего никто не делает, но это явно для примера), только имя бы ему более точное - MathProxy, но и так сойдёт.

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

Пример Shamil1 как раз и демонстрирует возможность перехвата вызова метода ADD (полезная работа, ради которой всё и задумывалось) с так желанной вами возможностью не прописывать "делегирование" для каждого метода за счёт использования рефлексии.

И негодование по поводу "захардкоженности" мне непонятно. Данный прокси делался с одной целью - проксировать Math. Что он и делает. Какое обобщение тут нужно? Или речь о том, чтобы в каждом месте, где нужно создавать прокси для конкретной цели, всецело и полностью описывать требуемый функционал? Тогда это уже чистой воды говнокод выходит, но никак не "гибкость".
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
03.03.2017, 14:27
Цитата Сообщение от oopguru Посмотреть сообщение
Вот этим и отличаются квази-ооп языки, что там баланс смещен в сторону конкретизации, а возможности к обобщению ограничены почти до нуля by design
В Вашем примере кода класс Proxy используется только для перехвата обращений к Math.
Вы же не собираетесь сохранять эти две строки в отдельный модуль, сохранять в специальной папке и использовать в разных модулях. Если Вам где-то ещё понадобится такая же функциональность, проще будет заново вбить эти две строки, а не подключать другой модуль (файл) с этими строками. Поэтому я не вижу причин, по которым код
Code
1
2
3
4
5
6
7
8
Proxy := Object clone do(
   forward := method( target doMessage(call message) )
)
 
p := Proxy clone do(
   target := Math clone
   add := method(x, y, "go out")
)
предпочтительней, чем код
Code
1
2
3
4
5
6
7
Proxy := Object clone do(
   target := Math clone
   add := method(x, y, "go out")
   forward := method( target doMessage(call message) )
)
 
p := Proxy clone
Далее. Оба варианта обладают недостатком - клиент может вызвать "неправильный" add, если обратиться к нему через target. По-хорошему, target надо скрыть от того, кто будет использовать Proxy. То есть, в том месте, где создаётся p, target должен быть недоступным.

Далее. В коде вероятно
Code
1
p := Proxy clone
будет использовано несколько раз (в разных областях видимости), и это предпочтительней, чем использование несколько раз кода
Code
1
2
3
4
p := Proxy clone do(
   target := Math clone
   add := method(x, y, "go out")
)
так как в этом случае у нас одно и то же поведение дублируется в нескольких местах.

Добавлено через 32 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
И негодование по поводу "захардкоженности" мне непонятно.
+1
И ещё больше непонятно то, что ТС связывает эту захардкоженность с используемым языком.
Конечно, ТС может не согласиться с моими соображениями, изложенными сообщении выше, с него станется. Но настаивать на том, что они связаны с использованием C#, - это уже откровенное передёргивание, вызванное предвзятостью. У ТС есть готовый ответ, и все факты трактуются с точки зрения это ответа, либо отбрасываются, если совсем не подходят.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
03.03.2017, 21:39
oopguru, я тут случайно нашёл для тебя отличное место для самовыражения. Там как раз обсуждают то, что ты любишь — акторы.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2017, 21:39

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru