Java面向对象设计问题:更新内部状态或返回新对象

时间:2010-02-23 15:50:29

标签: java oop encapsulation

这是一个设计问题。设计是伪代码,代表一个小例子,但我可能会在未来添加更多的方法,数据和逻辑。

在这个例子中,我正在考虑两种方法。在下面的execute方法中,我应该使用execute方法的输出返回不可变的“data / bean / model”对象,还是更新BusinessLogic类的状态。

两者都实现了相同的目标,我想要执行结果,数据应该包含在bean容器中,或者包含在BusinessLogic类的内部。

我更喜欢使用BusinessLogic类,因为SomeObject只是一个没用的bean。

你有什么想法?

public class SomeObject  {
    private String data1;
    private String data2;
}

public class BusinessLogic {

    private final IWebObject webObject;

    /* String data1; String data2 */    

    public BusinessLogic(final IWebObject webObject) {
        this.webObject = webObject;
    }

    // Approach 1        
    public SomeObject execute() {
        return new SomeObject();
    }

    or
    ...
    ...

    // Approach 2
    public void execute() {
        // Do something
        this.data1 = "data1";
        this.data2 = "data2";
    }

    public String getData1() { }
    public String getData2() { } 

} // End of the Class //

方法2的唯一问题是data1和data2不会是不可变的。我可以任意调用execute并更改这些值。

3 个答案:

答案 0 :(得分:4)

如果该方法的主要目的是执行而不返回任何内容,我个人会采用您的第二种方法并将数据保留在BusinessLogic类内部。

答案 1 :(得分:1)

在大多数情况下,我会说它取决于调用execute()方法的代码的性质。如果它只是按原样读取结果,那么将它保存在BusinessLogic类中就可以了。如果您要将结果传递给不同的方法,您应该将结果放在一个单独的类中(您可以让BusinessLogic实现一个仅包含结果方法的接口,但这可能会模糊BusinessLogic实现的位置之间的界限)结束,结果实施开始的地方)。

首先,最好将其保持在内部 - 遵循“你不需要它”的原则。当您可以看到 需要将结果传递给其他方法和其他对象时,您可以根据自己的需要对其进行重构。

答案 2 :(得分:1)

这不是一般的面向对象设计问题 - 它取决于您尝试建模的域。

  • execute是否应该更改状态BusinessLogic? (选项2)
  • 该课程如何被消费? data1和data2是否以不同的方式使用?在不同的背景下? (选项1)
  • data1和data2的生命周期是否与BusinessLogic不同? (选项1)