Laden...

Objekte mit vielen Eigenschaften verwalten

Erstellt von Taladan vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.519 Views
Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren
Objekte mit vielen Eigenschaften verwalten

Hallo,

ich muß Objekte mit einer imensen Menge an Eigenschaften verwalten. Genauer gesagt geht es erst um ein Objekt (eine Beschreibung einer Person), welches imens viele Spezifikationen hat. Aktuell müssen pro Datensatz weit über 300! Eigenschaften gespeichert werden, tendenz steigend. Ich bin ein wenig geschockt über diese Vorraussetzung, das der Code sich natürlich gigantisch aufblähen wird. Hat jemand Erfahrungen die er mit mir teilen kann? Muß ich Beispielsweise für jede dieser Eigenschaften ein Property erstellen oder gibt es möglichkeiten das anders zu lösen? Dummerweise darf ich auch keine Datenbank verwenden, sonder muß bei Objekten bleiben.

Gruß dat Tala

6.862 Beiträge seit 2003
vor 14 Jahren

Hallo,

du kannst doch eine Art Dictionary benutzen wo du den Namen der Eigenschaft als Key benutzt. Ab .Net 4 könntest auch direkt mit dynamischen Objekten arbeiten, aber naja, ich persönlich mag die net so 😃

Baka wa shinanakya naoranai.

Mein XING Profil.

5.742 Beiträge seit 2007
vor 14 Jahren

Hallo Taladan,

kannst du dieses "Mega-Objekt" nicht in mehrere Objekte aufsplitten?

Eine Möglichkeit wäre z.B., dass eine Person an sich nur eine ID und den Nachnamen enthält. Dann kannst du z.B. noch ein PersonAdress (oder wie auch immer) bereitstellen, das dann alle Adressdaten enthält.

Je nach dem könntest du dann syntaktisch z.B. so etwas basteln:


public interface IPersonInfo { }

public sealed class Person //...
{
   //...

   public void GetInfo<TPersonInfo>() where TPersonInfo : IPersonInfo
   {
      //...
   }

   //...
}

//Verwendung
string street = person.GetInfo<IAddressInfo>().Street;

Implementierungstechnisch könntest du dann letztendlich auch das von talla vorgeschlagene Dictionary verwenden - im letzten Schritt kannst du sogar die zurückgegebenen IPersonInfo zur Laufzeit generieren oder füllen.

T
381 Beiträge seit 2009
vor 14 Jahren

Wenn die Eigenschaften sich nicht zu sehr unterscheiden, oder nicht zu viele Gruppen bilden, lassen sich die Gruppen in eigene objekte fassen.


Person p = new Person();

class Person {
	General General {get; set;} // Name, Alter, Geschlecht etc...
	Appearance Appearance {get; set;} // Augenfarbe, Hautfarbe, ...
	Communication Communication {get; set;} // Retohrik, Wortschatz, etc..
	SocialNetwork Social {get; set;} // Freunde, Familie, ...
	// Irgendwas für die Körperlichen Attribute wie Stärke, Geschick, etc..
	
}

Dann sind das schon nurnoch ~ 20 - 80 Attribute je Klasse.

Dann ist noch die Frage wie sehr die Attribute voneinander abhängen.
Wenn es nur wenige Datentypen sind wie String, Int, Double. Kann man halt noch wie oben schon gesagt einfach mehrere Dictionarys machen.


Person p;
p.GetStrAttribute("Name");

Finde ich aber nicht so schön. Oder man nimmt als Keys vom Dictionary nen enum mit den 300 Attributen. Wäre schon hübscher.

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Aber kann man auch an die vorgestellten Möglichkeiten binden? Immerhin sind das dann doch keine dependencyPropertys

Gruß dat Tala

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Taladan,

wenn du ein Dictionary (bzw. einen entsprechenden Indexer) verwendest, dann wird das direkte Binden vermutlich nicht funktionieren. Aber ich vermute, dass man sich eine eigene passende BindingSource-Klasse schreiben kann, um das Problem zu lösen.

herbivore

5.742 Beiträge seit 2007
vor 14 Jahren

Aber kann man auch an die vorgestellten Möglichkeiten binden?

Je nach GUI-Technologie wäre die Einführung einer Zwischenschicht (á la MVP oder MVVM) von Vorteil. Denn 400 Properties auf einer Form zu bearbeiten ist ja sicherlich nicht dein Ziel.

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Nope die werden nicht in einer Form ausgewertet. Es ist der Charakter eines Rollenspiels der dort beschrieben wird. Leider mit sehr vielen Infos 😦

Gruß dat Tala

99 Beiträge seit 2006
vor 14 Jahren

und die menge der person-eigenschaften ändert sich bestimmt noch in der zukunft:-)
Dafür ist Dictionary bestimmt. Dictionary ist serializable und wenn objekte die du in dictionary speicherst auch serializable sind (entweder einfache typen oder mit [Serializable] gekennzeichnet) kannst du sie in einer Datei speichern.

4.931 Beiträge seit 2008
vor 14 Jahren

Dummerweise darf ich auch keine Datenbank verwenden, sonder muß bei Objekten bleiben.

Hallo Taladan,

was sind denn die genauen Gründe dafür? Weil irgendwie wirst du die Objekte ja abspeichern wollen?
Und insbesondere eine "Embedded Database" à la 'SQLite' würde sich da doch perfekt für anbieten (Alternativ: 'MS SQL Server Compact' sowie 'VistaDB' bieten sogar direkten LINQ-Support).

Denn die typischen Datenbank-Features wie Suchen, Sortieren, Gruppieren etc. wirst du ja sonst von Hand nachprogrammieren müssen (und das ganz bestimmt nicht effizienter).

Vllt. könntest du ja noch ein paar Infos über das RPG rausrücken? -)

X
1.177 Beiträge seit 2006
vor 14 Jahren

huhu,

Nope die werden nicht in einer Form ausgewertet. Es ist der Charakter eines Rollenspiels der dort beschrieben wird. Leider mit sehr vielen Infos 😦

Dann denke ich, dass die meisten dieser Infos gut in einem Dictionary zu speichern sind. Es dürften sogar größtenteils Zahlen sein, womit man dann ein einfaches dict<string, float> oder so bekommt.

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.