Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5528

Рейтинг: 1004

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5528

Рейтинг: 1004

Положим, у меня есть некоторая функция

foo();

Я правильно понимаю, что функциональное программирование, это примерно так: 

main{

...

foo();

...

}

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

 

А паттерн команда делает так: 

main{

...

foo = new cmd CmdFoo();

LogInvoker(foo());

...

}

При этом ЛогИнвокеру глубоко плевать, какая команда к нему попадает, он просто сделает foo.Execute, ну и сделает об этом запись в лог, потому что ЛОГИнвокер. 

Если вместо ЛогИнвокера сделать Sender, то сендер отправит команду куда-то, и там уже Инвокер её исполнит. 

А ещё можно сделать 

Commands = array of ICommand;

И пихать команды в очередь, тасовать их там, и потом просто доставать нужную и закидывать в инвокер. 

 

 

Я правильно понимаю? 

 

Спойлер:

Т.е. обычная функция -- это когда мы говорим: "I'll have two number 9s, a number 9 large, a number 6 with extra dip, a number 7, two number 45s, one with cheese, and a large soda.". А паттерн команда, это когда мы говорим "Хочу есть!", и рядом стоит человек, который читает наши мысли и приносит нам two number 9s, a number 9 large, a number 6 with extra dip, a number 7, two number 45s, one with cheese, and a large soda.

Kagon

Пользователь

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

Kagon

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

Напридумывают этих паттернов...

Я считаю, что есть только один - KEEP IT SIMPLE STUPID

S0_HardCore

Пользователь

Регистрация: 01.07.2014

Сообщения: 3462

Рейтинг: 2905

S0_HardCore

Регистрация: 01.07.2014

Сообщения: 3462

Рейтинг: 2905

Kujivunia сказал(а):

Я правильно понимаю, что функциональное программирование, это примерно так: 

main{

...

foo();

...

}

Нажмите, чтобы раскрыть...

Процедурное. Функциональное это немного другое.

Kujivunia сказал(а):

При этом ЛогИнвокеру глубоко плевать, какая команда к нему попадает, он просто сделает foo.Execute

Нажмите, чтобы раскрыть...

Не совсем плевать, обычно паттерн реализуется таким образом, что объект команды имеет общий базовый класс/интерфейс. Конечно можно сделать и строку через switch, но это уже такое себе.

FreeM@n

Пользователь

Регистрация: 06.03.2013

Сообщения: 1980

Рейтинг: 4209

FreeM@n

Регистрация: 06.03.2013

Сообщения: 1980

Рейтинг: 4209

img

Здесь неплохо поясняется, когда паттерны подучивал стабильно этот сайт посещал.

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5528

Рейтинг: 1004

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5528

Рейтинг: 1004

S0_HardCore сказал(а):

 

Не совсем плевать, обычно паттерн реализуется таким образом, что объект команды имеет общий базовый класс/интерфейс. Конечно можно сделать и строку через switch, но это уже такое себе.

Нажмите, чтобы раскрыть...

Я вроде так и имел ввиду. 

То есть:

Есть базовый интерфейс ЯКоманда

У него есть реализаторы-наследники: конкретные команды. 

Но Инвокер в качестве входного значения имеет не тип конкретной команды, а тип интерфейса ЯКоманда, поэтому принимает и исполняет любую команду, причём все -- одинаково: КонкретнаяКоманда.Исполнить

В этом смысле ему плевать. Команда может быть любой, пока она реализует

Интерфейс ЯКоманда{

процедура Исполнить()

}

 

Если это всё так, то у меня вопрос: 

А что, если мне нужно сделать команду, которая зависит от входа? Ну, что-то вроде 

команда НапечататьСообщение(строка СообщениеДляПечати)

?

Ведь в интерфейсе нет никаких входных данных

FreeM@n сказал(а):

Здесь неплохо поясняется, когда паттерны подучивал стабильно этот сайт посещал.

Нажмите, чтобы раскрыть...

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

S0_HardCore

Пользователь

Регистрация: 01.07.2014

Сообщения: 3462

Рейтинг: 2905

S0_HardCore

Регистрация: 01.07.2014

Сообщения: 3462

Рейтинг: 2905

Kujivunia сказал(а):

А что, если мне нужно сделать команду, которая зависит от входа? Ну, что-то вроде 

команда НапечататьСообщение(строка СообщениеДляПечати)

?

Ведь в интерфейсе нет никаких входных данных

Нажмите, чтобы раскрыть...

Делаешь поля в интерфейсе/реализации, прокидываешь объект команды так же само, в самой команде оперируешь данными из её полей.

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5528

Рейтинг: 1004

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5528

Рейтинг: 1004

S0_HardCore сказал(а):

Делаешь поля в интерфейсе/реализации, прокидываешь объект команды так же само, в самой команде оперируешь данными из её полей.

Нажмите, чтобы раскрыть...

А как эти поля сделать? Разве тогда интерфейс не конкретизируется? 

Ну, например, одна команда требует строку, а друга - массив на пять тыщ семьсот сорок три double

Разве мне не придётся пихать в интерфейс оба поля? И потом реализовывать их в обеих командах, хотя каждой из них второе поле ваще не нужно? 

S0_HardCore

Пользователь

Регистрация: 01.07.2014

Сообщения: 3462

Рейтинг: 2905

S0_HardCore

Регистрация: 01.07.2014

Сообщения: 3462

Рейтинг: 2905

Kujivunia сказал(а):

А как эти поля сделать? Разве тогда интерфейс не конкретизируется? 

Ну, например, одна команда требует строку, а друга - массив на пять тыщ семьсот сорок три double

Разве мне не придётся пихать в интерфейс оба поля? И потом реализовывать их в обеих командах, хотя каждой из них второе поле ваще не нужно? 

Нажмите, чтобы раскрыть...

Общие поля выносишь, конкретные добавляешь в реализацию. Можешь вообще свою динамику сделать через какую-то штуку типа Map "String,Object" или JSON, вариантов куча.

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5528

Рейтинг: 1004

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5528

Рейтинг: 1004

S0_HardCore сказал(а):

Общие поля выносишь, конкретные добавляешь в реализацию. Можешь вообще свою динамику сделать через какую-то штуку типа Map или JSON, вариантов куча.

Нажмите, чтобы раскрыть...

Можно расшифрофку? У меня с ООП вообще беда. 

Что значит "выносишь общие поля"? Куда и как?

Как я добавлю конкретное в реализацию, если она должна сопадать с интерйфесом? Или реализации достаточно только реализовать всё, что есть в интерфейсе, а дальше она может развлекаться по полной? 

Что такое динамика через Мар? 

S0_HardCore сказал(а):

Общие поля выносишь, конкретные добавляешь в реализацию. Можешь вообще свою динамику сделать через какую-то штуку типа Map "String,Object" или JSON, вариантов куча.

Нажмите, чтобы раскрыть...

Через Map это так? 

begin

  var map: system.Collections.Hashtable:= new system.Collections.Hashtable;

  var a:array of byte;

  setlength(a,10);

  a[3]:= 1;

  map.Add('Поле класса КонкретнойКоманды1',a);

  print(map);

end.

Вывод:

&(Поле класса КонкретнойКоманды1,&0,0,0,1,0,0,0,0,0,0])] 

Winterhearted

Пользователь

Регистрация: 25.08.2014

Сообщения: 805

Рейтинг: 358

Winterhearted

Регистрация: 25.08.2014

Сообщения: 805

Рейтинг: 358

Kagon сказал(а):

Я считаю, что есть только один - KEEP IT SIMPLE STUPID

Нажмите, чтобы раскрыть...

Люто плюсую!

Scouser_AK

Пользователь

Регистрация: 21.06.2020

Сообщения: 4051

Рейтинг: -745

Нарушения: 110

Scouser_AK

Регистрация: 21.06.2020

Сообщения: 4051

Рейтинг: -745

Нарушения: 110

FreeM@n сказал(а):

Здесь неплохо поясняется, когда паттерны подучивал стабильно этот сайт посещал.

Нажмите, чтобы раскрыть...

а щас уже все паттерны на зубок знаешь?))00

FreeM@n

Пользователь

Регистрация: 06.03.2013

Сообщения: 1980

Рейтинг: 4209

FreeM@n

Регистрация: 06.03.2013

Сообщения: 1980

Рейтинг: 4209

img
Scouser_AK сказал(а):

а щас уже все паттерны на зубок знаешь?))00

Нажмите, чтобы раскрыть...

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

Scouser_AK

Пользователь

Регистрация: 21.06.2020

Сообщения: 4051

Рейтинг: -745

Нарушения: 110

Scouser_AK

Регистрация: 21.06.2020

Сообщения: 4051

Рейтинг: -745

Нарушения: 110

FreeM@n сказал(а):

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

Нажмите, чтобы раскрыть...

Не ну впринципе, те штуки что там теоретически написаны, нужно тупо зазубривать, чтобы потом помнить че искать и разбирать.

А вот подобрать паттерн это чтением не научишься)

FreeM@n

Пользователь

Регистрация: 06.03.2013

Сообщения: 1980

Рейтинг: 4209

FreeM@n

Регистрация: 06.03.2013

Сообщения: 1980

Рейтинг: 4209

img
Scouser_AK сказал(а):

Не ну впринципе, те штуки что там теоретически написаны, нужно тупо зазубривать, чтобы потом помнить че искать и разбирать.

А вот подобрать паттерн это чтением не научишься)

Нажмите, чтобы раскрыть...

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

Scouser_AK

Пользователь

Регистрация: 21.06.2020

Сообщения: 4051

Рейтинг: -745

Нарушения: 110

Scouser_AK

Регистрация: 21.06.2020

Сообщения: 4051

Рейтинг: -745

Нарушения: 110

FreeM@n сказал(а):

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

Нажмите, чтобы раскрыть...

я это и сказал, не находишь?

FreeM@n

Пользователь

Регистрация: 06.03.2013

Сообщения: 1980

Рейтинг: 4209

FreeM@n

Регистрация: 06.03.2013

Сообщения: 1980

Рейтинг: 4209

img
Scouser_AK сказал(а):

я это и сказал, не находишь?

Нажмите, чтобы раскрыть...

В зазубривании и понимании есть разница =)

Scouser_AK

Пользователь

Регистрация: 21.06.2020

Сообщения: 4051

Рейтинг: -745

Нарушения: 110

Scouser_AK

Регистрация: 21.06.2020

Сообщения: 4051

Рейтинг: -745

Нарушения: 110

FreeM@n сказал(а):

В зазубривании и понимании есть разница =)

Нажмите, чтобы раскрыть...

Понимание на словах далеко не понимание в коде.

 

НА словах это можно представить, как оно кулинарии используется)

SweetSweetLoot

Пользователь

Регистрация: 06.07.2015

Сообщения: 4739

Рейтинг: 1149

SweetSweetLoot

Регистрация: 06.07.2015

Сообщения: 4739

Рейтинг: 1149

img

какое то у тебя не правильное представление функционального программирования

https://habr.com/ru/post/505928/