Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Объясните на простом примере разницу между ООП и ФП?

Лучший ответ:
В чистом ФП будет примерно так:
releaseSocket(releaseConnection(releaseRouter(json(get('/users',prepareRequest(createRouter(routerParams,connect(createSocket('TCP'),ip, port)))),users))))
Некоторые приёмы использовать стоит, но не самая лучшая идея - писать в функциональном стиле такие программы.

Худший ответ:
Метафоричный взгляд с высока, но без отражения полной сути: 

ФП это код ДНК (DNA), программа роста/синтеза системы/организма

ООП это чертеж/схема системы/организма.

Система/организм предназначена для обработки/вычисления входного потока данных в выходной.
Вопрос: Перебои с КАБЕЛЬНЫМ интернетом, отсылает на страницу проверки РОУТЕРА марки mi (которого нет) — почему?

Лучший ответ:
Возможно это следствие двух обстоятельств:
- ваш провайдер - говно. Держит всех (или нескольких) клиентов в одном бродкастовом домене.
- ваш сосед по провайдеру вставил кабель провайдера не в тот порт роутера.
Как соедствие, IP адрес выдает вам не провайдер, а сосед. Со всеми вытекающими.

Худший ответ:
Вы подключены не напрямую, а через роутер Xiaomi. Ваш ли это ррутер или провайдерский - я хз
Щас конкретно на роутере не воткнут интернет-кабель, судя по скриншоту. 
Если роутер не ваш, а провайдерский - долбите его
Вопрос: Нормально ли идея установить Proxmox на Ubuntu?

Лучший ответ:
Ubuntu - прокачанный дебиан с возможностью ставить новые пакеты. 
Но дебиан - самая стабильная система на базе ядра linux. Я выбрал бы дебиан. 

Работал в интернет-провайдере, поднимал сервак на дебиане с проксмоксом - все отлично.

Вообще я считаю убунту - от лукавого. Скоро буду вообще пробовать FreeBSD, говорят там софта лишнего нет, что мне и нравится.

Худший ответ:
Так оно без напильника не взлетит скорее всего, то есть это их разряда я мастер кунг-фу и могу, тогда непонятно зачем мастериц спрашивать разрешения сходить в туалет пописать у учеников
Вопрос: Как перенести bd Mysql c частично неработающего жесткого диска, примонтированного к работающей Linux?

Лучший ответ:

перепроверяете, что СУБД остановлена и не запущена
находите datadir (например, /var/lib/mysql/ )
ставите на рабочей системе mariadb (или mysql - выясните, какая именно была установлена) той же самой версии
копируете целиком всё что есть в datadir в новое место жительства
запускаете СУБД и смотрите в лог


Худший ответ:
В корне не согласен с ответом от Melkij
Физический сбой на HDD пытаться обойти программно, да ещё и на уровне СУБД - крайне малоэффективный подход. И чреват потерей всех данных на накопителе!
Необходимо найти исправный HDD равного или  большего объёма. Оба подключить к тестовому ПК и с помощью ddrescue сделать клон сбойного диска ИЛИ сделать его образ в виде огромного файла. Я бы делал клон. И после того как ddrescue сделает всё что можно, уже на новом исправном диске, смотреть файлы, подключать базы и т.п.
Как работать с ddrescue в сети много описаний и главное на сайте их проекта. Проще всего использовать загрузочную флешку SystemRescue
https://www.system-rescue.org/
ddrescue там есть.
Я восстанавливал несколько раз данные с совсем плохих винтов.
Нюансов много. Если нужна помощь звоните
+сeмь дeвять О дeвять ЧЧ 17 ВЧ1
Всё что знаю расскажу и объясню.
Будьте здоровы.
Вопрос: Как задать вручную размер /dev/mapper/centos-root?

Лучший ответ:
в интернете одни водолеи, ничего по сути
Да, да - классика. В интернете катастрофический недостаток информации.

Вполне возможно, что у вас всё колом встало от недостатка места. Попробуйте все те "бесполезные" советы из интернета, загрузившись с флешки.

Худший ответ:
Ну увеличьте его. Инструкция: https://pingtool.org/ru/online-resize-lvm-partitio...
Вопрос: Как сравнить есть ли уже такой файл в базе или нет?

Лучший ответ:
Вести базу MD5 и SHA1 хешей для всех файлов, при добавлении нового файла высчитываем для него эти хеши и смотрим по базе, нет ли у нас файла. у которого оба хеша совпали, если есть - значит такой файл уже загружен и можно его повторно не загружать.

Худший ответ:
с точностью совпадения, допустим в 99%.
Вот посмотрите Как сравнить два текста в JS? .  https://stackoverflow.com/questions/5042873/javasc...

Проверку на хеш в вашем случае тоже можно делать, т.к. pdf довольно редко редактируют и все передают одну и ту же книгу.

Есть несколько сотен тысяч PDF файлов. 
Это реальная проблема или просто от нечего делать придумали? Слишком мало информации по самим документам. в некоторых сферах, где много типовых отчетов это обычное дело когда документ на 95% похож на другой, поменяться может например только одна цифра в дате, и такой документ нельзя будет отбраковывать. И из пдфа вы не всегда можете извлечь текст для сравнения. В общем довольно много подводных камней. Поэтому стоит более конкретно определиться с задачей.

upd: в общем есть еще такая особенность, что нужно правильно выбрать средство для извлечения текста, т.к. многие средства извлекают не всегда весь текст. Ну и еще интересно как быстро вы сравните 1 pdf со 200-300к других pdf, как по мне затраты на этот процесс будут слишком большими. Можно конечно сравнить только часть текста. Да кстати, извлечение текста из pdf медленный процесс, текст из некоторых страниц может извлекаться больше секунды на обычных процах (тестил на документах в 600-700 страниц), я пользовался только некоммерческими решениями, возможно вы найдете что-то быстрее, но парсить pdf вам придется явно не на ноде, т.к. это слишком медленно будет.
Вопрос: Как посчитать сколько встречается каждое слово в таблице (или ячейке)?

Лучший ответ:
Можно через создание своей формулы например
function COUNTUNIQWORDS(cell) {
 var result = []
 var words = String(cell).split(" ");
 var wordsCount = words.reduce(function (acc, w) {
  if(acc[w]) {
    acc[w] += 1
  } else {
    acc[w] = 1;
  }
  return acc;
}, {});
for (var w in wordsCount) result.push('Cлово "'+ w +'" встречается '+ wordsCount[w] +  ' раз');
return result
}


Худший ответ:
Виктор Л всё правильно подсказал.
Если немного изменить его код, можно получить не по одной ячейке, а по диапазону.
function COUNTUNIQWORDS(range) {
 let wordsCount = {};
 range.forEach(row=>{
   row.forEach(cell=>{
     let text = String(cell)
                  .toLowerCase()
                  .replace(/[^а-яА-ЯёЁa-zA-Z ]+/gi, ' ')
                  .replace(/\s+/gi, ' ');
    let words = text
                  .split(' ')
                  .filter(word=>word!=='');
    words.forEach(word=>{
      if (wordsCount[word]){
        wordsCount[word]+=1;
      }else{
        wordsCount[word]=1;
      };
    });
   });
 });
 
  let result = Object.keys(wordsCount)
                .sort()
                .map(word=>[word, wordsCount[word]]);
  return result;
};

Демонстрационная таблица с кодом
Вопрос: Какие перспективы у NEO4j?

Лучший ответ:
Странный вопрос. Стоит ли изучать управление реактивными самолётами и использовать их? Если вам понадобиться реактивный самолёт, будет абсолютно неважно, что легковые автомобили намного популярнее и устроиться таксистом проще, чем пилотом. Справедливо и обратное: если ваши потребности - только таксовать в пределах города, то использовать для этого реактивный самолёт - глупость.

Худший ответ:
Графовые базы в принципе не очень популярное решение, тк не многим проектам нужно очень много с чисто графовыми структурами работать.
Если есть желание - изучайте.
Вопрос: Как вывести то, чего нет в списке?

Лучший ответ:
set(кто в первом списке) - set(кто во втором списке)

Худший ответ:
a = {'Игорь', 'Борис', 'Илья', 'Антон'}
b = {'Игорь', 'Илья'}
a - b
a ^ a & b
# {'Антон', 'Борис'}
Вопрос: Как сгенировать лабиринт со стенами, что бы в этом лабиринте всегда был путь?

Лучший ответ:
В своё время делал довольно прямолинейно. На лабиринте генерил сначала путь из точки А в точку Б случайным образом и помечал эти клетки как проходные. А уж потом вокруг генерировал случайным образом весь остальной лабиринт.

Худший ответ:
Это задание а не вопрос
Вопрос: Как понять когда ставить указатель?

Лучший ответ:
Указатель, по сути, хранит адрес каких то данных (переменной, структуры, слайса и т.д.).
Иными словами он "указывает" на область данных.

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

Например:
type BigStruct struct {
    field1 int
    filed2 string
    field3 uint
    field4 []byte
    ...
    field50 string
}
Предположим, что после создания этой структуры и заполнения всех её полей она занимает в памяти 300мб.

Если вы сделаете функцию, которая будет принимать такую структуру как агрумент, например вот так
func Report(s BigStruct)
то при каждом вызове этой функции вся структура (300мб) каждый раз будут копироваться.
Пример:
s := BigStruct{}
// заполняем поля
Report(s)

Чтобы избежать такой мега нагрузки - можно передавать не копию данных, а указатель, т.е. адрес в памяти, где хранится сама структура.
Для этого нужно объявить агрумент функции как указатель, т.е. ставим *.
func Report(s *BigStruct)
А код уже будет выглядеть вот так.
s := BigStruct{}
// заполняем поля
Report(&s) // тут добавился & - берём адрес структуры, а не саму структуру
Или второй вариант
// создаём переменную s сразу с типом указатель на BigStruct
s := &BigStruct{}
// заполняем поля
Report(s) // поскольку s уже является указателем - & тут не нужен

В общем * используется:
- когда нужно объявить переменную
var s *BigStruct
- когда нужно прочитать/записать значение, которое храниться по адресу указателя
var i *int
    i = new(int)
    *i = 10 // пишем значение

    fmt.Printf("i: %v\n", i)
    fmt.Printf("*i: %v\n", *i)
Вывод будет примерно таким
i: 0xc0000160d8 (это адрес памяти, где лежит значение переменной i)
*i: 10 (а это её значение)

& (амперсанд) используется когда нужно получить адрес переменный.

Еще один вариант применения - если нужно иметь возможность модифицировать данные у параметра функции. Если нужны примеры - дайте знать, я напишу.

Худший ответ:
По мере необходимости.
Рекомендую почитать сначала теорию о том что такое указатели, переменные, типы и структуры данных.
 Без базовых понятий ты далеко не уедешь
Вопрос: Как запросом смотреть процедуры?

Лучший ответ:
postgresql
SELECT pg_catalog.pg_get_functiondef(pg_proc.oid)
FROM pg_proc
/* любые where по вкусу */
Так же известный как \sf в psql.

Худший ответ:
Ответ найден самостоятельно для MS SQL.
Получаем код хранимой процедуры в T-SQL (ms sql):

EXEC sp_helptext 'имя_процедуры'

или другой вариант:
SELECT [text]
FROM syscomments sc
INNER JOIN sysobjects so
ON sc.id=so.id
WHERE
so.type = 'P' and so.name='имя_процедуры'

или ещё один вариант просмотра кода хранимой процедуры:

  PRINT OBJECT_DEFINITION(OBJECT_ID(N'имя_процедуры','P'));

Бонус - для табличных функций/ пользовательских функций / триггеров
SELECT [TEXT]
FROM syscomments sc
INNER JOIN sysobjects so
ON sc.id=so.id
WHERE
name=<Имя триггера или функции> AND so.type IN ('TR','TF','FN')

описание объектов здесь (TR/ TF/FN) :
https://docs.microsoft.com/ru-ru/sql/relational-da...
Вопрос: Как настроить Debian в качестве маршрутизатора?

Лучший ответ:
1. Включаем ip-forwarding
https://www.google.com/search?q=ip+forwarding+debian
2. Разбираемся с фаерволом и нат
https://wiki.debian.org/iptables
https://www.opennet.ru/docs/RUS/iptables/
3. Разбираемся с вланами
https://www.google.com/search?q=debian+vlan

Худший ответ:
Схему лучше изменить. Серверы объединить в отдельный vlan, к примеру 30 и подключить к коммутатору.
На роутере debian оставить один внутренний интерфейс, скажем eth1 и создать на нём три vlan:
auto vlan10
iface vlan10 inet static
        address 10.10.10.1
        netmask 255.255.255.0
        vlan_raw_device eth1
...остальные по образу и подобию.

коммутатор с интерфейсом роутера соединить через транк порт.

Затем, включить ip forwarding и настроить NAT
Вопрос: Двойной NAT в другой стране, как преодолеть?

Лучший ответ:
VPN изнутри сети за NAT

Худший ответ:
STUN-сервер
Вопрос: Внедрение ЭЦП в веб-приложение: какой сервис выбрать?

Лучший ответ:
Если ЭЦП у них уже есть в виде свистка, то сторонний сервис не нужен, надо просто прикрутить что-нибудь вроде КриптоПро или VipNet к фронту.

Худший ответ:
Если ЭЦП у них уже есть в виде свистка, то сторонний сервис не нужен, надо просто прикрутить что-нибудь вроде КриптоПро или VipNet к фронту.
Вопрос: С# FindWindow первый параметр?

Лучший ответ:
https://docs.microsoft.com/en-us/windows/win32/win...
это предопределенные классы windows
так же вы можете назначить свой
где то внутри установки есть утилита winspy+

https://docs.microsoft.com/en-us/visualstudio/debu...

Худший ответ:
https://docs.microsoft.com/en-us/windows/win32/win...
это предопределенные классы windows
так же вы можете назначить свой
где то внутри установки есть утилита winspy+

https://docs.microsoft.com/en-us/visualstudio/debu...
Вопрос: Где изучить PHP, если ты не полный новичок?

Лучший ответ:
Писать код, много кода, только так.

По мимо того что писать код, начать с книг - 
PHP 7 | Котеров , Симдянов - как пример.

Прочитав главу - пописать код, закрепив на практике. Далее по мере погружения писать более сложные проекты - админку, магазин. После того как написали магазин на голом PHP, переходить к фреймворку. По мимо PHP желательно бы погрузиться в базу HTML, CSS, JS, что бы понимать как PHP коммуницирует с фронтом(примем сделать полноценную связку, а не использовать php как шаблонизатор html) Написать бэк на PHP, далее прикрутить к нему SPAшку Если получится всё это - будете гонять вайтишников на рынке. На самом старте и дикой конкуренции среди джунов, чем больше у вас охват по области, тем больше шансов пробиться на позицию джуна.

Худший ответ:
Официальный сайт?
https://www.php.net/manual/ru/
Вопрос: Как заблокировать TeamViewer на шлюзе Linux?

Лучший ответ:
TeamViewer использует схему UdpHole или, если не получается установить связь этим способом, ретранслирует через свой сервер поток TCP (грубо говоря). Вобщем не важно т.к. в любом случае используется сервер(а) teamviewer и идея в том чтобы найти центральный узел (подсеть узлов) teamviewer и заблокировать

Худший ответ:
Банальное правило в файервол в качестве параметра список.
В список заносите все известные сервера  тимвьювера.
Вопрос: Ipv6 c поддержкой всех сайтов?

Лучший ответ:
Ну если у сайта есть ipv6 - Он будет открываться, если нет - не будет.
https://serverfault.com/questions/1040907/can-i-us....

Худший ответ:
Протокол IPv6 по умолчанию имеет приоритет перед IPv4, ничего дополнительного для прокси делать не нужно — запросы будут идти через IPv6, если он настроен и работает.
Единственная возможная проблема может возникать в том случае, если клиент самостоятельно резолвит домен, отдаёт предпочтение IPv4-адресу и подключается к этому адресу через прокси, не передавая домен для подключения. В таком случае нужно перенастроить клиентское ПО, чтобы оно передавало домен прокси-серверу, а не IP-адрес.
Вопрос: Объясните пожалуйста как работает Docker/Podman?

Лучший ответ:
1. Вообще докер не для этого. Для того, что вы описали, лучше использовать виртуальную машину.
1.1 Один процесс - один контейнер. Отдельно пакуете apache, mysql, каждую версию php, и в docker compose всё оборачиваете. Git и systemd в контейнере не нужны. Докер сам как systemd.
1.2 Упаковать можно что угодно, но см. выше
2. Скорее наоборот, файлы, лежащие на хост-системе, пробрасываются в докер
3. Не будет, если ресурсы не ограничивать

Худший ответ:
Вам требуется LXC контейнер. создавайте сколько хотите и ставьте внутрь че угодно)
друг на друга влиять не будет
на хост систему можно поставить обратный прокси, типа NGINX, harproxy
Вопрос: Как изменить свою страну в интернете?

Лучший ответ:
Господя... вы вообще читаете соседние темы или пользуетесь поиском?)))

Интсрукция
арендуете ВПС в РФ
ставите там ОпенВПН
подключаете к этому опенВПН роутером, который там у Вас будет, пускаете весь траф через этот ВПН
подключаете рабочий ВПН(если он есть) на ПК
профит - Вы подключились из РФ

Худший ответ:
Даже если имеет неправильно классифицированные или не имеет вообще. На такое событие можно списать любую утечку
Вопрос: Как оптимизировать COUNT(*)?

Лучший ответ:
создайте таблицу в ней что то типа rows_matched
при инсерте нужной фразы добавляйте 1
при удалении вычитайте

по итогу у вас вместо тяжелого селекта очень легкий запрос

Худший ответ:
Будет ли от этого оптимизация или будет еще хуже?
В описанной ситуации, скорее всего, будет.
Вот пример для таблицы на 5 млн строк:
> EXPLAIN ANALYZE select count(*) from u where val like 'xz%';
-> Aggregate: count(0)  (actual time=358.829..358.829 rows=1 loops=1)
    -> Filter: (u.val like 'xz%')  (cost=1081.88 rows=4995) (actual time=0.388..358.196 rows=4995 loops=1)
        -> Index range scan on u using u_val  (cost=1081.88 rows=4995) (actual time=0.383..356.709 rows=4995 loops=1)

> EXPLAIN ANALYZE select count(*) from (select id from u where val like 'zx%' limit 11) q;
-> Aggregate: count(0)  (actual time=1.609..1.609 rows=1 loops=1)
    -> Table scan on q  (actual time=0.002..0.005 rows=11 loops=1)
        -> Materialize  (actual time=1.594..1.601 rows=11 loops=1)
            -> Limit: 11 row(s)  (actual time=0.089..1.560 rows=11 loops=1)
                -> Filter: (u.val like 'zx%')  (cost=1183.58 rows=5465) (actual time=0.088..1.555 rows=11 loops=1)
                    -> Index range scan on u using u_val  (cost=1183.58 rows=5465) (actual time=0.082..1.537 rows=11 loops=1)

Ускорение более чем в 200 раз. Разумеется, тут важно, что строк, подходящих под условие, в таблице значительно больше 10 - в данном случае 5.5 тысяч. Если подходящих строк будет в пределах нескольких десятков, разница будет не особо заметна.
Вопрос: Как перевести строку в число в ассемблере?

Лучший ответ:
Сначала напишите алгоритм на каком-нибудь высоком языке программирования, или хотя бы в псевдокоде. Потом аккуратно переведите в ассемблер.

Надо уметь только делить с остатком и умножать на 10. Как перевести 1234 в строку? Можно взять последнюю цифру - осток от деления на 10. Вот вы получили цифру 4. В строке это будет символ "4", или байт со значением 0x34. Вообще, для получения символа по цифре - надо прибавить 0x30. Это мы взяли остаток, а вот результат деления - 123. Можно продолжить перевод так же и мы получим символы в обратном порядке.

Итак, пока число не 0, делим нацело на 10. Остаток приписываем в ответ переводя в символ. В конце разворачиваем строку.

Перевод же из строки в число делается проще - идем циклом по строке, умножаем переменную на 10 и прибавляем тукущую цифру.

Худший ответ:
Безотносительно ассемблера. Это каноническая задача которую решают на 1 уроке информатики. 
Да был такой предмет когда-то. Допустим я-бы не знал готовой функции перевода. Но можно
наверное написать свою функцию. Понадобиться ассемблерная операция деления+нахождения остатка.
Вопрос: Что почитать, если тебе 12 и хочешь научиться кодингу?

Лучший ответ:
Ник Морган ,ява скрипт для детей. Правда учебник не полный, но он  лучше из тех что есть
Из плюсов что   не нужны не какие программы, можно  делать все  из консоли .
Но одной книги мало .. Он ведь хочет делать игры ?   нужны   книги по основам игр .... 
не плохой пример .... Книга Minecraft Справочник мини игр


В этой серии книг понятно показано      основа,     локации , животные,  то есть логика построения игры ...Конечно не вся серия ,а только две книги из серии .
Тут он увидит      основы тайлов и построения мира 

Хотя можно попробовать       и просто конструктор вроде  RPGMV

Есть программы  где ребенок может делать игры очень быстро 
но не сможет  компелировать игру .  
Например скретч или сайт   ttps://planet.mblock.cc 
Я рекомендую скретч https://scratch.mit.edu/projects/editor/?tutorial=home 

Литература   samlib.ru/s/shtumozt/scratch-1.shtml
samlib.ru/s/shtumozt/skretch-2.shtml

Что бы делать игры  ,  вовсе не обязательно уметь рисовать     или играть 
ответ Griboks     не верный.
Игры делать легко   , это могут дети   проблема лишь в том что нету инструмента 
Вместо Скретч нужен всего лишь детский игровой движок .Его пока нет , он в разработке

Что бы сделать вот такую игру , ребенку нужно всего час времени 

Играть можно не умея.....  В этом нет ничего сложного

Я рекомендую   начать с простых настольных игр . Это позволить     развить мышление ... И для этого не нужно программирование .  Например такие игры   как   Настольная игра Манчкин   их можно улучшить изменить    .Самые простые интересные игры это ККИ   такие как берсерк герои   .
Создав настольную можно потом   делать ПК игру . 
Очень интересная игра это Gremlins vs Automatons    ее вариант как настольной и ПК версии очень интересен

 Код  в играх не самое главное,  если   получается делать настольные игры и желание не пропадет , то    не будет проблем и с ПК играми. 
Проблема в том   что важен не сам язык,   а игровой движок ...    
Например Юнити     не имеет  редактора  музыки, и работы вектора .   Потому нужно целых три программы
проблемы 3 D игр 
1. Разработка  одежды для моделей
Существует только одна более менее програма пошива одежды для 3 Д модели Marvelous designer: 3D моделирование одежды   потому 3 Д   это долгий   и мало полезный путь ...
Потому я рекомендую начать с 2 D   в   2 D    тоже можэно делать красивые игры  которые выглядят как 3 Д 
но спрайты рмсовать проще  как и тайлы

Худший ответ:
Ничего, не портите ребенку детство. 
Закончит школу, тогда пусть и думает чем будет заниматься. Я в 12 лет хотел стать космонавтом, а когда закончил школу - уже не хотел.
Вопрос: Почему не работает скомпилированный .exe?

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

Худший ответ:
Потому что он не скомпилированный питон. ЭТО НЕ КОМПИЛЯЦИЯ. pyinstaller не компилирует питон, а упаковывает его в говно-файл.

Проблема у тебя скорее всего в абсолютных путях, которые скорее всего используешь и которые конечно же отсутствуют на другой учетке.
Вопрос: Хорошо ли использовать DTO в качестве объекта реквеста для api?

Лучший ответ:
Сложно понять Вашу картину и что имел ввиду Ваш коллега. Об этом лучше спросить самого коллегу. Однако постараюсь помыслить на эту тему...

1. Конкретно DTO не совсем применима к API в чистом виде и работе с ней. Более правильно в запрос кидать json, а вот этот json уже маппить на вашу DTO, в которой будет высокоуровневая валидация от симфони и php7.4. Пример И само DTO.

2. Так как у вас система микросервисная, то DTO передавать по сети точно не нужно. Вы можете использовать DTO внутри своего приложения, но не использовать его по сети. DTO позволяет Вам в сервис/хэндлер/команду передавать не сам Request и не кучу параметров, а своё DTO, которая должна создаваться на основе запроса. Таким образом вы отделяете слои и ответственности. При изменении названий параметров DTO не обязательно их менять в API и наоборот. Нет зависимости и это хорошо! Так же хорошо и для тестируемости.

3. Если вы упомянули ParamConverter это по сути конвектор параметров, но опять же на уровне приложения, а не между запросами сети) Об использовании его можно почитать в документации симфони. С помощью него можно указать в методе DTO, которую он принимает, а конвектор, написанный вами, знает как это DTO создать на основе ваших переданных данных. То есть вы не DTO передаёте в запрос, а те же параметры, просто этот конвектор делает вам из этих параметров DTO.  Использовать его или нет - дело ваше. Вы правильно подметили, что в Yii2 такого нет. Можно заморочиться написать свой, но смысла от этого нет вообще) Использовать DTO я бы рекомендовал. Так как профит будет: разделение слоев, меньшая связанность и возможность валидации. А вот использовать конвектор - решение команды или разработчика. Оно позволяет вам создать вашу DTO на основе переданных параметров. Параметры никуда не денутся, они просто сразу лягут в DTO это один профит - чище код.

Худший ответ:
Помимо уже перечисленного, переданный в публичный метод сервиса набор параметров зачастую продолжает гулять по приватным методам или компонентам сервиса, и делать это проще с одной DTO, чем с пачкой параметров.