2016-06-07 16 views
0

Mein Problem ist folgendes: Ich habe Produkte, die andere Produkte benötigen, um produziert zu werden. Um zum Beispiel ein Boot zu bauen, brauchst du X Holz und Y Eisen. Ich muss irgendwie sowohl die Abhängigkeiten als auch die Produkte darstellen. Ich muss in der Lage sein zu zeigen, wie viel Holz in einem Lager ist und wie viel Holz ich brauche, um ein Boot zu bauen.So entwerfen Sie die Klassenstruktur anstelle einer großen Enum

Also war mein erster Gedanke, eine große enum Products zu erstellen, und dann konnte ich Wörterbücher wie Dictionary<Products, int> RequiredProducts oder Dictionary<Products, int> StoredProducts erstellen. Es kann jedoch viele Produkte geben und es fühlt sich an, als wäre es ein schlechtes Design, um ein Enum mit etwa 50 Feldern zu machen. Außerdem benötige ich möglicherweise mehr Informationen über jedes Produkt, zum Beispiel die grafische Darstellung, die erforderliche Technologie und so weiter.

Es wäre viel besser, einige Klassenhierarchie zu verwenden, aber wenn ich eine abstrakte Klasse Produkt, und dann daraus ableiten, wie würde ich die erforderlichen Produkte darstellen? Dictionary<Product, int> nicht tun, da jetzt würde ich eine Instanz eines Produkts benötigen, um etwas zum Wörterbuch hinzuzufügen. Die Sprache, die ich benutze, ist C#.

+0

Vielleicht können Sie hier ein Fabrikmuster verwenden. –

+0

Eigentlich neige ich dazu, Reflektionen zu verwenden und Wörterbücher mit Klassennamen als Schlüssel zu erstellen. Immer noch nicht sicher. – Dunno

Antwort

0

Wenn ich das Problem richtig verstanden habe, würde ich vorschlagen, nur die gleiche Klasse in Ihrem zu verwenden. Sie Code wie dieses:

public class Product 
{ 
    public virtual ICollection<Product> RequiredProducts {get; set;}  
    ... 
} 

Wenn Sie nicht Ihre RequiredProducts wie gewohnt Produkte verwenden, werden Sie eine separate Klasse für diesen Zweck erstellen:

public class Product 
{ 
    public virtual ICollection<Material> RequiredMaterials {get; set;}  
    ... 
} 

Lassen Sie mich wissen, wenn es doesn Löse dein Problem nicht und ich werde versuchen, dir zu helfen.

Update: Sie können leichte Proxy-Klasse für Ihr Produkt und füllen Sie es mit nur Sie brauchen. Zum Beispiel:

public class LightProduct 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

So wird es auf das tatsächliche Produkt in Ihrer Datenbank bezogen werden und Ihr Speicher wird nicht überflutet werden.

Ich würde nicht empfehlen, mit der Reflexion in diesem Fall zu gehen, da dies die Leistung in diesem Teil Ihrer Anwendung erheblich verlangsamen wird.

Ein Ansatz mit Wörterbüchern, die Namen von Produkten enthalten, kann Probleme haben, wenn sich der Produktname geändert hat, während Sie bereits ein Wörterbuch gefüllt haben. Ich würde stattdessen andere Ansätze in Betracht ziehen.

+0

Das Problem ist, dass ich keine tatsächlichen Instanzen der Produkte erstellen möchte - ich möchte etwas wie ein Rezept haben. Ich brauche nur die Informationen über wie viel von X ich Y erstellen muss, aber ich möchte den Speicher nicht mit Hunderten von X-Instanzen überfluten – Dunno

+0

Überprüfen Sie meine aktualisierte Antwort. –

+0

Das ist also im Prinzip der Ansatz mit einem großen Enum plus eine separate Klasse für jedes Feld in der Enum. Nun, ich fürchte, es gibt keine andere Lösung, aber ich werde etwas warten und vielleicht wird sich jemand etwas anderes einfallen lassen. – Dunno

0

vielleicht so:

image class scheme

using System; 
using System.Collections.Generic; 

public partial class Product 
{ 
    public Product() 
    { 
     this.ProductRecept = new HashSet<ProductRecept>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<ProductRecept> ProductRecept { get; set; } 
} 

public partial class Material 
{ 
    public Material() 
    { 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
} 


public partial class ProductRecept 
{ 
    public int Id { get; set; } 
    public int ProductId { get; set; } 
    public int MaterialId { get; set; } 
    public decimal Qu { get; set; } 

    public virtual Product Product { get; set; } 
    public virtual Material Material { get; set; } 
} 
1

Es gibt nicht sehr viele Informationen zur Verfügung gestellt. Bevor Sie jedoch an Code-Strukturen denken, sollten Sie die Geschäftsdomäne modellieren. Sie könnten

enter image description here

mit diesem Modell beginnen, die von der Information angegeben in Ihrer Frage abgeleitet wird. Mach einfach weiter und erstelle ein komplettes Geschäftsmodell. Beginnen Sie dann erst mit der Transformation in ein oder mehrere technische Modelle.

Verwandte Themen