Как вы осуществляете навигацию и рефакторинг кода, написанного на динамическом языке?

14

Мне нравится, что для написания Python, Ruby или Javascript требуется так мало шаблонов. Я люблю простые функциональные конструкции. Я люблю чистый и простой синтаксис.

Тем не менее, есть три вещи, в которых я действительно плох при разработке большого программного обеспечения на динамическом языке:

  • Навигация по коду
  • Определение интерфейсов объектов, которые я использую
  • Рефакторинг эффективно

Я пробовал простые редакторы (например, Vim), а также IDE (Eclipse + PyDev), но в обоих случаях я чувствую, что мне нужно выделять гораздо больше памяти и / или постоянно "grep" и читать код, чтобы определить, интерфейсы. Это особенно верно при работе с большой кодовой базой с несколькими зависимостями.

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

Я уверен, что есть обходные пути для этих проблем. Как вы эффективно работаете в Python, Ruby или Javascript?

Филипп Бодуан
источник
Функции переименования PyDev до сих пор отлично работали для меня.

Ответы:

3

Навигация по коду

Получите лучший редактор, чем VIM.

Я использую Komodo Edit.

Я чувствую, что мне нужно больше памяти

Хорошо. Мышление это хорошо. Я считаю, что «обучение» в конечном итоге приводит к «памяти».

Постоянно "grep" и читать код, чтобы определить интерфейсы.

Это типично. Если вы не можете их запомнить, значит, они слишком сложные, не так ли? Время упростить.

Простое сложно создать. Но когда у вас проблемы с запоминанием, это признак плохого дизайна.

Я использую grep. Меня устраивает. Мой Komodo Edit имеет много приятного поиска. То же самое делает Notepad ++

Определение интерфейсов объектов, которые я использую

Док Строки и help()функции работают. Я использую их. Ежедневно.

Эффективный рефакторинг ... это становится очень зависимым от качества моих юнит-тестов.

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

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


Я уверен, что есть обходные пути для этих проблем.

Это не «проблемы» и не требуют «обходных путей».


Динамический язык - это как раз то, что вы не знаете тип объектов, которыми вы манипулируете. Когда вы получаете параметр, вы предполагаете, что он определяет метод "quack ()" и "feathers ()", но вы не знаете, где находится документация (фактически, они будут иметь несколько строк документации в своих многочисленных реализациях).

"не зная типа объектов"? В самом деле. Когда я проектирую клиента объекта, я знаю, какой тип я разработал.

Когда я определяю сервис, используемый несколькими клиентами, «точный» тип не имеет значения, когда у меня определен требуемый интерфейс quack()и feathers().

Наконец, у меня есть Read-Execute-Print-Loop и другие инструменты для определения «точного» типа в тех редких случаях, когда у меня возникает небольшая проблема. Это то, чем я на самом деле пользуюсь каждый день.

>>> x = some_mystery_factory( some, args )
>>> type(x)
>>> dir(x)

Не кажется слишком сложным - по крайней мере в Python - раскрутить тип объекта. Должны динамические языки иметь REPL, что позволяет довольно легко увидеть, что происходит.

Вы также не знаете ожидаемый порядок параметров. Кажется, для IDE трудно помочь там.

Это не имеет особого смысла. help()работает.

И моя IDE часто может найти определение. Не всегда - некоторые замысловатые динамические конструкции могут легко скрывать базовый класс. В этом случае мне нужно подумать о классе объекта, чтобы найти определение метода. Конечно, я пишу код, так что там мало (или нет) загадок.

С. Лотт
источник
6
Я чувствую, что могу утверждать, что принуждение больше отдавать памяти дает вам меньше возможностей для мышления ...
Николь,
@Renesis: запоминание не зло, если есть какой-либо шаблон или система для интерфейсов.
S.Lott
1
Я согласен с тем, что запоминание интерфейсов @Renesis отвлекает меня от реального мышления. Мне было все равно, как другой программист в моей команде решил заказать параметры. Тот факт, что большая кодовая база использует много разных библиотек с разными стандартами именования, нередок, и зачастую невозможно или нецелесообразно упростить или унифицировать эти компоненты.
Филипп Боден
Re: Док строки, они в порядке, когда вы знаете тип объекта, но часто вы этого не делаете, и вы должны это найти.
Филипп Боден
1
grr ... нет лучшего редактора, чем Vim: P
Anto
1

Есть компания - JetBrains - авторы ReSharper, TeamCity и IDEA. Недавно они начали изучать динамические языки и уже выпустили свои инструменты для Python, PHP и Ruby.

Качество отличное. Это не другие плагины для вашей любимой IDE, но полнофункциональные IDE, и они довольно хороши для рефакторинга / навигации / отладки и т. Д. Они похожи на IDEA lite.

Андрей Таптунов
источник