Есть вот такая небольшая функция. Есть ли способ сделать её более ёмкой и производительной? Может другой конструкцией (не if else) или по-другому сравнение реализовать? P.S. изучать PHP только начинаю
function game_parameters_check($gameMode, $level, $betValue)
{
if($gameMode != 'real' && $gameMode != 'demo')
{
exit();
}
if($level != 'easy' && $level != 'medium' && $level != 'hard')
{
exit();
}
if($betValue < 15 || $betValue > 500)
{
exit();
}
}
P.S. изучать PHP только начинаю
Мой ответ не будем о том, как записать код в три строчки.
1 Название функции
Обычно глагол ставят в начало названия: get, set, update, check, validate и т.д. Название функции/метода должно отражать, что она/он делают. Таким образом check_game_parameters
: проверка параметров игры.
2 Назначение функции
Такое обилие exit
в одной функции и без вывода сообщений об ошибках - это не серьезно. Еще пару-тройку таких функций и потом замучаетесь бегать по всему приложению с var_dump
.
Если это функция проверки/валидации, то она как минимум должна возвращать true
или false
. Таким образом: если переданные параметры игры удовлетворяют некоторым заранее определенным условиям, то возвращаем true
. Во всех остальных случаях - false
.
3 Аргументы функции
На входе имеем три аргумента, каждый из которых проходит по две-три проверки. Итого на текущий момент - 7 проверок.
Почти всегда проблемы возникают из-за слишком длинных методов, часто содержащих массу информации, погребенной под сложной логикой, которую они обычно в себе заключают. Основным типом рефакторинга здесь служит «Выделение метода», в результате которого фрагмент кода превращается в отдельный метод. -- Мартин Фаулер.
В нашем случае не метод, а функция. Три аргумента - три отдельных функции, от которых нам нужно либо true
, либо false
.
4 Именование аргументов
$gameMode
- проверяем параметры игры, поэтому приставка game
излишня.$level
отлично.$betValue
- из контекста и так понятно, что это значение.echo '<pre>';
function check_game_parameters($mode, $level, int $bet)
{
return validate_mode($mode)
&& validate_level($level)
&& validate_bet($bet);
}
function validate_mode($mode) {
return in_array($mode, [
'real',
'demo'
]);
}
function validate_level($level) {
return in_array($level, [
'easy',
'medium',
'hard'
]);
}
function validate_bet(int $bet) {
return $bet >= 15 && $bet <= 500;
}
if (!check_game_parameters('real', 'hard', 15)) {
echo 'Проверка не пройдена<br>';
exit();
}
echo 'Проверка пройдена<br>';
Ну, в голову приходит только два варианта:
function game_parameters_check($gameMode, $level, $betValue) {
if($gameMode != 'real' && $gameMode != 'demo') exit();
if($level != 'easy' && $level != 'medium' && $level != 'hard') exit();
if($betValue < 15 || $betValue > 500) exit();
}
Либо же
function game_parameters_check($gameMode, $level, $betValue) {
if(!in_array($gameMode, [ 'real', 'demo' ])) exit();
if(!in_array($level, [ 'easy', 'medium', 'hard' ])) exit();
if($betValue < 15 || $betValue > 500) exit();
}
Во втором варианте, лучше, конечно же, переменную gameMode перевести в нижний регистр.
function check_game_parameters($gameMode, $level, $betValue)
{
$allowedRule = [
'level' => ['easy','medium','hard'],
'game_mode' => ['real','demo'],
];
if(! in_array($gameMode,$allowedRule['game_mode']) ||
! in_array($level,$allowedRule['level'])) exit();
if($betValue <= 15 || $betValue > 400) exit();
}
А если в будущем добавится еще один уровень, или игровой режим? добавлять новые if'ы?
В данном случае достаточно этот новый режим\уровень добавить в массив $allowedRule
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть форма на странице indexphp В форме данные для ввода (логин и пароль) и recaptcha