Ich habe vor ungefähr fünf Monaten meinen Universitätsabschluss gemacht und arbeite seit vier Monaten in einem lokalen Startup. Während meines Studiums habe ich alleine Haskell, F # usw. studiert. An der Universität wurde uns Java beigebracht, aber ich war sehr bald mit funktionaler Programmierung vertraut und habe viel mehr Zeit damit verbracht als mit imperativer Programmierung. Infolgedessen ist mein Gehirn auf ein funktionierendes Denken eingestellt. Die Firma, der ich beigetreten bin, verwendet Python, und der Code ist äußerst wichtig. Es fällt mir sehr schwer, imperativen Code zu lesen. Ich kann Mutationen nicht nachverfolgen. Wenn eine Verschachtelung für-wenn-sonst-für-... mehr als vier Ebenen tief geht, verliere ich den Überblick darüber, was im Code vor sich geht. Python ist eine dynamische Sprache, daher enthält der Code keine Typen. Es' Es ist Wochen her, seit ich versucht habe, einen Teil unserer Codebasis (die angeblich "mäßig komplex" ist) zu verstehen, aber ich habe bisher keine nennenswerten Fortschritte beim Verständnis gemacht. Bitte bieten Sie mir einige praktische Techniken an, wie ich diesen Code verstehen soll. Danke im Voraus!
Edit:
Vielleicht sollte ich auch erwähnen , dass es nicht wirklich viele Kommentare im Code und die Namen sind auch nicht sehr intuitiv.
quelle
Antworten:
Legacy-Code zu verstehen ist schwierig. Es hat fast nichts mit funktionalen oder prozeduralen Aspekten zu tun.
Erstellen Sie eine Karte. Ein Komponentendiagramm der Python-Pakete und -Module. Für jedes Modul müssen Sie Klassendiagramme erstellen.
Verwenden Sie den Python-Interpreter. Sie sollten in der Lage sein, Module zu importieren, Objekte zu erstellen und diese interaktiv auszuüben. Deshalb ist Python beliebt. Sie können drucken, um
type(x)
zu sehen, welcher Typ eine Variable ( x ) tatsächlich ist.Lesen Sie im Zweifelsfall unbedingt den Einheitentestcode. Wenn es keinen Unit-Test-Code gibt, treten zusätzlich zum Erlernen einer neuen Codebasis große Probleme auf.
Zeug aufschreiben. Beginnen Sie mit Begleitpapieren. Wenn Sie glauben, dass Sie wissen, was los ist, fügen Sie den Funktionen, Methoden und Klassen docstring-Kommentare hinzu. Fügen Sie diese früh und oft hinzu.
Verwenden Sie Sphinx mit 'autodoc', um zu sammeln, was Sie lernen.
Der wichtigste Teil ist dies. Es ist schwer, die Dinge im Kopf zu behalten. Es ist einfacher, Dinge in Dokumentationsdateien aufzubewahren.
quelle
Warten Sie ... bei solch tiefen Verschachtelungsebenen verliert jeder den Überblick über den Code. Oder wie es Linus Torvalds ausdrückte:
Wenn Sie mehr als 3 Einrückungsstufen benötigen, sind Sie trotzdem geschraubt und sollten Ihr Programm reparieren.
Dies hört sich nicht so an, als würde Ihr Unternehmen die gängigen Best Practices einhalten.
Wenn ich Sie wäre, würde ich nur versuchen, die Codebasis durch Disziplin und Gewalt zu verstehen. Grabe dich einfach ein, immer und immer wieder. Es ist wahrscheinlich wie alles. Im Moment fühlen Sie sich wie unter Wasser und können nicht atmen, aber fahren Sie fort, die Codebasis zu untersuchen, und bald schwimmen Sie an die Oberfläche.
Ich fürchte, Ihrer Frage fehlen die technischen Details, um Ihnen einen guten Rat zum Verständnis der Codebasis zu geben, aber es ist nie falsch, sie in einigen Sitzungen mit erfahrenen Kollegen durchzuarbeiten. Lassen Sie sich die Gesamtarchitektur und das Zusammenspiel der verschiedenen Komponenten sowie die von ihnen getroffenen Implementierungsentscheidungen erklären.
Es ist schwierig, allgemeine Ratschläge für den Übergang von funktionalen Sprachen zu imperativen / OO-Sprachen zu geben. Klar, ich könnte ein paar blumige Ausdrücke wie "Sie müssen über Zustände und Verhaltensweisen von Objekten nachdenken" erwähnen, aber diese helfen Ihnen nicht viel. Ich denke, das ist etwas, was Sie erleben müssen.
quelle
Wenn es Unit-Tests gibt (groß, wenn von Ihnen beschriebene schlechte Praktiken), können Sie sich diese ansehen, um zu sehen, wie der Code getestet wird. Dies bietet einen guten Einblick in die Funktionsweise des Codes.
Ansonsten würde ich empfehlen, allgemeineren Python-Code zu lesen, um sich an die Art und Weise zu gewöhnen, wie er geschrieben wurde.
quelle
Sie könnten versuchen, einige Fragmente aus Python in Pseudo-Haskell oder was auch immer Sie möchten zu übersetzen. Das kann Ihnen ein Gefühl dafür geben, welche Imperativkonstruktionen lose auf welche Funktionskonstruktionen abgebildet werden. Mit zunehmender Erfahrung werden sich die imperativen Konstruktionen natürlicher anfühlen.
Ich bin von der Programmierung von OCaml und Haskell zur Programmierung von Java und Python übergegangen, und ich habe die Erfahrung gemacht, dass zwingende Programmierung kein so großer Sprung ist wie dynamisches Tippen, was sich bis heute fremd anfühlt.
quelle
Ich schlage vor, Sie setzen Haltepunkte und beginnen mit der Verwendung des Befehls Next (als ob Sie debuggen). Dies wird Ihnen helfen, den Ablauf zu verstehen (wahrscheinlich auf Zweigen, es gibt Pfade, die mit größerer Wahrscheinlichkeit genommen werden, auf diejenigen, auf die Sie sich konzentrieren sollten, um sie zu erhalten) die allgemeine Idee des Codes).
(Ich hatte gute Ergebnisse mit Eclipse zusammen mit PyDev als Eclipse-Plugin)
quelle