Sie möchten, dass Ihr Code aus kleinen Teilen besteht, die einzeln getestet und verstanden werden können.
Jedes kleine Stück sollte eine Sache tun und es gut machen, ob das Stück eine Funktion ist, und Methode oder eine Klasse.
Sie wollen größere Stücke von Funktionalität aus diesen kleinen Stücken, so komponieren können, dass jede Zusammensetzung, egal wie komplex intern, einfach bleibt auf der Ebene der Abstraktion dieser Funktionalität.
Mit anderen Worten, selbst auf der hohen Ebene sollten wir noch in der Lage sein, komplexe Interna in einfachen externen Systemen zu beschreiben.
Das ist, was Andrew Koenig meint, wenn er sagt "Abstraktion ist selektive Ignoranz". Durch absichtlich Aufgeben Wissen von wie etwas wmay intern arbeiten, können wir betrachten nicht wie es funktioniert, aber was es tut.
Lassen Sie uns ein kurzes Beispiel geben. Am oberen Ende könnten wir sagen, "diese Klasse findet das kleinste int in einer Datenstruktur". Das sagt uns, was es tut, nicht wie es tut, und auf dieser hohen Ebene der Abstraktion, das ist alles, was uns interessiert.
Wir haben etwas, das etwas tut, und seine modulare, können wir es mit etwas anderes zu ersetzen, funktioniert das elbe, egal wie tut es. Das hat eine öffentliche Schnittstelle.
Jetzt auf einer niedrigeren Ebene, kann es sein, dass wie dies funktioniert ist, dass es intern ist ein Heap oder eine Warteschlange oder was auch immer.
Und diese Dinge können in Bezug auf Bäume oder selbstausgleichende Bäume oder sogar (suboptimal) eine verkettete Liste implementiert werden. Eine verkettete Liste wäre eine suboptimale Implementierung, aber solange sie das Gleiche tun würde, würden wir nicht wirklich caféen, denn wenn die Suboptimalität genug zurückkommt, um unser Programm zu verlangsamen, könnten wir es für eine bessere Implementierung auslagern mit der gleichen Schnittstelle.
Und diese Dinge sind in Bezug auf Baum Traversal implementiert (Pre-Order: immer in der Reihenfolge links, Eltern, rechts gehen). Und diese Dinge werden im Hinblick auf einfache Operationen auf Knoten implementiert.
Und hier ist der wichtige Teil: weil die Rest von out App keine Abhängigkeit von den Einbauten oder Nebenwirkungen dieses Moduls hat, die Swap aus einer schlechteren Implementierung für eine bessere ändert keines unserer anderen Code, es beschleunigt die Dinge insgesamt.
Jede Schicht kommuniziert nur mit den Schichten unmittelbar darüber und darunter, so dass jede Schicht ersetzt werden kann. Optisch sieht es wie Kreise in Kreisen innerhalb von Kreisen aus, nicht wie die Überlappung eines Venn-Diagramms.
Wenn Sie sich auf Intuition verlassen müssen, deutet das darauf hin, dass Ihr Code Nebeneffekte hat oder dass er übermäßig breite Schnittstellen zu anderen Modulen hat, oder anstelle von Schnittstellen überhaupt, anstatt aufgebauter Code zu sein von in sich geschlossenen, sich nicht überschneidenden Modulen, haben Sie Überschneidungen und Überschneidungen und fragilen Code. Dass du es nicht in Stücke zerlegt hast, die einfach genug sind, um es zu verstehen.
(Mist, es ist spät, und ich fürchte, dass ich diese Erklärung aufgeschlüsselt hätte besser. Ich komme wieder diese zu bearbeiten.)
Finden Sie oft, wenn Sie zurückkommen und diesen Code überprüfen, dass Sie einen Fehler verursachenden Nebeneffekt erzeugt haben (im Gegensatz zu nur hässlichem Code, der sauberer sein könnte). –