2

我的支付类只有一个本地私有变量——totalCost,因此totalCost 也有一个getter 和setter 方法。TotalCost 是唯一的局部变量,因为它是唯一用于支付类中多个方法的变量。这个类应该有更多的getter和setter吗?

public class Payment {
    private int totalCost;

    public Payment(){
    }

    public int calculateItemcost(int itemQuantity, int itemPrice){
        return itemPrice * itemQuantity;

    public int calculateTotalcost(int itemCost){
        return totalCost = totalCost + itemCost;
    }


    public int calculateBalance(int clickedValue, int totalCost){
        return this.totalCost = totalCost - clickedValue;

    public int getTotalcost(){
        return this.totalCost;
    }    

    public void setTotalcost(int totalcost) {
        this.totalCost = totalcost;
    }
}     
4

4 回答 4

2

你知道得墨忒耳定律吗?

它收集了一些小的指导方针,以避免代码中的松散耦合。

Getter 和 setter 是导致类之间紧密耦合的元素。

为什么?

因为 getter 和 setter 会告诉你一个类的实现(尤其是它的字段)和它的设计。

总是系统地创建 getter/setter 代码的开发人员完全误解了面向对象编程的概念。

事实上,这会导致领域模型贫乏

因此,它强制客户端自己实现业务逻辑,即使它不是它的角色。

简而言之:在应用程序中,80% 的 getter 和 setter 是不必要的。面向对象编程是关于消息的。你想要一个对象的行为,告诉它!不要询问有关其状态的信息,以便将您的厨房放在一边,因为这通常是一种程序化的编码方式。(告诉!不要问!!)并赞成不尊重 DRY(不要重复自己)。

于 2012-10-25T01:28:16.647 回答
2

您将 getter 用于您可能需要在其他类中“获取”的字段,并将 setter 用于您可能需要在其他类中“设置”的字段。因此,在编写 getter/setter 之前,请考虑您的要求。

于 2012-10-25T01:18:31.573 回答
2

由于您只有一个字段,因此您已经有了 getter 和 setter。无关紧要。看起来不错。

虽然,重构这个:

    public int calculateTotalcost(int itemCost){
        return totalCost = totalCost + itemCost;
    }

    public int calculateBalance(int clickedValue, int totalCost){
        return this.totalCost = totalCost - clickedValue;
    }

调用setter。例子:

public int calculateTotalcost(int itemCost){
       setTotalCost(totalCost + itemCost);
       return getTotalCost();
    }

这种方式对 totalCost 的更改已本地化到该setTotalCost方法。

于 2012-10-25T01:18:36.127 回答
2

我遵循两个准则。

首先,不一定所有私有数据都应该通过 getter 和 setter 公开,因为其中一些可能仅供内部使用。

其次,getter 和 setter 应该提供对象视图,而不是实现视图。

例如,如果您的班级硬编码了 10% 的采购税率(暂时忘记硬编码这是一个坏主意),即使它是计算值而不是私人会员。此外,您可能希望根据税前价格设置值。

因此,如果税前价值为政府秃鹰增加了 10%,例如:

public void setPreTax (int preTaxAmt) {
    totalCost = preTaxAmt * 11 / 10;
}
public int getTax (void) {
    return totalCost / 11;
}

我没有为计算使用浮点数而烦恼,因为它与讨论无关并且您已经在使用int.

这种对象/实现分离是一件好事——你应该根据你想提供给它的客户的信息来设计你的 API,而不是基于内部细节。

于 2012-10-25T01:21:04.117 回答