7

Ich denke über den besten Ansatz zur Trennung von Model View und Controller nach - für Java und die Verwendung von Eclipse, wenn es einen Unterschied macht.Der beste Ansatz zum Trennen von Modell, View und Controller

ich verwenden, um jede Art von MVC in seinem eigenen Paket zu trennen, aber ich bin zu denken beginnen, dass dies nicht der beste Ansatz ist:

  • com.company.client (Controler)
  • com. company.client.model
  • com.company.client.view

  • com.company.another (controler)

  • com.compa ny.another.model
  • com.company.another.view

  • com.company.yetAnother (Controler)

  • com.company.yetAnother.model
  • com.company.yetAnother.view

(viele verschiedene Pakete annehmen, jedes mit seiner eigenen Ansicht und Modell)

ich über den Gebrauch gedacht:

  • com.company.client
  • com.company.another
  • com.company.yetAnother

  • com.company.model.client

  • com.company.model. andere
  • com.company.model.yetAnother

  • com.company.view.client

  • com.company.view.another
  • com.company.view.yetAnother

Ich dachte sogar über den Controller, Modell setzen und Blick in verschiedenen Projekten . Vielleicht wäre es noch modularer und ich wäre sicherer, dass die Ansicht zum Beispiel nicht den Controller verwendet (da das Controller-Projekt die Ansicht enthält, aber nicht umgekehrt).

Was ist der beste Ansatz, um M, V und C zu trennen?

(Web- und Desktop-Anwendungen betrachten, nicht nur Web)

+0

Cross-Site-Duplikat: [Sollte ich meine Ordner nach Geschäftsdomäne oder nach technischer Domäne organisieren?] (Http://programmers.stackexchange.com/q/170348/165156) – emlai

Antwort

4

Die Graal Quest! Sie haben zweidimensionale Matrix mit vertikalen (MVC) und horizontalen (Geschäftsregeln) Schichten ...

  • ich nicht eine strenge Antwort
  • Ihr erster Ansatz sieht gut aus, weil modular (unbeabsichtigte vielleicht orientierte gefunden habe)
  • Für eine kleine App, um Ihre zweite obwohl vielleicht akzeptabel

Für mich Antwort ein Wort ist: Abhängigkeiten
Suchen Sie weiter in "Verpackungsdesign/Strategie"; "Granularität"

Einige Lese

ich dieses stark ein empfehlen:

GOOD GLÜCK!

1

sind nur Sie sich mit gehen, um das Modell, View und Controller so weit wie die Benennung und Pakete „Trennung“? Dies scheint alles zu sein, worum du fragst.

Ich neige dazu, meine Pakete als solche legen:

  • com.company.app.domain - Domain Modellklassen für die Anwendung, einfach Java Beans (Getter und Setter nur sehr wenig, wenn jede Logik). Dies wird als "das Modell" in der gesamten Anwendung verwendet und von jeder Ebene meiner Anwendung verwendet.
  • com.company.app.service - Service-Level-Klassen der Anwendung, die Business-Logik enthalten.
  • com.company.app.web.controllers - Controller-Klassen für meine Webapp. Andere webspezifische Klassen werden in verschiedene andere Unterpakete von web eingegeben.
  • com.company.app.dao - DAO-Schnittstellen die Domänenmodell Klassen für den Zugriff - dh einen Benutzer aus der Datenbank abgerufen werden, usw.

Innerhalb dieser sind die Pakete manchmal aufgeschlüsselt nach Bereich der Anwendung oder in kleinere Gruppen basierend auf Funktionalität, was auch immer angemessen erscheint.

+0

Ich habe die Frage aktualisiert, die Sie berücksichtigen sollten entweder Desktop-Apps. Übrigens, wo ist die Aussicht? In web.view pkg? –

+0

In einem Web-Projekt ist die "Ansicht" in der Regel eine Vorlage und kein Stück Code, sie wird in einem Ressourcenordner (außerhalb des Codebaums) gespeichert. –

1

Ich denke, es ist auch wichtig zu überlegen, wie Sie letztlich die Tatsache nutzen möchten, dass Sie separate Module in Ihrer Codebasis ausgebrochen sind. I.E. Welche Art von Dienstprogramm außer der grundlegenden Codequalität möchten Sie anhand Ihres Verpackungsschemas ausnutzen?

Die meisten Apps, an denen ich arbeite, folgen der folgenden Packungsstruktur: * .domain, * .servicesubservice, * .dao, * .web.controllers. Dies funktioniert gut zum Nachverfolgen von zyklischen Abhängigkeiten in der Code-Basis und/oder Abhängigkeiten, die in die falsche Richtung fließen (Controller trifft den Dao ohne die Indirektion eines Dienstes). Es stellt auch eine sehr einfache Verpackungsstruktur bereit, die nützlich und nicht belastend ist.

Bei automatischen Abhängigkeitenfolgenabschätzungen wird dies jedoch nicht berücksichtigt. Ich verwende derzeit DependencyFinder mit ein wenig benutzerdefiniertem Code, um zwei JAR-Dateien vor der QA zu vergleichen. DependencyFinder ruft alle modifizierten Methoden und ihre zugehörigen Abhängigkeiten auf der ersten Ebene ab. Benutzerdefinierter Code muss eingefügt werden, um die geänderten Methoden/Klassen den Geschäftsfunktionen zuzuordnen, und spuckt eine graphviz-Grammatikdatei zum Rendern eines geschäftsfunktionsbasierten Änderungssatz-Abhängigkeitsdiagramms für die Qualitätssicherung aus. Wir versuchen derzeit, die Ergebnisse des Tools für die intelligente Regressionstestplanung zu verwenden, insbesondere für Produktionsfehler, die ohne einen mehrwöchigen Regressionstest in die Produktion übergehen.

Die Verzeichnisstruktur, die Sie vorschlagen, wird den zweiten Fall viel einfacher machen. Allerdings fand ich auch, dass die meisten meiner Entwickler-Team nicht wirklich Abhängigkeiten kümmern, so dass das Dienstprogramm der automatischen Abhängigkeitsprüfung variieren kann :)

+0

Ich weiß nicht, ob ich dich gut verstehe, aber die Sache, die ich suche, ist Modularität und Einfachheit, für das System zu wachsen, ohne ein Monster zu werden. Und Änderungen hinzugefügt werden, ohne viel Einfluss oder viel Verständnis benötigt von der neuer Entwickler –

1

Hier ist ein Beispiel mit einer Geschichtete Architektur Design mit drei Schichten (Anwendung, Domäne ui):

in den Model-view-Controller (MVC) das Modell in einer unteren Lage sein würde, wie com.company.myapp.domain. Alle anderen Ebenen können auf das Modell zugreifen. Dann wäre die Ansicht und der Controller in com.company.myapp.ui. Das bedeutet, dass die Controller Klasse immer in der gleichen Schicht wie View ist. Verwechseln Sie den MVC-Controller nicht mit anderen Controller-Klassen, die Anwendungslogik bereitstellen und sich in der Anwendungsschicht befinden. Zum Beispiel eine SalesController in com.company.myapp.application, die Systemoperationen zur Verfügung stellt, um Verkäufe zu handhaben.

Sie können sich jetzt vorstellen, dass die SalesController einige Daten in Ihrem Modell ändert (aktualisiert einen Sale) und das Modell informiert dann den MVC-Controller, der die Ansicht aktualisiert.

Hinweis: Alle Modelle befinden sich in der domain Schicht. Alle Ansichten und MVC-Controller befinden sich in der ui-Ebene. Business-Logik-Controller sind in der application Schicht. Sie können diese drei Schichten natürlich weiter unterteilen, wenn Sie viele Klassen mit unterschiedlichen Interessen haben.

Ich hoffe, das hilft.

3

Angenommen, haben Sie mit einem nicht trivialen Projekt beschäftigen, ich glaube, Ihr Problem hat zwei Aspekte gemeinsam für den Aufbau der Architektur und die Qualität des Codes in Betracht gezogen werden:

  • Benennung
  • Modularisierung

Für die Benennung versuche ich die höchste Kohäsion in jedem Namensraum zu haben und den Common Closure Principle und Common Reuse Principle zu folgen.

Für Modularisierung versuche ich ein Modul für jedes architektonische Hauptproblem des Projekts zu verwenden und seine Pakete bequem zu benennen.

MVC ist ein Präsentationsmodul-Muster, das darauf abzielt, zu trennen, wie das Präsentationsmodul den Fluss steuert, auf welchen Datenmodellen es basiert und welche die sichtbezogene Logik ist.

In meiner Java IDE (z. B. Eclipse) verwende ich ein Projekt pro Modul, so dass Web-Modul ein Projekt und Desktop-Modul ein anderes Projekt sein wird.In einem Web-Projekt, zum Beispiel habe ich einen gemeinsamen Präfix, wie zB:

com.mycompany.app.web 

und darin hat ich ein .controllers (oder Aktionen) Nachkommen, ein .models Nachkommen und so weiter.

com.mycompany.app.web.models 
com.mycompany.app.web.actions 

Wenn ich eine Datenbank verwende, verlasse ich mich auf ein DAO-Modul, ein anderes Projekt. Das DAO-Modul hat keine Präsentation, daher hat es keinen MVC-Ansatz. Es behebt Domain-Objekte, so dass es vielleicht auf einem Domain-Modul beruht. In diesen Modulen verwende ich Präfixe wie folgt aus:

com.mycompany.app.domain 
com.mycompany.app.dao 

Ich versuche, nicht mit der Anwendung DomainModell in MVC zu verwirren; Sie sind nicht dasselbe.

Ein weiterer häufiger Fehler ist zu verwechseln Controller mit Business Logic; Geschäftslogik sollte in einem Modul platziert und über Präsentationsmodule, den Controller in einem Namespace des Präsentationsmoduls (Web oder Desktop) verteilt werden.

A Modell (in MVC, eine Ansicht Modell) ist ein Objekt durch eine Ansicht verwendet, um etwas zu dem Benutzer zu zeigen: Es kann eine, eine Kombination oder eine Sammlung von ObjektenDomain. Der Controller verwendet verfügbare Module (DAO usw.), um eine Ansicht Modell zu erstellen, und gibt sie dann an eine Ansicht weiter.

Ansicht dann nur auf seinem Modell verlassen kann (nur eine, ausdrücklich von der Steuerung erstellt) und nur für die Modelle fragen an die Steuerungen (Modelle bauen die nur in der Lage). Anzeigen, insbesondere für Webpräsentationen, ist oft in einer Mischung von Sprachen codiert, so dass ein Teil des Codes außerhalb der Namenskonventionen bleiben könnte.

+0

+1 für eine ausgezeichnete Trennung von Bedenken in Ihrem Ansatz –

1

Denken Sie darüber nach, wie Sie sich entwickeln. Entwickeln Sie pro Controller/Modell/View? Oder entwickeln Sie pro Modul. Chancen entwickeln Sie auf einem Modul und nicht auf einer MVC-Schicht. Daher denke ich, da liegt deine Antwort. Versuchen Sie, Ihre Paketnamen so nah wie möglich an den Modulen zu halten, die Ihr System repräsentiert (was Sie vermutlich bereits tun). Sie brauchen keine architektonischen Optionen in Ihren Paketnamen anzugeben.

Durch Anzeigen von Modulnamen und Domänenproblemen in Ihrem Paket erstellen Sie eine wartbare und konsistente Codebasis.

Verwandte Themen