17:26 

О стратегии именования абстрактных об'ектов

zHz00
Описаны методики и приёмы именования абстрактных объектов на примере файлов.

Когда нам приходится работать с большим числом более-менее однородных об'ектов, неизбежно возникает необходимость как-то ориентироваться во всём этом барахле. На помощь приходит именование. Это очень древняя система. В современном обществе имя есть практически у каждого человека (в отличие от фамилии -- у членов японской императорской семьи, например, фамилии нет, только имя). Тут следует сделать замечание, что есть две совершенно разные категории именования -- именование различных об'ектов и именование различных версий одного об'екта. Поскольку то, о чём я напишу ниже, работает для любых типов об'ектов, без ограничения общности будем считать, что речь идёт про файлы. С одной стороны, они являются более-менее однородными об'ектами (файлами (= ), с другой стороны, их содержимое может быть совершенно различным как по структуре (форматы), так и по смыслу, в случае одинаковой структуры. А ещё у всех файлов есть имя. Также речь пойдёт только о ситуациях, когда именовать вы имеете право. Если имена даны свыше (или другими существами), вы ничего с этим сделать не можете, это неинтересно.
Ниже я опишу основные способы именования, которыми я или не я пользовался или пользуюсь по сей день.


Первое: именование различных об'ектов

Итак, различные об'екты должны именоваться различно -- К.О. Если в жизни различные об'екты могут иметь два полностью одинаковых имени, то в случае с файлами это невозможно. Даже если у вас есть возможность так сделать (названия заметок в KeepNote, например), лучше от этого воздержаться. Причина проста и очевидна -- об'екты с одинаковым именем можно различить только путём непосредственной проверки содержимого, что означает необходимость дополнительных проверок (потеря времени), причём неопределённого (с какой попытки вы угадаете?).
Если необходимо всё-таки именовать одинаково, лучше ввести какой-либо различитель -- постфикс к имени, вид иконки или что-либо ещё. Однако, введение постфикса к имени автоматом делает имена различными. Пример различителей из реальной жизни -- именование королей ("Людовик XVI" -- отделение имени от различителя логическое, так как и "Людовик" и "шестнадцать" являются отдельными словами и по другому разбить полное имя нельзя, про разделитель см. ниже).

Как сделать правильный различитель? Он должен легко отделяться от основного имени и предоставлять широкие возможности.
Про лёгкое отделение -- тут всё понятно. Нужен символ-разделитель. Или несколько. Например:
Черчение-1.wav -- тут всё понятно, разделитель -- дефис;
Черчение[1].wav -- тут тоже всё понятно, разделитель -- квадратные скобки.
Ещё возможно разделение по признаку принадлежности к другой категории символов, например:
черчениеА.wav -- заглавные против строчных;
2черчение.wav -- цифры против букв.
Для всех об'ектов разделитель должен быть одним и тем же. Почему? При сортировке (о сортировке -- ниже) всё будет по порядку.
Это всё -- если различитель расположен в имени файла. Если различитель где-то ещё, разделитель возникает естественным образом. Лучше, чтобы различитель был в имени -- он будет виден при любом отображении списка файлов (на самом деле, не любом; можно заставить Проводник отображать только "ноготки", без имён). Также это поможет при сортировке.

Отступление: сортировка
Тут следует сделать замечание про сортировку. Любые именованные об'екты принято сортировать, для быстрого поиска. Сортировка производится, как правило, в алфавитном порядке. В случае файлов на компьютере, порядок определяется кодировкой, однако принцип алфавитности обычно соблюдается. Единственное, чем плох алфавитный порядок -- расположение букв в таком порядке не об'ясняется логически, только исторически. Другими словами, алфавит придётся выучить. "Определяется кодировкой" означает, что цифры и спец. знаки тоже включены, цифры идут ДО букв, русские буквы идут после латинских, строчные после заглавных. Эти правила общие для почти всех кодировок.


Про широкие возможности -- тут сложнее. Надо ответить на следующие вопросы --
1) Где расположить различитель?
2) Какие значения может принимать различитель?
3) Как оформить различитель?

Где расположить различитель?

Я не знаю, может быть вы сможете придумать причину, чтобы располагать его в середине имени, но я придумать такую не могу.
Различитель имеет смысл располагать либо в начале имени файла, либо в конце (про расширение речи нет). Как правило, в конце. В начале можно располагать в том случае, если различители с одинаковыми значениями могут служить для классификации об'ектов с разными именами, но одинаковыми различителями. Пример:
[красный]куб
[красный]шар
[красный]додэкаэдр
[зелёный]куб
[зелёный]шар
[жёлтый]куб
При сортировке появятся сначала жёлтые об'екты, потом зелёные, потом красные. Это может быть полезно.
Другой случай, когда различитель является надкатегорией над об'ектами. Тогда тоже можно располагать различитель в начале имени, однако в таком случае лучше все об'екты переместить в эту самую надкатегорию (создать для них папку и положить их туда безо всяких различителей).

Однако чаще проще и лучше размещать различитель в конце:
Летит-1.doc
Летит-2.doc
Летит-3.doc

Какие значения может принимать различитель?

Это тяжёлый вопрос. Если есть у об'ектов недублирующиеся характеристики, лучше, конечно, использовать их. Когда круг об'ектов известен заранее, можно найти такой признак, например, цвет. Когда круг неизвестен, вряд ли удастся.
Другой распространённый способ -- различать по номеру.

Отступление: нумерация.
Нумерация -- частный случай именования, когда вместо символов имени используются только цифры.
Нумерация может быть сквозная или категоризированная. И ту и другую можно наблюдать в нумерации помещений в школах, институтах и других учреждениях.
При сквозной нумерации числа, характеризующие об'екты (помещения), идут подряд.
При категоризированной, некоторые условные признаки позволяют узнать по номеру что-то ещё, что может облегчить поиск, например. В случае с помещениями, как правило, первая цифра означает номер этажа. Например -- 209 -- 9-я комната на 2-м этаже. И можно не обходить все кабинеты, а сразу на 2-й этаж. Если этажей 3 и более, это существенно сокращает время поиска.
Другой пример категоризированной нумерации -- нумерация домов на улице. Как правило (но не всегда!) с одной стороны улицы только чётные дома, с другой только нечётные. Каких-то домов может не быть.


Если душа не лежит к нумерации, а признак не находится, можно использовать любые наименования, которые способны вызвать в мозгу ассоциацию с конкретным об'ектом (желательно, чтобы наименования были из одной категории). В японских школах, например, (согласно аниме) вместо букв классов используют иногда названия растений.

Как оформить различитель?

Тут остаётся рассмотреть два небольших вопроса.
Первое -- каким выбрать разделитель? Правильный ответ -- любой (даже пустой, пример ниже), но он должен быть одинаковым. Если у одних файлов "_", а у других "-" -- это приведёт к тому, что при сортировке сначала будут выводиться одни ("-"), потом другие ("_"). Желательно, конечно, чтобы он был легко отличим (т.е., например, если в основном имени используются буквы, он не должен быть буквой).
Второе -- какова должна быть длина различителя? Правильный ответ -- лучше, чтобы она была одинаковой и не слишком большой. Не слишком большой -- для простоты восприятия, а желательность одинаковой длины опять связана с поиском и сортировкой. Если не дописывать, например, ведущий нолик к числам, сортировка по имени даст следующий результат:
имя1
имя10
имя11
...
имя19
имя2
имя20

Поняли, да? Надо-то было:
имя01
имя02
...
имя09
имя10
имя11
...

Сколько нулей писать, зависит от числа об'ектов, но надо брать "на вырост". После появления нового знака (такое бывает), ко всем старым об'ектам надо дописать ещё один нолик. Как можно быстрее.

Различные об'екты следует именовать различно, с этим разобрались, но как?
Тут всё зависит от того, что вы называете. Желательно, чтобы имя файла отражало его суть (: лучше не сохранять порнорассказы в файл доклад.doc, потом можно запутаться (=.
Название должно быть информативным, как правило, это значит, что по названию должно быть понятно:
1) Каков тип об'екта? (сервер? кинофильм?) -- эту функцию успешно выполняет т.н. "расширение" файла.
2) Что в этом об'екте? -- либо это название, данное логическому содержимому до нас (например, название фильма), либо категория, к которой его можно отнести (например, "Отчёт").
3) Какими характерными признаками оно обладает? -- для отчётов это либо тема отчёта, либо автор, либо и то и другое (например: отчёт сидоров.doc), для других файлов может либо отсутствовать, либо показывать какие-то характеристики (см. 2-й пример хорошего имени).
Примеры хороших имён:
Отчёт по экологии 2011 сидоров.doc
[Leopard-Raws] Kuragehime - 07 RAW (CX 1280x720 x264 AAC).mp4
Пример плохих имени:
Какая-то хрень.doc
Отчёт.doc
Последнее допустимо, если название папки даёт дополнительные сведения.



Второе: именование версий одного об'екта

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

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


Ключ к лёгкой ориентации в ваших файлах -- в грамотном именовании, опять-таки.
Коренного отличия между именованием разных версий одного об'екта и разных об'ектов с одним именем для машины нет. Для человека разница в том, что версии могут по внешнему виду слабо отличаться и поиск отличий может занять длительное время.
Тут работает другое правило -- одинаковые об'екты должны называться одинаково -- К.О. В счёт не идёт различитель, разумеется.

Другими словами, всё, что остаётся сделать, это правильно ввести различитель.

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

Дата
Да-да, именно дата (или дата/время) изменения -- главный различитель разных версий. Как его записать? Тут срабатывает правило про надкатегорию, по аналогии с разлечителем перед основным именем. Сначала пишут большие промежутки времени, потом меньшие. Год-месяц-день, как в Японии. Пример:
20111108154744
11 нобяря 2011 года, 15:47 и 44 секунды.
Можно и с внутренними разделителями:
2011_11_08_15_47_44
Можно и с двоеточием и слэшем, но понадобится извратиться: придётся использовать ШИРОКИЕ двоеточия и слэши. В отличие от обычных, они разрешены к использованию в именах файлов. Кто не знает, что такое широкие, ищет в гугле.

Нумерация внутри одной даты
Тут работает обычное правило с различителями. Например ДАТА-01, ДАТА-02. Если версии не бывают чаще раза в час, можно просто подключить два разряда времени.

Автор изменений
Несколько букв позволят понять, кто создал последнюю версию. Это бывает важно, чтобы найти виноватого. Если вы работаете в одиночку, это теряет смысл.

Полный пример:

super_program_2011_11_08-01-VASYA.rar

Вместо даты и кода сегодняшней версии, разумеется, можно использовать сквозной номер:
super_program_0167-VASYA.rar

Десерт: тэгирование
Эта система нашла широкое применение. Заключается она во включение в имя (или не в имя) файла дополнительных сведений о возможных категоризациях об'екта. О тэгах шары можно долго петь песню, но об этом в другой раз. Применяется тэгирование и для разных об'ектов и для версий одного об'екта и для всего чего угодно. Разделяются тэги квадратными скобками, как правило.
Главное требование, которое я советую соблюдать -- вписывать тэги в имя файла по алфавиту, чтобы при поиске можно было сразу указывать маску и не думать над порядком. Или надо установить жёсткий порядок обязательных тегов.

Пример:
Есть файлы версий одной программы, обеспечивающей работу некоего научного (или ненаучного) прибора. Называется программа, допустим, KILL_THEM_ALL. Программа бывает двух модификаций -- профессиональная и любительская. Есть три разновидности прибора -- A, B, C, для каждого используются немножко другие функции. Программа бывает в виде бета-версии и в виде финальной версии. И есть специальные признаки -- для внутреннего пользования, нерабочая, версия для слепых.
Классификации:
Классификация 1, по возможностям: профессиональная [PRO], любительская [AMA] (amateur).
Классификация 2, по разновидности прибора: A, B, C, соответственно, [A], [B], [C].
Классификация 3, по завершённости: beta -- [beta], final -- [final].
Это будут обязательные тэги.
Признаки:
Внутреннего пользования: [IN] (internal).
Нерабочая: [NW] (not-work).
Версия для слепых: [BL] (blind).
Это будут необязательные теги.

Обязательные теги в указанном порядке пишем, необазательные в алфавитном.
[PRO][B][FINAL]KILL_THEM_ALL-1.2.3[BL][NW]

Если мы хотим найти все версии для прибора B, маска поиска будет *[B]*, если беты для профессионалов -- [PRO]*[BETA]* (располагаем в оговоренном порядке).
Если хотим найти версию для слепых для внутреннего пользования -- маска будет *[BL]*[IN]* (тэги в алфавитном порядке).
Линуксоидам проще, у них регулярные выражения.

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

Пожалуйста, ознакомьтесь с комментариями!

@темы: Статьи, Мысли, Тухлые идеи

URL
Комментарии
2011-11-10 в 20:43 

Приведу несколько выдержек из документа, который я когда-то составил. К сожалению в электронном виде он до этих дней не дожил и я нашёл только 6 страниц из середины. Впрочем, этого достаточно т.к. это по сути самые важные страницы.

7. Именование файлов
<...>
7.3 Общие принципы категоризации. Для категоризации файлов применяются средства файловой системы --- директории. В частности, всегда вместо выделения в именах файлов общего элемента предпочтительно создать директорию с общим элементом имени файла и исключить его непосредственно из имени.
Пример:
sources/some_program.zip
sources/another_program.tar
binaries/some_program.zip
Более предпочтительно чем:
sources-some_program.zip
sources-another_program.tar
binaries-some_program.zip
Образования таких имён по возможности следует избегать, если это возможно. Использование категоризации через имя файла возможно в ряде оговорённых случаев (см. 7.4-7.11)
7.4 Использование расширений файлов для спецификации разных форматов представления одной и той же информации. В случае, если имеется несколько файлов, содержащих идентичную, крайне сходную или порождённую на основе одного из данных файлов информацию, допускается их размещение в одной директории при условии, что они различаются только расширениями. При этом допускается использование нуль-расширения.
<...>

// продолжение следует

URL
2011-11-10 в 20:44 

7.6 Использование счётных префиксов. В случае, если необходимо сохранить строгий порядок следования файлов (например, файлы представляют собой изображений отдельных страниц книги) допускается использование сортировочных префиксов.
7.6.1 Сортировочные префиксы должны содержать одинаковое число знаков.
7.6.2 Сортировочные префиксы должны содержать только цифровые и буквенные символы первой половины таблицы ASCII. Для повышения удобочитаемости допускается использование разделителей. При их использовании одинаковые разделители должны использоваться в соответствующих позициях. См. список разделителей с пояснением в 7.c.
<...>
7.11. Имена резервных копий. Имена резервных копий образуются как .orig.old, где orig --- исходное имя файла.
<...>
7.26 Имена конечных файлов. Имена конечных файлов записываются маленькими буквами. Для разделения слов (если есть такая необходимость) рекомендуется использовать символы: "-", " ", "_". При этом символ " " не рекомендуется использовать если общая длинна имени файла меньше 8 символов или если предполагается часто использовать файл из командной строки. Для отделения числовой и текстовой части всегда лучше использовать символ "-". В целом не рекомендуется смешивать разные разделители в одном каталоге. Запрещено смешивать различные разделители между словами в имени файла, если они имеют одинаковый статус. Подробнее см. 7.c.
7.27 Имена символических ссылок на директории. Имена символических ссылок на директории записываются с заглавной буквы.

// продолжение следует

URL
2011-11-10 в 20:45 

7.33 Именование не сортированных файлов. Иногда бывает необходимо создать временный файл, который сложно, лень или некогда называть в соответствии с этими правилам. Для таких файлов действуют следующие условия:
7.33.1 Такие файлы должны быть по возможности собраны в директории misc. Это название директории считается зарезервированным для не отсортированных, не до конца отсортированных файлов или файлов, чьи имена не соответствуют настоящим правилам.
7.33.2 В случае размещения подобных файлов вне директории misc в имя файла добавляется специальный префикс:
7.33.2.1 Префикс "%" является универсальным.
7.33.2.2 Префикс ":" помечает файлы для дальнейшей категоризации.
7.33.2.3 Префикс "^" файлы "с ограниченным сроком жизни". Такие файлы не могут считаться временными т.к. они по какой-то причине нужны. Тем не менее рано ли поздно файл будет удалён или переименован. Причём это произойдёт через достаточно малый промежуток времени.
7.33.2.4 Префикс "?" помечает файлы, которые пока что сложно категоризовать. Тем не менее через некоторое время или при наступлении необходимого условия файл будет категоризован.

Надоело перепечатывать. Там ещё много.

// ssvda

URL
2011-11-11 в 00:38 

zHz00
Это на бумаге всё было?
Ты более суров, чем я.
Хотя зачем я говорю? Я это всегда знал.

URL
2011-11-11 в 00:53 

Ну когда-то это было в компьютере. Теперь у меня остались только несколько листочков, выглядящих так, будто их достали из мм.. подхвостной области крупного животного с хоботом... вот.. Файла не сохранилось. Я всё не могу найти в себе силы воскресить эти записки.

Кстати, надо заметить, что реально эта система сейчас уже немного поменялась. В ряде деталей.

// ssvda

URL
   

Untitled

главная