Возможен ли автоматический рефакторинг в динамических языках? - PullRequest
10 голосов
/ 23 февраля 2010

Возможно, я ограничен опытом работы с динамическими языками (Ruby для Netbeans и Groovy для Eclipse), но мне кажется, что природа динамических языков делает невозможным рефакторинг (переименование методов, классов, push-up, pull и т. д.) автоматически.

Возможно ли автоматическое рефакторинг на любом динамическом языке (с любым IDE / инструментом)? Меня особенно интересуют Ruby, Python и Groovy, и как рефакторинг сравнивается с доступным на 100% автоматическим рефакторингом во всех Java IDE.

Ответы [ 5 ]

16 голосов
/ 23 февраля 2010

Учитывая, что автоматический рефакторинг был изобретен на динамическом языке (Smalltalk), я должен был бы сказать "Да".

В частности, Джон Брант, Дон Робертс и Ральф Джонсон разработали Браузер рефакторинга , который является одним из основных инструментов, например, в Squeak.

Мой Google-фу сегодня слаб, но вы можете попробовать найти эту статью: Дон Робертс, Джон Брант и Ральф Джонсон, Инструмент для рефакторинга для Smalltalk, «Теория и практика объектных систем», (3) 4, 1997

13 голосов
/ 23 февраля 2010

Smalltalk не объявляет никаких типов. Браузер рефакторинга успешно выполнил правильные рефакторинги в коммерческом коде с 1995 года и включен почти во все текущие среды разработки Smalltalk. - Дон Робертс

9 голосов
/ 23 февраля 2010

Автоматический рефакторинг был изобретен в Smalltalk, очень динамичном языке. И с тех пор он работает как шарм.

Вы можете попробовать себя в бесплатной версии Smalltalk (например, http://pharo -project.org )

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

TestCase allSubclasses size

2 голосов
/ 23 февраля 2012

Я удивлялся тому же. Я не пишу компилятор / интерпретатор, но я думаю, что ответом будет то, что невозможно сделать его идеальным. Тем не менее, вы можете сделать это правильно в большинстве случаев.

Во-первых, я собираюсь изменить название «динамический» язык на «интерпретируемый» язык, о котором я думаю в Ruby, Javascript и т. Д. Интерпретируемые языки, как правило, используют преимущества возможностей времени выполнения.

Например, большинство языков сценариев допускают следующее

-- pseudo-code but you get the idea
eval("echo(a)");

Я просто "запустил" строку! Вы должны также рефакторинг этой строки. И будет ли переменная или этот язык позволяет печатать символ а без кавычек, если нет переменной а?

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

Или немного поднять ставку:

def functionThatAssumesInputWillCreateX(input)
    eval(input)
    echo(x)


def functionWithUnknownParms( ... )
   eval(argv[1]);

По крайней мере, когда вы реорганизуете Java и изменяете переменную с int на строку, вы получаете ошибки во всех местах, которые ожидали int еще:

String wasInt;
out = 3 + wasInt;

С интерпретированными языками вы, вероятно, не увидите этого до времени выполнения.

1 голос
/ 25 февраля 2010

То же самое касается браузера Refactoring ... он очень эффективен в Smalltalk. Однако я полагаю, что существуют определенные типы рефакторинга, которые были бы невозможны без информации о типах (независимо от того, получено ли это путем явной аннотации типов в языке или с помощью какой-либо формы вывода типов в динамическом языке). Один пример: при переименовании метода в Smalltalk он будет переименовывать всех разработчиков и отправителей этого метода, что чаще всего просто отлично, но иногда нежелательно. Если бы у вас была информация о типе переменных, вы могли бы охватить переименование только для разработчиков в текущей иерархии классов и всех отправителей, когда сообщение отправляется в переменную, объявленную как тип в этой иерархии (однако я мог бы представить сценарии где даже с объявлением типа это сломается и приведет к нежелательным результатам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...