Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实例化时启动很多属性是一种好的做法吗?_C#_Oop_Constructor - Fatal编程技术网

C# 在实例化时启动很多属性是一种好的做法吗?

C# 在实例化时启动很多属性是一种好的做法吗?,c#,oop,constructor,C#,Oop,Constructor,我有一个Cart类,它有很多属性: public class Cart { public Customer Customer { get; set; } public Products Products { get; set; } public Payments Payments { get; set; } public DateTime TimeOfArrival { get; set; } //...and so on } 每当我想实例化一个新的购物

我有一个Cart类,它有很多属性:

public class Cart
{
    public Customer Customer { get; set; }
    public Products Products { get; set; }
    public Payments Payments { get; set; }
    public DateTime TimeOfArrival { get; set; }
    //...and so on
}
每当我想实例化一个新的
购物车
,我都需要初始化这些属性。其中一些已为人所知(如客户),另一些尚未为人所知(如产品和付款)。这就是我在实例化一张新票证时所做的:

Cart Cart = new Cart
                    {
                        // for know properties:
                        Customer = currentCustomer,
                        TimeOfArrival = DateTime.Now,

                        // for properties that are going to be filled later:
                        Products = new List<Product>(),
                        Payments = new List<Payment>(),

                        // ...and so on
                    };
购物车=新购物车
{
//对于已知属性:
客户=当前客户,
到达时间=日期时间。现在,
//对于以后要填充的属性:
产品=新列表(),
付款=新列表(),
//……等等
};
这个解决方案显然是可行的,但在实例化时看起来非常庞大,而且在initiator中完成了很多工作,我认为这是一件坏事

我这样做是否正确,或者在实例化时启动很多属性不是一个好的做法?如果是,我应该怎么做


提前感谢

是的,还有改进的余地。但是要小心,很多取决于需求,基本上他们应该在很多情况下起主导作用。这是品味的问题。有些人比其他人更纯粹

这取决于你的项目:它有多重要?这是一个辅助项目还是你的核心业务

是的,还有改进的余地;总是有。。。现在,明年,在每一次审查中。。。只是说:没有完美的设计


现在,我的强烈偏见是:)

您的设置代表了域驱动设计中的典型情况。我稍后会发送一个链接

通常,在域驱动设计中,您会尝试确定特定的业务功能/概念,并将其封装在最具描述性的对象中。基本上,你的购物车走在正确的轨道上

但是,购物车似乎只有一点到很多领域知识

具体来说,嵌套的复杂类型可以表示您正在跨越某些域边界

例如:
客户
;它位于车内。客户可能会依次包含一个地址。。。等等

显然,一个人的地址与购物车本身无关

还有,;付款我不认为它通常被捆绑在购物车上,也许更像是一个订单

至于产品,;一个小的描述和一个到实际产品的链接就足够了。其次是明显的价格和数量

对于CART,您可能需要考虑仅存储客户ID,并且如果需要附加数据,则调用客户。


不管怎么说,这是一个普遍的话题。最好的建议是:;不要尝试涉及太多复杂的类型,只在模型中加入对特定“事物”有意义的事物。

是的,还有改进的余地。但是要小心,很多取决于需求,基本上他们应该在很多情况下起主导作用。这是品味的问题。有些人比其他人更纯粹

这取决于你的项目:它有多重要?这是一个辅助项目还是你的核心业务

是的,还有改进的余地;总是有。。。现在,明年,在每一次审查中。。。只是说:没有完美的设计


现在,我的强烈偏见是:)

您的设置代表了域驱动设计中的典型情况。我稍后会发送一个链接

通常,在域驱动设计中,您会尝试确定特定的业务功能/概念,并将其封装在最具描述性的对象中。基本上,你的购物车走在正确的轨道上

但是,购物车似乎只有一点到很多领域知识

具体来说,嵌套的复杂类型可以表示您正在跨越某些域边界

例如:
客户
;它位于车内。客户可能会依次包含一个地址。。。等等

显然,一个人的地址与购物车本身无关

还有,;付款我不认为它通常被捆绑在购物车上,也许更像是一个订单

至于产品,;一个小的描述和一个到实际产品的链接就足够了。其次是明显的价格和数量

对于CART,您可能需要考虑仅存储客户ID,并且如果需要附加数据,则调用客户。


不管怎么说,这是一个普遍的话题。最好的建议是:;不要尝试涉及太多复杂的类型,只在模型中加入对特定“东西”有意义的东西,如果您担心预先初始化属性的成本(在本例中,这看起来不是问题),然后,您可以使用
Lazy
在需要时方便地实例化属性

比如说

private Lazy<List<Product>> products;
constructor() {
   products = new Lazy<List<Product>>(()=>new List<Product>());
} 
public List<Product> Products => products.Value;
私有产品;
构造函数(){
products=newlazy(()=>newlist());
} 
公共列表产品=>Products.Value;

对于列表之类的东西,这是相当愚蠢的,但对于更昂贵的初始化,
惰性
可能很有用。

如果您担心预先初始化属性的成本(在本例中,这看起来不是问题),然后,您可以使用
Lazy
在需要时方便地实例化属性

比如说

private Lazy<List<Product>> products;
constructor() {
   products = new Lazy<List<Product>>(()=>new List<Product>());
} 
public List<Product> Products => products.Value;
私有产品;
构造函数(){
products=newlazy(()=>newlist());
} 
公共列表产品=>Products.Value;
对于列表之类的东西,这是相当愚蠢的,但对于更昂贵的初始化,
惰性
可能很有用。

使用构造函数:

public class Cart
{
    // shorthand constructor, only 1 setting, else use a normal function style constructor
    public Cart (Customer cust) => Customer = cust;

    public Customer Customer { get; set; }
    public Products Products { get; set; } = new List<Product>();
    public Payments Payments { get; set; } = new List<Payment>();
    public DateTime TimeOfArrival { get; set; } = DateTime.Now;
    //...and so on
}

var cart = new Cart( my_customer_instance );  // all thats needs to be done
公共类购物车
{
//速记构造函数,只有1个设置,否则使用普通函数样式的构造函数
公共购物车(客户客户)=>客户=客户;
公共客户客户{get;set;}
聚氨基甲酸酯