Wie viel Abstraktion ist zu viel?
In einem Objekt-orientierten Programm: , Wie viel Abstraktion ist zu viel? Wie viel ist genau richtig?
Ich war schon immer ein Nüsse-und-Bolzen Art von Kerl. Ich Verstand das Konzept, das hinter der hohen Ebenen der Kapselung und Abstraktion, aber immer fühlte instinktiv, dass Sie zu viel würde nur verwirren Sie das Programm.
Habe ich immer versucht zu Schießen, für einen Betrag von Abstraktion, die linke keine leeren Klassen oder Schichten. Und wo im Zweifelsfall, anstatt das hinzufügen einer neuen Schicht der Hierarchie, die ich versuchen würde-und passen Sie etwas in die bestehende Schichten.
Jedoch, vor kurzem habe ich seit der Begegnung mehr stark abstrahierte Systeme. Systeme, wo alles könnten, erfordern eine Darstellung, die später in der Hierarchie bekommt eine up-front. Dies führt zu einer Menge von leeren Ebenen, die auf den ersten Blick wie schlechtes design. Allerdings, auf den zweiten dachte, ich bin gekommen, zu erkennen, dass das verlassen der leeren Ebenen, gibt mehr Orte, um Haken in der Zukunft ohne viel refactoring. Es lässt Sie mehr Möglichkeiten, neue Funktionen hinzuzufügen, die auf den alten, ohne dabei annähernd so viel Arbeit zum anpassen der alte.
Den beiden Risiken dieser zu sein scheinen, können Sie die Ebenen, die Sie brauchen, falsch. Man würde In diesem Fall wind-up immer noch müssen, tun erhebliche Umgestaltung erweitern Sie den code und hätte noch einen Tonne nie benutzt Schichten. Aber je nachdem, wie viel Zeit verbringen Sie die ersten Abstraktionen, die chance zu Schrauben und die Zeit, die gerettet werden könnten, später, wenn Sie es richtig machen - es kann immer noch Wert, es zu versuchen.
Das andere Risiko, das ich denken kann, ist die Gefahr, über es zu tun und nie brauchen all die extra-Schichten. Aber ist das wirklich so schlimm? Sind extra-Klasse Schichten wirklich so teuer, dass es viel von einem Verlust, wenn Sie nie benutzt werden? Der größte Kosten-und-Verlust-hier wäre die Zeit, die verloren geht, vorne kommt mit den Schichten. Aber viel von dieser Zeit noch gerettet werden können, wenn später arbeiten kann man mit dem abstrahierten code eher als low-level-code.
Also Wann ist es zu viel? An welchem Punkt werden die leeren Ebenen und extra "brauchen könnten" Abstraktionen geworden overkill? Wie wenig ist zu wenig? Wo ist der sweet spot?
Gibt es irgendwelche verlässlichen Faustregeln, die Sie gefunden haben im Laufe Ihrer Karriere, die Ihnen dabei helfen zu beurteilen, die Höhe der Abstraktion benötigt?
- Wie lange ist ein Stück Schnur??? 😉
- Sollte CW IMHO, da Sie nicht haben, ein Antwort
- Worrier Getan.
- Warum Java-apps neigen dazu, mehr Abstraktionen im Vergleich zu C#?
- abhängig von Sprachen, z.B. Pascal sagt, es hat eine Länge, aber intelligent (c) die Menschen wissen es nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass es eine definitive Antwort auf diese Fragen. Erfahrung ist notwendig, um zu entwickeln ein Gefühl von dem, was ist "zu viel" und "zu wenig". Vielleicht ist die Verwendung von bestimmten metrischen oder quality-control-tools können helfen, aber es ist schwer zu verallgemeinern. Meistens kommt es auf jeden Fall.
Hier sind ein paar links, die vielleicht inspirieren Sie bei der Suche nach Antworten:
Entwicklung ist alles über die richtige balance zu finden zwischen den verschiedenen Spannungen, die vorhanden sind, die in einem software-engineering-Aufwand.
Die Stelle der Abstraktionen ist es, zu Faktor gemeinsame Eigenschaften von der spezifischen, wie in die mathematische operation:
Nun tun Sie das gleiche mit zwei Operationen statt drei. Dieses factoring aus unseren Ausdruck einfacher.
Ein typisches Beispiel für eine Abstraktion des Dateisystems. Zum Beispiel, Sie wollen Ihr Programm schreiben zu können, die für viele Arten von Speichermedien: USB-Sticks, SD-Karten, Festplatten, usw...
Wenn wir nicht über ein Dateisystem, würden wir die Notwendigkeit zur Umsetzung der direct disk schreiben Logik, die Feder-Antrieb zu schreiben Logik und die SD-Karte schreiben-Logik. Aber alle diese Logiken haben etwas gemeinsam: Sie schaffen Dateien und Verzeichnisse, so dass diese gemeinsamen Dinge werden abstrahiert, indem eine Abstraktionsschicht, und bietet eine Schnittstelle zu den Hersteller der hardware zu tun, die bestimmte Sachen.
Mehr die Dinge, die eine gemeinsame Eigenschaft. Der weitere Vorteil einer Abstraktion sein kann:
zu:
Dies reduzieren würde die 9 Operationen 5.
Im Grunde genommen jeder gute Abstraktion, die etwa die Hälften der Komplexität eines Systems.
Braucht man immer mindestens zwei Dinge, die eine gemeinsame Eigenschaft, um eine Abstraktion sinnvoll. Natürlich Sie reißen einen einzelnen Sache auseinander, so sieht es aus wie eine Abstraktion, aber es bedeutet nicht, dass es nützlich ist:
Nicht definieren das Wort "common", wenn Sie nur eine Einheit.
Also um deine Frage zu beantworten. Sie haben genug Abstraktionen, wenn Sie, dass dein system so einfach wie möglich.
(In meinen Beispielen hinaus verbindet die Teile des Systems, während die Multiplikation definiert eine abstrakte-konkrete Beziehung.)
Wenn Sie halten Sie die Arbeit mit "low-level" - Elemente auf einer regelmäßigen basis, und Sie ständig das Gefühl, wie Sie don';t wollen, dies zu tun. Abstract 'em away.
Wenn du nicht bits und Stücke, einige code-Teile auf einer regelmäßigen basis und zu Debuggen, die Sie nach unten, um die Vorherige Ebene. Fühlen Sie sich dieses Besondere Schicht nicht etwas beitragen, nur ein Hindernis. Legen Sie es.
Bewerbe ich mich bei den pragmatischen Ansatz. Wenn Sie sehen die Notwendigkeit für eine Abstraktion und verstehen, wie es wird Ihr Leben zu verbessern, gehen Sie für es. Wenn Sie gehört haben, sollte es "offiziell" eine zusätzliche Ebene der Abstraktion, sondern Sie sind sich nicht klar, warum, tun Sie es nicht, aber die Forschung erste. Wenn jemand darauf besteht, Abstraktion, etwas, aber nicht deutlich erklären, was passiert, wenn zu bringen, Sag Ihnen, Sie sollen Weggehen.
In der Theorie, es sollte eine Frage der einfachen Mathematik mit nur drei (relativ einfachen) Variablen:
Wenn S * P > C , dann ist der code gut ist. Wenn S * P < C, dann ist es schlecht.
Dem Grund, dass die rein theoretische, jedoch, ist, dass Sie in der Regel nicht erraten können, auf die Wahrscheinlichkeit der Nutzung oder die Einsparungen, die Sie bekommen werden, zu benutzen. Schlimmer noch, Sie können nicht erraten, oder oder meist sogar Messen die Kosten seiner Anwesenheit.
Zumindest einige Menschen haben die Schlussfolgerung gezogen aus diesem. In TDD, das standard-mantra ist "you ain' T gonna need it" (YAGNI). Einfach ausgedrückt, alles, was nicht direkt dazu beitragen, den code der Erfüllung seiner aktuellen Anforderungen wird als eine schlechte Sache. Im wesentlichen, Sie habe abgeschlossen, dass die Wahrscheinlichkeit der Nutzung ist so gering, dass darunter solche extra-code ist nie gerechtfertigt.
Einige dieser kommt zurück, um "bottom-up" versus "top-down" - Entwicklung. Ich Neige dazu zu denken, der bottom-up Entwicklung als "Bibliotheksentwicklung" -- I.-e. anstelle der Entwicklung einer spezifischen Anwendung, du bist wirklich die Entwicklung von Bibliotheken für die Dinge, die Sie müssen in der Anwendung. Das denken ist, dass mit einem guten genug, Bibliothek, können Sie entwickeln fast jede Anwendung dieser Allgemeinen Art relativ leicht.
Einiges hängt auch von der Größe des Projekts. Riesige Projekte, die im Einsatz bleiben, für Jahrzehnte rechtfertigen, viel mehr langfristige Investitionen als kleinere Projekte, die verworfen und ersetzt viel schneller. Dies hat offensichtliche ähnlichkeiten im realen Leben. Sie sorgen sich nicht annähernd so viel über die Passform, fertig stellen, oder Verarbeitung in einem Einweg-Rasierer werfen Sie Weg in weniger als einer Woche, wie Sie tun in so etwas wie einem neuen Auto, das Sie verwenden werden für die nächsten Jahre.
Einfach ausgedrückt, es ist zu viel Abstraktion, wenn der code ist schwer zu verstehen.
Nun, dies ist nicht zu sagen, dass Sie sollten hart code alles, denn das ist der einfachste code zu schreiben und zu Lesen.
Der einfachste test ist entweder put it down für ein paar Tage, nehmen Sie es wieder auf, und Fragen Sie sich, macht das Sinn. Ein besserer Ansatz ist, um es an jemand anderen geben, und sehen, wenn Sie können machen Kopf oder Zahl davon.
Die Realität ist, dass es davon abhängt, wie gut Sie in die Zukunft schauen können. Sie möchten änderungen, die Sie vorhersehen kann, ohne zu viele extra-Schichten. Wenn Sie ein design, das überträgt die Daten zwischen den Systemen, gehen Sie vor und erstellen Sie eine Schnittstelle und verwenden Sie die geplante Umsetzung als Standard. Zum Beispiel, verwenden Sie FTP, um Dateien zu verschieben, aber wissen, die standard-message-basiert (oder was auch immer) im nächsten Jahr.
Als für Schichten in der Konstruktion, manchmal die zusätzlichen Schichten machen es einfacher zu schreiben, dass es kleinere Klassen. Es ist ok, um konzeptuelle Ebenen, wenn es heißt, die konkreten Klassen werden gerade nach vorne.
Jede Abstraktion, die nicht tatsächlich verwendet, ist zu viel. Je einfacher ein system, desto leichter ist es zu ändern. Abstraktionsebenen fast immer machen-Systemen komplizierter.
OTOH, es ist sicherlich möglich zu Programmieren einer komplexen, wartbaren Durcheinander, ohne jede Art von Abstraktion, und manchmal, "standardisierte" abstraction-Layer können helfen, die Struktur eines Systems besser als die meisten Menschen wären in der Lage, auf Ihre eigenen zu tun.
Siehe Punkt
(6a)
von RFC 1925 und wissen, dass es tatsächlich wahr ist. Die einzigen Probleme, die Sie nicht lösen können durch hinzufügen von Abstraktion Schichten sind jene, die sich aufgrund von zu vielen Abstraktionsebenen. (Insbesondere, jedes Stück Abstraktion macht die ganze Sache schwieriger zu verstehen.)