Jak nawigować i refaktoryzować kod napisany w dynamicznym języku?

14

Uwielbiam to, że pisanie Pythona, Ruby lub Javascript wymaga tak niewielkiej liczby elementów. Uwielbiam proste konstrukcje funkcjonalne. Uwielbiam czystą i prostą składnię.

Są jednak trzy rzeczy, w których jestem naprawdę zły podczas tworzenia dużego oprogramowania w dynamicznym języku:

  • Poruszanie się po kodzie
  • Identyfikowanie interfejsów obiektów, których używam
  • Wydajna refaktoryzacja

Próbowałem prostych edytorów (np. Vim), a także IDE (Eclipse + PyDev), ale w obu przypadkach mam wrażenie, że muszę poświęcić dużo więcej pamięci i / lub ciągłego „grepowania” i czytania kodu w celu identyfikacji interfejsy. Jest to szczególnie prawdziwe w przypadku pracy z dużą bazą kodu z wieloma zależnościami.

Jeśli chodzi o refaktoryzację, na przykład zmianę nazw metod, staje się bardzo zależna od jakości moich testów jednostkowych. A jeśli spróbuję wyizolować moje testy jednostkowe poprzez „odcięcie” ich od pozostałej części aplikacji, nie ma gwarancji, że interfejs mojego kodu pośredniczącego pozostanie aktualny w stosunku do obiektu, który wprowadzam.

Jestem pewien, że istnieją obejścia tych problemów. Jak wydajnie pracujesz w Pythonie, Ruby lub JavaScript?

Philippe Beaudoin
źródło
Dotychczasowe funkcje zmiany nazwy PyDev były dla mnie świetne.

Odpowiedzi:

3

Poruszanie się po kodzie

Uzyskaj lepszy edytor niż VIM.

Używam Komodo Edit.

Czuję, że muszę poświęcić dużo więcej pamięci

Dobry. Myślenie jest dobre. Uważam, że „uczenie się” prowadzi ostatecznie do „pamięci”.

Ciągle „grep” i czytaj kod, aby zidentyfikować interfejsy.

To jest typowe. Jeśli ich nie pamiętasz, to są zbyt skomplikowane, prawda? Czas na uproszczenie.

Proste jest trudne do stworzenia. Ale kiedy masz problemy z zapamiętywaniem, jest to objaw złego projektu.

Używam grep. Mi to pasuje. Moja Komodo Edit ma wiele fajnych wyników wyszukiwania. Podobnie jak Notepad ++

Identyfikowanie interfejsów obiektów, których używam

Doc Strings i help()funkcja działają. Używam ich. Codziennie.

Efektywna refaktoryzacja ... staje się ogromnie zależna od jakości moich testów jednostkowych.

To nie są wiadomości. To zawsze było prawdą, nawet w języku statycznym.

W języku statycznym często stajemy się leniwi, zakładając, że - o ile się kompiluje - naprawdę może działać. To oczywiście fałszywe, ale stajemy się leniwi.


Jestem pewien, że istnieją obejścia tych problemów.

Nie są to „problemy” i nie wymagają „obejść”.


Język dynamiczny polega właśnie na tym, aby nie znać rodzaju obiektów, którymi manipulujesz. Gdy otrzymujesz parametr, zakładasz, że definiuje on metodę „quack ()” i „feathers ()”, ale nie wiesz, gdzie jest dokumentacja (w rzeczywistości będą miały wiele dokumentów w wielu implementacjach).

„nie znając rodzaju obiektów”? Naprawdę. Kiedy projektuję klienta obiektu, wiem, jaki typ zaprojektowałem.

Kiedy definiuję usługę, z której korzysta wielu klientów, typ „dokładny” nie ma znaczenia, gdy mam zdefiniowany wymagany interfejs quack()i feathers().

Wreszcie mam pętlę odczytu-wykonania-wydruku i inne narzędzia do określania typu „dokładnego” w rzadkich przypadkach, gdy mam subtelny problem. Tego właśnie używam na co dzień.

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

Nie wydaje się zbyt trudne - przynajmniej w Pythonie - odprężenie typu obiektu. Dynamiczne języki muszą mieć REPL, dzięki czemu łatwo jest zobaczyć, co się dzieje.

Nie znasz też oczekiwanej kolejności parametrów. IDE wydaje się trudne do pomocy.

To nie ma większego sensu. help()Pracuje.

A moje IDE często może zlokalizować definicję. Nie zawsze - niektóre zawiłe konstrukcje dynamiczne mogą łatwo ukryć klasę podstawową. W takim przypadku muszę pomyśleć o klasie obiektu, aby znaleźć definicję metody. Oczywiście piszę kod, więc nie ma tu żadnej tajemnicy.

S.Lott
źródło
6
Czuję się jak mogę twierdzić, że został zmuszony do popełnienia więcej pamięci daje mniejszą zdolność do myślenia ...
Nicole
@Reneesis: Zapamiętywanie nie jest złe, jeśli istnieje jakikolwiek wzór lub system interfejsów.
S.Lott,
1
Zgadzam się z zapamiętywaniem interfejsów @Renesis odrywając się od prawdziwego myślenia. Nie obchodziło mnie to, jak inny programista w moim zespole zdecydował się zamówić parametry. Fakt, że duża baza kodów korzysta z wielu różnych bibliotek o różnych standardach nazewnictwa, nie jest rzadkością, a uproszczenie lub ujednolicenie tych komponentów jest często niemożliwe lub niepraktyczne.
Philippe Beaudoin
Re: Ciągi dokumentów, są w porządku, gdy znasz typ obiektu, ale często tego nie robisz i musisz to sprawdzić.
Philippe Beaudoin,
1
grr ... nie ma lepszego edytora niż Vim: P
Anto
1

Istnieje firma - JetBrains - autorzy ReSharper, TeamCity i IDEA. Niedawno zaczęli patrzeć na dynamiczne języki i już wypuścili swoje narzędzia dla Pythona, PHP i Ruby.

Jakość jest świetna. Nie są to kolejne wtyczki do twojego ulubionego IDE, ale w pełni wyposażone IDE i są całkiem dobre do refaktoryzacji / nawigacji / debugowania itp. - są jak IDEA lite.

Andrey Taptunov
źródło