Как лаконично оформить код?

113
10 декабря 2020, 01:00

Есть вот такая небольшая функция. Есть ли способ сделать её более ёмкой и производительной? Может другой конструкцией (не 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();
    }
}
Answer 1

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 Именование аргументов

  1. $gameMode - проверяем параметры игры, поэтому приставка game излишня.
  2. $level отлично.
  3. $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>';
Answer 2

Ну, в голову приходит только два варианта:

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 перевести в нижний регистр.

Answer 3
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

READ ALSO
Подключение google recaptcha

Подключение google recaptcha

Есть форма на странице indexphp В форме данные для ввода (логин и пароль) и recaptcha

127
Yii2 как правильно написать запрос с Inner join?

Yii2 как правильно написать запрос с Inner join?

По сути я хочу написать запрос

100
Mysql pdo - не информативный errorInfo

Mysql pdo - не информативный errorInfo

Выполняю запрос:

109
Spring Security Principal null

Spring Security Principal null

метод контроллера:

182