【发布时间】:2011-06-13 15:11:43
【问题描述】:
在任何情况下都应该在类中使用类的getter-setter吗?
【问题讨论】:
标签: oop class getter-setter
在任何情况下都应该在类中使用类的getter-setter吗?
【问题讨论】:
标签: oop class getter-setter
getter setter 通常用于从外部类从内部直接访问字段。 主要优点/目的是 封装 getter setter,
如果您的 getter setter 有一些逻辑代码,请使用它。
例如:
public void setValue(int val){
if(val > 100)
this.val = 0;
else
this.val = val;
}
另见
【讨论】:
是的,getter 和 setter 很有用。因为 PHP 不支持像 int 或 string 这样的简单类型的类型提示,所以不能强制一个值是正确的类型。
通过使用设置器,您始终可以检查设置的值。当设置为 int 属性的值不是 int 时,您可以选择对其进行类型转换或引发错误,而不仅仅是接受错误的值。
这将使调试和维护您的应用程序变得更加容易。因此使用 getter 和 setter 是个好主意,即使它们除了这些检查之外不包含太多逻辑。
【讨论】:
您应该几乎在任何地方都使用 getter 和 setter,包括在类内部。如果你不这样做,那么你可能会破坏封装,更糟糕的是,你可能会使你的不变量无效。
作为一个简单的 C++ 示例:
class BankAccount
{
public:
void withdraw(int amount)
{
m_balance -= amount;
m_withdrawals++;
}
void transfer(BankAcount& other, int amount)
{
m_balance -= amount;
other.m_balance += amount;
}
private:
int m_balance;
int m_withdrawals;
};
看到错误了吗? transfer 提款,但不会增加 m_withdrawals。如果它只是调用withdraw 而不是手动减少余额,则可以避免这种情况。
这同样适用于 getter 和 setter。例如,让 getter 懒惰地初始化它们的值是很常见的。如果另一个成员函数尝试直接访问未初始化的成员,那么您将获得一个空指针取消引用。
基本上,只要 getter 和 setter 提供所需的功能,您就应该始终尝试使用它们。你做的低级的事情越多,你就会有越多的低级错误。如果您不打算使用 getter 和 setter,那么编写它们是没有意义的。
【讨论】:
@GolezTrol
主题上没有 PHP 徽章,你错了。您所描述的与二传手无关。您可以使用任何方法(不仅是 setter)强制参数类型(在 PHP 中)。
你可以写:
setX( X $x ){ ...}
setY( Y $y ){ ...}
或者只是:
iAmMethodNotASetter( X $x, Y $y){
//20lines of code here end then:
$this->x = $x;
$this->y = $y;
}
如您所见,我不需要 setter 来强制输入对象属性。
在检查变量类型后在 setter 中抛出错误无论如何都是个坏主意。这是从静态类型语言过渡到动态类型语言的程序员的常见错误。
Setter 和 geter 是 CONVENTION,它们不强制执行任何操作! 今天我们通常使用它们来创建普通的旧 Java 对象。 (POJO - 在 php 单词 POPO 中)所以它只是一个用于创建可以在库或项目之间使用的对象的约定(标准)。
您可以将 setter 与类型检查或其他任何东西结合起来,但这并不会使它们变得比它们本身更重要。
关于封装:
@org.life.java - Jigar Joshi
“主要优点/目的是 getter setter 的封装,"
@彼得亚历山大
“你应该使用吸气剂 几乎无处不在, 包括里面的“类。如果你 不要,那么你有可能 打破封装” “吸气剂和 setter 是封装”
错了,错了,错了。 封装与 getter 和 setter 无关,这是很常见的错误。我知道有很多文章一遍又一遍地颠倒重复...
更糟糕的是,getter 和 setter 无助于封装,它们可能会破坏封装。当您使用它们从对象获取一些数据而不是要求对象使用自己的数据为您做某事时,它们会这样做。
Encapsulation == 对象对其数据承担全部责任,并且不提供其行数据。私有财产的吸气剂只不过是以复杂的方式公开该财产==制动封装。
检查段落封装:http://en.wikipedia.org/wiki/C%2B%2B或http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 甚至没有一个关于 setter 或 getter 的词......
【讨论】:
setAge 方法或 Age 属性设置他的年龄。在这种情况下,setAge 是二传手吗?如果你愿意,你可以用其他方式称呼它,但我认为这只是一个认知问题。如果您将此函数命名为setAgeByNotUsingSetter 感到更安全,那么我认为您只是在自欺欺人。