Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 此方法属于值对象还是管理器_Java_Atg - Fatal编程技术网

Java 此方法属于值对象还是管理器

Java 此方法属于值对象还是管理器,java,atg,Java,Atg,在电子商务应用程序中,下面是高级API interface Order{ public List<PaymentGroup> getPaymentGroups(); } interface PaymentGroup{} class PaymentGroupImpl implements PaymentGroup{} class CreditCard extends PaymentGroupImpl{} class GiftCard extends PaymentGr

在电子商务应用程序中,下面是高级API

interface Order{
    public List<PaymentGroup> getPaymentGroups(); 
}

interface PaymentGroup{}

class PaymentGroupImpl implements PaymentGroup{}

class CreditCard extends PaymentGroupImpl{}

class GiftCard extends PaymentGroupImpl{}

class OrderManager{ //Manager component used to manipulate Order}
2) 将这些移动到
OrderManager

class OrderManager{
   public List<GiftCard> getGiftCards(Order order){}
}
类订单管理器{
公共列表getGiftCards(顺序){}
}

我个人更喜欢2),只是好奇有什么理由选择1)而不是2)

我有两个答案。一个是我称之为旧的Skool OOP,另一个我称之为新的Skool OOP

让我们先解决新的问题。这也改变了人们看待OOP的方式。添加hasGiftCard()等方法会导致在代码中添加条件逻辑/分支。它可能看起来像这样:

if (order.hasGiftCard()) {
    //Do gift card stuff
} else {
    //Do something else
}
最终这种代码变得脆弱。在大型应用程序上,许多开发人员将编写谓词方法。谓词方法断言某事并返回true或false。这些方法通常以“has”、“is”或“contains”开头。例如,isValid()、hasAddress()或containsFood()。还有更多的开发人员编写使用这些谓词方法的条件逻辑

为了避免所有这些条件逻辑,软件工程师改变了他们对面向对象的想法。他们不再使用谓词方法和条件逻辑,而是开始使用策略模式、访问者模式和依赖注入。您的问题域中的示例可能如下所示:

//Old Skool
if (this.hasCreditCard()) {
    orderManager.processCreditCard(this.getCreditCards());
}
以下是解决相同问题的另一种方法:

//New Skool
for(PaymentItem each : getPaymentItems()){
    each.process(this);
}
新的Skool方法解决了这个问题。将工作推给下级对象,而不是让订单和订单管理器负责繁重的工作。这些图案很光滑,因为:

  • 他们消除了很多“如果”的说法
  • 代码更加灵活,更易于扩展应用程序,并且
  • 与每个开发人员都对Order和OrderManager进行更改不同,工作分散在更多的类中,代码合并更容易
  • 那是新的Skool。回到那天,我写了很多旧的Skool面向对象代码。如果你想走这条路,以下是我的建议

    • 恕我直言,您不需要PaymentGroup接口和PaymentGroupImpl类。如果所有的支付类都扩展了PaymentGroupImpl,那么就去掉这个接口,将PaymentGroup设为一个类
    • 将isCreditCard()和isGiftCertificate()等方法添加到PaymentGroup类。让他们全部返回“false”
    • 在PaymentGroup的子类中,在适当的地方重写这些方法以返回true。例如,在CreditCard类中,isCreditCard()应返回“true”
    • 在Order类中,创建按类型筛选付款的方法。创建诸如getCreditCards()、getGiftCertificates()等方法。在传统的Java(没有lambdas或helper库)中,这些方法可能看起来像这样
    列出getCreditCards(){ 列表=新的ArrayList(); 对于(PaymentGroup each:getPaymentGroups()){ if(each.isCreditCard()){ 列表。添加(每个); } 退货清单; } -在Order类中,创建诸如hasCreditCards()之类的谓词方法。如果性能不是问题,请执行以下操作:

    boolean hasCreditCards() { return !getCreditCards().isEmpty(); } 信用卡{ return!getCreditCards().isEmpty(); } 如果性能是一个问题,请做一些更聪明的事情:

    boolean hasCreditCards() { for(PaymentGroup each : getPaymentGroups()){ if(each.isCreditCard()) { return true; } return false; } } 信用卡{ 对于(PaymentGroup each:getPaymentGroups()){ if(each.isCreditCard()){ 返回true; } 返回false; } }
    要知道,如果您添加了一个新的支付组,则必须在旧的Skool范例中的许多地方添加代码。

    我认为这在很大程度上取决于API的结构。 boolean hasCreditCards() { return !getCreditCards().isEmpty(); } boolean hasCreditCards() { for(PaymentGroup each : getPaymentGroups()){ if(each.isCreditCard()) { return true; } return false; } }