我最近一直在使用别人的代码,我意识到这个人对私有变量和方法参数的理念与我的不同。我一般认为私有变量只应在以下情况下使用:
(我承认,上面的许多都是轻微的重复,但它们看起来各不相同,值得这样的处理...)
这似乎是防止意外更改变量的最有效方法。似乎遵循这些标准将允许最终操纵外部引用(如果类最终被修改),从而在将来为您留下更多选项。这只是一个风格问题(如一个真正的括号或匈牙利命名惯例),还是我有这种信念的理由?在这种情况下,实际上是否有最好的做法?
修改
我认为这需要纠正。我使用上面“全局”的实际意思,“全局实例方法”并非“任何地方都可以全球访问”。
的 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;
}
}
答案 0 :(得分:31)
通常,类成员应该表示类对象的 state 。
它们不是方法参数的临时位置(这是方法参数的用途)。
答案 1 :(得分:8)
我声称这不是样式问题,而是可读性/可维护性问题。一个变量应该有一个使用,一个只使用。 “回收”变量仅仅因为碰巧需要相同类型而出于不同目的没有任何意义。
根据您的描述,听起来好像您正在处理的其他人的代码就是这样,因为所有其他用途基本上都在您的列表中。简而言之,它根据情况使用私有成员变量作为临时变量。我是正确的假设吗?如果是这样,代码就太可怕了。
任何给定变量的词法范围和寿命越小,错误使用的可能性越小,资源处理越好。
答案 2 :(得分:8)
拥有一个成员变量意味着它将保持需要在方法调用之间保持的状态。如果值不需要在调用之间存在,则它没有理由存在于单个调用范围之外,因此(如果存在的话)应该是方法本身内的变量。
风格永远是一个艰难的风格,一旦你开发了风格,你可能会陷入一种困境,很难看出为什么你做的可能不是最好的方式。
答案 3 :(得分:4)
您应该只在需要的时间和地点创建变量,并在完成后处理它们。如果类不需要类级变量来运行,那么它就不需要一个。在不需要它们的地方创建变量是非常糟糕的做法。
答案 4 :(得分:2)
班级成员应为以下任何一种:
答案 5 :(得分:1)
如果您熟悉C ++析构函数,我认为答案很简单。应该为所有成员变量分配一种可以销毁的方式,而不能提供函数参数。这就是为什么成员变量通常是对象的状态或依赖关系,这些对象的生命周期具有某种关系。
答案 6 :(得分:0)
我不确定使用全局范围变量与总是作为方法参数传递的最佳实践。 (通过“私有变量”,我假设你的意思是全局范围的变量。)
使用全局范围的变量是在.NET中实现属性的唯一方法(即使自动属性最终使用全局范围的变量,也不是您必须自己声明的变量)。
总是使用方法参数存在一系列争论,因为它使得它完全清楚值的来源。我不认为它确实有助于防止该方法对基础值进行更改,在我看来,它有时会使事情变得更难以阅读。
答案 7 :(得分:0)
我不同意为全局访问实现它或使编程更容易。通过在没有过滤任何类型的情况下全局暴露这些,使得将来确定访问变得更加困难。
答案 8 :(得分:0)
由于对象属性意味着保持状态,正如其他人所说,我的策略是默认将所有属性设为私有,除非我有充分的理由公开它们。
如果必须的话,稍后公开它们会更容易,只需编写一个getter方法(我也不必在编写一个类的开头考虑)。但是后来卷入公共财产可能需要重写大量的代码。
我喜欢保持灵活性,而不必考虑这个而不是需要。