2016-07-22 17 views
0

Ich habe eine Liste von Objekten mit etwa 500.000 Elementen darin. Die Objektklasse enthält ungefähr 100 (vollständige) Eigenschaften (verschachtelt oder nicht). Alle Eigenschaften dieses Modells sind miteinander verknüpft.Aktualisieren einer Sammlung über mehrere Klassen hinweg

Ich bin Bereicherung/Zuordnung von Werten zu diesen Klassen in verschiedenen Klassen mit dem Namen Enricher, da jede Wertzuweisung hat seine eigene große Logik.

Ist es eine gute Möglichkeit, ein Listenelement über mehrere Klassen hinweg zu aktualisieren? Bitte beachten Sie, dass ich die Zwischenwerte in den Anreichern speichern muss.

Ich habe Klasse Design wie unten

class MyItem 
    { 
     public bool IsXyz { get; set; } 
     public decimal Value { get; set; } 
     public Tuple<string, string> MyTuple { get; set; } 
     public double Rate { get; set; } 
     //Like these around 100 properties 
    } 

    class Enricher1 
    { 
     public void Enrich(MyItem myItem) 
     { 
      myItem.IsXyz = true; 
     } 
    } 

    class Enricher2 
    { 
     public void Enrich(MyItem myItem) 
     { 
      myItem.Value = 3M; 
     } 
    } 

    class Enricher3 
    { 
     public void Enrich(MyItem myItem) 
     { 
      myItem.MyTuple = Tuple.Create("Test", "Test"); 
     } 
    } 

    class Enricher4 
    { 
     public void Enrich(MyItem myItem) 
     { 
      myItem.Rate = 300; 
     } 
    } 
+0

nur weil sie alle miteinander verknüpft sind, bedeutet das nicht, dass Sie sie besser in anderen Unterklassen gruppieren können. Auch deine Frage ist unklar was willst du machen? –

+0

Glauben Sie mir, Ihre Objekte müssen wahrscheinlich nicht so groß sein wie diese Eigenschaften! Haben Sie darüber nachgedacht, die Eigenschaften Ihrer Klasse in andere Klassen aufzuteilen und diese Objekte dann als Eigenschaftstyp zu verwenden? Wie zum Beispiel Klasse RidiculousPropsClass {Int Kilometerstand, Int LiterFuel, Int ...} 'zu' Klasse RidiculousPropsClass {CarProperties Eigenschaften} ... Klasse CarProperties {Int Kilometerstand, Int LiterFuel, Int ...} ' –

+0

Sie können sich Observer Design Pattern ansehen, da es das Problem der Aktualisierung mehrerer Objekte zu lösen, wenn ein spezifiziertes Objekt wird aktualisiert. Ihre Frage ist ein wenig verwirrend. – meJustAndrew

Antwort

0

Ihre Frage äußerst unklar. So lässt annehmen, dass Sie eine Instanz haben, wie:

List<MyItem> itemsList = listGetter.getList(); 

wo listGetter.getList() ist unabhängig von Code Sie verlassen sich über die Liste bekommen, die Sie wirklich haben enthalten sollte. seine eigene große Logik

Ich bereichere/Werte zu diesen Klassen in verschiedenen Klassen genannt enricher zuweisen, da jede Wertzuweisung

hat Das ist eine seltsame Art und Weise eine Liste zu aktualisieren. Sie brauchen die Klasse Enricher nicht, da es fast immer eine andere Möglichkeit gibt, etwas zu tun. Wenn Sie eine "große Logik" machen müssen (warum liefern Sie weniger vage Kommentare, wenn Sie wollen, dass dieses Problem genau gelöst wird), wenn Sie die Eigenschaften aktualisieren, dann brauchen Sie vielleicht die Eigenschaften in Klassen gruppiert, in denen Operationen stattfinden können:

class MyItem { 
    int widgetVolume { get; set { MadLogic.doMadLogic(); } } // throws TooMadForYouBroException 
    int widgetDepth { get; set; } 
    int widgetWidth { get; set; } 
    int widgetHeight { get; set; } 

    int wodgetVolume { get; set; } 
    int wodgetDepth { get; set; } 
    int wodgetWidth { get; set; } 
    int wodgetHeight { get; set; } 
} 

wird

class MyItem { 
    Widget widget { get; set; } 
    Wodget wodget { get; set; } 
} 

class Widget { 
    int widgetVolume { get; set; } 
    int widgetDepth { get; set; } 
    int widgetWidth { get; set; } 
    int widgetHeight { get; set; } 

    // Mad logic occuring here 
    void UpdateHeight(int height) { 
     this.widgetHeight = height; 
     this.widgetVolumne = this.widgetHeight * this.widgetLength * this.widgetDepth; 
    } 

class Wodget { 
    // Logic could also be in these as setter methods. 
    int wodgetVolume { get; set; } 
    int wodgetDepth { get; set; } 
    int wodgetWidth { get; set; } 
    int wodgetHeight { get; set; } 

    void UpdateHeight(int height) { 
     // Mad logic occuring here 
     this.wodgetHeight = height; 

     // Store some "intermediate" stuff, totally made up psuedo-code 
     // I'm storing the height before the update, as an example 
     Database db = SomeDbDriver.Connect("db-connection-string"); 
     db.SaveToTable("some-table", this.wodgetHeight); 

     // Property updated, as well as updated side effects for other properties. 
     this.wodgetVolumne = this.wodgetHeight * this.wodgetLength * this.wodgetDepth; 
    } 
} 

Viel mehr überschaubar! Beachten Sie, dass das MyItem jetzt nur zwei Eigenschaften referenzieren muss, und diese ganze verrückte Logik wird ordentlich in ihre eigene Klasse eingefügt, statt in eine einzelne, nicht manipulierbare, tausende von Zeilen lange Klasse. Sie können diese Klassen sogar in separate Dateien unterteilen. Stellen Sie sich vor, wie einfach es wäre, eine bestimmte Eigenschaft zu finden, die eine "WidgetHeightException" verursacht, wenn Sie debuggen müssen, und Sie haben eine einzige Klasse innerhalb einer Datei Widget.cs!

Auf die Sammlung, wenn es wie itemsList, oben deklariert ist, könnten Sie System.Linq verwenden. Verwenden Sie .Where() und all die glorreichen Methoden, vielleicht aktualisieren alle die Eigenschaften der Liste so etwas wie dies mit:

itemsList.Select(c => { 
    c.PropertyToSet = value; 
    return c; 
}).ToList(); 

aber es hängt wirklich davon ab, was Sie unter „Liste aktualisieren“. Was ist die Liste? Wie wird es erklärt? Wo ist es gespeichert? Wie können Ihre Enricher Objekte die Zwischenwerte speichern, wenn die Klassen überhaupt keine Eigenschaften haben?

MyItem item = new MyItem(); 
Enricher enricher = new Enricher(item); 

// What code can I call on the Enricher to return the value??? 
Verwandte Themen