Известен такой анекдот. Вызывает профессор-лингвист студента к доске и говорит: «Пиши: Глокая куздра штеко будланула бокра и курдячит бокренка». «Чего-чего?» было спросил студент, но с авторитетом профессора спорить не стал и честно записал эту абракадабру. А теперь, - сказал профессор, объясни – о чем говорится в этом предложении? На студента стало жалко смотреть и лектор сжалился.
- Ну, кто здесь главное действующее лицо?- Ку… куздра, - промямлил студент
- А какая она, эта куздра?
- Глокая! - уже уверенней произнес студент
- А на кого направлено действие?
- На бокра!
- И что эта куздра сделала?
- Она его будланула! – выкрикнули из аудитории со смехом.
- И штеко, причем, будланула, добавил, улыбнувшись, профессор.
- А вот бокр – он живой?
Студент задумался…
- А! Да! У него бокренок есть!
- У бочки тоже есть бочонок, но это не значит, что она живая. Если бы бокр был неживой, мы бы сказали «булданула бокр», это винительный падеж «кого, что».
Итак, не зная смысла ни одного существительного, прилагательного или глагола мы уже можем достаточно много рассказать о происшедшем. Информацию об этом мы извлекли из вроде бы незначащих вещей – падежей, союзов, окончаний, определяющих отношения между словами в предложении.
Теперь вернемся от языковедения к программированию. При чем здесь Глокая куздра? Много говорилось о том, что названия процедур, функций и переменных должны быть «говорящими» должны соответствовать логике их использования. Но не менее говорящими должны быть и связи между идентификаторами! Даже не зная конкретного смысла программы, можно с первого взгляда увидеть, как она устроена.
Как этого достичь?Возьмем Глокую куздру.
Но что это? Известно, что Глокая куздра может выполнять несколько действий. Она умеет будлануть, а умеет и курдячить т.е. представляет собой несколько связанных действий. Также известно, что эта куздра именно глокая, т.е. есть изменяемый параметр, явно в природе существуют и другие куздры – неглокие. В 1С логичнее всего оформить нашу куздру как обработку. Ведь бокров она именно «обрабатывает». Теперь, если ввести в тексте программы
Куздра. (с точкой), то система покажет все, что эта куздра умеет делать. Глокая пусть будет реквизитом обработки. Сегодня Куздра будет Глокая, т.е.
Куздра.Глокая = Истина
Дальше возьмемся за бокра. Документ или справочник наш герой, не так важно, т.к. сам он ничего не делает, кроме одного: как мы помним, куздра его будланула. Т.е. явно состояние бокра изменилось, произошло действие! Что у нас отвечает за действие, что в 1С заменяет глаголы? Процедуры и функции. Теперь нужно выбрать, что будем применять. Можно написать
Куздра.Будланула(бокра);и это будет почти по-русски. Но из этой записи совершенно не понятно, изменился бокр или нет. Опять же, куздра булданула его штеко т.е. с параметром. Получится
Куздра.Булданула(Бокра, Штеко)Здесь непонятно, кого куздра булданула – бокра или штеко, что является результатом действия, а что - его параметром. Самый правильный выход – написать
Бокр = Куздра.Будланула(Бокр, Штеко)
Теперь все методически правильно. Бокр является параметром и результатом (т.е. изменено его состояние, это объект над которым произошло действие), штеко – параметр. Соответственно продолжим наше повествование. Из него не совсем понятно, когда же это все кончится, когда глокая куздра все-таки закурдячит бокренка, ведь висящая программа нам не нужна. Допустим, бокренка есть функция Конец(), которая определяет конец закурдяченности. Получится такая вот такая конструкция
Пока Не Бокренок.Конец() Цикл Бокренок = Куздра.Курдячит(Бокренок) КонецЦикла
Здесь мы выразили непрерывное, повторяющееся действие через цикл (допустив, что прекращение действия зависит от Бокренка. Если оно зависит, например, от Бокра или состояния самой ГлокойКуздры, это тоже можно было выразить). Дальше еще можно добавить связь между Бокром и Бокренком. Оба они бокры! Значит, это можно выразить, объединив их в структуру, что может понадобиться, например, если нужно будет передать куда-то всех бокров скопом, а не поодиночке.
Итого у нас получилосьКуздра.Глокая = Истина; Бокры.Бокр = Куздра.Будланула(Бокры.Бокр, Штеко); Пока Не Бокры.Бокренок.Конец() Цикл Бокры.Бокренок = Куздра.Курдячит(Бокры.Бокренок); КонецЦикла;
Конечно, по сравнению с богатством русского языка, в пересказе на макроязыке 1С некоторые нюансы шедевра потерялись, но главная нить по-прежнему вполне улавливается. А значит и в языке программирования операторы отношения и присваивания имеют выразительный смысл, который можно и нужно использовать!
Формализуем правилаГлокаяКуздра(Бокра, Бокренка, Будланула, Курдячит)это не наш путь!