Выразительный 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 облегчает понимание кода. И её можно использовать во многих ситуациях, не только в нашем случае. К примеру, для вывода отформатированных таблиц с числами.

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

Хорошее правило – добавляйте только ту функциональность, которая вам точно пригодится. Иногда появляется искушение создавать фреймворки общего назначения для каждой небольшой потребности. Сопротивляйтесь ему. Вы никогда не закончите работу, а просто напишете кучу кода, который никто не будет использовать.