Слыхал что этот паттерн можно использовать с переменным числом параметров...
не приведёте пример?
...только не говорите что передача каждого параметра будет осуществляться вызовом метода (как в MySQL к примеру)?
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>Слыхал что этот паттерн можно использовать с переменным числом параметров... VYR>не приведёте пример?
Посмотри в wiki и если что непонятно, задай вопрос с примером конкретного кода.
VYR>...только не говорите что передача каждого параметра будет осуществляться вызовом метода (как в MySQL к примеру)?
Параметры передаются в конструктор команды. Не понял в чём вопрос и причём тут mysql.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>Слыхал что этот паттерн можно использовать с переменным числом параметров... VYR>не приведёте пример? VYR>...только не говорите что передача каждого параметра будет осуществляться вызовом метода (как в MySQL к примеру)?
А при чем здесь параметры,если этот паттерн нужен для отслеживания истории изменений и возможности отката. Что-то типа redo\undo в редакторах.
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>Слыхал что этот паттерн можно использовать с переменным числом параметров... VYR>не приведёте пример?
Например, передаётся словарь ключ-значение. Нужно что-то ещё передать — добавил ключ.
Разумеется, чем ближе к динамическому языку (JS, Python, Erlang и т.п.), тем проще такое писать. Но и в статических — несложно.
VYR>...только не говорите что передача каждого параметра будет осуществляться вызовом метода (как в MySQL к примеру)?
"Команда" это когда само действие описано тоже параметром универсального объекта, передаваемого в общем API. Например, в Unix API это lio_listio(). Передаётся массив(!) структур на операцию ввода-вывода. Для каждой операции заданы:
— тип операции (чтение/запись/иное);
— адрес буфера в памяти, размер данных;
— дескриптор открытого файла/сокета/etc., с которым выполняется операция;
— смещение относительно начала файла или плоского блочного устройства.
Вот если бы тип операции не был бы задан — это было бы не "команда". А если бы был не массив — можно было бы делать по функции для каждой (как и делали кроме этого интерфейса — aio_read, aio_write, и так далее).
Для Windows один из лучших примеров — IRP в ядерном I/O. Все данные об операции — в одной структуре, которая передаётся между слоями, модифицируясь при этом по необходимости.
"Командой" может быть принят API типа REST. Что бы ни было, мы стучимся в одну и ту же дверь (хост и порт), одним и тем же транспортом (HTTP, HTTPS...), передаём универсальные GET, PUT, POST, DELETE. Суть выполняемого действия задаётся в URL, параметры — в параметрах URL и в теле. Но см. ниже про внешний транспорт.
VYR> кажись MySQL тоже зтот паттерн использует
Это называется "параметризованные SQL запросы", существует во всех достаточно "взрослых" СУБД.
Конкретный метод представления параметров в тексте может быть разный — например, данная команда может выглядеть как
INSERT INTO `usersdb`.`users` ( `firstname`, `age`) VALUES(?, ?); INSERT INTO `usersdb`.`users` ( `firstname`, `age`) VALUES(:1, :2); INSERT INTO `usersdb`.`users` ( `firstname`, `age`) VALUES(:fn, :ag); INSERT INTO `usersdb`.`users` ( `firstname`, `age`) VALUES(%s, %s); INSERT INTO `usersdb`.`users` ( `firstname`, `age`) VALUES(%(fn), %(ag));
К паттерну "команда" (по крайней мере в понимании GoF и последователей) всё это некоторое отношение, конечно — та же картина — мы универсально в некоторый транспорт впихиваем и определение самого действия, и параметры к нему. Но в случае SQL мы можем их и прямо записать в теле запроса. А вот если бы такой возможности не было, и всё в VALUES, и название таблицы, и список колонок для вставки — пришлось бы передавать в таких дополнительных параметрах — это была бы сильно ближе к "команде" уже в чистом виде.
Но обычно таки "команда" применяется только ко внутреннему API (функции внутри программы), где это что-то особенное, требующее обоснования, почему не сделать каждое действие явной функцией. Для внешнего транспорта такой стиль является естественным и поэтому не называется как-то особо.
Здравствуйте, netch80, Вы писали:
N>Для Windows один из лучших примеров — IRP в ядерном I/O. Все данные об операции — в одной структуре, которая передаётся между слоями, модифицируясь при этом по необходимости.
Пояснение у вас конечно превосходное, но по-моему, абонент тут и половину не поймёт.
Здравствуйте, Слава, Вы писали:
С>Здравствуйте, netch80, Вы писали:
N>>Для Windows один из лучших примеров — IRP в ядерном I/O. Все данные об операции — в одной структуре, которая передаётся между слоями, модифицируясь при этом по необходимости.
С>Пояснение у вас конечно превосходное, но по-моему, абонент тут и половину не поймёт.
Задаст ещё вопросы
Будет сегодня вдохновение — допишу пример попроще.
Хотя почему бы напрямую не посмотреть у четвёрки бандитов от паттернизации?
Пусть есть (не буду стремиться попадать в синтаксис и семантику C#)
class A {
public int foo(int a, string b);
public string bar(string zzz);
};
И есть такое:
class A {
struct Command {
string action;
Object rvalue;
Object[] params;
};
public void execute(ref Command command) {
if (command.action == "foo") {
command.rvalue = new Int(command.params[0] + command.params[1]);
} else if (command.action == "bar") {
Console.WriteLine(command.params[0] + "? ");
command.rvalue = Console.ReadLine();
}
}
};
Чем второе лучше и чем хуже двух функций в явном виде — сами разберётесь?
VYR>Слыхал что этот паттерн можно использовать с переменным числом параметров... VYR>не приведёте пример? VYR>...только не говорите что передача каждого параметра будет осуществляться вызовом метода (как в MySQL к примеру)?
Ну вот выше — массив параметров. Набивайте чем хотите...
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>Слыхал что этот паттерн можно использовать с переменным числом параметров...
Как вариант, когда создаёшь команду — передаёшь туда все параметры при конструировании, а при вызове исполнения передаёшь только контекст исполения который тоже может быть полиморфный. Но полиморфный контекст это уже другая история.