nastya97core
@nastya97core
Начинающий программист

Почему этот код неверный и как он должен выглядеть?

Здравствуйте. Читаю статью по созданию бота в телеграм https://habr.com/ru/company/netologyru/blog/326174/ и если прочесть комментарии, то там в пух и прах разносят "качество" кода. Аргументируют оперируя лишь терминами, а не примерами. Подскажите, как должен выглядеть код, если через if ($text == "сообщение") - это неверно.
  • Вопрос задан
  • 499 просмотров
Пригласить эксперта
Ответы на вопрос 2
Bavashi
@Bavashi
if ($text == "сообщение")

Используйте ===.
Ответ написан
@FanatPHP
Чебуратор тега PHP
Мне кажется, что код немного подправили со времени публикации, как минимум добавили композер.
Так что сейчас сложно судить что конкретно вызвало реакцию в комментах.

Но на данный момент я бы сказал что основная проблема - это классическое спагетти.
Вообще, этот код - хороший пример того, как получается спагетти. Сначала берем простой пример, он короткий и понятный. Потом добиваем в него разный функционал, и код в итоге раздувается. Какие-то картинки, рссы, смешались в кучу кони, люди...
А потом в один прекрасный день программист вдруг откроет для себя, что НТТР ресурсы иногда возвращают не запрошенный контент, а ошибку. И станет вкрячивать проверку на ошибку в этот же самый винегрет.

Чтобы сделать этот код приличнее, его надо декомпозировать. Код каждого действия записать в свою собственную функцию. И тогда у нас каждый участок кода будет заниматься своим делом - диспетчер обработки запросов будет только решать какое действие выполнить в ответ на тот или иной запрос, и вызывать его. А сама обработка будет происходить где-то ещё, каждое действие отдельно.

Здесь же пригодится и ООП. Чтобы не писать каждый раз все эти $chat_id, $name, $keyboard - сделать их переменными класса и убрать с глаз долой.

Как именно построить сам диспетчер - вопрос по большей части вкуса. Почему-то считается, что switch case в данном случае смотрится лучше чем if elseif. Ну в целом да, новерное. Но лучше всего будет в РНР 8 с оператором match

match ($this->text) {
    "/start" => $this->startReply(),
    "/help" => $this->helpReply(),
    "Картинка" => $this->picReply(),
    default => $this->promptReply(),
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы