Zum Inhalt springen
  • 0

Geschäftslogik von GUI trennen


Frage

Geschrieben (bearbeitet)

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

14 Antworten auf diese Frage

Empfohlene Beiträge

  • 0
Geschrieben (bearbeitet)

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
  • 0
Geschrieben

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.

 

  • 0
Geschrieben
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.

  • 0
Geschrieben (bearbeitet)
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
  • 0
Geschrieben (bearbeitet)

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
  • 0
Geschrieben
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.

  • 0
Geschrieben

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.

 

  • 0
Geschrieben (bearbeitet)

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
  • 0
Geschrieben

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.

  • -2
Geschrieben
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.

  • -3
Geschrieben
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.

 

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

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

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

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

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

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

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...