如何设计类结构而不是使用大枚举

时间:2016-06-07 14:11:15

标签: c# oop uml

我的问题如下:我有产品,需要其他产品才能生产。例如,要制作船,您需要X木材和Y铁。我必须以某种方式表示依赖关系和产品。我需要能够显示一些储存中有多少木材以及建造船只需要多少木材。

所以我的第一个想法是创建一个大的枚举Products,然后我可以构建像Dictionary<Products, int> RequiredProductsDictionary<Products, int> StoredProducts这样的词典。然而,可能会有很多产品,并且用大约50个字段制作枚举感觉设计不好。而且,我可能需要有关每种产品的更多信息,例如其图形表示,所需技术等。

使用某些类层次结构会好得多,但如果我创建一个抽象类Product,然后从中派生出来,我将如何表示所需的产品? Dictionary<Product, int>无法做到,因为现在我需要一个产品实例来向字典中添加内容。我使用的语言是C#。

3 个答案:

答案 0 :(得分:1)

提供的信息不多。但在考虑代码结构之前,您应该对业务领域进行建模。你可以从这个模型开始

enter image description here

从您问题中所述的信息中推断出来。继续这样做,创建一个完整的商业模式。然后才开始将其转换为一个或多个技术模型。

答案 1 :(得分:0)

如果我正确地理解了这个问题,我建议你在你的内部使用同一个类。您将拥有以下代码:

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

如果您不打算像往常一样使用RequiredProducts产品,可以为此目的创建一个单独的类:

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

如果它没有解决您的问题,请告诉我,我会尽力帮助您。

更新:您可以为您的产品制作轻量级代理类,并仅在您需要时填写它。例如:

use Rack::Session::Cookie, key: 'rack.session',
    domain: 'mydomain.com',
    path: '/',
    expire_after: 2592000,
    secret: ENV['SESSION_SECRET']

因此它将与您数据库中的实际产品相关,并且您的记忆力不会被淹没。

我不建议在这种情况下使用反射,因为这会显着降低应用程序这一部分的性能。

如果在已填写字典的情况下更改了产品名称,则包含包含产品名称的字典的方法可能会出现问题。我会考虑采用其他方法。

答案 2 :(得分:0)

也许如此:

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; }
}