Правильный стиль написания Java-скриптов
Введение
Если что-то делать так делать максимально эффективно.
Современные скриптовые языки (JavaScript, VBScript) достаточно
просты и вполне доступны в освоении непрофессиональными пользователями.
Эти языки, собственно, и были созданы с таким расчетом. Однако,
зачастую, пользователи не владеют навыками правильного стиля написания
скриптов.
Что подразумевается под «правильным стилем»:
- краткий код, оптимальный алгоритм (высокая скорость загрузки)
- понятный, читабельный код (легкость модификации)
- корректная обработка ошибок (недопустимо сообщение браузера
об ошибке)
Поводом для написании статьи послужил скрипт, который я нашел
в одной гостевой книге. Скрипт выводит на страницу текущую дату,
при этом наименование дня недели определяется следующим образом:
if(dow == 0){
dow = "Воскресенье";
} else {
if(dow == 1){
dow = "Понедельник";
} else {
if(dow == 2){
dow = "Вторник";
} else {
if(dow == 3){
dow = "Среда";
} else {
if(dow == 4){
dow = "Четверг";
} else {
if(dow == 5){
dow = "Пятница";
} else {
dow = "Субота";
}}}}}}
Не знаю, как вы а я был поражен. Я просто не думал, что
в XXI веке еще кто-то пишет в таком стиле, хорошо, что дней недели
всего семь. Простейшая задача выродилась в настоящего монстра
и даже с орфографической ошибкой (суббота пишется с двумя "б").
Попробуем постепенно облагородить данный скрипт.
Switch
Вообще-то, в программировании для выбора значения из списка существует
оператор выбора switch ( case ).
Синтаксис из справочника по JavaScript:
switch (expression) {
case label : statementlist
case label : statementlist
...
default : statementlist
}
В нашем случае:
switch (dow) {
case 0 : dow = "Воскресенье";
case 1 : dow = "Понедельник";
case 2 : dow = "Вторник";
case 3 : dow = "Среда";
case 4 : dow = "Четверг";
case 5 : dow = "Пятница";
default : dow = "Суббота";
}
Почему не написано хотя бы таким образом загадка для меня.
Возможно, автор не знал о существовании switch.
Функция
Скрипт стал значительно легче, но требует дальнейшей модификации.
Сделаем массив из наименований дней недели и оформим все в виде
функции:
function DowName( dow ) {
var DowList = new Array("Воскресенье","Понедельник","Вторник","Среда",
"Четверг","Пятница","Суббота");
return DowList[dow];
}
Вот, в основном, и все. Но, для того, чтобы функция работала
для любого числового dow, нужно написать следующее:
function DowName( dow ) {
var DowList = new Array("Воскресенье","Понедельник","Вторник","Среда",
"Четверг","Пятница","Суббота");
return dow <0 || dow>=DowList.length ? "Ошибка!"
: DowList[dow];
}
Напомню, что изначально днем ошибки служила «cуббота»,
так как являлась последним днем недели. В нашем случае при некорректном
дне недели выдается более осмысленное значение.
Созданную функцию уже можно поместить в библиотеку для дальнейшего
использования.
Модификация
Жизнь часто вносит свои коррективы, и, в один прекрасный день,
нам понадобится многоязычная функция. Добавим новый параметр
lang (язык). При этом позаботимся, чтобы функция в старом
своем виде (с одним параметром dow) продолжала исправно
работать. Для этого новый параметр lang по умолчанию
задаем равным 0. Можно, конечно, поступить иначе и
назвать функцию по-новому: например, DowName2. Но это
обозначает, что у нас будет 2 функции для определения одного и
того же, а товарищ Оккама завещал не плодить сущности ("бритва
Оккама").
Наш массив стал двумерным, т.е. массивом массивов. Теперь входные
параметры проверяются и для внешнего и для внутреннего массивов.
function DowName( dow, lang ) {
if ( lang==undefined ) lang = 0;
var DowList = new Array();
DowList[0] = new Array("Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота");
DowList[1] = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
return dow <0 || lang <0 || lang>=DowList.length
|| dow>=DowList[lang].length ? "Ошибка!" : DowList[lang][dow];
}
Для внедрения нового языка достаточно описать DowList[2] ,
DowList[3] и так далее. Аналогично, можно вносить
коррективы и добавлять новые возможности (например, вывод краткого
дня недели).
Заключение
Проверим, является ли наш скрипт «правильным» скриптом
и найдем отличия от первоначального варианта.
- Код сократился в несколько раз при увеличении функциональности
- Скрипт стал более понятен и готов к дальнейшему развитию
- Корректно обрабатываются входные параметры
Если даже для такой простой задачи, как наша, преобразования
дали вполне ощутимый эффект, то что говорить о сложных деловых
приложениях, где эффект может быть измерен в денежном выражении.
|