国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

由「抽象一致性」思考如何書寫可讀性代碼

xiaodao / 1439人閱讀

摘要:結論二從不同的角度去看抽象一致性得出的結論是不一樣的只有最符合現有業務的沒有最正確的說明三對于實現一方法是查詢用戶的消費信息而這里的詳細計算訂單金額直接寫在這個方法里面抽象層次十分混亂所以實現一是不推薦的。

場景

用戶實體User

通過用戶Id查找用戶的訂單信息接口List orders = orderService.queryOrders(long userId)

通過用戶Id查找用戶退款訂單Id列表List orderIds = orderRefundService.queryRefundOrderIds(long userId)

查找所有用戶的信息List users = UserService.queryAllUsers()

要求查詢用戶訂單消費總金額(除去退過款的訂單)

實現 實現一
public List 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 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 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;
}
實現結論

實現一:接到一個需求,完成工作,未仔細推敲代碼的合理性

實現二:接到另外一個需求,需要復用實現一的部分代碼,所以重新組織了下代碼

實現三:仔細看了下實現二,覺得很別扭,深層次的思考了下代碼的結構,發現實現二并沒有滿足現在已知需求的「抽象一致性」

說明 說明一

對于實現二queryUserStatistics()的抽象層次,我們可以這樣定義:

查找用戶的訂單消費總額和用戶信息

查找用戶信息

計算訂單消費金額

計算訂單消費金額

查找所有的訂單信息

查找退款信息

過濾退款信息,計算消費金額

查找所有的訂單

過濾退款訂單

計算消費金額

過濾退款訂單

查找退款訂單

過濾

結論一:實現二在已知的需求里面其實是不是非常滿足「抽象一致性的」
結論二:仔細推敲下實現三,其實這個方法中filterRefundOrderAndCalculateAmount還是不是非常滿足「抽象一致性」的要求的。

說明二

從另外一個角度來看實現二

計算訂單消費金額

查找所有的訂單信息

過濾退款并計算消費金額

過濾退款并計算消費金額

查找退款信息

過濾退款信息

計算消費金額

結論一:如果這樣子理解,也是可以說實現二也滿足「抽象一致性」。
結論二:從不同的角度去看「抽象一致性」得出的結論是不一樣的,只有最符合現有業務的,沒有最正確的

說明三

對于實現一queryUserStatistics方法是查詢用戶的消費信息,而這里的詳細計算訂單金額直接寫在這個方法里面,抽象層次十分混亂,所以實現一是不推薦的。

總結

在編寫代碼的時候,盡量讓方法或者類保持「抽象一致性」,這里說盡量的意思就是說明在很多時間可以違反這個約定(因為有的時候會覺得很沒有必要,保持抽象一致性,就代表著你的方法里面可能需要很多私有方法,并且在極端情況下私有方法里面的代碼數很少)

「抽象一致性」從不同的角度看,可能會有不同的結果,所以盡量選一個更加符合當前業務的角度(比如說實現一和實現二)
PS:關于抽象一致性更加詳細的描述,可以翻看我以前的提問對抽象層次一致性的看法

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65374.html

相關文章

  • 我的第一次移動端頁面制作 — 總結與思考

    摘要:最近被分配到移動端開發組,支持某活動的頁面頁面制作。這算是我第一次真正接觸移動端頁面制作,下面就談談個人總結和思考。這無疑會增強程序的可維護性。規范正如上面討論的,一個頁面由多個組成。的兼容性在安卓及以下是不支持的。 最近被分配到移動端開發組,支持某活動的頁面頁面制作。這算是我第一次真正接觸移動端頁面制作,下面就談談個人總結和思考。 整體流程 開會大體講解、討論與排期 -> 交互設計 ...

    voyagelab 評論0 收藏0
  • 我的第一次移動端頁面制作 — 總結與思考

    摘要:最近被分配到移動端開發組,支持某活動的頁面頁面制作。這算是我第一次真正接觸移動端頁面制作,下面就談談個人總結和思考。這無疑會增強程序的可維護性。規范正如上面討論的,一個頁面由多個組成。的兼容性在安卓及以下是不支持的。 最近被分配到移動端開發組,支持某活動的頁面頁面制作。這算是我第一次真正接觸移動端頁面制作,下面就談談個人總結和思考。 整體流程 開會大體講解、討論與排期 -> 交互設計 ...

    Cheng_Gang 評論0 收藏0
  • CSS代碼重構與優化之路

    摘要:代碼重構的目的我們寫代碼時,不僅僅只是完成頁面設計的效果,還應該讓代碼易于管理,維護。命名與備注命名是提高代碼可讀性的第一步,也是及其重要的一步。 寫CSS的同學們往往會體會到,隨著項目規模的增加,項目中的CSS代碼也會越來越多,如果沒有及時對CSS代碼進行維護,CSS代碼不斷會越來越多。CSS代碼交錯復雜,像一張龐大的蜘蛛網分布在網站的各個位置,你不知道修改這行代碼會有什么影響,所以...

    fou7 評論0 收藏0
  • CSS代碼重構與優化之路

    摘要:代碼重構的目的我們寫代碼時,不僅僅只是完成頁面設計的效果,還應該讓代碼易于管理,維護。命名與備注命名是提高代碼可讀性的第一步,也是及其重要的一步。 寫CSS的同學們往往會體會到,隨著項目規模的增加,項目中的CSS代碼也會越來越多,如果沒有及時對CSS代碼進行維護,CSS代碼不斷會越來越多。CSS代碼交錯復雜,像一張龐大的蜘蛛網分布在網站的各個位置,你不知道修改這行代碼會有什么影響,所以...

    不知名網友 評論0 收藏0

發表評論

0條評論

xiaodao

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<