Jump to content
  • 0
Melde dich an, um diesem Inhalt zu folgen  

Geschäftslogik von GUI trennen

Frage

Bitte sagt mir, ob mein Vorgehen korrekt ist.

Möchte ich meine Logik von meiner GUI trennen, verfahre ich folgendermaßen:

Mein Controller, instanziiert ein Objekt der Klasse View und ein Objekt der Klasse Logik.

Public Class Controller(){
	private View myView;
	private Logic myLogic;

	public Controller(){
		myLogic = new Logic();
		myView = new View(myLogic);		
 	}
}

Meine View erhält im Konstruktor mein Objekt der Klasse Logik.

Public Class View(){
	private Logic logic = null;
	//paar Klassenmember

	public View(Logic myLogic){
		this.logic = myLogic;
	}
}

Somit habe ich keine Abhängigkeit zw. meiner View und meiner Logik.
Würde ich die Abstraktion noch weiter erhöhen wollen, kann ich der View ein Interface übergeben das meine Logik implementiert.

Ist das richtig? Ist das schon MVC Pattern?

bearbeitet von TheWorldDrown

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

14 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
vor 10 Minuten schrieb Memento:

Ich rieche eine subtile Bitte zum Erledigen von Hausaufgaben.

Zeig doch mal, wie du es lösen würdest. Ich bin mir sicher, dass hier niemand deine Hausaufgaben machen wird - aber genauso sicher ist, dass man Dir bei der eigenständigen Lösung helfen wird.

Ich möchte noch ergänzen, das ich diesen Thread erstellt habe um ein Verständnis davon zu bekommen, wie man Abhängigkeiten trennt.

Ich will weder das jemand, ein Projekt für mich codiert, noch irgendeine Hausaufgabe erledigt bekommen.

Wie ich das ganze lösen würde, siehst du im ersten Post meines Threads.

Das ein Administrator deinen Satz liked, finde ich ebenfalls mehr als fragwürdig.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Natürlich hast du eine Abhängigkeit zwischen deiner View und deine logic, du injectest das eine in das andere. Außerdem hast du eine doppelte Abhängigkeit von der logic Klasse, die steht in der View und in der Controllerklasse. 

bearbeitet von TheGuy

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Moin,

aktuell ist View von der konkreten Logic-Klasse abhängig.

Wenn du ein Interface hättest wäre View immer noch von einem Logic-Typen (einer Klasse die das Interface implementiert) abhängig, aber nicht von dieser konkreten Logic-Klasse - du könntest die Logic-Klassen also tauschen.

Zitat

Meine View erhält im Konstruktor mein Objekt der Klasse Logik.

Zu

Zitat

Meine View erhält im Konstruktor ein Objekt des Typs Logik.

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
vor einer Stunde schrieb TheGuy:

Natürlich hast du eine Abhängigkeit zwischen deiner View und deine logic, du injectest das eine in das andere. Außerdem hast du eine doppelte Abhängigkeit von der logic Klasse, die steht in der View und in der Controllerklasse. 

Das mit der doppelten Abhängigkeit stimmt nicht.

Du kannst hier ganz normal einen Controller instanziieren, wo bitte ist da die Abhängigkeit von Logic??

 

Aktuell besteht lediglich eine Abhängigkeit zwischen Logic und View, da der Konstruktor der View ein Objekt von Logic benötigt. Nur weil hier speziell bei der Konstruktion des Controllers die Variable logic gesetzt wird, bedeutet das noch keine Abhängigkeit.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
vor 5 Minuten schrieb Memento:

Ich rieche eine subtile Bitte zum Erledigen von Hausaufgaben.

Zeig doch mal, wie du es lösen würdest. Ich bin mir sicher, dass hier niemand deine Hausaufgaben machen wird - aber genauso sicher ist, dass man Dir bei der eigenständigen Lösung helfen wird.

Was heißt Hausaufgaben. Der Code findet keine Anwendung. Er dient nur dazu die Trennung der Abhängigkeiten zu verstehen.

Ich würde ein Interface erstellen z.B. ILogic und die Klasse Logic davon erben lassen. Dann kann ich meiner View ein Objekt von ILogic übergeben und kann somit die Logic jederzeit austauschen, sofern diese wieder ILogic implementiert.

Das gleiche könnte man mit der View machen. Und dem Controller bei der instanziierung ein Interface IView übergeben. Damit kann man die View ebenfalls austauschen.

Aber das scheint nicht die richtige Vorgehensweise zu sein. Wird mir zumindest hier gerade vermittelt.

bearbeitet von TheWorldDrown

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Und nochmal zum TE:

Dir wird eigentlich nicht vermittel, dass das die falsche Vorangehensweise ist...

Also bezogen auf das:

"Ich würde ein Interface erstellen z.B. ILogic und die Klasse Logic davon erben lassen. Dann kann ich meiner View ein Objekt von ILogic übergeben und kann somit die Logic jederzeit austauschen, sofern diese wieder ILogic implementiert."

Du sagst allerdings, dass du gerne deine View trennen möchtest von deiner Logik (um sie ggf. austauschen zu können). Warum machst du sie dann abhängig von Logik?

bearbeitet von Defneqon

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Also hier mal ein kleiner Tipp, damit du in die richtige Richtung läufst:

Deine View soll austauschbar sein. Sie ist also von nix abhängig. Genau wie deine Logik. Diese beiden Komponenten sollen nach Belieben austauschbar sein.

Der Fehler ist also im Konstruktor zu suchen: Mache den View-Konstruktor bitte unabhängig von der Logik.

Der Controller führt dann diese beiden Komponenten zusammen und stellt irgendwelche Dinge mit diesen an.

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Wie ist es so... :

public class Controller{
        public IView View { get; set; }
        public ILogic Logic { get; set; }
        public Controller(IView view, ILogic logic)
        {
            this.View = view;
            this.Logic = logic;
        }
    }

 public class View :IView{
        private Controller myController;
        public View(Controller controller)
        {
            this.myController = controller;
            ILogic logic = myController.Logic;
        }
    }

 

bearbeitet von TheWorldDrown

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Damit hast du das Sichtfeld nochmal ein Stück nach außen verschoben, bleiben wir beim ersten Beispiel.

Public Class Controller(){
	private IView myView;
	private ILogic myLogic;

	public Controller(){
		myLogic = new AbcLogic();
		myView = new View(myLogic);		
 	}
}
Public Class View() : IView{
	private ILogic logic = null;
	//paar Klassenmember

	public View(ILogic myLogic){
		this.logic = myLogic;
	}
}

Im Controller könnte myView eine beliebige Klasse mit dem Interface IView sein.

Die Klasse View nimmt ein beliebiges Objekt einer Klasse mit dem Interface ILogic an, in diesem Beispiel AbcLogic.

 

Für genaueres müsstest du dir sonst mal ein konkreteres Beispiel überlegen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • -1
vor 10 Minuten schrieb TheWorldDrown:

Kann mir jemand anhand meines Codebeispiels zeigen wie es richtig geht?

Ich rieche eine subtile Bitte zum Erledigen von Hausaufgaben.

Zeig doch mal, wie du es lösen würdest. Ich bin mir sicher, dass hier niemand deine Hausaufgaben machen wird - aber genauso sicher ist, dass man Dir bei der eigenständigen Lösung helfen wird.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • -2
vor 4 Minuten schrieb TheWorldDrown:

Ich will weder das jemand, ein Projekt für mich codiert, noch irgendeine Hausaufgabe erledigt bekommen.

vor 30 Minuten schrieb TheWorldDrown:

Kann mir jemand anhand meines Codebeispiels zeigen wie es richtig geht?

Wäre Superklasse 💖

Dan hättest du evtl. nicht fragen sollen, dass man dir explizit für deinen Code ein "Beispiel" angibt.

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Melde dich an, um diesem Inhalt zu folgen  

Fachinformatiker.de, 2020 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung