摘要:結(jié)論二從不同的角度去看抽象一致性得出的結(jié)論是不一樣的只有最符合現(xiàn)有業(yè)務(wù)的沒有最正確的說明三對(duì)于實(shí)現(xiàn)一方法是查詢用戶的消費(fèi)信息而這里的詳細(xì)計(jì)算訂單金額直接寫在這個(gè)方法里面抽象層次十分混亂所以實(shí)現(xiàn)一是不推薦的。
場景
用戶實(shí)體User
通過用戶Id查找用戶的訂單信息接口List
通過用戶Id查找用戶退款訂單Id列表List
查找所有用戶的信息List
要求查詢用戶訂單消費(fèi)總金額(除去退過款的訂單)
實(shí)現(xiàn) 實(shí)現(xiàn)一public List實(shí)現(xiàn)二queryUserStatistics(){ List users = UserService.queryAllUsers() for (User user : users) { long userId = user.getAccountId(); List orders = orderService.queryOrderInfo(); BigDecimal totlePayAmount = filterRefundOrderAndCalculateAmount(orders,accountId); user.setSumPayAmount(totlePayAmount); } } private BigDecimal filterRefundOrderAndCalculateAmount(List orders, long userId) { List orderIds = orderRefundService.queryRefundOrderIds(userId); BigDecimal totlePayAmount = BigDecimal.ZERO; for (Order order : orders) { if (!orderIds.contains(order.getOrderId())) { totlePayAmount = totlePayAmount.add(order.getPayAmount()); } } return totlePayAmount; }
public List實(shí)現(xiàn)三queryUserStatistics(){ List users = UserService.queryAllUsers() for(User user : users){ BigDecimal sumPayAmount = calculateTotleConsumeAmount(user); user.setSumPayAmount(sumPayAmount); } } private BigDecimal calculateTotleConsumeAmount(User user) { long userId = user.getUserId(); List orders = orderService.queryOrderInfo(userId); return filterRefundOrderAndCalculateAmount(orders, userId); } private BigDecimal filterRefundOrderAndCalculateAmount(List orders, long userId) { List orderIds = orderRefundService.queryRefundOrderIds(userId); BigDecimal totlePayAmount = BigDecimal.ZERO; for (Order order : orders) { if (!orderIds.contains(order.getOrderId())) { totlePayAmount = totlePayAmount.add(order.getPayAmount()); } } return totlePayAmount; }
public List實(shí)現(xiàn)結(jié)論queryUserStatistics(){ List users = UserService.queryAllUsers() for(User user : users){ BigDecimal sumPayAmount = calculateTotleConsumeAmount(user); user.setSumPayAmount(sumPayAmount); } } private BigDecimal calculateTotleConsumeAmount(User user) { long userId = user.getUserId(); List orders = orderService.queryOrderInfo(userId); List orderIds = orderRefundService.queryRefundOrderIds(long userId); return filterRefundOrderAndCalculateAmount(orderPayAmountVOs, orderIds); } private BigDecimal filterRefundOrderAndCalculateAmount(List orders,List orderIds) { BigDecimal is = BigDecimal.ZERO; for (Order order : orders) { if (!orderIds.contains(order.getOrderId())) { totlePayAmount = totlePayAmount.add(order.getPayAmount()); } } return totlePayAmount; }
實(shí)現(xiàn)一:接到一個(gè)需求,完成工作,未仔細(xì)推敲代碼的合理性
實(shí)現(xiàn)二:接到另外一個(gè)需求,需要復(fù)用實(shí)現(xiàn)一的部分代碼,所以重新組織了下代碼
實(shí)現(xiàn)三:仔細(xì)看了下實(shí)現(xiàn)二,覺得很別扭,深層次的思考了下代碼的結(jié)構(gòu),發(fā)現(xiàn)實(shí)現(xiàn)二并沒有滿足現(xiàn)在已知需求的「抽象一致性」
說明 說明一對(duì)于實(shí)現(xiàn)二queryUserStatistics()的抽象層次,我們可以這樣定義:
查找用戶的訂單消費(fèi)總額和用戶信息
查找用戶信息
計(jì)算訂單消費(fèi)金額
計(jì)算訂單消費(fèi)金額
查找所有的訂單信息
查找退款信息
過濾退款信息,計(jì)算消費(fèi)金額
或
查找所有的訂單
過濾退款訂單
計(jì)算消費(fèi)金額
過濾退款訂單
查找退款訂單
過濾
結(jié)論一:實(shí)現(xiàn)二在已知的需求里面其實(shí)是不是非常滿足「抽象一致性的」
結(jié)論二:仔細(xì)推敲下實(shí)現(xiàn)三,其實(shí)這個(gè)方法中filterRefundOrderAndCalculateAmount還是不是非常滿足「抽象一致性」的要求的。
從另外一個(gè)角度來看實(shí)現(xiàn)二
計(jì)算訂單消費(fèi)金額
查找所有的訂單信息
過濾退款并計(jì)算消費(fèi)金額
過濾退款并計(jì)算消費(fèi)金額
查找退款信息
過濾退款信息
計(jì)算消費(fèi)金額
結(jié)論一:如果這樣子理解,也是可以說實(shí)現(xiàn)二也滿足「抽象一致性」。
結(jié)論二:從不同的角度去看「抽象一致性」得出的結(jié)論是不一樣的,只有最符合現(xiàn)有業(yè)務(wù)的,沒有最正確的
對(duì)于實(shí)現(xiàn)一queryUserStatistics方法是查詢用戶的消費(fèi)信息,而這里的詳細(xì)計(jì)算訂單金額直接寫在這個(gè)方法里面,抽象層次十分混亂,所以實(shí)現(xiàn)一是不推薦的。
總結(jié)在編寫代碼的時(shí)候,盡量讓方法或者類保持「抽象一致性」,這里說盡量的意思就是說明在很多時(shí)間可以違反這個(gè)約定(因?yàn)橛械臅r(shí)候會(huì)覺得很沒有必要,保持抽象一致性,就代表著你的方法里面可能需要很多私有方法,并且在極端情況下私有方法里面的代碼數(shù)很少)
「抽象一致性」從不同的角度看,可能會(huì)有不同的結(jié)果,所以盡量選一個(gè)更加符合當(dāng)前業(yè)務(wù)的角度(比如說實(shí)現(xiàn)一和實(shí)現(xiàn)二)
PS:關(guān)于抽象一致性更加詳細(xì)的描述,可以翻看我以前的提問對(duì)抽象層次一致性的看法
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65374.html
摘要:最近被分配到移動(dòng)端開發(fā)組,支持某活動(dòng)的頁面頁面制作。這算是我第一次真正接觸移動(dòng)端頁面制作,下面就談?wù)剛€(gè)人總結(jié)和思考。這無疑會(huì)增強(qiáng)程序的可維護(hù)性。規(guī)范正如上面討論的,一個(gè)頁面由多個(gè)組成。的兼容性在安卓及以下是不支持的。 最近被分配到移動(dòng)端開發(fā)組,支持某活動(dòng)的頁面頁面制作。這算是我第一次真正接觸移動(dòng)端頁面制作,下面就談?wù)剛€(gè)人總結(jié)和思考。 整體流程 開會(huì)大體講解、討論與排期 -> 交互設(shè)計(jì) ...
摘要:最近被分配到移動(dòng)端開發(fā)組,支持某活動(dòng)的頁面頁面制作。這算是我第一次真正接觸移動(dòng)端頁面制作,下面就談?wù)剛€(gè)人總結(jié)和思考。這無疑會(huì)增強(qiáng)程序的可維護(hù)性。規(guī)范正如上面討論的,一個(gè)頁面由多個(gè)組成。的兼容性在安卓及以下是不支持的。 最近被分配到移動(dòng)端開發(fā)組,支持某活動(dòng)的頁面頁面制作。這算是我第一次真正接觸移動(dòng)端頁面制作,下面就談?wù)剛€(gè)人總結(jié)和思考。 整體流程 開會(huì)大體講解、討論與排期 -> 交互設(shè)計(jì) ...
摘要:代碼重構(gòu)的目的我們寫代碼時(shí),不僅僅只是完成頁面設(shè)計(jì)的效果,還應(yīng)該讓代碼易于管理,維護(hù)。命名與備注命名是提高代碼可讀性的第一步,也是及其重要的一步。 寫CSS的同學(xué)們往往會(huì)體會(huì)到,隨著項(xiàng)目規(guī)模的增加,項(xiàng)目中的CSS代碼也會(huì)越來越多,如果沒有及時(shí)對(duì)CSS代碼進(jìn)行維護(hù),CSS代碼不斷會(huì)越來越多。CSS代碼交錯(cuò)復(fù)雜,像一張龐大的蜘蛛網(wǎng)分布在網(wǎng)站的各個(gè)位置,你不知道修改這行代碼會(huì)有什么影響,所以...
摘要:代碼重構(gòu)的目的我們寫代碼時(shí),不僅僅只是完成頁面設(shè)計(jì)的效果,還應(yīng)該讓代碼易于管理,維護(hù)。命名與備注命名是提高代碼可讀性的第一步,也是及其重要的一步。 寫CSS的同學(xué)們往往會(huì)體會(huì)到,隨著項(xiàng)目規(guī)模的增加,項(xiàng)目中的CSS代碼也會(huì)越來越多,如果沒有及時(shí)對(duì)CSS代碼進(jìn)行維護(hù),CSS代碼不斷會(huì)越來越多。CSS代碼交錯(cuò)復(fù)雜,像一張龐大的蜘蛛網(wǎng)分布在網(wǎng)站的各個(gè)位置,你不知道修改這行代碼會(huì)有什么影響,所以...
閱讀 3110·2021-08-03 14:05
閱讀 2154·2019-08-29 15:35
閱讀 691·2019-08-29 13:30
閱讀 3180·2019-08-29 13:20
閱讀 2545·2019-08-23 18:15
閱讀 1810·2019-08-23 14:57
閱讀 2230·2019-08-23 13:57
閱讀 1325·2019-08-23 12:10