Wie navigieren Sie in einem Code, der in einer dynamischen Sprache geschrieben ist, und wie können Sie ihn umgestalten?

14

Ich finde es toll, dass das Schreiben von Python, Ruby oder Javascript so wenig Boilerplate erfordert. Ich liebe einfache funktionale Konstrukte. Ich liebe die klare und einfache Syntax.

Bei der Entwicklung einer großen Software in einer dynamischen Sprache kann ich jedoch drei Dinge wirklich schlecht:

  • Im Code navigieren
  • Identifizieren der Schnittstellen der von mir verwendeten Objekte
  • Effizientes Refactoring

Ich habe sowohl einfache Editoren (dh Vim) als auch IDE (Eclipse + PyDev) ausprobiert, aber in beiden Fällen habe ich das Gefühl, dass ich viel mehr in den Speicher investieren und / oder ständig "grep" und den Code durchlesen muss, um mich zu identifizieren die Schnittstellen. Dies gilt insbesondere, wenn Sie mit einer großen Codebasis mit mehreren Abhängigkeiten arbeiten.

Was das Refactoring angeht, zum Beispiel das Ändern von Methodennamen, hängt es stark von der Qualität meiner Unit-Tests ab. Und wenn ich versuche, meine Komponententests zu isolieren, indem ich sie für den Rest der Anwendung "ausschneide", gibt es keine Garantie dafür, dass die Schnittstelle meines Stubs mit dem Objekt, das ich stubbe, auf dem neuesten Stand ist.

Ich bin sicher, es gibt Problemumgehungen für diese Probleme. Wie arbeiten Sie effizient in Python, Ruby oder Javascript?

Philippe Beaudoin
quelle
Die Umbenennungsfunktionen von PyDev haben mir bisher sehr gut gefallen.

Antworten:

3

Im Code navigieren

Holen Sie sich einen besseren Editor als VIM.

Ich benutze Komodo Edit.

Ich habe das Gefühl, dass ich mich viel mehr der Erinnerung widmen muss

Gut. Denken ist gut. Ich finde, dass "Lernen" schließlich zu "Gedächtnis" führt.

Ständig "grepen" und den Code durchlesen, um die Schnittstellen zu identifizieren.

Das ist typisch. Wenn Sie sich nicht an sie erinnern können, dann sind sie doch zu komplex, oder? Zeit zu vereinfachen.

Einfach ist schwer zu schaffen. Aber wenn Sie Probleme haben, sich zu erinnern, ist es ein Symptom für schlechtes Design.

Ich benutze grep. Für mich geht das. Mein Komodo Edit hat viele nette Suchmöglichkeiten. Notepad ++ auch

Identifizieren der Schnittstellen der von mir verwendeten Objekte

Doc Strings und die help()Funktion funktionieren. Ich benutze sie. Täglich.

Effizientes Refactoring ... es hängt stark von der Qualität meiner Unit-Tests ab.

Das sind keine Neuigkeiten. Das war schon immer so, auch in einer statischen Sprache.

In einer statischen Sprache werden wir oft faul, wenn wir davon ausgehen, dass - solange es kompiliert wird - es sehr wahrscheinlich ist, dass es funktioniert. Dies ist offensichtlich falsch, aber wir werden faul.


Ich bin sicher, es gibt Problemumgehungen für diese Probleme.

Dies sind keine "Probleme" und erfordern keine "Problemumgehungen".


Bei einer dynamischen Sprache geht es genau darum, den Typ der Objekte, die Sie bearbeiten, nicht zu kennen. Wenn Sie einen Parameter erhalten, nehmen Sie an, dass er eine "quack ()" - und eine "feathers ()" - Methode definiert, aber Sie wissen nicht, wo sich die Dokumentation befindet (in der Tat haben sie mehrere Dokumentzeichenfolgen in ihren verschiedenen Implementierungen).

"den Typ der Objekte nicht kennen"? Ja wirklich. Wenn ich den Client eines Objekts entwerfe, weiß ich, welchen Typ ich entworfen habe.

Wenn ich einen Service definiere, der von mehreren Clients verwendet wird, ist der "genaue" Typ nicht relevant, wenn ich die erforderliche Schnittstelle von quack()und definiert habe feathers().

Schließlich habe ich die Read-Execute-Print-Loop und andere Tools, um in den seltenen Fällen, in denen ich ein subtiles Problem habe, den "exakten" Typ zu bestimmen. Das benutze ich eigentlich jeden Tag.

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

Scheint nicht zu schwierig - zumindest in Python - den Typ eines Objekts abzuwickeln. Müssen dynamische Sprachen eine REPL haben, ist es ziemlich einfach zu sehen, was los ist.

Sie kennen auch die erwartete Parameterreihenfolge nicht. Es scheint schwer für eine IDE, dort zu helfen.

Das ergibt wenig Sinn. help()funktioniert.

Und meine IDE kann die Definition oft finden. Nicht immer - einige gewundene dynamische Konstrukte können die Basisklasse leicht verbergen. In diesem Fall muss ich über die Klasse des Objekts nachdenken, um die Methodendefinition zu finden. Natürlich schreibe ich den Code, also gibt es dort wenig (oder gar kein) Rätsel.

S.Lott
quelle
6
Ich habe das Gefühl, ich könnte argumentieren, dass Sie weniger in der Lage sind, zu denken , wenn Sie gezwungen sind, mehr in Erinnerung zu behalten ...
Nicole
@Renesis: Das Auswendiglernen ist nicht böse, wenn die Schnittstellen ein Muster oder ein System aufweisen.
S.Lott
1
Ich bin damit einverstanden, dass @Renesis das Auswendiglernen von Schnittstellen meine Gedanken vom wirklichen Denken ablenkt. Es war mir egal, wie sich ein anderer Programmierer in meinem Team dazu entschied, die Parameter zu bestellen. Die Tatsache, dass eine große Codebasis viele verschiedene Bibliotheken mit unterschiedlichen Benennungsstandards verwendet, ist nicht selten und es ist oft unmöglich oder unpraktisch, diese Komponenten zu vereinfachen oder zu vereinheitlichen.
Philippe Beaudoin
Re: Doc Strings, sie sind in Ordnung, wenn Sie den Typ des Objekts kennen, aber oft nicht und Sie müssen das nachschlagen.
Philippe Beaudoin
1
grr ... es gibt keinen besseren editor als Vim: P
Anto
1

Es gibt eine Firma - JetBrains - Autoren des ReSharper, TeamCity und IDEA. Sie haben kürzlich angefangen, sich mit dynamischen Sprachen zu beschäftigen, und bereits ihre Tools für Python, PHP und Ruby veröffentlicht.

Die Qualität ist super. Dies sind keine weiteren Plugins für Ihre Lieblings-IDE, aber voll funktionsfähige IDEs. Sie eignen sich sehr gut für Refactoring / Navigation / Debugging usw. - sie sind wie IDEA lite.

Andrey Taptunov
quelle