Чи вразливі динамічні мови для спритного розвитку?


12

З того, що я читав, гнучка розробка часто включає рефакторинг або зворотний інженерний код на діаграми. Звичайно, це набагато більше, але якщо ми розглянемо практику, яка спирається на ці два методи, динамічно набрані мови в невигідному стані?

Здається, статично введені мови значно полегшать рефакторинг та реверсивну інженерію.

Чи важко, якщо не неможливо, переробляти чи (автоматизувати) зворотну інженерію в динамічно набраних мовах? Що реальних проектів розповідає про використання динамічно набраних мов для гнучкої методології?


5
Зворотний інженерний код на діаграми? Чому б ти зробив це в Agile?
CaffGeek

7
Agile не означає "спочатку код, документ пізніше".
Gort the Robot

@CaffGeek: Деякі книги, які часто рекомендують, пропонують намалювати схеми на дошці, потім код та нарешті змінити інженерний код у діаграми для наступної зустрічі.
Геренюк

1
Я думаю, що сильно набрані тексту слід видалити з тегів та тексту цього питання. Здається, питання стосується статичної проти динамічної, а не сильної проти слабкої.
Вінстон Еверт

@WinstonEwert - Добрий дзвінок, я змінив теги на dynamic-typingіstatic-typing
Carson63000

Відповіді:


11

Теоретично динамічні мови перебувають у невигідному стані, всі інші рівні, тому що вони вказують менше на те, як працює код (які обмеження), і тому менше рефакторингу можна зробити автоматично, а проблеми, що виникають, не можуть бути виявлені також автоматично .

Але все інше не рівне. Найпопулярніші динамічні мови дозволяють отримати дуже компактний, але зрозумілий код, який, як правило, робить в них швидший розвиток, а також робить логіку (яка може змінитися при рефакторингу) легше візуально помітити. Отже, хоча ви можете втратити частину відносної переваги роботи динамічною мовою, ви все одно можете випереджати, особливо якщо ви планували робити рефакторинг вручну.

З іншого боку, існують статично типізовані мови, які мають по суті ті ж переваги, що й динамічні мови (тобто компактні та зрозумілі - з типами в основному зроблені висновки, але їх дуже багато): Haskell - це, мабуть, провідний приклад, але OCaML / F #, Scala, та інші також в цій категорії. На жаль, оскільки вони менш широко використовуються, ніж найпопулярніші статично набрані мови, вони не мають настільки широкого набору інструментів для них (наприклад, для рефакторингу).

Отже, як підсумок, я думаю, що ви достойно поступите з гнучкими методологіями на більшості мов; Я б не сказав, що зараз є чіткий переможець, оскільки практика ще не догнала теорію.


Я думаю, що ця відповідь найкраще стосується ключових моментів питання :) Чи не могли б ви також детальніше розповісти про важливість безпечного рефакторингу та реверсивної інженерії для спритного розвитку? Я припускав, що це відіграє дуже важливу роль? Можливо, це менше, ніж я думав, і інструменти для мови динаміки просто досить хороші.
Геренюк

1
@Gerenuk - Я не маю достатнього досвіду з гнучким розвитком (особливо в динамічних мовах), щоб дати авторитетну відповідь - чи не підкреслюється аспект рефакторингу, залишається таким же і т.д.? Майте на увазі, що інші поширені аспекти процесу - наприклад, тестова розробка, наприклад, - можуть допомогти точно визначити, куди пішов ваш рефакторинг, і якщо ви докладете трохи більше зусиль, скажімо, на етапі проектування, можливо, вам не знадобиться рефактор стільки ж. Я не думаю, що одна особлива техніка є ключовою - це тримати під рукою повний набір інструментів, розгортати їх часто та спільно.
Рекс Керр

14

Автоматизований рефакторинг був винайдений у Smalltalk, динамічно набраній мові. Тож ні, не неможливо автоматизований рефакторинг динамічно набраною мовою. Наскільки важко, набагато більше залежить від інших факторів, крім дисципліни введення тексту. C ++ та Java обидва мають статичний тип, але інструменти рефакторингу дійсно існують лише для Java. Smalltalk зі своєю самоаналізами та простим синтаксисом був справді хорошим кандидатом для інструментів рефакторингу.

Деяким чином динамічне введення тексту фактично полегшує рефакторинг. Якщо у вас хороший набір для тестування, ви можете бути впевнені, що ваші реконструкції не зламали нічого. Динамічно типізована база коду зазвичай менша. Крім того, рефакторинг, як правило, впливає на менший код. Загалом зусилля, пов'язані з переробкою вручну динамічної бази коду, менше, ніж у статичної бази кодів.


1
А як щодо реверсної техніки? Чи відрізняється Smalltalk від Python щодо набору тексту? Здається, складною проблемою вивести всі типи в Python і таким чином визначити, який метод насправді ідентичний, а не просто однойменний.
Геренюк

2
Smalltalk НЕ що сильно відрізняється від Python стосовно друкувати. Це є , однак, істотно відрізняється в залежності від оснащення . Інструменти та IDE, доступні для Smalltalk, набагато кращі, ніж ті, які доступні для Python або навіть C #, C ++ та Java. Причина, чому IDE для Python погані, не тому, що Python динамічно набирається, це тому, що, ну, IDE для Python погані. Не будемо забувати, що IDE, яку ми тепер знаємо як Eclipse, колись називали VisualAge для Smalltalk. Спільнота Smalltalk має 40-річний досвід створення IDE, і вони застосовують це до Java.
Йорг W Міттаг

@Gerenuk, набір Smalltalk не відрізняється від python. Іншими способами, такими як самоаналіз, Smalltalk дійсно надає набір функцій, більш дружніх для рефакторингу. Поширення типу в python вимагало б роботи, але це було зроблено, див. Проект PyPy.
Вінстон Еверт

1
@WinstonEwert "але ви можете рефакторировать вручну, а динамічні мови насправді роблять це досить просто" - Ні, ручний рефакторинг не змінюється. Підтримка інструментів для рефакторингу змінює все, навіть якщо рефакторинг не є на 100% автоматичним (див. Фрагменти тематичного прикладу нижче - programmers.stackexchange.com/a/166594/4334 )
igouy

1
Майже кожен пункт вашого "динамічного програмування насправді полегшує рефакторинг" є сумнівним чи не послідовним. Динамічне програмування не означає, що у вас є більш всебічний тестовий набір, просто більший (тому що деякі речі потребують тестування, яке в іншому випадку буде статично зафіксовано). Ви не пропонуєте жодної підтримки для "рефакторинга, як правило, впливає на менший код" (як додаток до "проекту все одно менше", що, ймовірно, вірно, враховуючи поточний урожай динамічних мов). І "зусилля, пов'язані з рефакторингом вручну", здаються неправильними, якщо ви не маєте на увазі, що навіть не дозволите, що ваш компілятор вам допоможе!
Рекс Керр

8

Рефакторинг був винайдений на динамічних мовах. Автоматизовані інструменти рефакторингу були винайдені на динамічних мовах. ІДЕ були винайдені в динамічних мовах. На динамічних мовах було винайдено кілька гнучких методологій.

Я справді не бачу жодної проблеми.


"Smalltalk не так сильно відрізняється від Python, що стосується набору тексту. Це, однак, суттєво відрізняється щодо інструментарію". - Можливо, це починає змінюватися, див. Jetbrains.com/pycharm/features/index.html
igouy

3

Щоб ми не забули, "Agile" спосіб роботи, який став відомим як Extreme Programming (XP), був створений за проектом Smalltalk (і Smalltalk, безумовно, вважається "динамічною" мовою).

Ось тематичне дослідження промислового використання інструменту рефакторингу, який надається динамічно набраною мовою:

На Cargill була розроблена дуже велика програма Smalltalk для підтримки роботи зернових елеваторів та пов'язаної з цим торгової діяльності. Клієнтська програма Smalltalk має 385 вікон та понад 5000 класів. Близько 2000 класів у цій програмі взаємодіяли з раннім (приблизно в 1993 році) рамкою доступу до даних. Рамка динамічно виконувала відображення атрибутів об'єкта в стовпці таблиці даних.

Аналіз показав, що хоча динамічний пошук вимагає 40% часу виконання клієнта, це було непотрібно.

Був розроблений новий інтерфейс рівня даних, який вимагав, щоб бізнес-клас надавав атрибуту об'єкта для відображення стовпців у явно закодованому методі. Тестування показало, що цей інтерфейс був на порядок швидшим. Питання полягало у тому, як змінити 2100 користувачів бізнес-класу рівня даних.

Велика програма, що розробляється, не може заморозити код під час побудови та тестування трансформації інтерфейсу. Нам довелося побудувати і протестувати перетворення в паралельній гілці сховища коду з основного потоку розробки. Коли трансформація була повністю випробувана, її застосовували до основного потоку коду за одну операцію.

У 17100 змінах було виявлено менше 35 помилок. Усі помилки були швидко усунені за три тижні.

Якби зміни були зроблені вручну, ми вважаємо, що на розробку правил трансформації знадобилося б 8 500 годин, порівняно з 235 годин.

Завдання було виконано за 3% від очікуваного часу за допомогою переписати правила. Це поліпшення в 36 разів.

від "Трансформація рівня даних програми" буде Loew-Blosser OOPSLA 2002

Також - "Інструменти для неможливих змін - досвід роботи з інструментом для перетворення великих програм Smalltalk"


1

Думка ваших принципів звучить для мене правильно .

Сильно набрані мови, такі як C #, є хорошими кандидатами для кодової бази, яка постійно потребує повторного факторингу. В основному більшість інструментів ре-факторингу (наприклад, Resharper, JustCode та ін.) На ринку є дуже ефективними в статично набраних мовах програмування.

Що реальних проектів розповідає про використання динамічно набраних мов для гнучкої методології?

Для команди розробників, яка практикує методологію Agile / Scrum, дуже корисно (навіть критично) мати хороший набір інструментів для повторного факторингу під броні. В іншому випадку всі раптові зміни в майбутньому спринті можуть бути кошмаром, який можна змінити або переробити.

Таким чином, гнучка методологія не дає переваг статично набраним мовам або динамічним разом. Що вона надає, це ітеративний підхід до створення надійного додатку.


4
Динамічні мови мали засоби автоматизованого рефакторингу задовго до того, як C # навіть існував, і коли Блокнот все ще був найпотужнішим Java IDE Java.
Йорг W Міттаг

4
Ця відповідь повністю не підтримується моїм досвідом. Динамічні мови , як правило , швидше робити речі , ніж більш традиційні статично типізованих з них (я отримав , щоб дізнатися Haskell або ML або що - щось подібне коли - то). Вони також набагато швидше змінюються, якщо раптом знадобиться, що призвело до мого висновку, що звичайний Лисп - найкраща мова, коли ти насправді не знаєш, що ти робиш. Більше того, з чого, на вашу думку, почався рефакторинг?
Девід Торнлі

1
чому ви так думаєте, наприклад, javascript - це динамічна мова, але Re-sharper не виконує таку саму витончену роботу, як це робиться з C #. По-друге, я НЕ сказав, що "динамічні мови повільніше роблять справи".
Юсубов

Від людей, які принесли вам IntelliJ IDEA - PyCharm - "Перейменування перейменування дозволяє виконувати зміни глобального коду безпечно та миттєво. Місцеві зміни у файлі виконуються на місці. Рефакторинг працює у звичайних проектах Python та Django. Використовуйте ввести змінну / Поле / Константа та Вбудований Локальний для вдосконалення структури коду в методі, Метод вилучення для розбиття довших методів, Витяг суперкласу, Push Up, Pull Down та Move для переміщення методів та класів. " jetbrains.com/pycharm/features/index.html
igouy

@igouy, у своїй відповіді я маю на увазі Resharper та JustCode. Таким чином, це справедливо для контексту, про який йдеться.
Юсубов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.