Ща попробую объяснить что бы все поняли о чём я говорю.
Наверное лучше на определённых сферах задач объяснить.
Я последнее время много писал всяких ботов. Сейчас для Алисы от яндекса пишу всякую муть.
Так вот, при написании бота сначала нужно продумать логику его работы.
При каких условиях он будет отвечать "да", при каких "нет" грубо говоря.
Например при вопросе "как дела" он должен "говорить" привет, а при вопросе "как дела в Крыму", он должен искать новость про крым и читать её заголовок и предлагать прочитать подробнее.
То есть это этап проектирования логики бота. Тут интерфейс класса не первичен, потому что пока даже непонятно что может бот и при каких условиях.
Так вот на этапе проектирования (уже не на доске, а в коде) пытаемся запилить логику.
protected function defineUserCommands () {
if ($this->isHello()) {
$this->addComand('sayHello');
}
if ($this->isBye()) {
$this->addComand('sayBay');
}
}
Подумали что пользователь может поздороваться и потом попрощаться. Нужно поздороваться и попрощаться. Или просто поздороваться/попрощаться.
Дальше запускаем это команды, ну допустим так.
protected function executeUserCommands () {
foreach ($this->getCommandList() as $command) {
if (method_exist($command)) {
$this->{$command}();
}
}
}
Потом "архитектор" пишет методы, которые лучше называть "демками" вместо моков и болванок с пустышками. Потому что они работают, пусть и в таком урезанном демо режиме.
protected function isHello () : bool {
return true;
}
protected function sayHello () {
$this->addResponseText('Привет');
}
И так может быть расписана вся логика.
(Пользователь спросил погоду - задать вопрос "в каком городе")
(Пользователь спросил "что там происходит в Сирии" - поискать новости по Сирии)
(Пользователь раньше искал что то, и при этом "согласился", значит нужно читать полную версию)
(Пользователь спрашивал о погоде, а теперь ответил названием города - говорим погоду в этом городе)
Ну образно говоря. То есть пишется логика, и пишутся демки навыков. Навык "распознать запрос погоды", навык "рассказать о погоде", навык "сказать привет" и т.д.
Вот когда написан такой макет, когда уже понятно что и как будет работать, вот тогда мы переходим к реализации навыков. Прикручиваем эластик для поиска, пилим массив с разными вариантами "привет". В таком духе.
Только на этой стадии становится понятно что нужен контракт "ElasticSearch" для поиска или там Logger для логгирования, ну и другие зависимости.
И получается что интерфейс класса фактически определяется после шага с проектированием логики и перед реализацией навыков (а может и после). Только в этот момент становится понятно какие методы будут у бота и какие нужно сделать публичными.
Вот если $this->sayBay(); подходит под определения навыка бота, то $this->addComand(); уже не очень. Это навык класса, который архитектор создал в виде пустышки, но его кишки ещё нереализованы. Но не говорить же "Разработана логика, но ещё не разработаны кишки")
_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2