ErlangРаботыРевюСтатьиКнигаЗаказ
 

Очеловечиваем языки программирования

Кирилл Панфилов

Очень часто на сайтах можно встретить надписи, подобные следующей:

«Количество тем в форуме: 31»

Это всё ничего. Хуже, когда встречается такое:

«В форуме 31 тем»

Всё очень просто: число берётся сценарием из базы или внешнего файла и помещается в текстовую заготовку. А написать разные варианты окончаний для исчисляемого слова программист просто поленился или не догадался.

У проблемы есть простое решение. Нужно написать функцию, изменяющую окончание исчисляемого слова, а вызывая функцию, передавать ей в качестве параметра число, тип склонения и (в моём варианте функции) само исчисляемое слово. Вот пример такой функции (традиционно на примере PHP, если кто-то хочет, может прислать код на других языках, с удовольствием помещу их тут с сохранением авторства):

<?php
function numDeclin($text,$type,$numero)
{
$declins = array();
$declins["I"] = array("","а","ы");
$declins["Ik1"] = array("ок","ка","ки");
$declins["Ik2"] = array("ек","ка","ки");
$declins["II"] = array("ов","","а");
$declins["IIn"] = array("й","е","я");
$declins["IIj"] = array("ев","й","я");
$declins["III"] = array("ей","ь","и");
$declins["IIIer"] = array("ерей","ь","ери");

$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("комментари","IIj",$komm);
?>

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