27

我最近一直在使用其他人的代码,我意识到这个人在私有变量和方法参数方面的理念与我非常不同。我通常认为私有变量应该只在以下情况下使用:

  1. 该变量需要存储以供以后调用。
  2. 存储在变量中的数据在类中全局使用。
  3. 当需要全局操作变量时(与每个类方法读取变量的需要明显不同)。
  4. 什么时候它将使编程变得更加容易。(诚​​然含糊不清,但在许多情况下必须避免将自己逼入角落)。

(我承认,上述许多内容略有重复,但它们似乎都不同,足以值得这样处理......)

这似乎是防止意外更改变量的最有效方法。似乎遵循这些标准将允许最终操作外部引用(如果最终修改了类),从而为您在未来留下更多选择。这仅仅是一个风格问题(比如一个真正的括号或匈牙利命名约定),还是我有理由相信这种信念?在这种情况下实际上有最佳实践吗?

编辑
我认为这需要纠正。我在上面的实际意思中使用了“全局”,“通过实例方法全局”而不是“任何地方、任何地方都可以全局访问”。

edit2
要求提供一个示例:

class foo
{
    private $_my_private_variable;

    public function __constructor__()
    {
    }

    public function useFoo( $variable )
    {
        // This is the line I am wondering about,
        // there does not seem to be a need for storing it.
        $this->_my_private_variable = $variable; 
        $this->_doSometing();
    }

    private function _doSomething()
    {

        /*
          do something with $this->_my_private_variable.
        */
        // This is the only place _my_private_variable is used.
        echo $this->_my_private_variable;
    }
}

这就是我会这样做的方式:

class foo
{

    public function __constructor__()
    {
    }

    public function useFoo( $variable )
    {
        $this->_doSometing( $variable );
    }

    private function _doSomething( $passed_variable )
    {
        /*
          do something with the parameter.
        */
        echo $passed_variable;
    }
}
4

9 回答 9

36

一般来说,类成员应该代表类对象的状态

它们不是方法参数的临时位置(这就是方法参数的用途)。

于 2009-02-09T20:11:05.873 回答
8

我声称这不是风格问题,而是可读性/可维护性问题。一个变量应该有一种用途,而且只有一种用途。仅仅因为它们碰巧需要相同的类型而为不同的目的“回收”变量是没有任何意义的。

从您的描述看来,您处理的其他人的代码似乎就是这样做的,因为您的列表基本上涵盖了所有其他用途。简而言之,它根据情况使用私有成员变量充当临时变量。我可以这样假设吗?如果是这样,代码是可怕的。

任何给定变量的词法范围和生命周期越小,错误使用的可能性就越小,资源处置就越好。

于 2009-02-09T19:50:52.443 回答
8

拥有一个成员变量意味着它将保持需要在方法调用之间保持的状态。如果该值不需要在调用之间存在,则它没有理由存在于单个调用的范围之外,因此(如果它存在的话)应该是方法本身内的一个变量。

风格始终是一种艰难的风格,一旦你开发了一种风格,你可能会陷入一些陈规之中,并且很难理解为什么你所做的可能不是最好的方式。

于 2009-02-09T19:55:11.277 回答
4

您应该只在需要的时间和地点创建变量,并在完成后处理它们。如果类不需要类级变量来运行,那么它就不需要一个。在不需要的地方创建变量是非常糟糕的做法。

于 2009-02-09T19:50:01.103 回答
3

类成员应该是以下任何一种:

  • 一个类的依赖
  • 表示类状态的变量
  • 类的一个方法
于 2016-10-29T22:52:07.347 回答
1

I think the answer is straightforward if you are familiar with C++ destructors. All member variables should be assigned a way to be destructed while function parameters are not. So that's why member variables are usually the states or dependicies of an object having some kind of relation regarding their lifecycle.

于 2020-05-26T03:55:21.403 回答
0

我不确定是否有使用全局范围变量而不是始终作为方法参数传递的最佳实践。(通过“私有变量”,我假设您的意思是全局范围的变量。)

使用全局范围的变量是在 .NET 中实现属性的唯一方法(即使是自动属性最终也使用全局范围的变量,而不是您必须自己声明的变量)。

始终使用方法参数存在争议,因为它完全清楚值的来源。我不认为它真的有助于阻止该方法对基础值进行更改,而且在我看来,它有时会使事情变得更难阅读。

于 2009-02-09T19:55:26.410 回答
-1

我不同意实现它以实现全局访问或使编程更容易。通过在不进行任何过滤的情况下在全球范围内公开这些内容,使确定未来的访问变得更加困难。

于 2009-02-09T19:55:53.990 回答
-1

由于对象属性旨在保持状态,正如其他人所说,我的策略是默认情况下将它们全部设为私有,除非我有充分的理由公开它们。

如果必须的话,稍后将它们公开要容易得多,例如只需编写一个 getter 方法(我也不必在开始编写课程时就考虑到这一点)。但是稍后卷入公共财产可能需要重新编写大量代码。

我喜欢保持它的灵活性,而不必考虑超出需要的范围。

于 2012-04-26T14:03:49.247 回答