Очеловечиваем языки программирования
Очень часто на сайтах можно встретить надписи, подобные следующей:
«Количество тем в форуме: 31»
Это все ничего. Хуже, когда встречается такое:
«В форуме 31 тем» или «Выбрано 1 из 38 темы».
Все очень просто: число берется сценарием из базы или внешнего файла и помещается в текстовую заготовку. А написать разные варианты окончаний для исчисляемого слова программист просто поленился или не догадался.
У проблемы есть простое решение. Нужно написать функцию, изменяющую окончание исчисляемого слова, а вызывая функцию, передавать ей в качестве параметра число, тип склонения и (в моем варианте функции) само исчисляемое слово. Вот пример такой функции (на примере PHP):
<?php
Function numDeclin($text,$type,$numero)
{
$declins = array();
$declins[”I"] = array("","a","bi");
$declins["Ik1"] = аггау("ок","ка","ки");
Очеловечиваем языки.
4.7 |
$declins["Ik2"] = аггау("ек","ка","ки"); $declins["II"] = аггау("ов","","а"); $declins["IIn"] = аггау("й","е","я"); $declins["IIj"] = аггау("ев","й","я"); $declins["III"] = аггау("ей","ь","и"); $declins["IIIer"] = аггау("ерей","ь","ери");
$lc=substr($numero, strlen($numero)-1,1); if(strlen($numero)>"1" && substr($numero, strlen($ numero)-2,1)=="1")
{$cntr = $declins[$type][0];} elseif($lc=="1")
{$cntr = $declins[$type][1];} elseif($lc>"1" && $lc<"5")
{$cntr = $declins[$type][2];} else
{$cntr = $declins[$type][0];} return $numero." ".$text.$cntr;
}
?>
Здесь в функцию numDeclin передаются параметры $text (исчисляемое слово), $type (тип склонения) и $numero (число, влияющее на конечный вид фразы).
Затем в двухмерный массив заносятся все распространенные типы склонения, каждый — с набором окончаний следующих форм: родительный падеж множественного числа (35 листов, 17 мгновений, 11 скобок), именительный падеж единственного числа (1 окно, 31 дом) и родительный падеж единственного числа (2 девушки, 3 товарища, 24 дочери). Исключения, если требуется, можно написать самостоятельно. А типы склонения, не использующиеся на сайте, можно вообще выкинуть из массива, чтобы код был короче.
Наконец, все эти три случая просто расшифровываются условными операторами, а в конце возвращается строка, состоящая из числа, привязанного неразрывным пробелом к исчисляемому слову, оформленному нужным окончанием. Естественно, функцию можно модифицировать, чтобы возвращалось только нужное окончание, тогда достаточно будет передать в функцию число объектов и тип склонения.
Вызывается функция так (при $komm — числе комментариев):
<?php
Echo numDeclin("KOMMeHTap^',"IIj",$komm);
?>
В результате всех этих манипуляций часть текстов на сайте выглядит не технично, а вполне естественно. Мысль, изложенную в главе, легко развить, написав функции для спряжения глаголов, если в этом есть необходимость.
Другой частый случай — внешний вид дат.
Чаще всего даты, встречающиеся на сайтах, оформлены как отчеты. «Документ изменен 24.06.04». «Добавлено: 2005 Jan 13». Иногда такое появляется из-за того, что зарубежную систему управления сайтом ее пользователь не перевел на русский язык; иногда — из-за экономии кода.
А ведь решение заключается в добавлении одной строчки кода и модификации другой.
Было:
<?
Echo "Сегодня ".date("d. m.y"); // Вывод: «Сегодня 01.07.07»
?>
Стало:
<?
$months arr = array("", "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря");
Echo "Сегодня ".date("j")." ". $months_arr[date("n")]." ".date("Y")." года";
// Вывод: «Сегодня 1 июля 2 0 07 года»
?>
Второй вариант выглядит гораздо более человечным. Всего-то: добавили массив, содержащий названия месяцев в родительном падеже, причем первый (нулевой в нумерации языка PHP) элемент пустой, потому что он не будет использоваться вообще, а вызываем нужный элемент этого массива с помощью числа, соответствующего номеру месяца. И по мелочи: в формате дня месяца выбираем тот, который выводит число без ведущего нуля, а год выводим полностью, а не только последние две цифры.
Зря говорят, что лень — двигатель прогресса. Двигатель прогресса в плане развития инструментов — это постоянные мысли о том, кто будет этим инструментом пользоваться.