精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

煩死了,業務代碼老寫不好...

開發 前端 開發工具
本文舉一個非常簡單的例子,以案例的業務實現來分析如何寫好業務代碼。

 [[401825]]

圖片來自 Pexels

本案例只是簡單的模擬,可能與真實的情況有出入,這里只是為了舉例使用。

案例:用戶挑選商品放入購物車,然后下單結算。

流程如下:挑選商品→下單→結算→生成訂單→通知。

提交下單的業務邏輯如下:驗證賬號是否合法→調用第三方接口查看商品的打折價格→錢包金額扣除→生成訂單信息→通知用戶下單成功,等待收貨。

代碼實現:

  1. @Service 
  2. public class OrderServiceImpl implements OrderService { 
  3.     @Autowired 
  4.     private UserMapper userMapper; 
  5.     @Autowired 
  6.     private ProductMapper productMapper; 
  7.     @Autowired 
  8.     private OrderMapper orderMapper; 
  9.     @Autowired 
  10.     private KafkaTemplate kafkaTemplate; 
  11.  
  12.     /** 
  13.      *  購買商品,提交訂單 
  14.      * @param userId      用戶ID 
  15.      * @param productId   商品ID 
  16.      * @return 
  17.      */ 
  18.     public Result submit(Long userId, Long productId) throws BizException { 
  19.         // 驗證賬號 
  20.         UserDO userDO = userMapper.findById(userId); 
  21.         if (userDO == null) { 
  22.             throw BizException(USER_NOT_EXISTS); 
  23.         } 
  24.         // 查看商品信息及打折信息 
  25.         ProductDO productDO = productMapper.findById(productId); 
  26.         Double delta = HttpUtils.getDiscount(productId); 
  27.         double actualPayment = productDO.getPrice() - delta; 
  28.         Money money = userDO.getMoney(); 
  29.         if (actualPayment > money.getRemain()) { 
  30.             // 如果商品價格 - 優惠價格 > 用戶錢包,則說明不夠付 
  31.             return Result.fail("余額不足"); 
  32.         } 
  33.         // 錢包夠付,扣除金額 
  34.         double remain = money.getRemain() - actualPayment; 
  35.         money.setRemain(remain); 
  36.         // 更新賬號錢包余額 
  37.         userMapper.update(userDO); 
  38.         // 生成訂單信息 
  39.         OrderDO orderDO = new OrderDO(); 
  40.         orderDO.setUserId(userId); 
  41.         orderDO.setProductId(productId); 
  42.         orderMapper.save(orderDO); 
  43.         // 通知用戶訂單已生成,等待收貨 
  44.         kafkaTemplate.send("orderTopic", orderDO); 
  45.         return Result.ok(); 
  46.     } 

上面代碼寫好了,而且可以實現相關功能,但是隨著業務的迭代,可能會出現很多問題。

①可維護性差

XxMapper 是基于 Mybatis 實現數據操作層,也就把技術細節帶入業務邏輯中了,如果技術實現變了(改為使用 Hibernate,或 Mybatis 版本升級造成用法改變等),業務代碼就得改變。

XxDO 是和數據表綁定的,數據表結構變更等也會影響業務代碼。

調用第三方 API,直接在業務代碼中調用 HttpUtils 完成,未來第三方 API 修改了方法簽名或返回值,或改為了 RPC 接口,那么業務代碼也會隨著改變。

發送消息直接使用 KafkaTemplate,如果技術選型變了要改為使用 RocketMQ,那么業務代碼還得變。

②可擴展性差

如果商品因為做活動又加了其他的優惠,或商品某一段時間不打折了,那么原有的代碼就會重新改來改去。

業務邏輯和數據存儲結構是強依賴的,數據存儲結構的變化對業務的影響可想而知。

③可測試性差

因為直接依賴了數據庫,第三方接口,中間件,所以需要所有技術實現后才能進行測試,測試成本和時間都比較大。

代碼優化一

我們上面說了,數據庫操作不應該直接暴露在業務邏輯中,因此把數據庫操作“隔離”開。

  1. public interface UserRepository { 
  2.     User findById(Long userId); 

新增 XxRepository 接口,業務邏輯直接依賴接口/抽象,而不應該直接依賴實現。

Repository 是數據倉庫,不一定非得是 DB,也可以是其他的數據操作。

Repository 返回的對象也不是 DO,與數據庫結構無關。

代碼優化二

DO 對象是只有 set、get 操作,沒有其他行為,我們說這有時是一種貧血現象,會導致本該在業務領域實體中完成的事情散落到各個 Service 中,低內聚而且也不好維護。

增加領域實體,相關行為直接在實體內完成(高內聚):

  1. public class Money { 
  2.     private double remain; 
  3.     public double getRemain() { 
  4.         return remain; 
  5.     } 
  6.     public void setRemain(double remain) { 
  7.         this.remain = remain; 
  8.     } 
  9.     /** 
  10.      * 扣費 
  11.      * @param delta 
  12.      * @return 
  13.      */ 
  14.     public boolean charge(double delta) { 
  15.         if (remain < delta) { 
  16.             return false
  17.         } 
  18.         this.remain -= delta; 
  19.         return true
  20.     } 

代碼優化三

第三方接口是不可靠的,方法簽名或返回值或調用方式都有可能會變的,如果直接在業務中依賴,會對業務造成“腐蝕”,所以應該加一層適配層(也叫防腐層 ACL)。

  1. /** 
  2.  * 防腐層/適配層 
  3.  */ 
  4. @Service 
  5. public class PayServiceImpl implements PayService { 
  6.  
  7.     @Autowired 
  8.     private DiscountFacade discountFacade; 
  9.  
  10.     /** 
  11.      *  支付 
  12.      * @param money 
  13.      * @param product 
  14.      * @return 
  15.      */ 
  16.     public boolean pay(Money money, Product product) { 
  17.         // 獲取優惠 
  18.         Double delta = discountFacade.getDiscount(product.getId()); 
  19.         // 扣除費用 
  20.         return money.charge(product.getPrice() - delta); 
  21.     } 

代碼優化四

抽象中間件,不直接依賴具體的 MQ 實現:

  1. public interface MessageProducer<T, R> { 
  2.     Result<R> send(T message); 

總結

優化后的代碼如下:

  1. @Autowired 
  2. private UserRepository userRepository; 
  3. @Autowired 
  4. private ProductRepository productRepository; 
  5. @Autowired 
  6. private OrderRepository orderRepository; 
  7. @Autowired 
  8. private MessageProducer<Order,Result> messageProducer; 
  9. @Autowired 
  10. private PayService payService; 
  11.  
  12. /** 
  13.  * 購買商品,提交訂單 
  14.  * @param userId      用戶ID 
  15.  * @param productId   商品ID 
  16.  * @return 
  17.  */ 
  18. public Result submit(Long userId, Long productId) throws BizException { 
  19.     // 驗證 
  20.     User user = userRepository.findByUserId(userId); 
  21.     if (user == null) { 
  22.         throw BizException(USER_NOT_EXISTS); 
  23.     } 
  24.     // 支付 
  25.     Product product = productRepository.findById(productId); 
  26.     boolean f = payService.pay(user.getMoney(), product); 
  27.     if (!f) { 
  28.         return Result.fail("費用扣除失敗"); 
  29.     } 
  30.     // 更新賬戶 
  31.     userRepository.update(user); 
  32.     // 生成訂單信息 
  33.     Order order = OrderFactory.create(user, product); 
  34.     orderRepository.add(order); 
  35.     // 通知用戶訂單已生成,等待收貨 
  36.     messageProducer.send(order); 
  37.     return Result.ok(); 

代碼不一定非常嚴謹,只是通過這一個簡單的例子告訴大家實際工作中代碼該怎么寫,該遵循哪些目標。

①獨立于框架:架構不應該依賴某個外部的庫或框架,不應該被框架的結構所束縛。

②獨立于 UI:前臺展示的樣式可能會隨時發生變化(今天可能是網頁、明天可能變成 console、后天是獨立 app),但是底層架構不應該隨之而變化。

③獨立于底層數據源:無論今天你用 MySQL、Oracle 還是 MongoDB、CouchDB,甚至使用文件系統,軟件架構不應該因為不同的底層數據儲存方式而產生巨大改變。

④獨立于外部依賴:無論外部依賴如何變更、升級,業務的核心邏輯不應該隨之而大幅變化。

⑤可測試:無論外部依賴了什么數據庫、硬件、UI 或者服務,業務的邏輯應該都能夠快速被驗證正確性。

作者:構即人生

編輯:陶家龍

出處:toutiao.com/i6903053083555807752/

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2021-01-29 08:52:10

App微信移動應用

2020-11-08 14:34:31

小視頻瀏覽器

2020-11-09 14:15:23

代碼菜鳥老司機

2009-08-25 09:32:31

2021-08-18 15:23:42

SDNSD-WAN軟件定義網絡

2019-12-27 14:00:43

傳統IT商業模式

2025-10-09 00:00:00

CSSWeb 開發Next.js

2009-11-20 12:54:42

2021-11-12 08:07:40

競品分析數據分析 大數據

2023-10-25 16:36:06

數字化轉型IT系統

2025-02-24 10:10:20

ChatGPTC#代碼

2019-01-22 08:58:41

代碼耦合業務

2020-11-26 06:29:20

代碼非業務程序員

2019-08-14 08:52:40

業務代碼運營

2022-12-26 09:00:07

2024-02-26 00:00:00

RAGGeminiLLM

2020-09-21 05:57:11

代碼編程語言開發

2016-04-20 11:08:57

代碼歷史新功能

2010-11-01 16:00:00

2012-07-03 09:59:03

程序員
點贊
收藏

51CTO技術棧公眾號

久热爱精品视频线路一| 亚洲成精国产精品女| 国产精品亚洲自拍| 精品少妇爆乳无码av无码专区| 欧美一二三不卡| 国产精品羞羞答答在线| 一区二区三区四区五区精品视频| 国产亚洲欧美aaaa| 日本黄色一级网站| 欧美色网在线| 亚洲国产aⅴ成人精品无吗| 色一情一乱一伦一区二区三区| 99热这里只有精品在线| 三级影片在线观看欧美日韩一区二区| 欧美成人高清视频| 欧美性猛交xxxx乱| jizz性欧美23| 在线不卡免费欧美| 免费国产成人av| av老司机在线观看| 亚洲免费看黄网站| 亚洲欧美久久久久一区二区三区| 欧美熟妇另类久久久久久不卡| 全国精品久久少妇| 26uuu亚洲伊人春色| 劲爆欧美第一页| 99久久亚洲精品蜜臀| 亚洲美女中文字幕| 精品国产av色一区二区深夜久久| 国产一区二区| 欧美日韩国产另类不卡| 无码人妻丰满熟妇区毛片| 成人免费高清观看| 一区二区久久久久| 好吊色这里只有精品| 日韩精品成人av| 国产喷白浆一区二区三区| 开心色怡人综合网站| 殴美一级特黄aaaaaa| 欧美天堂在线视频| 成人网18免费网站| 亚洲偷欧美偷国内偷| xxxx黄色片| 久久国产精品免费精品3p| 精品女同一区二区| 最新国产精品自拍| 亚洲视频电影图片偷拍一区| 亚洲欧美久久精品| zzijzzij亚洲日本少妇熟睡| 91沈先生作品| 一本色道久久综合无码人妻| 久久性色av| 欧洲一区二区视频| 亚洲欧美偷拍一区| 久久xxxx精品视频| 欧美在线激情网| 国产区在线观看视频| 在线播放日韩| 69久久夜色精品国产69乱青草| 国产亚洲自拍av| 狠狠爱综合网| 91精品国产免费久久久久久| 日本va欧美va国产激情| 国产精品久久久久9999高清| 2025国产精品视频| japanese国产在线观看| 美腿丝袜亚洲一区| 91在线无精精品一区二区| 97在线视频免费播放| 亚洲国产精品午夜在线观看| 亚洲经典在线| 欧美怡春院一区二区三区| 天堂网视频在线| 日本免费在线视频不卡一不卡二| 国产欧美一区二区三区四区| a毛片在线免费观看| 丁香天五香天堂综合| 国产在线观看一区| 丁香婷婷在线观看| 亚洲视频中文字幕| 国产精品又粗又长| 亚洲mmav| 日韩欧美高清dvd碟片| 艳妇乳肉亭妇荡乳av| 国产剧情一区| 久久91精品国产| 国产专区第一页| 免费看欧美美女黄的网站| 91九色视频导航| 日本精品999| 国产精品久99| 国产 日韩 亚洲 欧美| 日韩制服一区| 亚洲第一色中文字幕| 夫妇露脸对白88av| 亚洲美女视频在线免费观看| 国产精品香蕉av| 亚洲精品一区二区三区蜜桃| 久久久久久久综合日本| 国产盗摄视频在线观看| 英国三级经典在线观看| 欧美日韩电影一区| 亚洲一区二区三区四区五区六区| 色天天久久综合婷婷女18| 国产69精品久久久久9| 亚洲手机在线观看| 99久久精品国产导航| 一区二区三区精品国产| 亚洲美女性囗交| 毛片在线网址| 欧美中文字幕一区二区三区| 亚洲成年人av| 四虎国产精品免费观看| 97久久国产精品| 国产欧美一区二区三区视频在线观看| 91老司机福利 在线| 精品国产一区二区三区在线| 成人黄色免费短视频| 亚洲第一av在线| 黄色a级片在线观看| 日本中文字幕一区二区有限公司| 成人黄视频免费| 麻豆传媒在线观看| 在线观看国产精品网站| 亚洲精品在线视频免费观看| 欧美三级第一页| 国产在线拍揄自揄视频不卡99| 亚洲欧美日韩免费| 亚洲自拍另类综合| 亚洲五月激情网| 第一社区sis001原创亚洲| 91av视频在线播放| 亚洲欧美黄色片| 亚洲三级在线免费观看| 狠狠干狠狠操视频| 色一情一乱一乱一区91av| 日韩综合在线| 青草成人免费视频| 日韩在线视频第一页| 亚洲精品乱码久久久久久黑人| 亚洲国产高清av| 精品视频亚洲| 国产成人一区二区在线| 国产中文字幕在线视频| 日韩欧美中文第一页| 日本xxxx裸体xxxx| 9色国产精品| 久久国产精品99久久久久久丝袜| 国产在线观看www| 亚洲第一中文字幕在线观看| 国产极品在线播放| 成人精品免费视频| 一二三四视频社区在线| 久久精品亚洲成在人线av网址| 久久久久久久久久久人体| 成人av无码一区二区三区| 一区二区高清视频在线观看| 亚洲av无一区二区三区久久| 欧美a级一区| 懂色中文一区二区三区在线视频| 菠萝蜜视频在线观看www入口| 亚洲成在人线av| 91video| 国产网站一区二区| 欧美美女一级片| 911精品美国片911久久久| 亚洲xxx自由成熟| 24小时免费看片在线观看| 日韩大片免费观看视频播放| 中文字幕黄色片| 中文字幕成人在线观看| 亚洲无在线观看| 激情亚洲网站| 日韩久久一区二区| 中文字幕人妻熟女人妻洋洋| 成人精品动漫一区二区三区| 97在线看福利| 粉嫩av一区| 日韩欧美国产一二三区| 久久夜色精品亚洲| 国产欧美日韩综合精品一区二区 | 日韩aaaa| www.成人av.com| 黑人巨大精品欧美一区二区桃花岛| 伊人久久综合97精品| 国产女人18毛片18精品| 五月激情综合婷婷| 欧美a在线播放| 成人中文字幕合集| 亚洲精品一二三四五区| 一区二区在线| 欧美日韩亚洲综合一区二区三区激情在线 | 1000精品久久久久久久久| 熟妇女人妻丰满少妇中文字幕| 在线综合视频| 婷婷视频在线播放| 亚洲第一二三区| 2014亚洲精品| 成人国产精品入口免费视频| 欧美国产日韩在线| 国产精品视频一区二区久久| 日韩欧美三级在线| 日本成人一级片| 亚洲成a人片在线不卡一二三区| 成人在线手机视频| 99久久精品国产导航| 精品亚洲视频在线| 久久欧美肥婆一二区| 日韩中文在线字幕| 天堂中文最新版在线中文| 久久99热狠狠色一区二区| 色一情一区二区三区四区| 91精品啪在线观看国产爱臀| 国产精品久久久久久久久男| 17videosex性欧美| 久久av红桃一区二区小说| 国产精品视频二区三区| 亚洲精品大尺度| 国产黄a三级三级三级| 欧美在线综合视频| 国产精品乱子伦| 亚洲成av人片观看| 一区二区在线观看免费视频| 中文字幕日韩精品一区| 久久久免费看片| 国产亚洲精品bt天堂精选| 日本黄色免费观看| 成人午夜电影久久影院| 91福利免费观看| 免费成人av在线播放| 老太脱裤子让老头玩xxxxx| 欧美在线亚洲| 欧美少妇一级片| 99久久亚洲精品蜜臀| 亚洲激情一区二区三区| 国产99亚洲| 免费成人看片网址| 日韩美脚连裤袜丝袜在线| 国产一区自拍视频| 久久久免费毛片| 精品乱色一区二区中文字幕| 日韩精品社区| 久久综合久久久| 国产成人精品免费视| 欧美另类一区| 欧美日韩水蜜桃| 日本一区二区三区视频免费看| 精品国产一区探花在线观看| 欧美日韩在线一二三| 欧美精品一二| 亚洲精品在线免费看| 久久亚洲在线| 国产美女视频免费| 欧美精品一卡| 青青草国产精品视频| 亚洲一区视频| 老头吃奶性行交视频| 另类的小说在线视频另类成人小视频在线 | 7777精品久久久大香线蕉| 一二三区在线播放| 欧美一级精品在线| 免费看黄网站在线观看| 日韩精品中文字幕视频在线| 欧美另类自拍| 精品国产拍在线观看| 国产淫片在线观看| 国内自拍欧美激情| 国产超碰精品| 国产欧美一区二区三区在线看 | 精品产品国产在线不卡| 妖精视频一区二区三区| 亚洲aⅴ天堂av在线电影软件| 国产精品国产一区| 国产一二三区在线播放| 亚洲毛片视频| 青青青在线视频免费观看| 精品在线亚洲视频| 三级视频网站在线观看| 欧美极品aⅴ影院| 亚洲天堂黄色片| 亚洲不卡av一区二区三区| 午夜精品免费观看| 91麻豆精品国产自产在线观看一区 | 大白屁股一区二区视频| 在线免费观看麻豆| 亚洲色图制服诱惑| 国产精品一区二区三区四| 欧美日韩亚洲高清一区二区| 久久噜噜噜精品国产亚洲综合 | 蜜桃成人av| 亚洲午夜精品久久| 在线看片日韩| 中文字幕亚洲欧洲| 94色蜜桃网一区二区三区| 97精品在线播放| 精品久久久久久久久久久久| 伊人网综合在线| 日韩成人网免费视频| a毛片在线观看| 国产精品88a∨| 理论片一区二区在线| 中文字幕日韩一区二区三区不卡 | 欧美专区国产专区| 国产日韩一区二区三免费高清| 精品一区二区三区国产| 亚洲色图国产| 亚洲欧洲日本精品| 91丨porny丨最新| 久久精品国产av一区二区三区| 欧美日韩三级在线| 欧美色18zzzzxxxxx| 欧美国产日韩在线| 国产一区二区三区亚洲综合| 日韩久久不卡| 在线亚洲自拍| 国产大学生视频| 一区二区三区日韩精品| 中文字幕欧美色图| 亚洲色图50p| 成人三级高清视频在线看| 亚洲最大的免费| 99久久影视| 亚洲欧美自拍另类日韩| 久久精品视频免费观看| 一级片免费网址| 精品国产露脸精彩对白| 伊人福利在线| 91免费视频国产| 仙踪林久久久久久久999| 欧日韩不卡在线视频| 欧美在线 | 亚洲| 欧美成人全部免费| 在线免费成人| 亚洲一区二区精品在线观看| 日韩高清不卡一区| 久久精品成人av| 欧美午夜激情在线| 青青操在线视频| 青青草成人在线| 最新国产一区| 欧美精品色婷婷五月综合| 久久综合av免费| 黄色片网站在线免费观看| 日韩麻豆第一页| 国产免费不卡| 欧美日韩精品综合| 日韩精品一二三四| 内射毛片内射国产夫妻| 欧美日韩专区在线| 日本高清视频在线播放| 91精品久久久久久综合乱菊 | 亚洲午夜无码av毛片久久| 99亚偷拍自图区亚洲| 精品人妻无码一区二区性色| 亚洲欧洲日韩国产| jizz免费一区二区三区| 在线观看日韩片| 国产精品99久久久久久久vr| 国产无精乱码一区二区三区| 亚洲成人激情在线| xx欧美视频| 亚洲国产一区二区三区在线| 国产一区视频网站| 精品无码免费视频| 亚洲精品视频在线观看视频| 成人精品一区二区三区电影| 亚洲一一在线| 丰满放荡岳乱妇91ww| 日本精品久久久久久久| 日本不卡网站| 亚洲国产日韩欧美| 国产精品一区在线| 中日韩黄色大片| 在线播放国产一区二区三区| 亚洲综合资源| 99热亚洲精品| 中文字幕欧美日本乱码一线二线| 国产一区二区三区成人| 97在线观看免费| 日韩精品永久网址| 国产xxx在线观看| 色94色欧美sute亚洲线路一久 | 国产一区二区三区电影在线观看 | 久久午夜夜伦鲁鲁一区二区| 亚洲欧洲成人av每日更新| 亚洲免费不卡视频| 国产精品日韩专区| 亚洲视频精品| 在线国产视频一区| 精品日韩在线观看| 韩国精品主播一区二区在线观看| 国产人妻互换一区二区| 久久亚洲综合色| 国产三级小视频| 浅井舞香一区二区| 这里只有精品在线| 欧美黄色一级生活片| 欧美videofree性高清杂交| 亚洲综合av一区二区三区| 精品免费久久久久久久|