Идиоматический подход для структурирования [закрытого] исходного кода Clojure

11
задан durron597 28 July 2015 в 21:46
поделиться

1 ответ

Я тоже имею опыт работы на Java, а также немножко Ruby и немного Go. Вот что я делаю сейчас, примерно через месяц в Clojure:

  • Я думаю о пространстве имен как о семантической единице, это код, который объединяется для определенной цели, например, тип данных и операции с ним.

У меня есть два соглашения для пространств имен и файлов:

  • Для небольших блоков, которые удобно помещаются в один файл (я использую ~ 1000 строк в качестве ограничения, в котором файл должен быть разделен), у меня есть одно пространство имен для каждого файла с путь к каталогу плюс имя файла такое же, как пространство имен. Я думаю, что это хорошая вещь в Java, это упрощает поиск пространства имен из файла или наоборот.
  • Для больших модулей, которым требуется несколько файлов, я использую соглашение Go: пространство имен соответствует пути к каталогу, и все файлы в каталоге используют одно и то же пространство имен. В этих случаях я обычно назначаю первичному файлу фиксированное имя («main»), которое загружается и взаимодействует с другими.

В качестве примера пространства имен у меня есть синтаксический анализатор, который считывает формат и преобразует его в HTML. У меня есть единое пространство имен для парсера (семантическая единица) и несколько файлов в каталоге, разделенных на подфункции: лексер, парсер, преобразование HTML и основной файл, содержащий основной общедоступный API для использования парсера.

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

Требовать vs.использование:

  • Требовать с подходящим коротким псевдонимом почти везде.
  • Это также позволяет повторно использовать имена ядра: в моем типе данных дерева специального назначения есть операция «получить», чтобы соответствовать картам; при использовании require конфликта нет: «get» - это get ядра Clojure, «tree / get» - это мой тип данных.
  • Я использую «использовать» только для того, что считаю «расширениями ядра», например, когда я создаю свою собственную «карту-если», которая представляет собой карту и фильтр, объединенные в одно целое.
8
ответ дан 3 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: