Чистый код — использование техники раннего возврата

На мой взгляд, чистый код — это практика, которая четко отличает хорошего разработчика от среднего. Но это не то, что вы можете включить или выключить, это то, чего вы достигаете, придерживаясь множества более мелких техник. И, как вы, наверное, догадались, раннее возвращение — одно из них.

Цель досрочного возврата, как вы можете догадаться, состоит в том, чтобы ваш метод использовал возвращаться ключевое слово как можно скорее, а это означает, что вы, вероятно, получите кучу возвратов через ваш метод. Младшего программиста это может сбить с толку, так как вы не сразу понимаете, куда именно возвращается метод, но поверьте мне, это действительно полезно. Возьмем пример:

bool ShouldFireNuclearWeapon(PossibleTarget target)
{
    if (target != null)
    {
        if (target.IsFromEnemyNation)
        {
            if (target.IsCarryingWeapon)
            {
                if (!target.IsCivillian)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

            if (target.LivingBeingInformation.NumberOfLegs == 2)
            {
                if (target.LivingBeingInformation.Height < 1.50)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }        
    }

    return false;
}

Предположим, мы разрабатываем систему наведения для нашего нового атакующего робота и сейчас работаем над тем, как он выбирает цель. Изучив приведенный выше метод, мы не можем четко понять, когда он возвращает true или false. И представьте, что в какой-то момент нам придется изменить его. Это будет нелегко. Но с помощью простой магии рефакторинга мы можем сделать это намного проще.

bool ShouldFireNuclearWeapon(PossibleTarget target)
{
    if (target == null)
        return false;

    if (!target.IsFromEnemyNation)
        return false;

    if (target.IsCarryingWeapon)
        return !target.IsCivillian;

    if (target.LivingBeingInformation.NumberOfLegs == 2)
        return target.LivingBeingInformation.Height > 1.50;

    return false;    
}

Видеть? Однозначно понятнее. Все еще не кристально ясно, так как мы должны попытаться угадать значение некоторых проверок, таких как target.LivingBeingInformation.NumberOfLegs == 2, но это уже другая тема о чистом кодировании. Но, все же говоря о досрочном возврате, причин для его принятия на вооружение еще больше. Например, давайте посмотрим на следующий код:

void ShootThyEnemy(YupThatsATarget target)
{
    PrepareLasers();

    RaiseArm();

    if (target != null)
        Shoot();
}

Мы ничего не знаем о методах PrepareLasers() и RaiseArm(), но давайте предположим, что их выполнение занимает много времени. Может быть, даже заблокировать некоторые ресурсы, например, таблицу базы данных. Мы бы потратили усилия ЦП впустую, если бы в конце концов цель была нулевой. Сделаем рефакторинг:

void ShootThyEnemy(YupThatsATarget target)
{
    if (target == null)
        return;

    PrepareLasers();

    RaiseArm();

    Shoot();
}

И вот, теперь мы будем запускать наши методы только в том случае, если у нас действительно есть цель. Конечно, кто-то может возразить, что к концу наших длинных методов цель может исчезнуть, и нам, возможно, следует снова проверить, но давайте не будем вдаваться в подробности.


Первоначально опубликовано на

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *