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

14

Mi piace che la scrittura di Python, Ruby o Javascript richieda così poche informazioni. Amo i semplici costrutti funzionali. Adoro la sintassi pulita e semplice.

Tuttavia, ci sono tre cose che mi fanno davvero male quando si sviluppa un software di grandi dimensioni in un linguaggio dinamico:

  • Navigazione nel codice
  • Identificazione delle interfacce degli oggetti che sto usando
  • Refactoring efficiently

Ho provato semplici editor (cioè Vim) e IDE (Eclipse + PyDev) ma in entrambi i casi mi sento come se dovessi impegnarmi molto di più nella memoria e / o costantemente "grep" e leggere attraverso codice per identificare le interfacce. Ciò è particolarmente vero quando si lavora con un codebase di grandi dimensioni con dipendenze multiple.

Come per il refactoring, ad esempio cambiando i nomi dei metodi, diventa enormemente dipendente dalla qualità dei miei test unitari. E se provo a isolare i miei test unitari "tagliandoli" dal resto dell'applicazione, non c'è alcuna garanzia che l'interfaccia del mio stub rimanga aggiornata con l'oggetto che sto eseguendo lo stub.

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

    
posta Philippe Beaudoin 02.02.2011 - 21:33
fonte

3 risposte

3

Navigating the code

Ottieni un editor migliore di VIM.

Uso Komodo Edit.

I feel like I have to commit a lot more to memory

Buona. Pensare è buono Trovo che "l'apprendimento" porti eventualmente alla "memoria".

Constantly "grep" and read through the code to identify the interfaces.

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

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

Io uso grep. Per me funziona. Il mio Komodo Edit ha una buona ricerca. Così fa Notepad ++

Identifying the interfaces of the objects I'm using

Stringhe di documenti e la funzione help() funzionano. Li uso Quotidiano.

Refactoring efficiently... it becomes hugely dependent on the quality of my unit tests.

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

In un linguaggio statico, spesso diventiamo pigri, presumendo che - finché è compilato - è molto probabile che funzioni. Questo è manifestamente falso, ma diventiamo pigri.

I'm sure there are workarounds for these problems.

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

A dynamic language is precisely about not knowing the type of the objects you manipulate. When you receive a parameter, you assume it defines a "quack()" and a "feathers()" method, but you don't know where there documentation is (in fact, they will have multiple docstrings in their multiple implementations).

"non conoscendo il tipo di oggetti"? Veramente. Quando progetto il cliente di un oggetto, so che 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 il 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 ogni giorno.

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

Non sembra troppo difficile - almeno in Python - per srotolare il tipo di un oggetto. I linguaggi dinamici devono avere un REPL, per cui è facile vedere cosa sta succedendo.

You don't know the expected parameter order either. It seems hard for an IDE to help there.

Questo non ha molto senso. help() funziona.

E il mio IDE può spesso individuare la definizione. Non sempre: alcuni costrutti dinamici convoluti 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 nessun) mistero lì.

    
risposta data 02.02.2011 - 22:26
fonte
2

Una rapida ricerca ha trovato Rfactor for Ruby ( intervista qui ) e riparatore di biciclette per Python. Non sei sicuro di quanto siano buoni ... ma vale la pena guardare.

    
risposta data 02.02.2011 - 21:55
fonte
1

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

La qualità è eccezionale. Questi non sono un altro plug-in per il tuo IDE preferito ma IDE completi e sono abbastanza utili per il refactoring / navigazione / debugging ecc. Sono come IDEA lite.

    
risposta data 03.02.2011 - 19:09
fonte

Leggi altre domande sui tag