gpt4 book ai didi

java - 处理继承时删除条件语句

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:19 28 4
gpt4 key购买 nike

我想避免条件语句并应用一些技术使代码在处理继承类时更易于维护和扩展。

在这个例子中我们有。

MarketOrder 和 LimitOrder 均从基类 Order 扩展而来。

TradeServiceImpl 与方法 getUnitPrice 计算 2 个订单将被交易的价格。

此方法有几个条件来为不同类型的订单选择正确的价格。此外,它正在转换为派生类。

这个方法的问题是,如果我想添加 5 个新订单,我将有 7*7=49 个 if 语句,其中一些我需要转换为派生类,我可能会与另一个派生类混淆,这看起来很容易编写有缺陷的代码,并给我一种我应该重新设计的味道。

请问我有什么想法吗?

// Domains.

public class Order{

private OrderTypeEnum orderType;
// can be buy or sell

public OrderTypeEnum getOrderType() {
return orderType;
}
public void setOrderType(OrderTypeEnum orderType) {
this.orderType = orderType;
}
}

public class LimitOrder extends Order{

private Long unitPrice;

public Long getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(Long unitPrice) {
this.unitPrice = unitPrice;
}
}

public class MarketOrder extends Order{

}

// Service.

public class TradeServiceImpl implements TradeService{

private TradeRepository tradeRepository;


public Long getUnitPrice(Order buyOrder, Order sellOrder){

if(buyOrder instanceof MarketOrder && sellOrder instanceof MarketOrder){
return tradeRepository.getLastPrice();
}

if(buyOrder instanceof MarketOrder && sellOrder instanceof LimitOrder){
return ((LimitOrder)sellOrder).getUnitPrice();
}

if(buyOrder instanceof LimitOrder && sellOrder instanceof MarketOrder){
return ((LimitOrder)buyOrder).getUnitPrice();
}

if(buyOrder instanceof LimitOrder && sellOrder instanceof LimitOrder){
return ((LimitOrder)buyOrder).getUnitPrice() + ((LimitOrder)sellOrder).getUnitPrice() /2;
}

return 0L;
}
}

最佳答案

首先,有两种情况可以合并为一种情况:当顺序不同时:

 if(buyOrder instanceof MarketOrder && sellOrder instanceof LimitOrder){
return ((LimitOrder)sellOrder).getUnitPrice();
}

if(buyOrder instanceof LimitOrder && sellOrder instanceof MarketOrder){
return ((LimitOrder)buyOrder).getUnitPrice();
}

收件人:

if(!buyOrder.getClass().equals(LimitOrder.getClass())){
return ((LimitOrder)sellOrder).getUnitPrice();
}

另一方面,您可以使用订单类作为包含函数对象的映射的索引。这样您就可以通过向该 map 添加元素来扩展您的功能。

您可以使用实现如下接口(interface)的匿名内部类来封装计算算法:

public interface IFunction {
public Long execute(Order oA, Order oB);
}

并决定使用顺序类访问此 map 时执行的行为:

Map<Class, Map<Class, IFunction>> opClass2calcAlgorithm = new HashMap();

IFunction market_market = new IFunction() {

@Override
public Long execute(Order a, Order b) {
return tradeRepository.getLastPrice();
}
};

IFunction market_limit = new IFunction() {

@Override
public Long execute(Order a, Order b) {
return ((LimitOrder)a).getUnitPrice();
}
};

Map<Class, IFunction> marketMap = new HashMap();
marketMap.put(MarketOrder.class, market_market);
marketMap.put(LimitOrder.class, market_limit);
opClass2calcAlgorithm.put(marketMap);

最后,您的 getUnitPrice 方法可以这样实现:

public Long getUnitPrice(Order buyOrder, Order sellOrder){

long ret = 0L;

Map<Class, IFunction> firstLevel = opClass2calcAlgorithm.get(buyOrder.getClass());
if(firstLevel == null) return ret;
IFunction calcAlg = firstLevel.get(sellOrder.getClass());
if(calcAlg == null) return ret;

ret = calcAlg.execute(buyOrder, sellOrder);

return ret;
}

关于java - 处理继承时删除条件语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23211468/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com