программерское :: oop & literal programming

Правильно я думал, что предыдущий пост вызовет вопросы : ) Он их вызвал. Обьяснюсь, чего я хочу и почему. Я хочу двух вещей: объектно-ориентированного подхода и повышенной читабельности программы. Эти вещи друг с другом очень связаны, поэтому ниже я не особо буду их разделять.

Возмущение первое связано с порядком аргументов в глобальных функциях и противоестественностью для живого человека принятой в таких случаях записи. В известных мне человеческих языках порядок частей речи чаще всего такой: субъект, действие, объект. Субъект производит действие над объектом. Субъект (в отличие от многих других субъектов) умеет производить определённое действие, причём оно должно производиться над объектом. Переходя к программированию, логично сделать действие методом субъекта, и этот метод будет принимать параметром объект. И программист радостно напишет что-то вроде субъект.действие( объект ) или палец.нажимает( кнопкаМыши ). Напишет... в счастливом будущем. А сейчас в одном многими (справедливо?) нелюбимом, но очень популярном языке программирования ему приходится писать нажимает( палец, кнопкаМыши ) или нажимает( кнопкаМыши, палец ) — каждый раз в разном порядке. Ну да ладно, это свойство языка, и кое-где солнце светит ярче.

Возмущение второе связано с необходимостью делать так:
$o1 = new Order(); $customer->addOrder($o1); $line1 = new OrderLine(6, Product::find(‘TAL’)); $o1->addLine($line1); $line2 = new OrderLine(5, Product::find(‘HPK’)); $o1->addLine($line2); $line3 = new OrderLine(3, Product::find(‘LGV’)); $o1->addLine($line3); $line2->setSkippable(true); $o1->setRush(true);
и невозможностью делать вот так:
$customer->newOrder() ->with(6, ‘TAL’) ->with(5, ‘HPK’)->skippable() ->with(3, ‘LGV’) ->priorityRush(); Ну вы видите, да? Второй вариант можно читать. Это почти человеческий язык. Кое-то называет это "Fluent Interfaces", а кто-то — удобным api, но суть не в этом. Суть в том, что это читается почти как предложение (отсюда, кстати, literate programming в заголовке).

А возмущение третье связано с синтаксисом оператора отрицания. Вот что вам приходит в голову при виде записи !string.contains( 'substr' )? Если вы — не машинноговорящий франкенштейн человек, то это нужно читать как «не строка содержит подстроку». Ага! «Йоды магистра речи тайна раскрыта, оказывается, на форте программист старый есть он просто.» Нормальные люди (кроме немцев : ) так не говорят. У них отрицание ровно перед действием стоит: «строка не содержит подстроку». При переводе в машинный язык это должно выглядеть как string.!contains( 'substr' ). Но не выглядит ни в одном из известных мне языков программирования : (

Артемий Трегубенко,

комментарии