这个二传手是'邪恶'吗

时间:2009-02-25 20:26:32

标签: oop setter

有很多关于吸气剂和制定者是'邪恶'的说法,而不是。

我的问题是:以下二传手是邪恶的吗? (为了简洁起见,省略了其余的课程)

int balance

public void deposit(int amount)  
{  
    this.balance += amount;  
}

此课程正在模拟ATM。在英国有一些ATM可以让你存款以及退出,因此这个对象需要一种改变其状态(余额)的方法。这个二传手是“邪恶的”吗?

12 个答案:

答案 0 :(得分:8)

除了没有处理异常条件的事实外,它看起来像是一个非常好的OO方法 - 它被称为它的功能,并且它可以达到你所期望的效果。

答案 1 :(得分:8)

我不相信当人们谈论吸气剂和制定者时这意味着什么,因为这不仅仅是将成员设置为给定值。

我不关心setter和getter,但主要是因为我认为我的“对象”是代码库中的高级实体。例如。 (IMO)在课外进行操作会“更加错误”:

account.SetBalance(account.GetBalance() + depositAmount)

相反,您已在对象中实现了更高级别的功能;你存款,让对象找出处理它的正确方法。与上面给出的getter / setter示例相比,这允许更加集中处理异常条件。

答案 2 :(得分:4)

这是一个技巧问题吗?我问,因为提供的方法甚至不是“setter”方法。这是一项行动,而不是财产。 Setters和Getters通常是私有变量(属性)的访问器方法。所以我想你问题的答案是:

这不是一个制定者,但作为对象执行操作的一般方法,它根本不是邪恶的。

答案 3 :(得分:3)

对于一个类来说,通过setter设置值没有什么不好,但这更像是一个函数,而不是直接的setter。是的,它设置了一个属性的值,但它是通过添加而不是替换以前的值来实现的,而且名称不对齐。

真正的“设定者”看起来更像是这样:

int balance

private void setBalance(int amount)
{
    this.balance = amount;
}

public void deposit(int amount)  
{  
    setBalance(this.balance + amount);  
}

但是,对于您的特定ATM问题,我非常怀疑ATM会立即为您的余额存入押金。可能需要通过单独的机制收集和发布。

答案 4 :(得分:2)

就个人而言,我会称之为方法,而不是设定者。陈规定型者将是

public void deposit(int new_balance)
{
    this.balance = new_balance;
}

它所做的只是让你直接访问类的内部,从而击败通过封装它们和限制访问获得的任何价值。这就是为什么人们不喜欢它们。

答案 5 :(得分:1)

那么你想检查负数,零金额等......但是要求它是可以的。

遵循这个经验法则,你所做的每个变量都应该是最终的,除非它必须改变,并且永远不要为实例变量设置方法,除非你真的希望它们在类之外被改变。

答案 6 :(得分:0)

不一定;你提到你想模仿ATM(自动提款机)的行为。而且你担心ATM会让你存款以及退出。但是这些操作,即存款和取款,都必须序列化。你需要所有的行为都是原子的,所以这种方法比你尝试做更多事情的方法要好。

答案 7 :(得分:0)

我看到的一个问题是你在处理钱时使用的是整体类型。如果这是一个定点数字,则不是问题,但没有迹象表明它是如此。

答案 8 :(得分:0)

国际海事组织,ATM不应该将“平衡”作为一个领域。

(另外,您的“存款”方式不是制定者)

你应该有一个带有'balance'字段的Account对象,并且可能有一个方便的方法'modifyBalance',它带有一个正值来递增或一个负值来减少余额。

然后,在执行这些类型的交易时,您的ATM方法会在Account对象上调用'modifyBalance'。

答案 9 :(得分:0)

你无法判断一个方法是否是邪恶的,它取决于上下文以及谁有权访问该对象。

如果您拥有所有字段的getter和setter,并且每个人和他的狗都可以访问该对象,那么这非常糟糕,因为基本上没有封装数据。

另一方面,如果你只为需要它的字段设置了setter,并且只有少数其他需要与之通信的对象才知道该对象,那就没问题了。

答案 10 :(得分:0)

那不是一个二传手。这是一种常规方法(或成员函数,或其他)。

setter是一个将给定变量设置为给定值的函数,通常是个坏主意。方法是执行给定类操作的函数。这对班级来说很有意义。

如果你有一个奇怪的数据结构,你实际上可能没有“平衡”变量。无论您的数据结构如何,您都必须拥有“存款”功能。有部分差异。

答案 11 :(得分:0)

这不是一个设定者,它是一种常规方法

即使它是一个二传手,也不是邪恶的

这是一个邪恶的二传手

int _balance = 0;  
public int Balance()  
{  
    get { return _balance; }  
    set { }    //now that's evil!  
}