c# - 如何封装只适用于少数方法的私有(private)字段

标签 c# oop encapsulation

我正在为一个类中的业务域对象建模,我想知道什么是正确封装仅适用于少数方法的私有(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/

相关文章:

Perl 封装类变量?

c - 是否有任何解决方法可以在 C 中以某种方式使结构成员成为 'private'?

java - 我应该返回集合还是流?

c# - 当调用者期望特定的构造函数签名时使用构造函数注入(inject)

c# - 如何检测未知并发任务的完成推送和拉取并发队列 <T>

c# - 无法加载 'MySql.Data' 或其依赖项之一。

C# 破解 : low level difference between interface and abstract class

c# - Entity Framework 连接字符串定义

c# - 使用类型约束实现泛型类时出错

c# - 在另一个对象中实例化一个对象? (C#)