我正在为一个类中的业务域对象建模,我想知道什么是正确封装仅适用于少数方法的私有(private)字段的最佳方法。
刚开始的时候,我的代码最初是这样的:
public class DiscountEngine
{
public Cart As Cart { get; set;}
public Discount As Discount { get; set;}
public void ApplySKUGroupDiscountToCart()
{
...
}
}
但是,ApplySKUGroupDiscountToCart()
开始变得丑陋,所以我决定将代码重构为从 ApplySKUGroupDiscountToCart()
调用的更小的私有(private)方法。我首先将大量局部变量传递到辅助方法中,但随后决定提取两个例程共有的变量并将它们设为私有(private)模块变量。新代码如下所示:
public class DiscountEngine
{
public Cart As Cart { get; set;}
public Discount As Discount { get; set;}
private int _SKUGroupItemDiscountsApplied = 0
private int _SKUGroupTotalDiscounts = 0
private int _SKUGroupID = 0
public void ApplySKUGroupDiscountToCart()
{
...
}
private void ApplyDiscountToSingleCartItem(ref CartItem cartI,
ref DiscountItem discountI)
{
...
}
}
一方面,三个私有(private)整数字段对于允许相关方法共享公共(public)变量而不需要将它们作为参数来回传递非常有用。但是,这些变量仅适用于这些相关方法,我可能添加的任何其他方法都不需要查看它们。
有没有办法封装私有(private)字段及其相关方法,同时仍然保留 DiscountEngine
类的一部分?有没有更好的方法来处理这个问题?
最佳答案
通常,将类字段设为私有(private)意味着“我有足够的纪律来确保该字段仅在此类中以适当的方式使用”。如果你的类(class)太大,你不能自信地说,那么可能类(class)试图做太多不同的事情,应该分开(参见 SRP)。
无论如何,理论已经足够了:-)。如果你想坚持使用一个类,那么你总是可以将这三个字段封装到一个私有(private)嵌套类中,例如
public class DiscountEngine
{
public Cart As Cart { get; set;}
public Discount As Discount { get; set;}
private class SKUGroup
{
public int ItemDiscountsApplied = 0
public int TotalDiscounts = 0
public int ID = 0
}
public void ApplySKUGroupDiscountToCart()
{
...
}
private void ApplyDiscountToSingleCartItem(ref CartItem cartI,
ref DiscountItem discountI)
{
...
}
}
这让您可以更自由地将类的实例作为方法参数传递给您的代码。
您可以更进一步,将所有作用于 SKU 数据的私有(private)方法也移动到嵌套类中。
关于c# - 如何封装只适用于少数方法的私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3159977/