Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

1

15.02.2016, 22:17

[C#] Klasse um viele nicht zur grundlegenden Funktionalität gehörenden Funktionen erweitern

Hallo Leute,

ich hoffe, dass sich jemand trotz des etwas sperrigen Titels hierher verirrt und mir helfen kann. Wenn euch ein besserer Titel einfällt schreibt ihn.

Kleine Beschreibung der Verhältnisse:
Ich bin zurzeit wieder an meiner DMX-Software beschäftigt und habe schon ein paar tausend Zeilen Code C# geschrieben. :) Meine Klassen, die anfangs nur die grundlegende Funktionalität von Effekten und Geräten darstellten sind inzwischen sehr groß geworden. An der grundlegenden Funktionalität (Farbenmischen, Verknüpfen von Effekten mit Fadern oder die Ausgabe über den DMX Bus) der Klassen hat sich nicht viel geändert und dieser Teil ist recht kompakt.

Der restliche Code der Klassen stellt Funktionen bereit, die zu einem großen Teil die GUI betreffen: z.B. Farbe von Fadern, Anzeigenamen oder IDs. Die Hauptaufgabe besteht darin diese Werte zu speichern und mittels INotifyPropertyChanged der GUI eine Änderung rückzumelden. Weiterhin müssen diese Werte an bestimmte Member dieser Klassen übergeben werden, damit diese die Werte auch visualisieren können.

Fragestellung:
Nun kommt immer mehr "Schnickschnack" dazu und ich frage mich, ob diese GUI-spezifischen Funktionen in diese Klassen hineingehören. Ich habe schon überlegt, wie ich das auslagern kann, gerade weil viele Funktionen in mehreren Klassen eingesetzt werden. Leider können C#-Klassen nicht von mehreren Basisklassen erben, sondern nur von einer. Meine Idee für jede Funktionalität eine Basisklasse zu schreiben ist also sinnlos.

Meine Versuche das Problem zu lösen:
Bisher habe ich mir mit Interfaces beholfen, die wenigstens die Variablennamen auslagern und so eine gewisse Struktur schaffen. So kann ich recht schnell erkennen, ob eine Funktionen zur "Grundklasse" oder zu einer GUI-spezifischen Erweiterung gehört. Leider kann ich den Code aber nicht auskoppeln um meinen Klassencode zu kürzen.

Ich hoffe, dass ihr meine Überlegungen nachvollziehen könnt. Code ist bei dieser Designfrage denke ich unnötig. Gibt es vielleicht ein Pattern, dass diesem Problem in C# begegnet? MVVM kenne ich, allerdings weiß ich nicht ob diese Erweiterungsfunktionen da hinein gehören und wie ich das anstellen soll. :(

Schonmal Danke für eure Antworten!
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

2

15.02.2016, 23:11

Wenn ich deinen Text richtig verstanden habe, hast du genau das gemacht was man bei MVVM nicht machen sollte,
nämlich ViewModels (Buisnesslogik der GUI) und Models (Datenklassen) vermischt.

Normalerweise werden werden deine Models im ViewModel instanziert und das ViewModel gibt die benötigten Informationen
mittels Propertys und INotifyPropertyChanged an die View weiter.
Btw. wird daher das INotifyPropertyChanged-Interface auch nur von den ViewModels implementiert, bzw. legt man sich
normalerweise eine ViewModelBase-Klasse an (welche jenes Interface implementiert) und alle ViewModels erben von diesem.

MVVM wurde eigentlich nur entwickelt um die Probleme zu vermeiden die du jetzt hast. :P

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

3

15.02.2016, 23:50

Das war die schlimmste Antwort mit der ich gerechnet habe! :( Dann muss ich wohl nochmal was zu MVVM fragen:

- Speichert ein ViewModel irgendwelche Daten des Models oder etwas anderes? Speichert es das Model selbst? Oder ist es ein reiner Wrapper um ein Model?
- Darf ein Model NUR über sein ViewModel geändert werden? Oder wie bekommt die GUI Änderungen mit, die der Grundlegende-Code im Model verursacht?
- Wird ein ViewModel-Objekt pro View oder pro Model erzeugt? Und kennen sich alle drei gegenseitig oder gibts da eine Hierarchie?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

4

16.02.2016, 00:23

- Speichert ein ViewModel irgendwelche Daten des Models oder etwas anderes? Speichert es das Model selbst? Oder ist es ein reiner Wrapper um ein Model?


Zur Laufzeit sind die Daten im Model selbst gespeichert, was du zu Beginn und am Ende machst ist dir überlassen. Oft werden die Models zu Beginn aus einer Datenbank geladen und sobald nötig auch wieder
dort abgespeichert. Das wird wahrscheinlich im ViewModel geschehen.

- Darf ein Model NUR über sein ViewModel geändert werden? Oder wie bekommt die GUI Änderungen mit, die der Grundlegende-Code im Model verursacht?


Wenn man nach dem Pattern handelt, werden Models nur über das ViewModel geändert. Das wird über die Propertys geregelt bzw. in deren get und set ... du musst halt dafür sorgen dass, sobald nötig, deine
onPropertyChanged-Methode aufgerufen wird.

- Wird ein ViewModel-Objekt pro View oder pro Model erzeugt? Und kennen sich alle drei gegenseitig oder gibts da eine Hierarchie?


Normalerweise gehört zu jeder View ein ViewModel, was aber nicht ausschließt das eine View andere Views (und somit deren ViewModel) beinhaltet.
Die ViewModels beinhalten wiederum alle Models die in der View bearbeitet werden sollen d.h. da gibt es keine Grenze außer dem gesunden Menschenverstand.
Das ViewModel kapselt dabei die Models gegenüber der View. Also kennen sich View und ViewModel, als auch ViewModel und Model, aber nicht Model und View (Trennung von Daten und Darstellung).

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

5

16.02.2016, 17:14

Vielleicht habe ich ja jetzt MVVM besser verstanden. :) Einige Fragen habe ich dennoch. Ich mache mal ein Beispiel: Man hat eine Geräteklasse, die hat mehrere Objekte einer Funktionsklasse (RGB, Dimmer, Pan/Tilt) und diese wiederum haben jeweils ein Objekt der Pin-Klasse, damit sie sich an Effekte anschließen lassen. (Wie eine LED an einen IC - So habe ich das zurzeit aufgebaut) Die Objekte dieser Klassen kennen sich gegenseitig und modifizieren sich über Methoden oder direkt die Member. Keine dieser Klassen implementiert INotifyPropertyChanged.

Alle diese Objekte sollen darstellbar und über eine GUI modifizierbar sein. Muss nun jedes Model ein eigenes ViewModel bekommen? Und den Objekten bringt es doch nichts mehr, wenn sie sich gegenseitig kennen - schließlich dürfen sie doch eh nur über das jeweilige ViewModel auf das Objekt zugreifen? Jetzt habe ich doch zwei Möglichkeiten, wie ein Model ein anderes modifiziert:

- Ein Geräte-Model speichert die ViewModels aller seiner Funktions-Model und ruft dann die Funktionen der ViewModels auf.
- Ein Geräte-Model speichert die Models aller seiner Funktions-Model. Diese Models haben ihre ViewModels als public-Member gespeichert. Möchte nun das Gerät ein Funktions-Model verändern, dann schnappt es sich das richtige Model, nimmt die ViewModel-Eigenschaft von ihm und ruft da die Modifikationsroutinen auf.

Ich hoffe, ich konnte meine Frage verständlich vormulieren. ;)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

16.02.2016, 17:40

Models speichern niemals ViewModels. Die Models wissen nicht mal, dass es ViewModels gibt. ViewModels kennen untergeordnete ViewModels und ViewModels kennen Models.

Dass sich Models gegenseitig in die Methoden und gar Member greifen, ist auch nicht gut. Hierarchisch kann das schon Sinn machen, aber niemals gegenseitige Abhängigkeit verwenden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

16.02.2016, 18:06

Deine Fragen hat BlueCobold soweit beantwortet. Aber ich denke entgegen deiner eigenen Meinung hast du MVVM noch nicht
wirklich verstanden (was nicht weiter tragisch ist, es ist auch sehr abstrakt). Nimm dir doch einfach mal die 30-60 Minuten
und schau dir eines der vielen guten Videos zu MVVM auf Youtube an (am besten die englischsprachingen) und versuch den grundsätzlichen
Aufbau zu verstehen. Danach sollte dir vieles verständlicher sein.

Kann es sein dass du WPF momentan eher Windows-Forms like nutzt ? Also einfach in den CodeBehind der Views klatschst was du brauchst ?
Dann hättest du nämlich noch einiges vor dir :)

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

8

17.02.2016, 00:42

Dass sich Models gegenseitig in die Methoden und gar Member greifen, ist auch nicht gut. Hierarchisch kann das schon Sinn machen, aber niemals gegenseitige Abhängigkeit verwenden.
Und wie sollen dann meine Objekte (Models) miteinander kommunizieren, sodass die GUI das Ganze auch mitbekommt?

Nein, mein CodeBehind ist sehr leer... Ich mache ziemlich viel mit XAML-Code, Datenbindung und DataTemplates. Oder ist das auch nicht korrekt? Hab nix dagegen, wenn ich noch was vor mir habe - nur find ichs doof, wenn ich nicht weiß WAS ich noch vor mir habe und WIE ich den Berg abbauen kann. ;) Ich werde mal nach Tutorials schauen. Habt ihr gute Vorschläge? Mit möglichst wenig Akzent im Englischen. ;)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

9

17.02.2016, 01:20

Soo kleines Update:

Ich habe mir folgendes Tutorial angeschaut: https://www.youtube.com/watch?v=EpGvqVtSYjs

Nun bin ich der Meinung, das MVVM garnicht das richtige Pattern für meine Anwendung ist. So wie ich das verstanden habe ist das Hauptziel von MVVM, dass ich ein Datensatz (Model) über eine GUI (View) anzeigen und verändern kann. Dabei kann die View beliebig angepasst werden.

Warum ich finde, dass das nicht zu meiner Anwendung passt: Bei mir ist Primärziel, dass die Objekte möglichst realitätsgetreu eine Steuerung von DMX-Geräten über Effekte darstellt. Darum gibt es auch eine Hierarchie zwischen den Klassen und sie können sich gegenseitig über Methoden und Eigenschaften modifizieren. Danach geht es mir erst um die Visualisierung: (Fast) alle Objekte sollen anzeigbar sein, um Parameter vom User verändern zu lassen und um dem User Einsicht in die aktuellen Werte, mit denen gerechnet wird zu geben. Meine Anwendung stellt also keine Datensätze wie Telefonbücher oder Kundentabellen dar, sondern soll ein dynamisches System anzeigen, das erstmal ohne den Benutzer funktioniert.

Ich hoffe ihr versteht den Unterschied, den ich ausdrücken möchte. Falls das Tutorial den falschen Eindruck von MVVM in mir geweckt hat, schickt mir doch bitte einen besseren Link. ;) Ansonsten: Gibts ein besseres Pattern für meinen Anwendungsfall?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

10

17.02.2016, 08:58

Und wie sollen dann meine Objekte (Models) miteinander kommunizieren, sodass die GUI das Ganze auch mitbekommt?

Das ist grundsätzlich kein Problem ... Wenn Model B von Model A abhängig ist, dann wird im Setter von A die onPropertyChange Methode halt für beide aufgerufen.

Nein, mein CodeBehind ist sehr leer... Ich mache ziemlich viel mit XAML-Code, Datenbindung und DataTemplates. Oder ist das auch nicht korrekt?

Nein das ist super, genau diese Dinge (DataBindings, DataTemplates und leerer CodeBehind) sind essentieller Bestandteil der MVVM Architektur.

So wie ich das verstanden habe ist das Hauptziel von MVVM, dass ich ein Datensatz (Model) über eine GUI (View) anzeigen und verändern kann. Dabei kann die View beliebig angepasst werden.

Das Hauptziel von MVVM ist dasselbe wie dass jedes GUI-Paterns. Eine Struktur vorzugeben welche verhindert dass sich Darstellung, Buisnesslogic und Daten vermischen. Die Tatsache dass die Views einfach ausgetauscht werden können (bzw. mit minimalem Aufwand Neue entwickelt werden können) ist mehr eine der Besonderheiten von MVVM, welche dieses Pattern zu anderen unterscheidet.

Dein Primärziel ist mit MVVM genauso umsetzbar wie mit jedem anderen GUI-Pattern. Mit einem anderen Pattern wirst du dir genauso Gedanken um die Implementierung machen müssen. Die Probleme werden lediglich
an anderer Stelle auftauchen. Da du dich eh schon in WPF und MVVM eingearbeitet hast würde ich einfach dabei bleiben und nicht die Flinte ins Korn werfen. Wenn man es dann mal verstanden und umgesetzt hat
ist es auch eine wirklich komfortable Sache (siehe DataBinding und DataTemplates zum Beispiel).

Werbeanzeige