C# 在实例化时启动很多属性是一种好的做法吗?
我有一个Cart类,它有很多属性: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 } 每当我想实例化一个新的购物
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;}
聚氨基甲酸酯