Более чистый код с венгерской нотацией

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

Предисловие

Вы помните, как вы научились форматировать даты календаря для буквенно-цифровой сортировки? У вас либо были даты в американском формате первый месяц, например 09–11–1991 или в европейском формате первый день, например 11–09–1991, и вы поняли, что сортировка не работает. Сортировка по дате должна происходить сначала по году, затем по месяцу и, наконец, по дню месяца, например 1991–09–11.

Или - вы помните, когда вы изучили передовой опыт более четкого именования переменных, методов и классов? Возможно, это произошло, когда вы смотрели на чужой код и понятия не имели, что означает переменная isOvrLn… или функция с именем mkZro ();

Ха! Я инстинктивно закончил последнее предложение точкой с запятой.

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

Другое прозрение, подобное этому, снова случилось со мной недавно - через двадцать лет моей карьеры программиста.

Венгерская нотация

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

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

Пример продукта данных микробиома

Здесь я использую шаблоны JSON с низким кодом для определения продукта данных Tag.bio из исходных файлов данных. Вы должны уметь следовать этим примерам, не зная синтаксиса Tag.bio.

Этот файл верхнего уровня - config.json - описывает все файлы и функции, необходимые для создания модели данных.

Обратите внимание, как мы используем пути к файлам для ссылки на вложенный код: файлы, содержащие объекты table, имеют префикс table_, а файлы, содержащие объекты parser, имеют префикс парсеры_.

Вы можете заметить, что объектные файлы table уже находятся в папке с именем tables /, а объектные файлы анализатора уже находятся в папке с именем парсеры /. Итак, почему избыточность?

Потому что я не всегда смотрю файл по его полному пути. Часто я смотрю на имя файла как на вкладку в редакторе.

Здесь мы используем префиксы type, чтобы различать объектный файл table и объектный файл синтаксического анализатора для одних и тех же генных семейств. аспект.

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

Зачем использовать префиксы вместо суффиксов?

Вот здесь и помогает ненадолго отойти от английского языка. В английском языке мы ставим прилагательные перед существительными - то есть большая река. Во многих других языках прилагательные ставятся после существительных, то есть el rio grande на испанском языке.

Учитывая тот факт, что код в этой статье - и явная большая часть всего кода, когда-либо написанного - написан на английском языке, почему мы решили назвать файл table_genefamilies.json, а не genefamilies_table.json ? Это не так очевидно. Когда мы с коллегами говорим об этих объектах, мы однозначно говорим «таблица геносемейств», а не «таблица геносемейств».

Мой аргумент в пользу использования префиксов венгерской нотации - в данном конкретном случае - снова связан с IDE и с тем, как имена файлов организованы, отображаются и сортируются.

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

При построении иерархии папок мы уже объявили тип каждого объекта более важным, чем аспект, т. Е. парсеры помещаются в папку parsers /, а таблицы помещаются в папку tables /.

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

Установив, что я нахожусь в папке parsers / и просматриваю объекты parser, я могу затем выполнить вертикальное сканирование по крайнему правому «столбцу» информации, чтобы определить конкретный файл, который мне нужно открыть, или чтобы быстро понять объем всех файлов в этой папке.

Стоит отметить, что в Tag.bio мы установили соглашение, согласно которому наши файлы JSON должны быть организованы сначала по типу, а затем по аспекту. Мы предпочитаем более широкие папки с меньшим количеством вложений, и мы часто копируем / вставляем полезный код между файлами одного и того же типа. Разработчики чаще работают с несколькими таблицами или несколькими синтаксическими анализаторами и реже работают с одним аспектом, например генные семьи.

Иногда суффиксы могут быть лучше

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

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

Сообщество Angular осознало, что разработчики часто работают над файлами, относящимися к определенному аспекту - например, user.component - и реже работает с файлами, относящимися к определенному типу - например, .css.

Если подумать, расширения файлов, вероятно, являются наименее спорной формой венгерской нотации.

Разве все это не очевидно?

Что ж, проверьте свою кодовую базу (и) и решите сами, достаточно ли понятны имена файлов. Сможет ли другой разработчик понять назначение каждого файла, просто прочитав его имя?

Спасибо за прочтение!