Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Klassendesign - Schreiben auf Daten entkoppeln... macht es Sinn ?
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

Klassendesign - Schreiben auf Daten entkoppeln... macht es Sinn ?

beantworten | zitieren | melden

Hallo Leute,

ich möchte gerne wissen ob es sinnvoll ist das Schreiben auf Entity bzw auf Daten zu entkoppeln.
Hab zum Beispiel folgendes Szenario :

class ProcessDaten : IEntity
{
	public int Id { get; set; }
	[NotMapped]
	public Process MeinProcess { get; set; }
	public bool CanBeEnabled { get; set; }
	//...............
}
Vom GUI Thread wird jetzt alles initialisiert, bis auf Informationen die nur zu Laufzeit bekannt sind.
Nun habe ich eine Klasse die sich darum kümmern soll.

ProcessDatenInitialisierer (auf eng) wollte ich Sie nennen, auch wenn der Aufgaben-Bereich nicht so ganz klar ist.
Sie initialisiert verschiedene Eigenschaften und tut das auch für jede neue Entity innerhalb meiner Repository automatisch.
Schon könnte ich Sie ProcessDatenInitialisiererAndBinder nennen. Außerdem passieren manche Zuweisungen nicht aus den GUI Thread.
Ich könnte jetzt den Dispatcher übergeben um das zu lösen. Jetzt hab ich mir überlegt Events zu verwenden,
um in einer anderen Klasse Objekte zu erstellen und zuzuweisen. Wirkt irgendwie alles dirty oder ?
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Ayke am .
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 6141
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo Ayke

So ganz steige ich nicht durch, was du denn genau willst.
Aber eines kann ich dir mit Gewissheit sagen: Ein Klassenname der "And" oder "Und" enthält, zeigt eindeutig das die Klasse für zwei Dinge gleichzeitig verantwortlich ist und das ist nicht gut.

Was sind denn das für Eigenschaften die initialisiert werden?

BTW: Auf engl. heisst es Initializer, nicht Initialiser.


Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

Hey Peter,

schön das ich so Kompetente Hilfe bekomme.

Ich versuche hier soviel Deutsch wie möglich zu verwenden, denn sonst muss man sich schon genug mit Englisch rumschlagen.

Es geht um eine Klasse die Informationen überwacht und bei Eintreffen eines Ereignisses, einen Verlauf dazu erstellt und Eigenschaften wie Datum, Ort speichert.
GPS wird zu Laufzeit initialisiert und hat Events die mich über weitere Informationen zum Verlauf versorgt.

public class Spaziergang : IEntity
{
	public string WoWilstDuHin { get; set; }
        public bool SpaziergangAktiv { get; set; }
	public GPS MeinGPS { get; set; }
	public Collection<Verlauf> Verläufe { get; set; }
}

public class Verlauf : IEntity
{
	public DateTime StartDatum { get; set; }
	public DateTime EndDatum { get; set; }
	public bool AllesGutGegangen { get; set; }
	public virtual Spaziergang { get; set; }
}

Ich habe jetzt 2 Repository's Spaziergänge und Verläufe.
Der Benutzer fügt neue Spaziergänge hinzu auf die geprüft werden soll.
Eine Klasse "SpaziergängeInitialisierer" macht ungefähr sowas (ist in Notepad geschrieben und soll nur zum Verständnis dienen)

public class SpaziergängeInitialisierer
{
	public SpaziergängeInitialisierer(Repository<Spaziergang> spaziergänge)
	{   
	    InitialisierereAlle(spaziergänge);
	    
		spaziergänge.CollectionChanged = (sender, e) => { 
			if (e.Event ==  NotifyCollectionChangedAction.Add)
			    InitialisierereEinen((Spaziergang)sender);
		};
		spaziergänge.PropertyChanged = (sender, e) => { 
			if (e.PropertyName ==  "SpaziergangAktiv")
			   ((Spaziergang)sender).MeinGPS.Activ = ((Spaziergang)sender).SpaziergangAktiv;
		};
	}
	
	private static void InitialisierereAlle(Repository<Spaziergang> spaziergänge)
	{
		foreach (var spaziergang in spaziergänge)
		{
			InitialisierereEinen(spaziergang);
		}
	}
	
	private static void InitialisierereEinen(Spaziergang spaziergang)
	{
		spaziergang.MeinGPS = new GPS();
		spaziergang.MeinGPS.Ort = spaziergang.WoWilstDuHin;
		spaziergang.MeinGPS.Activ = spaziergang.SpaziergangAktiv;
	}
}

public class VerlaufInitialisierer
{
	public VerlaufInitialisierer(Repository<Spaziergang> spaziergänge)
	{
		foreach (var spaziergang in spaziergänge)
		{
			spaziergang.MeinGPS.OrtErreicht = (sender, e) = {};
			//unsw................................................................
		}
	}
}

Ich hoffe damit kann man mehr anfangen.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ayke am .
private Nachricht | Beiträge des Benutzers
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

Da es ein öffentliches Projekt wird muss ich das sehr ordentlich halten,
sonst würde ich die Klassen einfach SpaziergangManager... nennen.
Ich bleib ich bei meiner Event-Idee.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5963
Herkunft: Leipzig

beantworten | zitieren | melden

Hi Ayke,

geht es dir um die englisch-deutschen Bezeichner, oder was ist sonst deine Frage? Die einzige Frage, die ich erkennen kann, heißt:
Zitat
Wirkt irgendwie alles dirty oder ?

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

Hey Christian,

habe meine Frage im ersten Post nicht ganz klar formuliert.
Schau dir bitte mein vorletzten Post an. Mir geht es darum das meine Klassen mehrere Zuständigkeiten haben (was ja nicht sein sollte) und deshalb mir kein passender Name für Sie einfällt.

Einmal reagieren die Klassen auf Ereignisse und gleichzeitig initialisieren und weisen verschiedene Eigenschaften von anderen Klassen zu. Ich glaube so etwas ist schwer nachzuvollziehen ohne Quellcode, deshalb habe ich es mit einen Beispiel versucht.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ayke am .
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5963
Herkunft: Leipzig

beantworten | zitieren | melden

Ich verstehe nicht so richtig, worauf du hinauswillst. Aber ich verstehe auch nicht den Sinn der Initialisierungs-Routinen und -Klassen. Statt so:


// Im EventHandler:
((Spaziergang)sender).MeinGPS.Activ = ((Spaziergang)sender).SpaziergangAktiv;

// In der Initialisierungs-Methode:
spaziergang.MeinGPS = new GPS();
spaziergang.MeinGPS.Ort = spaziergang.WoWilstDuHin;
spaziergang.MeinGPS.Activ = spaziergang.SpaziergangAktiv;

könnte man doch auch so:


class Spaziergang
{
  private MeinGPS gps = new MeinGPS();

  public bool SpaziergangAktiv
  {
    get { return gps.Aktiv; }
    set { gps.Aktiv = value; }
  }

  public string WoWilstDuHin
  {
    get { return gps.Ort ; }
    set { gps.Ort = value; }
  }

}

Und schon braucht es keine EventHandler und Initalisierungsroutinen mehr...

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

Ahmm ein paar Kleinigkeiten könnte ich so abändern, was eingentlich offentsichtlich sein müsste :) Ich wollte dies glaub ich nicht direkt in meiner Entity Klasse machen, wofür es eingentlich keinen Grund gibt. Ich muss auch auf Events von von GPS reagieren und Eigenschaften nach den feuern zuweisen. Das leuft dann aber schon. Danke erstmal.
private Nachricht | Beiträge des Benutzers