Laden...

Datenklasse übergeben und auf einzelne Felder zugreifen

Erstellt von EyeTrackJack vor 3 Jahren Letzter Beitrag vor 3 Jahren 852 Views
E
EyeTrackJack Themenstarter:in
35 Beiträge seit 2019
vor 3 Jahren
Datenklasse übergeben und auf einzelne Felder zugreifen

Hallo, ich habe mal eine generelle Frage zur Übergabe von Datenklassen an andere Klassen. Speziell, wie es mit der Möglichkeit steht, einerseits die ganze Klasse zu übergeben und andererseits einzelne Felder daraus von einer anderen Klasse aus zu ändern. Ich würde gerne wissen, ob das Vorgehen so in Ordnung ist:

    public partial class Options : Window
    {
        public class SomeData
        {
            public int Val1 { get; set; } = 8;
            public int Val2 { get; set; } = 5;

            public SomeData()
            {
            }
        }

        private SomeData _DataInWin = new SomeData();
        public SomeData DataInWin { get => _DataInWin; set => _DataInWin = value; } //korrekte Datenkapselung

        public int Val1 { get => DataInWin.Val1; set => DataInWin.Val1 = value; } //darf man das? ;)
        public int Val2 { get => DataInWin.Val2; set => DataInWin.Val2 = value; }

        public Options()
        {
            InitializeComponent();
        }
    }

Verwenden würde ich es so:

            Options opt = new Options();
            opt.DataInWin = new Options.SomeData(); //Die würde woanders initialisiert und hier mit den Werten übergeben.
            opt.DataInWin.Val1 = 89;
            opt.Show();
            Console.WriteLine(opt.Val1); // 89 

Zugegeben, jetzt nicht wirklich ein sinnvolles Beispiel. Aber mir geht es darum, dass ich in meinen Projekten nicht sicher bin, wie ich es machen soll. Es macht nicht immer Sinn, die ganze Klasse zu übergeben, sondern ich will auch einzelne Werte übergeben können. In manchen Situationen funktioniert es nicht, den Wert innerhalb der Klasse anzusprechen.

Auch ist die Frage, ob was dagegenspricht, die Felder der Klasse zur Datenkapselung zu nutzen.

Ich hoffe, ihr versteht was ich meine 😉

Grüße.

T
2.224 Beiträge seit 2008
vor 3 Jahren

Würde ich so nicht machen und auch so nicht empfehlen.
Wenn SomeData auch in anderen Seiten vorhanden sein soll, macht die nested Klasse dort keinen Sinn und sollte raus.
Ebenfalls machst du hier auch Doppelte Zugriffe über die Property DataInWin und über die einzelnen Properties Val1/Val2 was unnötig ist.

Eigentlich kannst du dir auch das Feld _DataInWin sparen, da C# hier mit einer Auto Property und direkter Instanzierung der Property einen eigenen Syntax dafür hat, was das ganze einfach lesbarer macht.

Wenn du nur einzelne Werte übergeben willst, dann greif im einfachsten Fall auf die Property DataInWin zu und dort setzt/holst du dir die entsprechenden Properties.
Dafür extra Properties anzulegen kann man machen, halte ich aber nur in bestimmten Fällen für sinnvoll.

Ebenfalls solltest du Standard Werte in SomeData auch als Konstanten anlegen und eine entsprechende Beschreibung hinterlegen.
Sonst weiß irgendwann niemand mehr warum die Werte mal vorgegeben wurden.


public partial class Options : Window
{
    public class SomeData
    {
        public int Val1 { get; set; } = 8;
        public int Val2 { get; set; } = 5;
    }

    public SomeData DataInWin { get; set; } = new SomeData ();

    public Options()
    {
        InitializeComponent();
    }
}

Die Zeile mit "opt.DataInWin = new Options.SomeData();" kannst du dir in diesem Fall auch sparen, da du sowohl mit deiner als auch mit meiner Variante immer schon eine Instanz hinter DataInWin liegen hast.
Du verwirfst damit nur die vorhandene Instanz und legst eine neue an!

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

E
EyeTrackJack Themenstarter:in
35 Beiträge seit 2019
vor 3 Jahren

Hallo, danke für die Antwort!
Somedata ist nur zum zeigen hier deklariert. Eigentlich verwende ich dafür eine eigene Klasse, die Datenklassen enthält.

Wie ist das eigentlich jetzt, wenn ich die Werte überprüfen will (z.B. wenn Val1 nicht größer als 10 sein darf) die übermittelt werden? Wo soll das passieren?
Manchmal will ich auch nur einen Wert übermitteln ohne dass alle anderen mitgeprüft werden.

Deshalb dachte ich an die zusätzlichen Properties, weil ich da die Werte prüfen kann. Wenn ich jetzt noch Flags setzen will, die nichts mit der Datenklasse zu tun haben, wo kann ich das? Mit Flags meine ich bool Variablen aus der Options Klasse. Manchmal ist es auch notwendig, Methoden aufzurufen. Wie bekomme ich das alles unter einen Hut?

T
2.224 Beiträge seit 2008
vor 3 Jahren

Schau dir am besten mal den Artikel zur Drei Schichten Architektur an.
Vielleicht fehlt dir einfach nur ein sauberer Aufbau deines Codes.

Link zum Artikel

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

E
EyeTrackJack Themenstarter:in
35 Beiträge seit 2019
vor 3 Jahren

Sagen wir mal, ich arbeite daran. Ich versuche schon, bestimmte Aufgaben so gut es geht, voneinander zu trennen. Aber es ist oft schwer, das wirklich konsequent hinzubekommen.

Ich weiß einige Dinge, aber mir fehlen oft Puzzlesteine, die mir helfen würden, meine Strukturen sauberer und schlüssiger zu bauen.

T
2.224 Beiträge seit 2008
vor 3 Jahren

Hängt halt von den Daten und der jeweiligen Anforderung ab und wie die DAten jeweils zusammen gehören.
Einen konkreten Vorschlag wie du deine Datenstrukturen am besten bauen musst, kann man hier kaum liefern.
Sowas hängt immer von den Anforderungen an dein Projekt ab und ergibt sich erst im laufe der Planung und der Entwicklung.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.