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

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

// Original code
if (user.isAdmin && user.hasAccess && (user.role === 'Manager' || user.role === 'Developer')) {
  // Perform some action
}

// Refactored code
function hasPermission(user) {
  return user.isAdmin && user.hasAccess && (user.role === 'Manager' || user.role === 'Developer');
}

if (hasPermission(user)) {
  // Perform some action
}

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

function isAgeGreaterOrEqualTo18(age) {
  return age >= 18;
}

function isMaleOrFemale(gender) {
  return gender === 'male' || gender === 'female';
}

function isLocationNewYorkOrCalifornia(location) {
  return location === 'New York' || location === 'California';
}

Как видите, даже самые лучшие условные предложения не очень хорошо сканируются. Вы должны остановиться и внимательно прочитать условное выражение и оценить его контекст, чтобы понять, что оно на самом деле делает.

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

// Create a function that checks if a number is divisible by 3
function isDivisibleByThree(num) {
  return num % 3 === 0;
}

// Create a function that checks if a number is divisible by 5
function isDivisibleByFive(num) {
  return num % 5 === 0;
}

// Create a function that checks if a number is divisible by both 3 and 5
function isDivisibleByBoth(num) {
  return isDivisibleByThree(num) && isDivisibleByFive(num);
}

// Create a function that checks if a number is divisible by either 3 or 5
function isDivisibleByEither(num) {
  return divisibleByThree(num) || divisibleByFive(num);
}

// Call the functions
isDivisibleByBoth(15); // prints "15 is divisible by both 3 and 5"
isDivisibleByEither(14); // prints "14 is divisible by either 3 or 5"

Инкапсуляция вашего условного выражения в функцию дает вам возможность дать ему имя, и это имя может предоставить все объяснения, необходимые для того, кто просматривает код, чтобы узнать, что такое условие и какие данные оцениваются из аргумента функции.

Если вы тестируете, инкапсуляция упрощает тестирование каждого условия в вашем приложении.

const isNumberGreaterThan10 = (num) => {
  return num > 10;
};

test('isNumberGreaterThan10 function should return true if the number is greater than 10', () => {
  expect(isNumberGreaterThan10(11)).toBe(true);
});

Инкапсулируйте свои условные операторы

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