<?xml version="1.0" encoding="Windows-1251"?>
<?xml-stylesheet type="text/xsl" href="xhtml.xsl"?>
<book><!--  xml:space="preserve" -->

<!-- 2007 ruvim@forth.org.ru -->
<!-- $Id: naming.xml,v 1.11 2009/03/23 22:06:57 ruv Exp $ -->

<h2>Именования</h2>

<toc/>

<chapter id="question-mark"><title>Ведущий знак вопроса</title>
<p>Ведущий знак вопроса в имени обозначает 
условное исполнение действия (<small>“operates conditionally”, Thinking Forth, L. Brodie</small>).
Классический пример — слово <w ds="x -- x x | 0">?DUP</w>.
Означает «может быть <w>DUP</w>» (“may be <w>DUP</w>”), здесь условность
отражется и на стековом эффекте.
Еще пример, слово <w>?DO</w> — выполняет функцию <w>DO</w> если граничные значения различны.</p>
<p>Общее свойство: <i>есть родственное слово с безусловным поведением</i>.</p>
<p>По аналогии названы слова: 
<w>?FOREACH-LIST</w> (работает как <w>FOREACH-LIST</w>, но делает очередную итерацию 
только если обработчик вернул TRUE, а иначе прекращает),
<w>?EXIT</w> (выполняет <w>EXIT</w> если дано TRUE).
</p>

<p>Такие слова как: <w>?COMP</w>, <w>?STACK</w>, <w>?CSP</w> — тоже имеют условное поведение,
но не имеют родственных слов (безусловного варианта действия) 
в силу недостаточной факторизации и устоявшейся практики.</p>

<p>Использование же ведущего знака вопроса для слов, 
просто возвращающих флаг, является моветоном.
</p>
</chapter>

<chapter id="flag"><title>Слова, возвращающие флаг</title>
<p>Пример: <w ds=" c -- flag ">IS-WHITE</w> — слово анализирует
аргумент на стеке. Используется префикс <w>IS-</w>, 
общий вид: <w>IS-[SOMETHING]</w> (или, <w>Is[Something]</w>).
</p>
<p>Пример: <w ds=" -- flag ">STATE?</w> — слово дает флаг
по состоянию связанного или заданного косвенным образом объекта.
Знак вопроса выступает <i>суффиксом</i>. Обычно, есть родственные слова
с тем же корнем.
</p>
<p>Одновременное использование и префикса “<w>IS</w>” и суффикса
“<w>?</w>” излишне.</p>
<p><b>Замечание.</b> Во многих форт-системах есть слово <w>IS</w>,
которое работает как слово <w>TO</w> и по смыслу служит для установки значения
(утверждение), а не для получения (вопрос).</p>
</chapter>

<chapter id="capital"><title>Прописные и строчные</title><!-- upper-case, lower-case -->

<p>В имена вкладывается (мной вкладывается :) дополнительная информация 
на основе вида составляющих их букв.
Возможные варианты: все <w>ПРОПИСНЫЕ</w>, <w>Смешанный</w>, все <w>строчные</w>.
В таком же порядке код идет от низкоуровневого (прописные) к высокоуровневому (строчные).
В качестве бонуса, это еще и согласуется с другим значением слова «прописной» — «обыкновенный».
Таким образом, более общие и глобальные слова именуются в верхнем регистре (например, лексикон форт-процессора),
а более локальные и узко специализированные слова (ad-hoc), замыкания на частные объекты
(например, интерфейс <a href="../../../model/dbms/mysql.f.xml">механизма доступа</a> к MySQL-серверу) —
именуются в нижнем регистре; часто эти слова идут и в отдельный словарь.
</p>

<p>Второй бонус: неправильный код должен выглядеть неправильно.
Соглашение в использовании регистра букв делает 
более заметными некоторые неудачные элементы дизайна системы
(у Джоэля Спольски есть хорошая <a href="http://local.joelonsoftware.com/mediawiki/index.php/%D0%9A%D0%B0%D0%BA_%D0%B7%D0%B0%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C_%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_%D0%B2%D1%8B%D0%B3%D0%BB%D1%8F%D0%B4%D0%B5%D1%82%D1%8C_%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE">статья</a>
на эту тему:
<small><a href="http://www.joelonsoftware.com/articles/Wrong.html">Making Wrong Code Look Wrong</a></small>).

Для проверки согласованности используются следующии критерии:
<ul>
<li>в определении прописных слов используются только прописные слова (хотя, допустимы обоснованные исключения);</li>
<li>в высокоуровневом коде не должно быть прописных слов (кроме, быть может, 
структур управления классического форта).</li>
</ul>
</p>

<p><b>Замечание.</b> Использовать везде только один регистр —
это лишать исходный код одного из каналов информации, это как убрать одну из составляющих RGB-палитры.
А каналов этих и так мало.
</p>

</chapter>

<chapter id="systematics"><title>Нарушение систематики</title>

<p>Рассмотрим следующие пары слов:
<ul>
<li><w>CELLS</w> и <w>/CELL</w> (одна пара),</li>
<li><w>CHARS</w> и <w>/CHAR</w> (другая пара).</li>
</ul>
Очевидно, что эти пары подобны.
Говоря более строго, между первой и второй парой легко установить изоморфизм:
<w>CELLS</w>—<w>CHARS</w>, <w>/CELL</w>—<w>/CHAR</w>
<small>
(по моему предположению, такая систематика происходит даже неосознанно).
</small>
Сравним сигнатуры этих слов:
<ul>
<li><w ds=" n -- n*size1 ">CELLS</w>, <w ds=" -- size1 ">/CELL</w>,</li> 
<li><w ds=" n -- n*size2 ">CHARS</w>, <w ds=" -- size2 ">/CHAR</w>.</li>
</ul>
Сигнатуры тоже изоморфны: соответствие элементов между первой и второй парой очевидно и однозначно.
Такая общая схема является естественной и ожидаемой.
</p>

<p>Теперь посмотрим на следующие пары стандартных слов (пример того, как делать не надо):
<ul>
<li><w ds=" n -- n*size1 ">CELLS</w>, <w ds=" -- size1 ">CELL</w>,</li> 
<li><w ds=" n -- n*size2 ">CHARS</w>, <w ds=" 'ccc' -- c ">CHAR</w>.</li>
</ul>
Вопрос: что здесь не так, где здесь «грязь»? — Да,
слово <w>CHAR</w> выпадает по сигнатуре из схемы, которую задают остальные три слова.
Либо слово <w>CELL</w> должно быть как слово <w>CHAR</w>, либо наоборот.
</p>
<p>Грубо обобщая: <i>слова, имеющие подобные имена, должны иметь и подобную сигнатуру</i>.
Если между какими-то под-наборами слов легко проглядывается подобие
на 7/8, то, по хорошему, оно должно быть полным.
</p>
<p>Вот, еще пример нарушения этого принципа, из библиотеки <a href="../../../../~ac/lib/str5.f">str.f</a>:
<ul>
<li><w ds=" addr u s -- ">STR+</w>, <w ds=" addr u s -- ">STR!</w>,</li> 
<li><w ds=" s1 s2 -- ">S+</w>, <w ds=" addr u var_addr -- ">S!</w>.</li>
</ul>
Имена подобны, а сигнатуры расходятся.
Здесь, беря в качестве базы первые три слова,
получаем для последнего подходящую сигнатуру: <w ds=" s1 s2 -- ">S!</w>,
при этом <w>addr u</w> из первой пары будет соответствовать <w>s1</w> из второй,
и <w>s</w> из первой — <w>s2</w> из второй.
<small>
Формально, в качестве базы можно взять из этих четырех любые три слова 
и вывести сигнатуру для четвертого, но содержательной будет только половина случаев (т.е., два из четырех).
Второй случай: <w ds=" addr u var_addr -- ">S+</w>.
Отсюда следует вывод, что не какое-то одно конкретное слово является «неправильным»,
а только лишь подсистема слов в целом содержит недостаток в виде несогласованности.
</small>
</p>

</chapter>

<chapter id="pieces"><title>Мера грануляции</title>
<p>Мера разбиения фрагментов кода по словам
определяется удобством <i>повторного использования</i> (в него входит и модификация,
и отладка).
Точно так же определяется и мера разбиения кода <i>по файлам</i>.
</p>
<p>Именно поэтому ядро модуля выделяется в один файл,
а обертка и привязка к системе — в другой файл, — чтобы была
возможность использовать ядро с другой оберткой
<small>(иной путь состоит в том, чтобы
обратиться лишь к необходимой части файла,
но он требует значительной инфраструктуры;
примером может служить <a href="http://www.google.com/search?hl=en&amp;q=define%3AXPointer">XPointer</a>)</small>.
Неудачная же грануляция ведет к 
<a href="../../2004/spf/FStream/readme.txt">дублированию кода</a>,
когда нужно «точно такой же, но только с перламутровыми пуговицами».
</p>

<p>Пример. Модуль <a href="../../2006/syntax/qname.core.f">qname.core.f</a> (quoted name) определяет слова для интерпретации однословных литералов,
но не ввязывает их в систему;
привязка к <w>NOTFOUND</w> осуществляется в <a href="../../2006/syntax/qname.f">qname.f</a>.
</p>
<p>Пример. Модуль <a href="../../2004/test/zstack/zstack.immutable.f">zstack.immutable.f</a> определяет лишь 
базовые операции некого z-стека, 
а <a href="../../../spf/compiler/control-stack.f">control-stack.f</a> оборачивает его, предоставляя
локальный для потока управляющий стек, 
а в другом месте он может послужить для воплощения пула локальных для 
хранилища объектов. <small>Суффикс <w>immutable</w> в имени файла говорит о том,
что в результате трансляции этого файла образуется только <i>неизменяемый</i>
объект (или объекты), в том числе как код так и данные.</small>
</p>
<p>Пример. Модуль <a href="../../2003/common/QSORT.F">QSORT.F</a> 
определяет лишь алгоритм сортировки <i>над</i> словами сравнения и обмена элементов,
но никак не определяет этих слов.
</p>

<p>Таким образом, некоторые модули мыслятся как схемы,
задающии отношения между элементами,
без определения, что эти самые элементы есть, лишь бы они выполняли известный контракт.
</p>

</chapter>

<chapter id="what"><title>Заимствования имен</title>
<p>При реализации известных интерфейсов
используются их устоявшиеся лексиконы, нет нужды придумывать новые.
Например, при <a href="../../../lib/lin/xml/libxml2-dom.f">реализации</a> DOM-интерфейса был взят напрямую и его же лексикон,
закрепленный в <a href="http://www.w3.org/TR/DOM-Level-2-Core/def-index.html">спецификации</a>
w3c (при разработке этих стандартов народ
<a href="http://lists.w3.org/Archives/Public/public-webapi/2007Jun/0077.html">кучи копий ломает</a>
в поисках лучших имен ;).
Слова для <a href="../../../model/lib/string/match.f.xml">работы со строками</a>:
<w>STARTS-WITH</w>, <w>ENDS-WITH</w>, <w>SUBSTRING-AFTER</w>, <w>SUBSTRING-BEFORE</w>,
<w>CONTAINS</w> — и действуют и называются по
соответствующему лексикону
<a href="http://www.w3.org/TR/xpath-functions/#substring.functions">XPath functions</a>.
</p>

</chapter>

<chapter id="links"><title>Ссылки по теме</title>
<p><ul>
<li><a href="http://my.opera.com/forth/blog/ethymology">Этимология (проФорт)</a></li>
<li><a href="http://www.nabble.com/Iterator-t4336038.html">Именования итераторов (spf-dev)</a></li>
</ul></p>
</chapter>

</book>
