Wie gehen Sie mit dem Verständnis von Abstraktion im Code um?


15

Wenn ich mir eine neue Codebasis anschaue, gehe ich gerne von einem Bottom-up-Ansatz aus.
Wo ich eine Datei verstehe und dann zur nächsten Abstraktion gehe.
Aber oft vergesse ich, was die untergeordnete Abstraktion tut.

An diesem Punkt befinde ich mich also in einer fast endlosen Schleife, in der ich zu den Dateien zurückkehre, die ich zuvor vollständig verstanden habe, und dann versuche, sie neu zu lernen. während ich versuche, mit zahlreichen anderen Abstraktionen zu jonglieren, die in meinem Kopf miteinander verbunden sind.

Gibt es eine bessere Strategie, um mit dieser Situation umzugehen?

Sollte ich die untergeordneten Details einfach vergessen und als gegeben betrachten? Aber selbst dann ist oft ein vorheriges Verständnis der Abstraktion auf niedrigerer Ebene erforderlich, um zu verstehen, was die aktuelle Abstraktion tut.



10
Kurze Antwort: Sie beginnen am falschen Ende. Ein Top-Down-Ansatz ist immer effizienter, da Sie mit jedem Level wissen, worum es geht und was es bedeutet. Wenn Sie ganz unten anfangen, fehlt Ihnen der notwendige Kontext. Dies macht es schwierig, sich zu erinnern, da Sie das, was Sie sehen, nicht mit etwas Sinnvollem in Beziehung setzen können. Schauen Sie sich zuerst das Gesamtbild an, und zoomen Sie erst dann auf die Teile, die Sie brauchen / wollen, um zu wissen, worum es geht.
Martin Maat

Sie müssen sich nicht an alles in Ihrem Kopf erinnern. Sie können ein Blatt Papier oder ein iPad verwenden, um einfache Diagramme zu zeichnen, mit denen Sie sich Assoziationen und Abstraktionen merken können.
sul4bh

Antworten:


31

Konkretes Programmieren ist der Impuls, Details in Ihre Richtung zu ziehen, damit Sie sie alle an einem Ort festnageln können. Wir fangen alle so an und es ist schwer loszulassen.

Abstraktes Programmieren bedeutet auf jeden Fall, "die Details der unteren Ebene zu vergessen". Manchmal auch übergeordnete Details. Sie schieben Details weg und lassen etwas anderes damit umgehen. Das hinterhältige ist, dass Sie dies die ganze Zeit getan haben. Verstehst du wirklich, was alles passiert print "Hello world"und was auf deinem Bildschirm angezeigt wird?

Das Wichtigste, was Sie verlangen müssen, wenn Sie sich abmühen, diese Details loszulassen, sind gute Namen. Ein guter Name sorgt dafür, dass Sie nicht überrascht werden, wenn Sie hineinschauen. Das ist der Grund, warum Sie nicht überrascht waren, dass printetwas auf Ihrem Bildschirm angezeigt wurde und es Ihnen egal war, wie. foo "Hello world"wäre eine andere Geschichte gewesen.

Auch die Abstraktionsebenen sollten konsistent sein. Wenn Sie sich auf einem Niveau befinden, bei dem es um die Berechnung des Pi geht, sollten Sie sich auch keine Gedanken darüber machen, wie der Pi angezeigt wird. Dieses Detail ist in eine Abstraktion eingedrungen, in die es nicht gehört.

Niedrigere, höhere oder seitwärts gerichtete Details, bei denen es nicht um das geht, woran ich an diesem einen Ort denke, können entweder ganz verschwinden oder sich zumindest hinter einem guten Namen verstecken.

Wenn Sie also wirklich Schwierigkeiten haben, von Datei zu Datei zu springen, kann es sein, dass Sie jemand mit schlechten Namen oder undichten Abstraktionen belegt hat.

Ich behebe das, indem ich mit meinen Fingern lese. Sobald ich anständige Tests in Bezug auf dieses Chaos habe, ziehe ich die Verantwortlichkeiten auseinander, gebe ihnen eindeutige Namen, um Überraschungen zu vermeiden, und zeige sie jemand anderem, um sicherzustellen, dass ich nicht in einer Fantasiewelt lebe.

Anscheinend bin ich nicht allein, wenn es darum geht, so zu arbeiten:

Immer wenn ich an unbekanntem Code arbeite, beginne ich, Methoden zu extrahieren. Wenn ich das mache, suche ich nach Codestücken, die ich benennen kann - dann extrahiere ich. Auch wenn ich die Methoden, die ich später extrahiert habe, später inliniere, habe ich zumindest die Möglichkeit, Details vorübergehend auszublenden, damit ich die Gesamtstruktur sehen kann.

Michael Feathers - Orange Code


12

Unten finden Sie einige Aktualisierungen darüber, wie sich dies für mich etwa jedes Quartal des Jahres ausgewirkt hat. Ich denke, sie sind wertvoll.

Gute Benennung. Oder, wenn es sich um den Code eines anderen handelt, der versucht, gute Namen / Verantwortlichkeiten basierend auf schlechten Namen den Klassen / Funktionen dieses Systems zuzuweisen, so dass es in meinem Kopf Sinn macht. Sobald dies der Fall ist, sind die Implementierungen auf niedriger Ebene viel leichter zu merken.

Das ist alles was ich habe. Es gibt eine Menge Puristen auf dieser Seite, die beschwören, welche Muster oder Objekte von welcher Art auch immer, aber eine gute Benennung wird Sie weit bringen. Ich selbst habe mehr als gute Arbeit geleistet, indem ich minimal dokumentierten / gut benannten / gut entkoppelten Code erstellt habe, und es hat mich nie wieder gebissen, selbst wenn mein Code an vielen Orten von vielen Leuten verwendet wurde, aber der Eine Sache, die ich richtig gemacht habe, war, viel Zeit mit guten Namen, guten Kommentaren und Schaltplänen zu verschwenden, die den Ablauf meines Codes erklärten. Eine einfache Implementierung ist erforderlich, um zu verstehen, ob Sie meinen Code umfassend erweitern möchten. Gut geschriebener Code kann auf vernünftige Weise erweitert werden. Es ist also in Ordnung, dass jemand oder Sie die Implementierungen auf niedriger Ebene nicht verstehen / sich daran erinnern.

Wenn Sie an einer Kontroverse interessiert sind, von der sowohl die Leute in meinem ursprünglichen Fach als auch ich wissen, dass sie die Wahrheit sind, aber wenn Sie sich anhören, was hier niedergeschrieben ist, werden Sie lernen, dieser Antwort sowohl zuzustimmen als auch nicht zuzustimmen Lesen Sie weiter:


Aber es gibt noch ein anderes Thema - Puristen. Sie werden gut formulierte Antworten und Ideologien hören, die vernünftig und völlig logisch sind. Tatsächlich ist daran nichts auszusetzen. Aber du musst ihnen nicht folgen, denn sie könnten zu deinem Nachteil sein.

Meine Freunde haben mit großen Systemen gearbeitet und sie lachen nur über Leute, die sich ein bisschen zu sehr für Konventionen und Muster interessieren, und aus gutem Grund würde ich es auch tun - ich kann meine Gründe dafür aus meinem Hauptgebiet der Datenanalyse entnehmen. da ich kein so erfahrener Entwickler bin: Die meisten Dinge, die Sie für wichtig halten, spielen keine Rolle, und in diesem Sinne besteht eine starke Korrelation zu Ihrem Ego.Oftmals hat ein Individuum aufgrund seines Ego Kenntnis davon erlangt, dass er höchstwahrscheinlich aufgrund seiner Vorurteile missverstanden wurde, die jetzt durch eine Autorität verstärkt werden, von der er glaubt, dass sie nur "das gleiche wie ich" gesagt hat. Dies ist eine sehr bekannte Falle, in die man niemals hineinfallen sollte. Das bedeutet nicht, dass er es nicht richtig oder zum Wohle des Gemeinwohls einsetzt, aber oft versprechen diese Leute, dass alles, was sie sagen, der goldene Preis ist.

Also was kannst du tun?

Erläutern Sie Ihren Code einem Kollegen und fragen Sie ihn, ob er unter allgemeinen Gesichtspunkten sinnvoll ist.

Das ist alles was zählt. Natürlich hat jeder, der den Code eines anderen liest, immer eine Alt-Tab-Fiesta, um die Implementierung bestimmter Dinge zu sehen, aber das spielt keine Rolle, wenn derjenige, der den Code liest, über ein umfassendes Verständnis Ihres Systems verfügt und versteht, warum Dinge passieren "(wieder, ohne unbedingt zu wissen, wie sie passieren), dann bist du golden.

Das sage ich nicht, mach weiter und schreibe Mistcode, der nicht performant ist oder nichts respektiert, aber was ich sage, ist:

1) Es ist in Ordnung zu vergessen. Mit der Zeit werden Sie besser darin sein, Code zu lesen, mit dem Sie arbeiten. Wenn der Code, den Sie lesen, erfordert, dass Sie die Implementierungen auf niedriger Ebene auf einem guten Niveau kennen, dann ist der Code schlecht geschrieben und spielt mit dem, was ich zuvor gesagt habe, zusammen: Versteht ein Mitarbeiter Sie?

2) Die Welt ist voller sehr intelligenter Menschen, die nicht sehr klug sind. Sie sind auch oftmals sehr emotional und neigen dazu, sich durch äußere Kräfte zu verstärken. Sie sind sehr gut darin, was sie tun, aber was sie als Akteure der Informationsverbreitung vergessen, ist: Ideen / Informationen, auch wenn sie von "Logik" gestützt werden, haben den Kontext desjenigen, der sie sendet, was entscheidend für das Verständnis ist, ob dies der Fall ist oder nicht Informationen sind auch für Sie nützlich. Was für Sie Sinn macht, könnte für andere Sinn machen, und sie würden es lieben, aber Informationen sollten nicht als absolut angesehen werden, und man sollte den Kontext, aus dem sie stammen, berücksichtigen oder zumindest versuchen, ihn mit seinem zu vergleichen eigenen Kontext, um zu sehen, ob es passt. Es ist wirklich das Gleiche wie wenn Milliardäre uns diese "Bits des Wissens geben, um voranzukommen".

Kurz gesagt: Schreiben Sie verständlichen Code und stellen Sie fest, dass es immer noch umstritten ist, wo wir so viele Muster / Klassen und Raffinerie benötigen, wie manche sagen. Es gibt sehr kluge Leute auf beiden Seiten des Streits, und es sollte nur die Idee bekräftigen, alles, was für Ihr Team funktioniert, auf vernünftige Weise zu erledigen Denken Sie später daran, dass Sie in einer extrem wettbewerbsintensiven Welt leben, in der das Timing das Wichtigste ist:

Timing für den Erfolg von Startups.

Teilen Sie Ihre Zeit und Ressourcen sinnvoll und gierig ein.


Hier ist eine Bearbeitung, 6 Monate später:

Es war eine verrückte Reise. Ich hätte nie gedacht, dass nur eine Trennung / gute Benennung und Dokumentation es Ihnen grundsätzlich ermöglichen kann, irgendetwas aus Ihrer Codebasis heraus und hinein zu stecken. Ich musste eine Menge Code neu schreiben, um ihn mit den neuen Änderungen auf den neuesten Stand zu bringen, und ich habe in 2-3 Tagen einen guten Teil davon gemacht. Ich kann mit Sicherheit sagen, dass ich SOLID nicht überall befolgt habe, weil mir Kenntnisse oder Best Practices gefehlt haben, und ich kann sagen, dass sie in meinen technischen Schulden stecken, aber nicht sehr viel. Trennen, benennen und dokumentieren, so können Sie den Code in kürzester Zeit ändern, wenn Sie irgendwann feststellen, wie dumm Sie waren.

Verstehen Sie mich nicht falsch: Wenn Sie Ihren Code eng miteinander verknüpft schreiben, werden Sie große Schmerzen haben, unabhängig davon, ob Sie SOLID hassen oder nicht. Selbst wenn Sie es verstehen und auf einer Basisebene anwenden, können Sie eine großartige Entkopplung erzielen, was ehrlich gesagt der Fall ist das einzige, bei dem OOP wirklich hilft. OOP sollte sich auch mit der Wiederverwendung von Code befassen und dabei kommt es hier und da vorWenn Sie nicht wirklich viele von Ihnen erstellte Objekte wiederverwenden können, konzentrieren Sie sich darauf, sicherzustellen, dass Ihr System gut voneinander getrennt ist. Wenn Sie reif sind und davon ausgehen, dass Onkel Bob Ihr Projekt leitet, wird er sagen: "Okay, das ist verdammt doof, aber zumindest ist alles getrennt, gut benannt und dokumentiert, damit ich zumindest weiß, worum es geht " (Ich hoffe). Bei mir funktioniert es. Mein LOC ändert sich ständig, aber zum Zeitpunkt des Schreibens sind es 110.000 Codezeilen, 110.000 Codezeilen, die für eine einzelne Person harmonisch funktionieren, eine Menge.


Hier ist eine Änderung, 3 Monate später, an einem 8-Monats-Code, den ich überarbeite:

Es macht alles Sinn. Ich kann jetzt das, was ich damals geschrieben habe, konzeptionell aufnehmen und den Code neu schmieden, mit neuen Ideen, weil ich genau verstehe, was los ist und warum es aufgrund der Schaltpläne / guten Benennung und der Kommentare funktioniert. Ich habe vor langer Zeit einen Code geschrieben, dem es egal war, wie man sich gut nennt, und es tut mir weh, ihn durchzuarbeiten. Ich überlege mir jetzt, was der nächste Schritt zur Erklärung meines Codes sein könnte.


Gute Benennung. Wichtigster Punkt. Für die meisten Menschen einfach zu machen und es macht die Dinge so viel einfacher.
gnasher729
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.