Key, value);
}
);
抽离通用逻辑
里面有很多如下重复代码
if (newItemIndexMap.get(oldItemId) == null) {
newItemIndexMap.put(oldItemId, new HashMap<>());
}
newItemIndexMap.get(oldItemId).putAll(value);
实际上就是将新的item_core_id 映射成 item.id ,然后填充到新的Map,可以抽离出一个函数,然后复用。
private static void putNewIndexMap(Map<String, Map<String,Object>> newItemIndexMap,
String indexKey, Map<String,String> value, Function<String, String> getOriginItemIdFunc) {
String originItemId = getOriginItemIdFunc.apply(indexKey);
if (newItemIndexMap.get(originItemId) == null) {
newItemIndexMap.put(originItemId, new HashMap<>());
}
Map<String,Object> srcMap = newItemIndexMap.get(originItemId);
newItemIndexMap.get(originItemId).putAll(merge(srcMap, value));
}
调用: putNewIndexMap(newItemIndexMap, indexKey, value, key -> key);
配置化
看如下代码,里面含有 item_price: , item_price:item_id 这样的业务信息,破坏了方法的通用性。
if (indexKey.startsWith("item_price:")) {
// item_price 与 item_id 一对一关系
String itemCoreId = itemIndexMap.get(indexKey).get("item_price:item_id");
}
可以抽离出来做成配置。好的配置可以让代码大大简化。仔细思考下整个过程:当 indexKey 包含某个表的前缀时,取它对应的 itemCoreId 的字段,然后得到 itemCoreId ,再根据 putNewIndexMap 方法将对应的 Map 添加到最终的Map中。见如下代码:
private static Map<String,String> itemIdConf = new HashMap() {
{
put("item", "item:item_core_id");
put("item_core", "item_core:id");
put("item_price", "item_price:item_id");
put("item_price_change_log", "item_price_change_log:item_id");
}
};
String table = indexKey.split(":")[0];
if (itemIdConf.containsKey(table)) {
String itemCoreIdField = itemIdConf.get(table);
String itemCoreId = itemIndexMap.get(indexKey).get(itemCoreIdField);
putNewIndexMap(newItemIndexMap, indexKey, value,
key -> new2oldItemIdMap.get(itemCoreId));
}
哈!if-elseif-elseif 语句消失了!此时,才说真正抓住了设计重点:将itemId 的映射抽离出来做成配置,然后其它的依此解析。
重构后的ItemUtil
// 这个配置含有新老itemId映射的信息以及获取orderNo, sID 的字段信息
private static List<String>
itemBaseDataConf = Arrays.asList("item:", "item:item_core_id",
"item:order_no", "item:s_id");
private static Map<String,String> itemIdConf = new HashMap() {
{
put("item", "item:item_core_id");
put("item_core", "item_core:id");
put("item_price", "item_price:item_id");
put("item_price_change_log", "item_price_change_log:item_id");
}
};
/**
* 聚合一个订单下的所有商品信息
* @param itemIndexMap 一个订单所有商品的信息映射
* @return 一个订单下的所有商品信息
*
* key 是 sID + order_no + item_id ;
*/
private static Map<String, Map<String,Object>> mergeOrderItemMap(Map<String, Map<String,String>> itemIndexMap) {
if (itemIndexMap == null || itemIndexMap.isEmpty()) {
return new HashMap<>();
}
// Map[oldItemId, newItemId]
Map<String,String> old2newItemIdMap = new HashMap<>();
Map<String,String> new2oldItemIdMap = new HashMap<>();
Set<Map.Entry<String,Map<String,String>>> entries = itemIndexMap.entrySet();
String orderNo = "";
Str