паттерн команда
От: vvv848165@ya.ru  
Дата: 23.10.19 13:41
Оценка:
Слыхал что этот паттерн можно использовать с переменным числом параметров...
не приведёте пример?
...только не говорите что передача каждого параметра будет осуществляться вызовом метода (как в MySQL к примеру)?
Re: паттерн команда
От: · Великобритания  
Дата: 23.10.19 14:31
Оценка: 3 (1)
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Слыхал что этот паттерн можно использовать с переменным числом параметров...

VYR>не приведёте пример?
Посмотри в wiki и если что непонятно, задай вопрос с примером конкретного кода.

VYR>...только не говорите что передача каждого параметра будет осуществляться вызовом метода (как в MySQL к примеру)?

Параметры передаются в конструктор команды. Не понял в чём вопрос и причём тут mysql.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: паттерн команда
От: Sharov Россия  
Дата: 23.10.19 15:03
Оценка: 1 (1) -2
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Слыхал что этот паттерн можно использовать с переменным числом параметров...

VYR>не приведёте пример?
VYR>...только не говорите что передача каждого параметра будет осуществляться вызовом метода (как в MySQL к примеру)?

А при чем здесь параметры,если этот паттерн нужен для отслеживания истории изменений и возможности отката. Что-то типа redo\undo в редакторах.
Кодом людям нужно помогать!
Re: паттерн команда
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 23.10.19 20:53
Оценка: 3 (1)
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Слыхал что этот паттерн можно использовать с переменным числом параметров...

VYR>не приведёте пример?

Например, передаётся словарь ключ-значение. Нужно что-то ещё передать — добавил ключ.
Разумеется, чем ближе к динамическому языку (JS, Python, Erlang и т.п.), тем проще такое писать. Но и в статических — несложно.

VYR>...только не говорите что передача каждого параметра будет осуществляться вызовом метода (как в MySQL к примеру)?


А что в MySQL?
The God is real, unless declared integer.
Re: MySQL
От: vvv848165@ya.ru  
Дата: 24.10.19 05:52
Оценка:
кажись MySQL тоже зтот паттерн использует
                    MySqlTransaction trans = conn.BeginTransaction();
                for (int j = 0; j < 50; j++)
                    {
                        MySqlCommand cmd = new MySqlCommand("INSERT INTO `usersdb`.`users` ( `firstname`, `age`) VALUES( @fn, @ag);", conn, trans);

                        cmd.Parameters.Add(new MySqlParameter("@fn", ...));
                        cmd.Parameters.Add(new MySqlParameter("@ag", ...));

                        cmd.ExecuteNonQuery();
                    }
                    trans.Commit();
Re[2]: MySQL
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 24.10.19 06:29
Оценка: 113 (5) +1
Здравствуйте, vvv848165@ya.ru, Вы писали:

"Команда" это когда само действие описано тоже параметром универсального объекта, передаваемого в общем 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 (функции внутри программы), где это что-то особенное, требующее обоснования, почему не сделать каждое действие явной функцией. Для внешнего транспорта такой стиль является естественным и поэтому не называется как-то особо.
The God is real, unless declared integer.
Re[3]: MySQL
От: Слава  
Дата: 24.10.19 06:46
Оценка:
Здравствуйте, netch80, Вы писали:

N>Для Windows один из лучших примеров — IRP в ядерном I/O. Все данные об операции — в одной структуре, которая передаётся между слоями, модифицируясь при этом по необходимости.


Пояснение у вас конечно превосходное, но по-моему, абонент тут и половину не поймёт.
Re[4]: MySQL
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 24.10.19 07:22
Оценка: 3 (1)
Здравствуйте, Слава, Вы писали:

С>Здравствуйте, netch80, Вы писали:


N>>Для Windows один из лучших примеров — IRP в ядерном I/O. Все данные об операции — в одной структуре, которая передаётся между слоями, модифицируясь при этом по необходимости.


С>Пояснение у вас конечно превосходное, но по-моему, абонент тут и половину не поймёт.


Задаст ещё вопросы
Будет сегодня вдохновение — допишу пример попроще.
Хотя почему бы напрямую не посмотреть у четвёрки бандитов от паттернизации?
The God is real, unless declared integer.
Re: паттерн команда
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 24.10.19 07:32
Оценка: 2 (1)
Здравствуйте, vvv848165@ya.ru, Вы писали:

Или ещё вариант:

Пусть есть (не буду стремиться попадать в синтаксис и семантику 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 к примеру)?

Ну вот выше — массив параметров. Набивайте чем хотите...
The God is real, unless declared integer.
Re: паттерн команда
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 24.10.19 10:02
Оценка: 2 (1)
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Слыхал что этот паттерн можно использовать с переменным числом параметров...

Как вариант, когда создаёшь команду — передаёшь туда все параметры при конструировании, а при вызове исполнения передаёшь только контекст исполения который тоже может быть полиморфный. Но полиморфный контекст это уже другая история.

Концептуально, это выгялдит так.
struct cmd
{
   cmd();
   virtual execute(const context& ctx) = 0;
};

struct update: public cmd
{
 update(string what, Url url, buffer buf);
 virtual execute(const context& ctx);
}

std::list cmdList;

main()
{
 std::thread t = std::thread([]{
  while(cmdList.empty())
  { 
   cmdList.front().execute(network_context);
   cmdList.pop_front();
  }
 });

 cmd = new update("db", "http://localhost",  "some data");      

 t.join();
}

Надеюсь, это то о чём ты спрашивал.
Sic luceat lux!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.