Frage

Ich habe ein Visual Studio Solution geerbt, die zahlreichen zirkuläre Referenzen zwischen Projekten enthält.

Gibt es überhaupt eine Situation, wo dies remote akzeptabel ist?

Ich versuche nur, meinen Verdacht zu bestätigen, dass diese Anwendung schrecklich ausgelegt ist. Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich habe einmal gelesen, eine Spalte, wo sie im Vergleich 3 Arten von Modellen:. Das Spaghetti-Modell, das Lasagna Modell und das Ravioli Modell

Spaghetti Modell, der gesamte Code miteinander verflochten ist, gibt es keine klare Struktur. Es ist schrecklich, und wir können wohl alle einig.

Lasagna Modell, wird der Code in verschiedenen Schichten aufgeteilt, und nur eine übergeordnete Schicht kann eine untergeordnete Schicht zuzugreifen, nie umgekehrt.

Ravioli Modell-Code wird in kleineren Modulen zusammengefasst. Jedes Modul macht nur das, was ausgesetzt sein muss, aber jedes Modul kann immer noch jedes andere Modul zugreifen zu können.

Vor etwa 10 Jahren, so schien es mir, dass die Ravioli Modell besser ist als das Lasagna Modell. Denn in Java haben Sie auch Java-Module, die leicht gegenseitig anrufen können (und ich hatte den Eindruck, dass es keine wirkliche Struktur zwischen der verschiedenen Java-Module war). Für mich schien das Lasagna Modell das Ergebnis des nicht-objektorientierten alten Code, während das Ravioli Modell modernere schien, mehr objektorientiert.

Heute neige ich zum Lasagna Modell zurück zu gehen, aber mit einem Ravioli Modell eingebaut. Dies ist:

  • Die Anwendung erstellt wird, um verschiedene Schichten verwendet wird, wie im Lasagna Modell
  • Aber innerhalb der Schichten, wird der Code noch zwischen verschiedenen Modulen aufgeteilt, die sie zugreifen kann, wie in einem Ravioli-Modell.

Bestimmte zirkuläre Referenzen können schwierig oder unmöglich zu entfernen sein. Ein Beispiel ist die folgende: Angenommen, Sie haben eine Filewriter-Klasse in Ihrer Anwendung und eine Debug-Klasse. Die Debug-Klasse wird die Filewriter-Klasse benötigen, da sie Dateien mit Debug-Informationen schreiben muss. Auf der anderen Seite kann die Klasse Filewriter will auch die Debug-Klasse verwenden.

Beachten Sie, dass der kreisförmige Bezug in diesem Beispiel bereits zu Problemen führen kann (die Filewriter Klasse könnte die Debug-Klasse aufrufe, während eine Zeile zu schreiben, aber die Debug-Klasse verwendet die Filewriter Klasse, um den Debug-Informationen, Ergebnis zu schreiben: Stapelüberlauf).

In diesem Fall könnte das Problem einfach durch nicht mit der Filewriter-Klasse in der Debug-Klasse lösen, aber die nativen iostreams zu verwenden (wenn Sie in C entwickelst ++). In anderen Fällen kann das Problem schwieriger sein, viel zu lösen.

Andere Tipps

Gute Software ist in Schichten mit klar abgegrenzten Grenzen zwischen ihnen entwickelt. dh: Wenn Sie eine Schicht haben, müssen Sie in der Lage sein, klar zu artikulieren, was es tut, warum es da ist, und was es hängt davon ab. Zirkularitäten macht dies schwer zu erreichen, und in der Regel entfernt werden soll. (Microsoft hat viel Aufwand in Windows 7 zu verbessern, die Schichtung von Windows ausgegeben, durch Zirkularitäten zu entfernen.)

Ich versuche nur, meinen Verdacht zu bestätigen, dass diese Anwendung schrecklich ausgelegt ist.

Dies würde auf jeden Fall, dass die Theorie unterstützen, aber IMO, würden Sie mehr als nur ein paar zirkulären Referenzen müssen diese Schlussfolgerung ziehen.

Um Ihre ursprüngliche Frage zu beantworten: Ja, können zirkuläre Verweise hilfreich sein, manchmal. Wechselseitig rekursive Funktionen sind ein gutes Beispiel für diese Art der Sache. Aber ... das ist eine kreisförmige Referenz sicher innerhalb eines Moduls versteckt. Für Inter-Modul Abhängigkeiten bedeutet eine zirkuläre Abhängigkeit in der Regel, dass der Code nicht korrekt ist über die Module aufgeteilt, und dies einige bedeutende Refactoring fix erfordern kann. (Einschließlich dem Hinzufügen von neuen Arten von abstactions die Lücke zu überbrücken, usw.)

Konkret Ich rate NDepend Verwendung zu erkennen und zu vermeiden Abhängigkeitszyklen .

alt text

Auszug aus dem Artikel (Ich schrieb): Control-Komponente Abhängigkeiten gewinnen saubere Architektur

Abhängigkeitszyklen zwischen den Komponenten führen zu, was allgemein Spaghetti-Code oder verhedderte Code genannt. Wenn die Komponente A auf B abhängt, die auf C abhängt, der auf einem abhängt, kann die Komponente A nicht entwickelt und unabhängig von B und C A, B und C bilden eine untrennbare Einheit, eine Art Super-Komponenten getestet werden. Diese Super-Komponente hat eine höhere Kosten als die Summe der Kosten über A, B und C wegen der Unwirtschaftlichkeit der Skala Phänomen (auch in Software Schätzung dokumentiert: Entmystifizierung der Black Art von Steve McConnell). Grundsätzlich gilt dies, dass die Kosten für ein untrennbares Stück Code zu entwickeln, exponentiell zunehmen.

Dies legt nahe, dass die Entwicklung und Pflege 1000 LOC (Lines of Code) wahrscheinlich drei kosten oder vier Mal mehr als die Entwicklung und 500 LOC beibehalten wird, es sei denn, es jede Spaltung in zwei unabhängigen Klumpen von 500 LOC sein kann. Daher den Vergleich mit Spaghetti, die beschreibt, verwirrten Code, der nicht aufrechterhalten werden kann. Um zu rationalisieren Architektur, muss man sicherstellen, dass es keine Abhängigkeitszyklen zwischen den Komponenten sind, sondern auch prüfen, ob die Größe jeder Komponente akzeptabel ist (500 bis 1000 LOC).

Rund Projektreferenzen sind ein Zeichen für schlechtes Design und sollen überhaupt erst möglich, wenn entfernt werden.

Die einzige Rechtfertigung ich für das Halten eines kreisförmigen Referenz denken kann, wäre ein Rück compat Problem sein. Selbst dann scheint es, wie es bei der Verwendung von Typ Spediteuren und anderen Baugruppe

festgelegt werden könnte,
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top