Книга знаний

1С:Предприятие / Приемы программирования / Встроенный язык

Kazakh Notation (Казахская нотация)

Автор статьи: skunk | Редакторы: Волшебник
Последняя редакция №13 от 23.08.13 | История
URL: http://kb.mista.ru/article.php?id=175

Автор: Max Skunk (Максим Скунки)
корпорация ОГО-го "Рога и Копыта"
март 2006 года (где-то в степях Казахстана)

Предисловие.
Еще во времена разработки первых версий MS DOS в недрах любимой всеми нами корпорации среди девелоперов появилось соглашение об именах идентификаторов. Суть этого соглашения сводилось к использованию префиксов для указания функционального назначения объектов. Несколько позже данная система была утверждена внутренним стандартом написания кода для всех программеров Майкрософт. Основной причиной этого послужило удобство чтения исходных текстов программ. Вскоре данную систему обработал и окончательно систематизировал доктор Чарльз Симонии (Charles Simonyi). Назвав данное соглашение "Венгерской нотацией". Причиной такого названия послужило то, что сам Симонии родом из Венгрии. В большинстве документов и заголовочных файлов, изданных Майкрософт за последнее время, используются "Венгерская нотация". Но, пожалуй, самую большую популяризацию данной системе положила книга Чарльза Пецольда (Charles Petzold's) Programming Windows.
Сейчас большинство программистов используют данную нотацию или аналогичные системы при оформлении исходного кода своих программ. Исключение из данного правила составляют насильники от один Си. По правде надо сказать, что данная когорта кодеров вообще представляет странное явление, выделяя их в особый легион. По сути, большинство из них как таковыми программистами назвать сложно. Так Барановы Левы (прости меня господи за мое богохульство). Но о них говорить сегодня не будем, посвятив весь материал данной статьи попытки систематизировать оформление кода на великом и могучем языке программирования один Си. За основу мною была взята "Венгерская нотация" доктора Ч.Симонии, если быть еще более точным, то данное является вольным переводом "Венгерской нотации" взятой мной с сайта всеми нами любимой корпорации Майкрософт (http://msdn.microsoft.com/library/techart/hunganotat.htm). Использовать или нет, данное соглашение, решать вам. И так соглашение оформления текстов программ и обозначения идентификаторов на языке один Си или "Казахская нотация".

"Что-то" про идентификаторы, Леву и матушку Германию.
Как сказать по русский, то о чем написал Симонии в своем "Program Identifier Naming Conventions", я точно не знаю. Если говорить по немецкий, то боюсь, вы мало поймете. Там вообще непереводимая игра слов. Поэтому попробуем по албанский.
По утверждениям Чарльза, если вы программер, а не Лева Баранов, то, придумывая новый идентификатор должны подумать за четыре вещи:
  1. Mnemonic value (мнемоническое значение) – идентификатор должен быть can remember (легко запоминаемым).

  2. Suggestive value (неприличное значение) – идентификатор должен намекать на свои действия (роль объекта в программе должна быть ясна из его имени).
  3. "Consistency" (логичность, последовательность) – у схожих по назначению объектов должны быть схожие имена. Этот пункт канает за чеченский понт (как таковой бессмысленный, бесполезный, рассматривается как эстетическая идея).

  4. Speed of the decision (и здесь за СПИД, хотя в данном случае имеется ввиду скорость) – имя объекта не должно отнимать у кодера много времени при его эксплуатации: "придумывание, ввод, редактирование и т.д. (не надо вводить в программу идентификатор следующего вида: "ЗдесьЯБудуХранитьТекстЗапроса")."

Не стоит слишком долго пыхтеть над придумыванием новых идентификаторах. Тем более удовлетворяющих все четыре правила. Уж больно это гемороно, особенно если речь идет о "Consistency". Да и по сути нафих нужно. Кто будет ковырять твой код кроме тебя самого. Не правда ли.

Тогда для чего это нужно?
Глупый вопрос, достойный только Левы Баранова. Все под богом мы ходим. Не сегодня-завтра ты сломаешь ногу, руку или того лучше, помрешь. И вот твой код в руках твоего heir (наследника). Как ему бедному разгребать твои каки? Если убедил, то читаем дальше. Нет, бурундук тоже птица пшел крылья искать.
Теперь же поговорим о преимуществе соглашений. Самое главное преимущество это же конечно повышенная читабельность вашего кода, другим программером с которым вы заключите соглашение о правилах присваивание имен объектам программы. В принципе для этого и договариваются. К тому же использование соглашений заметно облегчает этот самый пресловутый think up name variable (придумывание идентификаторов).
А теперь совсем кратко как правила облегчают понимание:
Имена объектов будут мнемоническими. Имеющим строго определенный смысл. Отсюда следует, что назначение объекта будет очевидно для того, кто знает правила построение его имени.
Смысловое значение позволяет отобразить индивидуальное наименование в наборе характеристик.
Использование правил построений наименований позволяет избежать противоречивости в именах объектов.
Построение наименование происходит механически. Что позволяет повысить скорость ввода и редактирования имен на этапе разработки.

Правила.
Известная индейская пословица гласит: "Есть много способов пахнуть скунсом". Смысл ее гораздо прозаичен, чем может показаться на первый взгляд. У любой проблемы есть куча решений. Так и в нашем случае, правил наименования объектов программы может быть много. Каждый должен сам следить за цветом месячных своих подруг. Я здесь лишь приведу свои правила, сформировавшиеся во время моего небольшого личного опыта написания программ в среде одинСи.
Для описания характеристик объекта удобнее всего использовать префиксы. Я использую в основном простые префиксы (префиксом указывается одна характеристика объекта). Достаточно редко, но все же приходится, использую составные префиксы. То есть префикс, состоящий из двух и более простых префиксов. Отсюда. Составные префиксы используются для отображения двух и более характеристик объекта. Сам по себе префикс представляет набор строчных букв и спецсимволов до первой заглавной буквы в персональном имени идентификатора, например: vlMonth (сзМесяц) – где vl (сз) и есть префикс. Количество символов простого префикса не должно быть слишком большим, для повышения скорости его ввода. В то же время не должно быть слишком маленьким, для обеспечения  его уникальности при формировании составного префикса. Оптимальный размер префикса 2-3 символа.

Префиксы.
Начнем, пожалуй, с положения объектов, а точнее указания в свойствах объекта возможность обращаться к нему из различных мест программы (конфигурации). Специфика программ написанных на данном языке, во всяком случае, в версии 77, позволяет разместить объекты доступные из любого места в программе только в одном модуле. Который называется "глобальный модуль конфигурации", указав при описании объекта ключевое слово export (экспорт). Вот такие объекты мы будем выделять с помощью самого эксклюзивного префикса – ведущим символом знаком подчеркивания ("_"). То бишь если имя начинается с него, то данный объект конфигурации "глобален".

Объекты… или за процедуры, функции и переменные.
При разработке любого приложения, на любом языке программирования, любой программер может оперировать всего тремя объектами. Это процедуры, функции и переменные. Первые две что-то вычисляют. Последняя что-то содержит. Так уж повелось, что при использовании процедур и функций в тексте программ после имени нужно обязательно указать парные круглые скобки. Независимо от того передаем мы им чего-то или нет. Правда, это больше похоже на суффикс, но в данном случае не важно. Важно другое, что по ним, по скобкам, мы достоверно можем идентифицировать объект. Нет скобок, значит это переменная. Наличие их говорит о том, что это процедура или функция.
Как же нам различать процедуры и функции? А какое самое главное отличие между ними. Правильно. Функция, после того как выполнила вычисления, возвращает результат. Процедура нет.
На основании изложенного можно сформулировать правило. Если в описании объекта программы наличествует парные круглые скобки и префикс типа значения, то данный объект программы является функцией, которая возвращает результат с указанным в ее имени типом значения. Если тип значения не указан, то данное описание соответствует процедуре.
Постойте, скажите вы, а как же быть с одной особенностью 1С. В некоторых случаях, мы не можем вызвать для расчетов процедуру, но при этом результат функции не важен. Как нам отличить процедуру от функции, которая ничего не возвращает. Идем копаться в первоисточники. А точнее в тексты программ написанных на языке Си, где само понятие процедура отсутствует наглухо. Объектом поиска становятся функции типа void ("пустота"). Дальше думайте сами, а я вожу еще один эксклюзивный префикс, для функций которые ничего не возвращают – void ("пст").
Для самих переменных мы используем префикс, указывающий на тип содержащегося в них значения. Правда и здесь есть одно исключение. Иначе, какое это будет правило. Оно касается переменной используемой в теле функции значение, которого функция вернет по завершению своей работы. Что бы эта переменная бросалась сразу в глаза, повышая читабельность кода, я ее всегда описываю одним словом – Answer ("Ответ"). Тип оной соответственно описан в имени функции.

Типы, типы и еще раз типы.
Тут много что можно писать, обсуждая те или иные плюсы. Поэтому я здесь приведу те префиксы, которые использую сам. С кратким описанием того, что это за тип и почему я использую именно такой префикс.



































































































































префикс не русскийпрефикс русский типкомментарий
un анне определен от английского unknown и русского аноним
intчис числов один си для работы с числами есть только один тип число и он не делятся на целые и дробные, просто я по привычке… integer
strстр строкастрока она и на чукотке строка… string
dtдт датадата… она же date
conкон константаконстанта как constant
refспр справочникот английского reference (справочник)
docдок документdocumentдокумент
seqпсл последовательностьпоследовательность - это просто "гениальное" изобретение (sequence)
enmпер перечислениеenumerationперечисление
coaпс план счетовПлан счетов даже не знаю как по русский это сказать (chart of accounts)
accсчт счетсчет только не тот, что в банке… account но не доступ
skdвс вид субконточто такое вид субконто даже ворд не знает, куда мне грешному (subconto kind)
oprопр операцияэто бухгалтерская операция (operation)
entпрв проводкакак говорил Пит про_водку не надо писать… ведь это всего лишь бухгалтерский entries.
regрег регистрэто register только не тот что в ассемблере, это особый односишный регистр.
cjlжр журнал расчетовв журнале расчетов хранятся записи о начислениях и удержаниях сотрудников (calculation journal)
ckdвр виды расчетоввиды расчетов мой самый любимый объект… из тех что не создаются программно (calculation kind)
cgpгр группы расчетовгруппы расчетов – это собранные в группы виды (calculation group)
calкал календарькалендарь – непонятный объект, для чего он нужен и кто его использует (calendar)
perпер периодическийпериодический объект нужен для работы с periodic константами и реквизитами справочников
vlсз список значенийсписок значений – набор различных данных в одном объекте (value list)
vtтз таблица значенийтаблица значений самая нака в один си. Ребята, которые ее придумали, наверное, и не догадывались что сотворили (value table)
tabтаб таблицатаблица в основном нужна для формирования печатных форм документов и всяких отчетов
at>би бухгалтерские итогибухгалтерские итоги прародитель "черного" запроса (account total)
qurзап запросзапрос – объект для выборки данных (query)
txtтхт текстданный объект для работы с файлами стандарта ANSI или по одноэсному текст(text)
picкрт картинкакартинка – не более чем picture
chtдгр диаграммадиаграмма – еще одна плюха в попытке из один си сделать Excel (chart)
fsфс файловая системану а этот объект для работы с файловой системой (files system), если без албанского, то для работы с файлами
dbfдбф XBaseединственный объект (из штатных) который в один си не имеет русской трансляции, нужен для работы с файлами формата data base files (файлы базы данных)
mdмд метаданныеименно по этому заглавный файл конфигурации имеет такое расширение… для программного получения информации аналогичной той что вы видите когда смотрите на дерево конфигурации в конфигураторе… или метаданные конфы (metadata)
frmфрм контекст формыобъект для управления окном открытой формы…
btкн кнопкаэто просто кнопка, по которой кликает пользователь (button)
cbчб флажокпочему check box одноэсники назвали флажком, не понимаю
rbрб переключательну с radio button логика их понятна
vlсз списокполе со спискомв сути этот тот же список значений только нарисованный на форме
gbрг рамка группырамка группы да вы сами знаете, что это такое group box
vtтз таблица значенийтаблица значений только на форме… есть несколько нюансов у этой value table
picкрт картинкакартинка на форме ни чем не отличается от picture созданной программно
arrмас массивв один си массивы получились такими не кошерными, что их редко кто использует, но нет-нет используют (array)
addвк внешняя компонентаобъект для работы с подгружаемыми модулями расширения языка один си… внешняя компонента… почему add, да я сам фих знаю… наверное от AddIn
oleоле OLEобъект, полученный через механизм OLE Automation
objоб объектпрочие объекты, полученные через недокументированные, но штатные средства один си


Стилевое оформление текста программ.
В этой части настоящей статьи мы поговорим об "этажерках", комментов и прочей лабе несколько повышающей читабельность сыра. Профессионализм и специализм одноэсников сквозит в 70% виденного мною сыра. И порой, чтобы найти место, в программе приводящее к ошибке приходится львиную часть времени приводить текст в божеский вид. Симонии не уделил этой теме места в своей нотации, наверное, в небезызвестной корпорации работают все-таки программисты, а не специалисты. А зачем на этом заострять внимание, когда это все по дефолту. Другое дело одноэсники. В лучшем случае настоящий одноэсник прослушал курс лекций на языке паскаль (дельфи) или васике. А большинство так, типа мы сами с усами, что нам стоит дом построить, тяпку в руки и вперед. Впрочем, ладно разговор не о них, а о том, как не быть похожими на них. Хотя впрочем, решать вам кто вы – реальный пацан или Лева Баранов.

Язык.
Меня очень часто спрашивают, почему я пишу по-английски, религия что ли. Можно сказать, что да, ведь привычка таже религия. В среду одноэсников я попал случайно. Хотя также случайно из нее вышел. А основным языком общения между мной и машинкой остается язык си, то который с двумя плюсиками. Ну, и даже при программировании в самой среде один эс я часто использовал возможности OLE Automation, а мешанина кода на разных языках, по-моему, не очень комильно.
Еще об одной силе привычки. Когда наоборот одноэсник пишет программу на какой-нибудь дельфи. Забавно смотрятся  переменные вида: "celMayPeremenaja", ну или в таком духе. А теперь представим невозможное, что текст программы с такими переменными читаем не мы с вами, а какой-нибудь Билли Гейтс. Вот он усытца вкуривая смысл данных переменных.
Вопреки бытующему мнению, чтобы писать на английском его знать не надо. Я когда написал свою first program кроме god save the queen не фиха не знал. Потом мой словарный запас пополнялся благодаря использованию англо-русских (русско-английских) словарей. И теперь я знаю что-то около 150 английских слов, а может и все 200. Так что совет вырабатывайте свой стиль сразу, в жизни пригодится.
И еще один довод в пользу английского. Он достаточно емок и компактен. Букв приходится меньше набирать. Короче самый оптимальный язык для ленивых (интересно, а другие бывают) программистов.

Комменты.
Ох уж эти комменты. Споры тут идут давно. Одни считают, что они как масло каши не испортят, другие наоборот. Я не придерживаюсь ни какой строгой концепции в этом вопросе. И наличие комментов в теле зависит от того для чего данное тело нужно. Если это пример того, как надо, или не надо делать, то комментов может быть больше чем самого кода. В противном случае оставляю только два вида комментариев. Своеобразные пояснительные записки. Один в начале модуля, другие перед началом процедуры или функции.
Цель первого, того, что в начале модуля, больше копирайтная. В нем указывается для чего собственно данный модуль и написан. Пример:

//*******************************************
//
//  Краткое описания  и назначение модуля.
//
//  Name:      Имя модуля.
//
//  by Автор
//  Место, Месяц и Год создания
//
//  information for contact:
//                            mailto, icq, phone и прочая лаба
//                            для вашего быстрейшего поиска.
//
//*******************************************

Следующий вид комментариев предназначен для описания процедуры или функции. Пример:

//*******************************************
// МояПроцедураИлиФункция()
//
// Параметры:
//  Полное описание всех переданных параметров
//  и их назначение. Если таковые есть.
//
// Возвращаемое значение:
//  Полное описание того что вернет функция.
//
// Описание:
//  Краткое описание того, что делает процедура или функция
//
function МояПроцедураИлиФункция()

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

//*******************************************
//  Pack Номер пука
//
//  by Автор
//  Место, Месяц и Год создания пука
//
//  information for contact:
//                            mailto, ICQ, phone и прочая лаба
//                            для вашего быстрейшего поиска.
//
//*******************************************
//  Изменения
//
//  Полное описание всех внесенных изменений.
//  Добавлена переменная, функция или процедура.
//  Исправлена ошибка в такой то процедуре или функции.
//
//*******************************************

В сами места исправлений отмечают конструкцией вида:

//*******************************************
//  Pack Номер пука.
//*******************************************
// Здесь идут ваши исправления.
// Рекомендую ни когда не удалять из тела исправленные куски кода, опускайте их в комменты. Да бы потом // можно было сделать ролл бак.
//*******************************************
//  end of pack
//*******************************************

Зарезервированные слова.
Зарезервированные слова всегда должны быть в нижнем регистре, для прапорщиков СА – это те слова, которые красятся в красный цвет.  Как ни странно это правило действует и для паскалистов, смотри Object Pascal Style Guide(http://edn.embarcadero.com/article/10280), но именно они его чаще всего и нарушают. Хотя, что с них взять, достаточно посмотреть для чего этот самый паскаль был придуман.

Использование пробелов.
Так уж исторически сложилось, что основная функция пробела это разделение отдельных слов. Что же в теле программы является отдельным словом. Конечно это зарезервированные слова, операции и операнды. Поэтому использование пробела в следующих случаях категорически запрещено:
  1. До и после оператора точка (при указывании свойств и методов объектов).

  2. Между открывающей скобкой и именем процедуры, функции и методов объектов.
  3. После открывающей или перед закрывающей, как круглой, так и квадратной.

  4. Перед точкой с запятой.

Не рекомендуется использовать вместо пробела символа табуляции или множества пробелов.

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

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

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

За операторы goto, break and continue

Данные операторы вне закона были объявленные еще при процедурном программировании, не говоря за объектно-ориентированное. Использовать их или нет, пусть вам подсказывает ваша линейная логика. Последних два я нет-нет использую, когда ломает продумывать условия выхода из цикла.

Заключение.
Данная статья не претендует на роль стандарта де-факто. Хочешь имеешь, хочешь нет. Ведь сколько людей, столько мнений. И кому-то нравиться рисовать тупым карандашом, а кому-то острым. Тем боле в большинстве компаний утвержден свой стиль. Это с одной стороны хорошо. Не фиха выдумывать не приходится, а с другой стороны. Пока научишься тупым карандашом рисовать тонкие линии, все пальцы себе обломаешь.

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика