Приемы рефакторинга для Clojure

Я знаком с рефакторингом довольно больших баз кода на C # и Java, но Clojure - это нечто иное, особенно потому, что он:

  • В типичном коде есть сочетание макросов и функций (т. Е. Вы можете хотите выполнить рефакторинг с макроса на функцию или наоборот?)
  • Использует динамическую типизацию в большинстве случаев (так что вы не получаете проверки правильности рефакторинга кода во время компиляции)
  • Является функциональным, а не объектом -ориентирован в стиле
  • Менее поддерживает рефакторинг в текущих IDE
  • Менее терпим к циклическим зависимостям в базах кода (что затрудняет перемещение блоков кода / определений!)

Учитывая вышеизложенное, что является лучший способ подойти к рефакторингу кода в Clojure?

26
задан mikera 3 October 2011 в 04:17
поделиться

1 ответ

1113 Я не эксперт. Но в любом случае:

  • Держитесь подальше от God функций. Если у вас есть большая функция, разбейте ее на более мелкие функции, и каждая из этих функций выполняет одно и делает это хорошо.
  • Если вы обнаружите использование массивов Java (и их не нужно использовать), преобразуйте их в последовательности Clojure.
  • Объятия defrecord и defprotocol.
  • Держитесь подальше от макросов, если вы действительно не можете продолжить без написания макроса.
  • Когда это возможно, отдавайте предпочтение ленивым последовательностям, а не рекурсии.
  • При создании службы поместите контракт в собственное пространство имен, а реализацию - в собственное пространство имен.
  • Добиться внедрения зависимости как передачи функций в качестве параметров другим функциям.
  • Используйте деструктуризацию для arglist функции, когда это возможно. Это облегчит понимание реализации функции.
  • Рассмотрите возможность использования проекта Prismatic Schema.

Также взгляните на CursiveClojure. Я думаю, что это действительно многообещающе.

Я не создатель CursiveClojure.

6
ответ дан 28 November 2019 в 17:26
поделиться
Другие вопросы по тегам:

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