Laden...

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

Erstellt von Ayke vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.892 Views
Ayke Themenstarter:in
643 Beiträge seit 2006
vor 11 Jahren
Klassendesign - Schreiben auf Daten entkoppeln... macht es Sinn ?

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 ?

5.941 Beiträge seit 2005
vor 11 Jahren

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

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 11 Jahren

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.

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 11 Jahren

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.

5.657 Beiträge seit 2006
vor 11 Jahren

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:

Wirkt irgendwie alles dirty oder ?

Christian

Weeks of programming can save you hours of planning

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 11 Jahren

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.

5.657 Beiträge seit 2006
vor 11 Jahren

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

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 11 Jahren

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.