用于填充值对象的面向对象的代码

时间:2012-12-21 11:47:09

标签: java oop procedural-programming

这是一个低级设计问题。我试图抓住面向对象的编程。

我正在编写一个Java类,其中包含一个设置值对象的数据成员值的方法。这些值是由我的类根据一些业务逻辑计算的。最后我的类应该返回如此填充的值对象。这种面向对象最直接的方式是什么?

我似乎要采用的一种可行方法是在我的Java类中为每个需要设置的数据成员(VO)创建compute()方法。这些计算方法中的每一个都返回我使用值对象的相应setter方法设置的所需值。 但是,我认为这种方法比面向对象更具程序性,因为我只是按顺序在程序中调用这些计算方法并填充我的值对象。

那么我可以使用/查看哪些设计(...设计模式,可能?)或最佳实践,以便此代码变为面向对象。

代表性代码(我现在拥有的):

class Adapter {   // this is my Java class
    MyValueObject applyBusinessLogic(Input object)
    {
        MyValueObject vo = new MyValueObject();
        vo.setA(computeA());
        vo.setB(computeB());
        vo.setC(computeC());
        return vo;
    }

    String computeA() { ...some logic... return a;}
    String computeB() { ...some logic... return b;}
    String computeC() { ...some logic... return c;}
}

class MyValueObject {
      String a;
      String b;
      String c;

      public void setA(String a)
      {
           this.a = a;
      }

      public void setB(String b)
      {
           this.b = b;
      }

      public void setC(String c)
      {
           this.c = c;
      }
}

3 个答案:

答案 0 :(得分:1)

恕我直言,这实际上取决于责任和计算方法的作用。您应该记住SRP(http://en.wikipedia.org/wiki/Single_responsibility_principle)来做OO设计。同样具有高内聚力和松散耦合原则。

如果computeA(),B和C不相关,则应拆分Adapter类。如果它们是相关的,那么你的Adapter类应该以不同的方式命名,以表达它真正的作用。例如:TaxCalculator。

然后你可以创建一个接收TaxCalculator的新类和一个执行apply的MyValueObject。或者只是将申请留在计算器中(尽管这对一个班级来说是两个责任,这通常很糟糕)。在后一种情况下,也许你可以调用类TaxCalculationsSetter或类似的东西,并使计算方法私有。瞧,你会再次满足SRP。 ; - )

始终牢记"什么是责任"是,有点主观。

我希望这已经澄清了一些事情。

答案 1 :(得分:1)

正如izaera已经提到的那样,它很大程度上取决于你没有提供的细节或问题。但是,至少有一件事看起来不对我:

似乎构造你的价值对象需要一些逻辑。现在的问题是,它应该去哪里?你已经在Adapter中完成了它。但是,它可能不对,因为VO的构造属于VO而不是适配器。因此,我肯定会将这种逻辑移到VO本身 - 作为其构建的一部分。

因此,在我看来,将这种逻辑转移到VO可以改善设计。

...
MyValueObject vo = new MyValueObject(); 
vo.setA(required input);
vo.setB(required input);
vo.setC(required input);

class MyValueObject {
      String a;
      String b;
      String c;

      public void setA(required input)
      {  
          ... some logic
          this.a = result of logic
      }

      public void setB(required input)
      {  
          ... some logic
          this.b = result of logic
      }

      public void setC(Srequired input)
      {
             ... some logic
          this.c = result of logic
      }
}

显然,如果使用构造函数完成构建,整个过程会变得更好,除非你必须使用setter,如果你使用了一些ORM等。

答案 2 :(得分:0)

对我来说没问题。您不应该总是寻找要使用的编程模式。最重要的是KISS(保持愚蠢和简单)

我会考虑是否可以使MyValueObject成为不可变的。

class Adapter {   // this is my Java class
    MyValueObject applyBusinessLogic(Input object){
        return new MyValueObject(computeA(),computeB(),computeC());
    }

    String computeA() { ...some logic... return a;}
    String computeB() { ...some logic... return b;}
    String computeC() { ...some logic... return c;}
}

class MyValueObject {
    final String a;
    final String b;
    final String c;

    public MyValueObject(String a, String b, String c){
        this.a=a;
        this.b=b;
        this.c=c;
    }

}
相关问题