亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

xiaodao / 1492人閱讀

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

場景

用戶實體User

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

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

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

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

實現(xiàn) 實現(xiàn)一
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;
}

實現(xiàn)二
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;
}
實現(xiàn)三
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;
}
實現(xiàn)結(jié)論

實現(xiàn)一:接到一個需求,完成工作,未仔細(xì)推敲代碼的合理性

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

實現(xiàn)三:仔細(xì)看了下實現(xiàn)二,覺得很別扭,深層次的思考了下代碼的結(jié)構(gòu),發(fā)現(xiàn)實現(xiàn)二并沒有滿足現(xiàn)在已知需求的「抽象一致性」

說明 說明一

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

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

查找用戶信息

計算訂單消費金額

計算訂單消費金額

查找所有的訂單信息

查找退款信息

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

查找所有的訂單

過濾退款訂單

計算消費金額

過濾退款訂單

查找退款訂單

過濾

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

說明二

從另外一個角度來看實現(xiàn)二

計算訂單消費金額

查找所有的訂單信息

過濾退款并計算消費金額

過濾退款并計算消費金額

查找退款信息

過濾退款信息

計算消費金額

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

說明三

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

總結(jié)

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/65374.html

相關(guān)文章

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

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

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

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

    Cheng_Gang 評論0 收藏0
  • CSS代碼重構(gòu)與優(yōu)化之路

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

    fou7 評論0 收藏0
  • CSS代碼重構(gòu)與優(yōu)化之路

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

    不知名網(wǎng)友 評論0 收藏0

發(fā)表評論

0條評論

xiaodao

|高級講師

TA的文章

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