Выразительный JavaScript | страница 31
> var chickenString = String(chickens);
> while (chickenString.length < 3)
> chickenString = "0" + chickenString;
> console.log(chickenString + " Куриц");
>}
>printFarmInventory(7, 11);
Если мы добавим к строке >.length
, мы получим её длину. Получается, что циклы >while
добавляют нули спереди к числам, пока не получат строчку в 3 символа.
Готово! Но только мы собрались отправить фермеру код (вместе с изрядным чеком, разумеется), он звонит и говорит нам, что у него в хозяйстве появились свиньи, и не могли бы мы добавить в программу вывод количества свиней?
Можно, конечно. Но когда мы начинаем копировать и вставлять код из этих четырёх строчек, мы понимаем, что надо остановиться и подумать. Должен быть способ лучше. Пытаемся улучшить программу:
>// выводСДобавлениемНулейИМеткой
>function printZeroPaddedWithLabel(number, label) {
> var numberString = String(number);
> while (numberString.length < 3)
> numberString = "0" + numberString;
> console.log(numberString + " " + label);
>}
>// вывестиИнвентаризациюФермы
>function printFarmInventory(cows, chickens, pigs) {
> printZeroPaddedWithLabel(cows, "Коров");
> printZeroPaddedWithLabel(chickens, "Куриц");
> printZeroPaddedWithLabel(pigs, "Свиней");
>}
>printFarmInventory(7, 11, 3);
Работает! Но название >printZeroPaddedWithLabel
немного странное. Оно объединяет три вещи – вывод, добавление нулей и метку – в одну функцию. Вместо того, чтобы вставлять в функцию весь повторяющийся фрагмент, давайте выделим одну концепцию:
>// добавитьНулей
>function zeroPad(number, width) {
> var string = String(number);
> while (string.length < width)
> string = "0" + string;
> return string;
>}
>// вывестиИнвентаризациюФермы
>function printFarmInventory(cows, chickens, pigs) {
> console.log(zeroPad(cows, 3) + " Коров");
> console.log(zeroPad(chickens, 3) + " Куриц");
> console.log(zeroPad(pigs, 3) + " Свиней");
>}
>printFarmInventory(7, 16, 3);
Функция с хорошим, понятным именем >zeroPad
облегчает понимание кода. И её можно использовать во многих ситуациях, не только в нашем случае. К примеру, для вывода отформатированных таблиц с числами.
Насколько умными и универсальными должны быть функции? Мы можем написать как простейшую функцию, которая дополняет число нулями до трёх позиций, так и навороченную функцию общего назначения для форматирования номеров, поддерживающую дроби, отрицательные числа, выравнивание по точкам, дополнение разными символами, и т. п.
Хорошее правило – добавляйте только ту функциональность, которая вам точно пригодится. Иногда появляется искушение создавать фреймворки общего назначения для каждой небольшой потребности. Сопротивляйтесь ему. Вы никогда не закончите работу, а просто напишете кучу кода, который никто не будет использовать.