Ich verwende seit einiger Zeit Sonar-Code-Qualität-Management-Plattform, und in den meisten Fällen finde ich es sehr hilfreich, versteckte Designfehler meiner Code-Basis zu enthüllen.Sind alle zyklischen Verweise zwischen Java-Paketen fehlerhaft?
Allerdings gibt es eine Regel, die mir mehr Ärger als Hilfe gibt, und das ist ihre Überprüfung auf "zyklische Paketreferenz" Verletzungen.
Ich denke, ich verstehe völlig, wo eine solche Abhängigkeit zwischen Pacakges eine schlechte Sache ist. Zum Beispiel ist es in einem typischen dreistufigen Darstellungs/Dienst/Persistenz-Schichten-Design fast immer eine schlechte Idee, den Datenbankbehandlungscode einen Verweis zurück zu UI-bezogenen Klassen zu haben. Ich habe kein Problem damit, es als "Verletzung" zu bezeichnen.
Aber betrachten wir andere Fälle, d. H. Wie das Entwerfen einer IDE-ähnlichen Anwendung. Nehmen wir an, wir haben ein Hauptpaket, das eine Anwendung Schnittstelle enthält, die definiert List Application.getViews() Methode, um Anwendungsansichten zu verweisen.
Wenn jedoch die Ansicht Schnittstelle eine Anwendung GetApplication() Methode hat zu seiner übergeordneten Anwendung zu verweisen, die ich glaube, ein ganz gewöhnliches Design ist, wird es eine zyklische Referenz einführen, sofern jede der Schnittstellen sind in com.myapp.ui und com.myapp.ui.view jeweils getrennt.
Natürlich können Sie nur setzen die Ansicht Schnittstelle in das com.myapp.ui den Zyklus zu brechen. Aber wenn man verschiedene andere Ansicht im Zusammenhang APIS in com.myapp.ui.view haben, viele von ihnen eine andere abstrakte APIs wie Abstract, InhaltAlle, AbstractContentView, etc, ich frage mich, ob es ratsam ist, sie zu halten in separaten Paketen zu einem Verwaltungszweck.
und betrachten die genannte Anwendung hat viele andere ähnliche Fälle wie com.myapp.ui.action, com.myapp.ui.perspective, usw., die wirklich com.myapp.ui thepacakge machen würde gedrängten wenn wir sie alle dort hineinbringen sollen.
Also, welchen Ansatz schlagen Sie vor, um eine solche Situation zu behandeln? Sind wirklich alle zyklischen Pakete eine schlechte Sache? Oder wenn ich mit ihnen leben muss, wie konfiguriere ich Sonar, um nur echte, problematische Zyklen zu überprüfen?
Danke!
Lassen Sie mich bitte versuchen, einen Fall zu denken, wo View.getApplication() gerechtfertigt sein könnte. Ich nehme an, es könnte eine übliche Anforderung für eine Sicht sein, auf andere Ressourcen zu verweisen, die normalerweise mit der Anwendung verbunden sind, wie ein i18n-Nachrichtenbündel oder eine JDBC-Datenquelle usw. Vielleicht können wir alle auf eine DI-Weise sortieren, aber ich glaube daran Definition ist eine Ansicht in diesem Fall ein Teil eines zusammengesetzten Ganzen, das nicht in einem getrennten Kontext gedacht werden kann. JDBC-Datenquelle kann also keine willkürliche sein, sondern eine, die ihre Elternanwendung bereitstellt. Wäre es nicht klarer, solche Abhängigkeiten auch im Design zu zeigen? – mysticfall