Forum: PC-Programmierung [c#] Frage zu Organisation mit Klassen


von Collector (Gast)


Lesenswert?

Hi zusammen,

ich habe in meinem Programm eine ICollection mit vielen Instanzen einer 
selbst erstellten Klasse, die ich jetzt einfach mal "Objekt" nenne. Die 
Objekte sollen allerdings die ICollection kennen; mit den anderen 
Objekten kommunizieren, neue Instanzen erstellen, oder sich selbst 
daraus löschen können. (Ich iteriere von Zeit zu Zeit durch die 
ICollection und rufe Funktionen auf in denen dies geschehen soll.) Dazu 
kommen noch einige andere Klassen, die ich im Hauptprogramm 
initialisiere, auf die die Objekte ebenfalls Zugriff haben sollen.
Wie teile ich nun den Objekten die ICollection und andere Klassen mit, 
und ist das überhaupt so sinnvoll?
Ich hatte überlegt einfach als Variable in die privaten Daten der Klasse 
eine ICollection<Objekt> und die anderen Klassen zu erstellen, denen ich 
bei der Initialisierung die eigentlichen Instanzen zuweise, jedoch finde 
ich dies sehr contra-intuitiv:
1
void main()
2
{
3
  ...
4
  Klasse1 klasse1 = new Klasse1();
5
  Klasse2 klasse2 = new Klasse2();
6
  private ICollection<Objekt> objektCollection;
7
  Objekt objekt1 = new Objekt(objektCollection, klasse1, klasse2,...);
8
  ...
9
}
10
11
class Objekt
12
{
13
  private ICollection<Objekt> objektCollection;
14
  private Klasse1 klasse1;
15
  private Klasse2 klasse2;
16
  ...
17
18
  void Objekt(ICollection<Objekt> objektCollection, Klasse1 klasse1, ...)
19
  {
20
    this.objektCollection = objektCollection;
21
    objektCollection.Add(this);
22
    this.klasse1 = klasse1;
23
    ...
24
  }
25
26
  public void Foo()
27
  {
28
    // hier soll jetzt mit objektCollection, Klasse1, ... gearbeitet werden
29
    ...
30
    Objekt objekt = new Objekt();
31
    objektCollection.add(objekt);
32
    ...
33
  }
34
35
  public void Bar()
36
  {
37
    // hier soll jetzt mit objektCollection, Klasse1, ... gearbeitet werden
38
  }
39
40
  public void Remove()
41
  {
42
    objektCollection.Remove(this);
43
  }
44
  ...
45
}

Intuitiver hätte ich die Idee gefunden bei jedem Funktionsaufruf (im 
Beispiel oben von Foo, Bar und noch ein paar weiteren Funkeionen) die 
ICollection&Co mitzugeben, allerdings werden die Zeilen dann relativ 
lang und unübersichtlich.

Wie würdet ihr das machen?

Schöne Grüße,
Max

von Dr. Sommer (Gast)


Lesenswert?

Normalerweise™ sollten Objekte nicht wissen, wie sie gespeichert sind 
(produziert Abhängigkeiten und erschwert die Verwendung des Klasse); ob 
in einer ICollection, einer lokalen Variable oder was auch immer. 
Algorithmen, die mit Instanzen der Klasse und eben dieser ICollection 
rumhantieren, gehören vielleicht einfach nicht in diese Klasse - sondern 
vielleicht in eine Management-Klasse der die ICollection gehört, oder 
globale Funktionen etc.

von Amöbenfurz (Gast)


Lesenswert?

Wie Dr. Sommer schon angedeutet hat: Die armen Elemente der Collection 
wissen und machen viel zu viel.

Du hast das Problem abstrahiert, aber dabei sind natürlich auch 
Informationen flöten gegangen. Eine simple Möglichkeit ohne Kenntnis der 
Details:
1
class MyCollection
2
{
3
  public .. Add(...) ...
4
  public .. Remove(...) ...
5
  ...
6
  
7
  public void Bar()
8
  {
9
    // hier soll jetzt mit objektCollection, Klasse1, ... gearbeitet werden
10
  }
11
12
  private Klasse1 klasse1;
13
  private Klasse2 klasse2;
14
  private EineCollection objektCollection;
15
}

Ein paar weiterführende Stichworte, um die Scheuklappen loszuwerden, die 
entstehen, wenn man lange auf das Problem starrt:
- Interfaces
- Visitor-Pattern
- List<T>.RemoveAll
- Linq
- IoC-Container
- Evtl. Factory-Patterns
- Evtl. Mediator-Pattern

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.