Frage

Ich sehe (jetzt mehr denn je) Entwickler, die riesige Mengen an Ebenen schreiben, wie zum Beispiel:

implementation PresentationLayer ->
    interface IMyDTO ->
        implementation MyDTO ->
            interface IMyService -> 
                implementation MyService -> 
                    interface IMyDomainRepository ->
                        implementation MyDomainRepository ->
                            interface IMyDomainObject -> 
                                implementation MyDomainObject ->
                                    interface IMyIndependentStorageLayer ->
                                        implementation MyMSSQLStorageLayer

Wenn man sich C#-Blogs ansieht, scheint dies das Beste seit geschnittenem Brot zu sein.Im Grunde ist alles lose gekoppelt.Verwenden Sie kein Domänenobjekt direkt.Führen Sie alles über eine Serviceschicht aus.Greifen Sie über ein Repository auf Daten zu.Alle Schichten sind vollkommen unabhängig.

Verstehen Sie mich nicht falsch, mir gefällt die Idee, aber ist der zeitliche Kompromiss nicht enorm, insbesondere bei einem größeren Projekt?Ist der ROI in der Wartung wirklich groß genug, um dies zu rechtfertigen?

Die Erklärungen, die ich gelesen habe, sind etwas umständlich, wie zum Beispiel „Auf diese Weise kann ich bei Bedarf eine andere Datenbank anhängen“.Wirklich?Ich glaube nicht, dass es ein häufiges Problem ist, dass jemand plötzlich verlangt, von MSSQL zu Oracle zu wechseln, und dann sitzt man da und wünscht sich, man hätte eine Million Schichten, die alle nichts voneinander wissen.

Gibt es einen Trend, es mit der losen Kopplung zu übertreiben, oder lese ich einfach die falschen Blogs?Wie denkst du darüber und gab es Situationen, in denen du später wirklich froh warst, dass du die zusätzliche Arbeit am Anfang geleistet hast?

War es hilfreich?

Lösung

Es ist sehr schwierig, die richtige Geschäft ausgerichtet Konzeption für eine Software zu entwerfen. Ich meine, mit einer akzeptablen ROI.

Doch für mich, Die Anzahl der Schichten oder die Höhe der Low-Kupplung einer Softwarekonzeption vom Kontext abhängig, in dem die Software verwendet werden!

Wenn Sie sicher sind, was die Software zu tun hat, und es wird wahrscheinlich keine großen Änderungen oder fügt in Zukunft eine super niedrige Niveau Kopplung Anwendung mit vielen Schichten ist nicht die Lösung. Weil es die Architektur zu komplex ohne Grund und die investierte Zeit für die Architektur macht, ist nicht rentabel ...
Auf der anderen Seite, wenn Sie wissen, dass die Anwendung für jeden Kunden individuell gestaltet werden können muss und wird sicherlich in der Tiefe ändern, so Zeit auf eine niedrige Niveau Kopplung Architektur verbrachte eine gute Idee ist ...
Low-Level-Kopplung kann klug sein, wenn Sie einen Teil des Codes für andere Anwendungen wiederverwendet werden sollen. In diesem Fall Zeit verbringen für Design ist völlig profitabel, natürlich.
Dann zusammenfassend, werde ich sagen, dass alles hängt von der Entwicklung der Software in der Zukunft und das Potenzial der Wiederverwendung von Code für andere Anwendungen.
Aber es ist eine bewährte Methode für mich nicht systematisch sehr komplexe Architektur zu tun.

Andere Tipps

Natürlich kann es übertrieben sein, und man muss wissen, Schichten Hinzufügen „wo zu stoppen“.

Faust Meine Regel ist, dass, wenn eine Schicht müssen keine wesentliche Funktionalität / Code, ich brauche es nicht. Davon abgesehen, Testbarkeit ist eine bedeutende Sache, so dass, wenn eine Schicht kauft mir besser Testbarkeit, werde ich es hinzufügen.

Nichts im Anwendungsdesign kommt ohne Preis.Hier ist der Preis eine erhöhte Komplexität.Sie müssen IMMER Ihre Optionen prüfen, bevor Sie diejenige auswählen, die Ihren Anforderungen am besten entspricht.

Vor diesem Hintergrund finde ich, dass Ihre Frage etwas voreingenommen klingt.In der realen Welt sieht man vielleicht nicht oft, dass ein Kunde eine neue Art von Datenbank verlangt, aber man sieht oft einen neuen Kunden, der die gleiche Art von Datenzugriff wie der vorherige wünscht, aber auf einer anderen Datenbank.Dabei geht es nicht nur um einfache Änderungen, sondern auch um die Wiederverwendung von Code.

Wenn diese Dinge Auswertung ich in der Regel finden es hilfreich, um es durch die Linse des DRY-Prinzip zu suchen und zu Überschneidungen in Ihrem Projekt suchen.

Wenn Sie eine Architektur verwenden, die komplexer als Ihr Projekt ist, werden Sie neigen dazu, eine Menge von Schichten, um zu sehen, die wenig tun, neben anderen Schichten wickeln und auf Anrufe passieren. Dies wiederholt sich.

Wenn auf der anderen Seite sind Sie eine dünne Architektur für ein komplexes System finden Sie vielleicht, dass in einem Teil der Systemfunktionalität zu schaffen nicht funktioniert können Sie diese Funktionalität in einem anderen Teil wiederverwenden, zwingen Sie eine Menge sehr zu schreiben ähnlicher Code der ganzen Ort. Dies wiederholt sich.

Nach meiner Erfahrung, wenn Sie bei der Identifizierung von Doppelarbeit wachsam sind und Refactoring ständig um es zu entfernen, die Struktur wird Ihnen präsentiert sich. Sagen Sie zum Beispiel, dass man mit einer eher grundlegenden Architektur erst anfangen, aber Dinge in Methoden zu brechen, sobald sie wieder verwendet werden müssen, und bricht Methoden aus in Klassen, sobald sie von anderen Klassen wiederverwendet werden müssen. Dann merkt man, kann schließlich, dass Ihre 13 Helfer / Manager / Handler Klassen, die Sie geschrieben haben, um Doppelarbeit entfernen tatsächlich etwas ganz schauen, wie sie auf der Verantwortung nehmen, die klarer definiert werden konnten, wenn sie in eine Service-Schicht gegangen waren.

Es kann schwierig sein, zu wissen, wann es mir lohnt, aber ich denke, den Schlüssel zum Erfolg in einem System mit vielen Schichten Konstruktion ist sehr klar zu sein mit dem, was Verantwortlichkeiten die verschiedenen Schichten haben sollen. Jede Ebene, die Sie hinzufügen, muss bei der Verringerung der Komplexität der Vorgänge in der darüberliegenden Schicht es Ihnen nützlich sein und machen es einfacher Funktionalität verweben auf elegante Weise.

Nehmen Sie ein hypothetisches Beispiel-Projekt. Die Tests verschiedene In-Prozess-SQLite-Datenbanken für die Geschwindigkeit verwenden, Computer die Entwicklungsdatenbank auf einige Entwickler ist PostgreSQL, ist die Staging-Datenbank ein einzelnes Oracle installieren und die Produktionsdatenbank ist eine hoch skalierbare, sehr teuer und sehr schwer zu konfigurieren Oracle Cluster.

Wie würden Sie überhaupt, dass ohne Trennung der SQL-Schicht von der Business-Schicht abziehen?

Es ist ein neuer Trend, und weniger erfahrene Leads / Architekten fallen Beute auf den fahrenden Zug zu springen.

Im Projekt, das ich auf bin, Datenzugriff ging:

Service Interface -> Service Implementation -> Delegiertenschnittstelle -> Delegieren Implementierung -> DAO-Schnittstelle -> DAO-Implementierung -.> Ibatis XML

Das war (und ist!) Schlecht in unserem Fall, weil die meisten Code in jeder Delegate Einführungsmethodik eine einzelne Zeile waren; es nannte nur die DAO. Für jedes DAO hatten wir zwei zusätzliche Klassen und eine zusätzliche Bean Config, und wir waren überhaupt nichts von diesem zu gewinnen.

Bestätigen Sie die Änderung, Refactoring, und ziehen weiter. Verwenden Sie so viele Schichten, wie es um Stück auseinander verschiedene Konzepte nimmt ... und dann stoppen. Wenn es kein wahrgenommen Gewinn etwas Code in schriftlicher Form, außer dass es einer Vorlage folgen, entweder verlangsamen und versuchen zu verstehen, warum die Vorlage das täte, oder zu akzeptieren, dass die Vorlage für Ihre Anwendung falsch ist und dass etwas ignorieren.

Im Moment arbeite ich an einem großen SOA-Projekt, bei dem jede Schicht entkoppelt wurde, und fast jede Klasse wird über eine abstrakte Fabrik instanziiert. Jetzt versuchen wir, einige der bestehenden Funktionalität in separat gehostete Dienste auszulagern, und es ist ein echter Alptraum durch die Schichten gehen zu versuchen, die wichtigen Bits zu extrapolieren, weil es eine nie endende Rechtsklick> zur Definition gehen ... zu jagen nach unten, was an der äußersten Schicht nur 1 Zeile Code war!

Es ist nichts falsch mit Entkopplung per se, und sicherlich auch in meinem Projekt gibt es viele Bereiche, in denen ich es sinnvoll, aus architektonischer Sicht finden. Nur nicht mitreißen ... Seien Sie pragmatisch und wägt die Vor- / Nachteile, wenn die Bereiche untersuchen Sie in Betracht ziehen zu entkoppeln.

Prost

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top