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

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

Сам код

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....'
	],
];
  • Вопрос задан
  • 539 просмотров
Решения вопроса 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".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SMIT Москва
от 45 000 до 65 000 руб.
Zelo Москва
от 130 000 руб.
Amigoweb Магнитогорск
от 40 000 до 70 000 руб.