Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

В "Эффективно работаем с устаревшим кодом" Michael Feathers предлагает добавить модульные тесты для создания искусственных "точек перегиба" в коде, который вы можете повторить -фактор вокруг.

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

  • разделите код на "Legacy" (без тестов), а остальное.
  • создать тест
  • повторяется на обеих половинах.

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

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

Ответ 2

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

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

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

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

Ответ 3

Я не знаком с рефакторингом довольно больших баз кода на С# или Java, но здесь.

Clojure:

  • Имеет сочетание макросов и функций: я могу ошибаться, но я думаю, вы обнаружите, что рефакторинг редко перемещает интерфейс между макросами и функциями.

  • Использует динамическую типизацию (поэтому вы не получаете проверки времени компиляции на реорганизованном коде):... ни на любой другой код: вам нужно больше тестов в любом случае.

  • Является функциональным, а не объектно-ориентированным в стиле. Рефакторинг указан в терминах OO, но часто выживает простая транскрипция: метод для функции, класс для функции или закрытия или карты.

  • У вас меньше поддержки для рефакторинга в текущих IDE True: больше работы.

  • Является менее терпимым к циклическим зависимостям в кодовых базах. Два случая: взаимная рекурсия в пространстве имен/файле должна быть легче справиться с чем-либо; но циклические зависимости между пространствами имен/пакетами вызывают путаницу и двусмысленность. Я думаю, что Java допустил их только потому, что С++ сделал, а С# следовал примеру.

Я сочла полезным ознакомиться с каталогом рефакторинга в каталоге Martin Fowler . Большинство выжить перевод с OO на функциональный жаргон. Некоторые (например, Изменить значение в ссылку) исчезают.