#168

Возвращайся поскорее

Чем глубже у тебя вложенность кода, тем тяжелее в нем ориентироваться. Вот типичный код:

// Было:

function findSponsorByCookieValue(db, affiliateCookieValue) {
  if (affiliateCookieValue) {
    const splitValue = affiliateCookieValue.split('.');

    if (splitValue.length == 2) {
      const userId = splitValue[0];

      if (!isNumber(userId)) {
        const user = db.User.findById(userId);

        if (user) {
          if (user.isEnabled() && user.deletedAt === null) {
            const incomingToken = splitValue[1];
            const validToken = tokenCreateByUserId(user.id);
            if (incomingToken == validToken) {
              return user;
            }
          }
        }
      }
    }
  }

  return null;
}

Что здесь печального, кроме глубины и тяжести восприятия? Смотри: из такого кода не очевидны выходы. Сколько вариантов выхода с негативным ответом ты здесь видишь? Посчитай. А покажи пальцем, где в коде возвращается положительный результат?

Один из моих любимых приемов бороться с таким — это как можно скорее выходить из метода в случае негативной ситуации.

// Стало

function findSponsorByCookieValue(db, affiliateCookieValue) {
  if (!affiliateCookieValue) {
    return null;
  }

  const splitValue = affiliateCookieValue.split('.');
  if (splitValue.length != 2) {
    return null;
  }

  const userId = splitValue[0];
  if (!isNumber(userId)) {
    return null;
  }

  const user = db.User.findById(userId);
  if (!user) {
    return null;
  }

  if (!user.isEnabled()) {
    return null;
  }

  if (user.disabledAt) {
    return null;
  }

  const incomingToken = splitValue[1];
  const validToken = tokenCreateByUserId(user.id);

  if (validToken != incomingToken)  {
    return null;
  }

  return user;
}

Обрати внимание:

  • Все негативные выходы видны сразу
  • Позитивный выход всегда в конце
  • Все выходы на одном уровне вложенности
  • Глубина минимальная
  • Легко читается