这是一个低级别的设计问题。我正在努力掌握面向对象编程。
我正在写一个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;
}
}
我认为,这实际上取决于责任和计算方法的作用。您应该记住SRP (http://en.wikipedia.org/wiki/Single_responsibility_principle)来进行OO设计。还有高内聚和松耦合原则。
如果computeA()、B和C不相关,则应该拆分适配器类。如果它们是相关的,那么适配器类应该以不同的方式命名,以表达它的实际功能。例如:TaxCalculator。
然后你可以创建一个新的类,接收一个TaxCalculator和一个MyValueObject。或者只是将应用程序留在计算器中(尽管一个类有两个职责,这通常是不好的)。在后一种情况下,也许您可以调用类TaxCalculationsSetter或类似的东西,并使计算方法私有。瞧,你又满足了SRP。: -)
永远记住"责任是什么",是一件有点主观的事情。
正如izaera已经提到的,这在很大程度上取决于你没有提供的细节或问题。但是,至少有一件事,在我看来是不对的:
看起来你的value对象的构造需要一些逻辑。现在的问题是,它应该去哪里?您已经在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等
看起来不错。您不应该总是寻找要使用的编程模式。最重要的是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;
}
}