Недавно наткнулся на статью про очередной фреймворк JS по названием Imba. Сначала приводится примеры кода на JS, а затем то же самое на этом очередном фреймворке:
Спойлертык:
Ниже показана простая JS-функция, которая возвращает наибольшее из двух переданных ей чисел, или, если эти числа равны, значение false.
PHP код:
function findGreatest(num1, num2) { if (num1 > num2) { return num1 } else if (num2 > num1){ return num2 } else { return false } }
Затем, соответственно, автор указывает на преимущества Imba перед чистым JS:
- длинное слово "function",
- куча скобок,
- частое употребление return
То ли автор знает только основы синтаксиса JS, причем устаревшие, и не знает как переписать функцию с учетом его требований. То ли пытается ввести людей заблуждение (хотя делать это на хабре довольно глупо).
Чтобы подобных заблуждений о длине кода JS не было, давайте немного потренируемся в том, как сделать функцию проще, понятнее и читабельней
Сокращение кода
1. if...else
Давайте и начнем с вышеупомянутой функции и попробуем ее сократить:
PHP код:
function findGreatest(a, b) { if (a > b) { return a } else if (b > a){ return b } else { return false } }
1) Выражение в скобках состоят из одной строки, а потому мы их можем убрать:
PHP код:
function findGreatest(a, b) { if (a > b) return a else if (b > a) return b else return false }
2) Избавляемся от "else". Зачем они здесь, если return и так не дает пройти дальше?
PHP код:
function findGreatest(a, b) { if (a > b) return a if (b > a) return b return false }
3) Используем сокращенную запись конструкции if...else, тем самым оставив один return
PHP код:
function findGreatest(a, b) { return (a > b) ? a : (b > a) ? b : false }
4) Знак ">" выше по приоритету, чем "?", а потому мы можем опустить скобки
PHP код:
function findGreatest(a, b) { return a > b ? a : b > a ? b : false }
5) Перепишем ее как анонимную функцию, т.е. записав в переменную
PHP код:
const findGreatest = function(a, b) { return a > b ? a : b > a ? b : false }
6) Это позволит следующим шагом записать ее как стрелочную функцию, т.е. избавившись от длинного ненавидимого некоторыми программистами слова "function"
PHP код:
const findGreatest = (a, b) => { return a > b ? a : b > a ? b : false }
7) Еще одно преимущество стрелочной функции - возможность убрать return совсем, для чего мы должны написать функцию в круглых скобках
PHP код:
const findGreatest = (a, b) => (a > b ? a : a < b ? b : false)
Спойлертык:
8) Чисто для справки - в круглых скобках мы можем писать не только одну строку. В ней мы можем написать и несколько строк, отделяя их запятыми, например можем добавить строчку "a = a/b".
PHP код:
const findGreatest = (a, b) => (a = a/b, a > b ? a : a < b ? b : false)
9) Читаемость конечно упадет, но для пары строк несильно. Если строк больше, можем перенести на несколько строк, как обычную функцию
PHP код:
const findGreatest = (a, b) => ( a = a/b, a > b ? a : a < b ? b : false )
Таким образом первоначальную функцию мы сократили до одной строки. Удобно ли для него это или нет - выбор автора, а выбора, как видим, немало. Лично мне нравится 2 вариант как самый читаемый и 7 - как самый короткий.
2. Switch
Одна из самых непривычных конструкций js. Многими считается устаревшей, кажется чужеродной, а постоянные вставки "break" бесят чуть ли не всех. Тем не менее в том же мейкере он часто используется для считывания направления персонажа. К примеру в этом посте используется подобная функция:
PHP код:
const move = function (direction) { let code; switch(direction) { case 2: code = 'Game_Character.ROUTE_MOVE_DOWN'; break; case 4: code = 'Game_Character.ROUTE_MOVE_LEFT'; break; case 6: code = 'Game_Character.ROUTE_MOVE_RIGHT'; break; case 8: code = 'Game_Character.ROUTE_MOVE_UP'; break; } return code }
1) Мы конечно можем записать брейки в одну строчку, при этом читаемость упадет не сильно
PHP код:
const move = function (direction) { let code; switch(direction) { case 2: code = 'Game_Character.ROUTE_MOVE_DOWN'; break; case 4: code = 'Game_Character.ROUTE_MOVE_LEFT'; break; case 6: code = 'Game_Character.ROUTE_MOVE_RIGHT'; break; case 8: code = 'Game_Character.ROUTE_MOVE_UP'; break; } return code }
2) Но можно вообще отказаться от свитча и использовать объект
Чем хорошо JS? Тем, что синтаксис дает выбор писать так, как нравится. Можно писать в одну строчку, а можно топорно но читаемо. Можно через стандартные старые конструкции, а можно через функции. Это я еще не говорил о "new Function", о котором можно почитать самостоятельно
Социальные закладки