Как избавиться от «такого» кода?

Есть код, нужна критика и советы по улучшению моего "говно кода"...
Это код для бота ВК.
Суть: автоответ на вопросы пользователей

Сам код

bot.php

<?php
require 'config.php';

$data = json_decode(file_get_contents('php://input'));

if(!isset($data)) exit;

if(strcmp($data->secret, VK_SECRET_KEY) !== 0 && strcmp($data->type, VK_TYPE_CONFIRMATION) !== 0) return;

/*
* __init__
*/

switch ($data->type) {
	case VK_TYPE_CONFIRMATION:
		echo VK_CONFIRMATION_TOKEN;
		break;

	case VK_TYPE_NEW_MESSAGE:
		$GROUP_ID = $data->group_id;
		$USER_ID = $data->object->user_id;
		$PEER_ID = $data->object->peer_id;
		$RANDOM_ID = $data->object->random_id;
		$USER_TEXT = mb_strtolower($data->object->text);
		$USER_INFO = json_decode(file_get_contents('https://api.vk.com/method/users.get?user_ids='.$USER_ID.'&access_token='.VK_TOKEN.'&v='.VK_API_VERSION.''));
		$USER_NAME = $USER_INFO->response[0]->first_name;
		$BOT_ANSWER = 'Бот не нашёл ответа на ваш вопрос!';
		$BOT_COMMANDS = [
			'!{user_name}' => $USER_NAME,
			'!{bot_name}' => BOT_NAME,
			'!{bot_version}' => BOT_VERSION
		];

		foreach ($VK_CONFIG_FAQ as $k => $v) {
			$res = strpos(mb_strtolower($k), mb_strtolower($USER_TEXT));
			if($res !== false){
				$BOT_ANSWER = $v[array_rand($v)];
			}
		}

		if($BOT_ANSWER != 'Бот не нашёл ответа на ваш вопрос!' and strpos($BOT_ANSWER, '!{') != false){
			foreach ($BOT_COMMANDS as $command => $val) {
				$BOT_ANSWER = str_replace($command, $val, $BOT_ANSWER);
			}
		}

		$params = http_build_query([
			'message' => $BOT_ANSWER,
			'peer_id' => $PEER_ID,
			'user_id' => $USER_ID,
			'random_id' => $RANDOM_ID,
			'access_token' => VK_TOKEN,
			'v' => VK_API_VERSION
		]);

		file_get_contents('https://api.vk.com/method/messages.send?' . $params);

		echo 'ok';
		break;
}


config.php

// TYPES
define('VK_TYPE_CONFIRMATION', 'confirmation');
define('VK_TYPE_NEW_MESSAGE', 'message_new');

// BOT PARAMS
define('BOT_NAME', 'NameBot');
define('BOT_VERSION', '0.0.1');

// FAQ
$VK_CONFIG_FAQ = [
	'Привет | Hi' => [
		'Привет, !{user_name}!!!! Тебя приветствует бот !{bot_name} версии !{bot_version}',
		'Опять вы.... Ну, hi....'
	],
];
  • Вопрос задан
  • 527 просмотров
Решения вопроса 2
Zraza
@Zraza
Помог ответ? Отметь решением!
Я бы посоветовал:
1) Разбить код на функции с осмысленными названиями.
Гораздо лучшее читаются короткие участки кода.
Для примера, я бы вынес функции validateRequest, sendMessage, findAnswer. Перенести в отдельные функции/методы классы запросы к внешним сервисам (vk)
2) Убрать неиспользуемые переменные. Зачем тут $GROUP_ID ?
3) Не использовать однобуквенные переменные.
Вместо `foreach ($VK_CONFIG_FAQ as $k => $v) {` лучше что-то вроде `foreach ($VK_CONFIG_FAQ as $questionPattern => $answers) {`
4) Не дублировать строковые константы типа 'Бот не нашёл ответа на ваш вопрос!'. Лучше вынести в отдельную константу типа NOT_FOUND_ANSWER

Ну и про PSR уже написали
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Бот «сломается» при большом числе запросов. Прежде, чем отдать ожидаемое «ok», он выполняет ещё два веб-запроса: users.get() и messages.send()– это съедает время и память. Будье готовы переключиться на схему с очередью и отдельными рабочими. Приняли запрос, сохранили, отдали "ok". Другой процесс, рабочий, неспеша разбирает задачи из очереди, отправляет ответы. Стали популярнее, добавили рабочих с других серверов.

Не проверяете user text на минимальную длину. Пришлют одну букву - получат весь FAQ. По мере роста FAQ'а, можете столкнуться с дубликацией: на запрос "hi" найдётся, скажем, ключ с "high load".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SaveTime Москва
от 100 000 руб.
Teamlead Ставрополь
от 25 000 до 50 000 руб.
Vigrom Москва
До 150 000 руб.