Come si naviga e si refactifica il codice scritto in un linguaggio dinamico?


14

Adoro il fatto che la scrittura di Python, Ruby o Javascript richieda così poca caldaia. Adoro i costrutti funzionali semplici. Adoro la sintassi pulita e semplice.

Tuttavia, ci sono tre cose in cui sono davvero pessimo durante lo sviluppo di un software di grandi dimensioni in un linguaggio dinamico:

  • Navigazione nel codice
  • Identificare le interfacce degli oggetti che sto usando
  • Refactoring in modo efficiente

Ho provato editor semplici (ad es. Vim) e IDE (Eclipse + PyDev) ma in entrambi i casi mi sento di dover impegnare molto di più nella memoria e / o "grep" costantemente e leggere il codice per identificare le interfacce. Ciò è particolarmente vero quando si lavora con una base di codice di grandi dimensioni con dipendenze multiple.

Per quanto riguarda il refactoring, ad esempio cambiando i nomi dei metodi, diventa fortemente dipendente dalla qualità dei miei test unitari. E se provo a isolare i test delle mie unità "tagliandoli" il resto dell'applicazione, non vi è alcuna garanzia che l'interfaccia del mio stub rimanga aggiornata con l'oggetto che sto stubbing.

Sono sicuro che ci sono soluzioni alternative per questi problemi. Come lavori in modo efficiente in Python, Ruby o Javascript?


Le funzionalità di ridenominazione di PyDev hanno funzionato alla grande per me finora.

Risposte:


3

Navigazione nel codice

Ottieni un editor migliore di VIM.

Uso Komodo Edit.

Sento che devo impegnarmi molto di più nella memoria

Buona. Pensare è buono Trovo che "apprendere" alla fine porti alla "memoria".

"Grep" costantemente e leggere il codice per identificare le interfacce.

Questo è tipico Se non riesci a ricordarli, sono troppo complessi, vero? È tempo di semplificare.

Semplice è difficile da creare. Ma quando hai difficoltà a ricordare, è un sintomo di cattiva progettazione.

Uso grep. Per me funziona. La mia modifica di Komodo ha molte belle ricerche. Così fa Notepad ++

Identificare le interfacce degli oggetti che sto usando

Doc Strings e la help()funzione funzionano. Li uso. Quotidiano.

Refactoring in modo efficiente ... diventa fortemente dipendente dalla qualità dei miei test unitari.

Questa non è una novità. È sempre stato vero, anche in un linguaggio statico.

In un linguaggio statico, spesso diventiamo pigri, supponendo che - fintanto che si compila - è davvero probabile che funzioni. Questo è manifestamente falso, ma diventiamo pigri.


Sono sicuro che ci sono soluzioni alternative per questi problemi.

Questi non sono "problemi" e non richiedono "soluzioni alternative".


Un linguaggio dinamico riguarda proprio il non conoscere il tipo di oggetti che manipoli. Quando ricevi un parametro, supponi che definisca un metodo "quack ()" e un "feathers ()", ma non sai dove sia la documentazione (in effetti, avranno più docstring nelle loro molteplici implementazioni).

"non conoscendo il tipo di oggetti"? Veramente. Quando progetto il client di un oggetto, so quale tipo ho progettato.

Quando definisco un servizio, utilizzato da più client, il tipo "esatto" non è rilevante, quando ho definito l'interfaccia richiesta di quack()e feathers().

Infine, ho Read-Execute-Print-Loop e altri strumenti per determinare il tipo "esatto" nei rari casi in cui ho un problema sottile. Questo è quello che uso effettivamente ogni giorno.

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

Non sembra troppo difficile - almeno in Python - rilassare il tipo di un oggetto. I linguaggi dinamici devono avere un REPL, rendendo abbastanza facile vedere cosa sta succedendo.

Neanche tu conosci l'ordine dei parametri previsti. Sembra difficile che un IDE ci aiuti.

Non ha molto senso. help()lavori.

E il mio IDE può spesso individuare la definizione. Non sempre: alcuni costrutti dinamici contorti possono facilmente nascondere la classe base. In tal caso, devo effettivamente pensare alla classe dell'oggetto per individuare la definizione del metodo. Certo, sto scrivendo il codice, quindi c'è poco (o no) mistero lì.


6
Sento che potrei sostenere che essere costretto a impegnare di più nella memoria ti dà meno capacità di pensare ...
Nicole,

@Renesis: la memorizzazione non è malvagia se c'è qualche tipo di modello o sistema nelle interfacce.
S.Lott

1
Concordo con @Renesis che memorizza le interfacce mi distoglie dal pensiero reale. Non me ne può fregare di meno di come un altro programmatore del mio team abbia deciso di ordinare i parametri. Il fatto che una base di codice di grandi dimensioni utilizzi molte librerie diverse con standard di denominazione diversi non è raro, ed è spesso impossibile o poco pratico semplificare o unificare questi componenti.
Philippe Beaudoin,

Ri: Le stringhe di Doc, vanno bene quando conosci il tipo di oggetto, ma spesso non lo fai e devi cercarlo.
Philippe Beaudoin,

1
grr ... non esiste un editor migliore di Vim: P
Anto


1

C'è una società - JetBrains - autori di ReSharper, TeamCity e IDEA. Di recente hanno iniziato a esaminare linguaggi dinamici e hanno già rilasciato i loro strumenti per Python, PHP e Ruby.

La qualità è ottima Questi non sono un altro plugin per il tuo IDE preferito ma IDE con funzionalità complete e sono abbastanza buoni per refactoring / navigazione / debugging ecc. - Sono come IDEA Lite.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.