Непростой выбор для простого решения

Timofey Aksenov

Timofey Aksenov

Front End Developer

Изучаю постепенно основы-основы в информатике. И сразу же натыкаюсь на Алгоритм Евклида wiki.

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

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

А теперь к сути, вернее к коду

Вариант 1. Код первоначальной версии:

/**
* @param {number} a
* @param {number} b
* @return {number|null}
*/
export default function euclideanAlgorithm(a, b) {
if (a === 0 && b === 0) {
return null;
}
if (a === 0 && b !== 0) {
return b;
}
if (a !== 0 && b === 0) {
return a;
}
if (a > b) {
return euclideanAlgorithm(a - b, b);
}
return euclideanAlgorithm(b - a, a);
}

Вариант 2. Код итоговой версии:

/**
* Recursive version of Euclidean Algorithm of finding greatest common divisor (GCD).
* @param {number} originalA
* @param {number} originalB
* @return {number}
*/
export default function euclideanAlgorithm(originalA, originalB) {
// Make input numbers positive.
const a = Math.abs(originalA);
const b = Math.abs(originalB);
// To make algorithm work faster instead of subtracting one number from the other
// we may use modulo operation.
return b === 0 ? a : euclideanAlgorithm(b, a % b);
}

Вариант 3. Еще раз код итогой версии без лишних комментариев

/**
* Recursive version of Euclidean Algorithm of finding greatest common divisor (GCD).
* @param {number} originalA
* @param {number} originalB
* @return {number}
*/
export default function euclideanAlgorithm(originalA, originalB) {
const a = Math.abs(originalA);
const b = Math.abs(originalB);
return b === 0 ? a : euclideanAlgorithm(b, a % b);
}

Вроде бы великолепный результат, вместо 15 строк кода, мы получаем 5 строк. Но с уменьшением количества строк мы увеличиваем сложность.

Первый вариант кода можно читать без предварительной математической подготовки (имеется в виду, что хватит беглого просмотра статьи из википедии). Второй вариант, потребует вдумчивого чтения комментариев и соответсвующей более детальной математической подготовки. С третьим вариантом, как говорится "без пол литра не разобраться".

Внимание!
Личное, ни на что не претендующее, мнение автора.

Разработчик (абсолютно любого уровня), должен понимать свою ответсвенность перед другими разработчиками, коллегами, бизнесом и многими, многими, многими... Оставив вариант №3, вы нанесете удар всем остальным людям. Будте готовы, что вас будут ненавидеть и вспоминать плохими словами, после того как вы наиграетесь и пойдете писать сложные вещи, туда где вас понимают или сыграет свою роль BUS_FACTOR *irony.

Выход из проблемы это варианты №1 и №2, т.к. они дают бизнесу уверенность, что за обозримое время недорогие разработчики разберутся в вашем коде. А разработчикам сопроводжающим код не прийдется уходить в запой от чувства собственной ничтожности.

Возлюбите ближнего своего — пишите код не для себя, а для людей! 🐱