【问题标题】:Class member variables, methods and their state类成员变量、方法及其状态
【发布时间】:2010-05-27 08:41:53
【问题描述】:

类成员变量应该如何与类方法结合使用?

假设我有一个带有成员变量“someData”的类“C”。

  1. 我调用 C.getData(),它不返回值,而是将数据放入 C.someData。实例化“C”的类首先调用 C.getData,然后通过访问成员变量 C.someData 来使用数据。

  2. 我在实例化“C”的类中调用 C.getData(),这是一个返回数据的函数。

我自己更喜欢第二种方式。但这也取决于情况,并且差异很小。拥有依赖于类内部状态的类方法是否“不好”?最好的约定是什么?

【问题讨论】:

    标签: c# .net vb.net oop state


    【解决方案1】:

    每个人对此都有自己的看法,但我从经验上看到的是,国家是邪恶的。状态迫使您在理解类的行为时考虑更多信息,因为它的行为现在隐含地受到状态的影响。在你的表现允许的情况下尽可能地避免它。我强烈支持你提到的第二种方式。第一种方法可能会导致错误和头痛。

    一般来说,我见过的一些最糟糕的方法都有像void DoSomething() 这样的签名:它不接受参数也不返回任何值。该方法的重点在于它的副作用,如果该方法命名不当,则可能不明显。

    第一种方法对其他人来说有多明显?拥有一个实际上不返回任何数据的名为 getData 的东西是否有意义? getData 操纵对象的状态是否有意义?有时,是的,为了缓存而操作对象是合理的。但是操作对象来存储你应该返回的值是自找麻烦。

    如果你真的觉得你必须使用第一个版本,至少称它为更准确的名称,如 void calculateValue() 甚至 void calculateCachedValue(),这表明它真的不应该返回任何东西,它的全部目的是计算其他东西。

    【讨论】:

    • 说得好。 @CodeMonky:其他开发人员的代码审查和对 VS IDE 的重构插件(如 DevExpress CodeRush)有助于确定最佳方法并减少快速更改代码所需的工作量。良好的命名和一致的编码是持续支持代码库的关键。
    【解决方案2】:

    C.someData 应该是一个只能公开获取的属性。您可以在第一次调用 C.someData 时将值延迟加载到 someData。

    public class C
    {
        public C() { }
    
        string someData = string.Empty;
        public string SomeData
        {
            get
            {
                if (string.IsNullOrEmpty(someData))
                    this.LoadSomeData();
                return someData;
            }
        }
    
        private void LoadSomeData()
        {
            this.someData = "Hello world";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多