精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

午夜精品久久久久久久无码 | 亚洲一二三四| 久久亚洲精华国产精华液| 国产精品第3页| 免费在线观看h片| 久久综合五月婷婷| 精品视频在线免费看| 操bbb操bbb| 亚洲AV成人无码一二三区在线| 日韩精品1区2区3区| 欧美成人精品在线观看| www.av欧美| 中文一区二区三区四区| 色噜噜狠狠色综合欧洲selulu| 一区国产精品| 你懂的视频在线免费| 久久99九九99精品| 国产91精品青草社区| 日韩在线视频网址| 国产区精品区| 亚洲国产成人精品一区二区| 国产精品视频中文字幕| 小草在线视频免费播放| 一区二区三区在线观看视频| 视频一区视频二区视频三区视频四区国产 | 超碰免费在线播放| 国产三级三级三级精品8ⅰ区| 99国产超薄肉色丝袜交足的后果 | 日韩电影免费在线观看网站| 国色天香2019中文字幕在线观看| 美国黄色片视频| 久久91成人| 国产视频精品久久久| 麻豆免费在线观看视频| 亚洲狼人综合| 欧美日韩一区二区电影| 人妻熟女一二三区夜夜爱| 超碰在线公开| 亚州成人在线电影| 欧美国产日韩激情| 天天干在线视频论坛| 亚洲美女区一区| 欧美少妇一级片| 天天在线视频色| 国产精品久久毛片a| 日韩wuma| 91在线看黄| 国产欧美精品区一区二区三区 | jjzzjjzz欧美69巨大| 榴莲视频成人app| 69堂国产成人免费视频| 一起操在线视频| 亚洲一区二区av| 欧美美女bb生活片| 五月婷婷激情久久| 久久av影院| 欧美久久久久中文字幕| 五月天丁香花婷婷| 经典三级久久| 精品国产一区二区三区av性色| 韩国黄色一级片| 久久夜色电影| 亚洲美腿欧美激情另类| 免费福利视频网站| 日本大胆欧美| 免费99精品国产自在在线| 极品盗摄国产盗摄合集| 激情综合在线| 欧美有码在线观看视频| 无码人妻丰满熟妇奶水区码| 日本午夜一本久久久综合| 国产欧美精品久久久| 国产免费不卡av| 成人免费毛片片v| 久久99精品久久久水蜜桃| 免费在线一级视频| 亚洲欧洲成人av每日更新| 无颜之月在线看| 日本黄色免费在线| 欧美性感一区二区三区| 女人扒开腿免费视频app| 亚洲精品一区国产| 亚洲欧洲在线观看| 91视频综合网| 性伦欧美刺激片在线观看| 国产成一区二区| 99国产精品久久久久久久成人 | 欧美人与z0zoxxxx视频| 国产精品国产精品国产专区不片| 日本精品免费观看| 91在线公开视频| 床上的激情91.| 免费在线成人av电影| 秋霞午夜在线观看| 欧美日韩国产综合视频在线观看中文| 不卡影院一区二区| 欧洲大片精品免费永久看nba| 亚洲国产欧美在线成人app | 亚洲国产一二三区| 久久久久国色av免费看影院| 一区不卡字幕| 亚洲欧美韩国| 欧美一区二区黄色| 久久国产柳州莫菁门| 欧美日韩hd| 国产精品久久久久久久app| www.天堂av.com| 日本一区二区三区dvd视频在线 | 免费电影一区| 影音先锋在线播放| 欧美怡红院视频| 亚洲精品乱码久久久久久蜜桃欧美| 精品免费av| 国产做受69高潮| 999免费视频| 国产精品视频一区二区三区不卡| 精品人妻少妇一区二区| 日韩一级特黄| 一夜七次郎国产精品亚洲| 日本熟妇色xxxxx日本免费看| 久久国产人妖系列| 日韩欧美精品一区二区| 日韩伦理在线| 欧美精品一区二区三区很污很色的 | 日本免费久久高清视频| www.久久久久久| 国产精品第13页| 欧洲熟妇精品视频| 久久av免费看| 91成人免费观看网站| 亚洲成人一二三区| 亚洲精品综合在线| 91pony九色| 日韩一区电影| 国产精品久久久久久久久久新婚| 亚洲欧洲综合在线| 亚洲6080在线| 波多野结衣影院| 精品成人在线| 国产精品一 二 三| 国产盗摄在线视频网站| 精品欧美乱码久久久久久| 国产男女猛烈无遮挡91| 丁香啪啪综合成人亚洲| 国产精品亚洲成在人线| 亚洲免费电影在线观看| 一区二区三区在线观看av| av在线免费不卡| 国产在线精品91| 欧美日韩一本| 欧美专区福利在线| 精品亚洲综合| 欧美午夜精品免费| 免费看一级黄色| 精品无人区卡一卡二卡三乱码免费卡 | 国产一区二区三区中文字幕| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产精品va在线播放我和闺蜜| 日色在线视频| 在线看国产一区| 免费91在线观看| 国产在线视频精品一区| 国产精品88久久久久久妇女| 日韩精品中文字幕吗一区二区| 九九九久久国产免费| 欧美77777| 日韩欧美aaa| 波多野结衣欲乱| 国产成人精品三级麻豆| 免费高清一区二区三区| 一区二区三区日本久久久| 国产成人鲁鲁免费视频a| 男人的天堂在线视频免费观看| 91精品欧美久久久久久动漫| 久久艹精品视频| 久久久久国产精品人| av在线免费看片| 一区二区日韩免费看| 日韩国产高清一区| 韩国一区二区三区视频| 91av视频在线免费观看| 91porn在线观看| 精品国产第一区二区三区观看体验 | 男人操女人下面视频| 99av国产精品欲麻豆| 亚洲国产精品久久久久久女王| 日韩欧美一级| 日韩av免费在线观看| 超碰在线观看免费版| 亚洲免费视频在线观看| 国产一区二区三区成人| 黄网动漫久久久| 欧美做爰爽爽爽爽爽爽| 久久久99精品久久| 真实乱偷全部视频| 日韩影院免费视频| 草b视频在线观看| 日韩欧美高清| 久久综合九九| 精品国产麻豆| 国产精品劲爆视频| 丰满的护士2在线观看高清| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | www日本高清视频| 色综合久久久久综合99| 激情视频在线播放| 中文字幕成人在线观看| 日本一卡二卡在线| 国产精品亚洲视频| 日本激情综合网| 亚洲三级网站| wwwjizzjizzcom| 色琪琪久久se色| 欧美激情第六页| 国产精品中文字幕制服诱惑| 91久久久久久久久久| 高清电影一区| 国产69久久精品成人| 国产探花在线观看| 久久精品国产久精国产一老狼| 免费观看成年在线视频网站| 精品精品欲导航| 精品久久久久中文慕人妻| 欧美日韩一区高清| 最近中文字幕在线免费观看| 高跟丝袜欧美一区| 日韩精品一卡二卡| 亚洲大片在线观看| 久久久久久蜜桃| 亚洲黄色免费网站| 性色av无码久久一区二区三区| 国产精品色婷婷| www..com.cn蕾丝视频在线观看免费版| 91网站黄www| 国产精品嫩草av| 99在线热播精品免费| 国产乱国产乱老熟300部视频| 国产一区91精品张津瑜| 欧美性受xxxxxx黑人xyx性爽| 日韩高清电影一区| 爱情岛论坛vip永久入口| 久久精品道一区二区三区| 日本网站免费在线观看| 国产亚洲精品v| 日韩av资源在线| 可以看av的网站久久看| 色婷婷综合久久久久中文字幕| 久久xxxx| 国产一二三四在线视频| 蜜桃av一区二区| 一级做a免费视频| 精品综合免费视频观看| 91性高潮久久久久久久| 国产精品99久久久久久久女警| 岛国大片在线免费观看| 国产成人99久久亚洲综合精品| 第一页在线视频| www.色精品| 亚洲色成人网站www永久四虎| 国产亚洲欧美中文| 国产麻豆a毛片| 一区二区三区在线免费视频| xxxxxx国产| 日韩欧美一区二区三区| 五月激情丁香网| 91精品婷婷国产综合久久 | 亚洲色图图片| 国产精品久久久久av福利动漫| 国产在线播放精品| 欧美一区视久久| 亚洲女同另类| 日韩a∨精品日韩在线观看| 模特精品在线| 国产探花在线看| 不卡视频在线观看| 永久免费av无码网站性色av| 中文字幕一区二区视频| 久久精品久久国产| 欧美性色黄大片手机版| 国产浮力第一页| 亚洲欧美综合v| 国产原创在线观看| 欧美在线观看视频| 国产成人视屏| 欧美男人的天堂| 亚洲一级淫片| 亚洲色成人一区二区三区小说| 黄网站免费久久| 色天使在线视频| ●精品国产综合乱码久久久久| 日本一二三区视频| 欧美性极品少妇| 视频国产一区二区三区| 日韩一区二区在线视频| 美女扒开腿让男人桶爽久久软| 国产女人18毛片水18精品| 老司机精品在线| 在线免费观看一区二区三区| 国产日产高清欧美一区二区三区| 91 在线视频观看| 91社区在线播放| 波多野结衣爱爱视频| 色婷婷综合中文久久一本| www.xxxx国产| 日韩一区二区三区在线播放| 欧美一区国产| 韩国一区二区三区美女美女秀| 999国产精品永久免费视频app| 国产l精品国产亚洲区久久| 国内精品第一页| 自拍偷拍你懂的| 欧美午夜宅男影院在线观看| 性一交一乱一伧老太| 日韩一区二区欧美| av免费在线一区| 免费在线成人av电影| 伊人天天综合| 黑人无套内谢中国美女| 《视频一区视频二区| 日韩乱码一区二区三区| 亚洲男人的天堂网站| segui88久久综合9999| 96成人在线视频| 婷婷伊人综合| 欧美成人乱码一二三四区免费| 久久精品亚洲一区二区三区浴池 | 日本不卡在线| 国产精品视频免费在线| 国内精品视频在线观看| 美女福利视频在线| 99久久亚洲一区二区三区青草| 18精品爽视频在线观看| 日韩欧美一区二区视频| 国产精品扒开做爽爽爽的视频 | 国产精品毛片一区视频播| 伊人男人综合视频网| 电影天堂国产精品| 色吧亚洲视频| 男女性色大片免费观看一区二区| 97人妻精品一区二区免费| 日韩欧美精品网址| 你懂的视频在线免费| 国产成人精品一区二区| 精品国产一区一区二区三亚瑟| 免费在线观看毛片网站| 久久久国产午夜精品| 精品一区二三区| 中文字幕亚洲一区在线观看 | 欧美高清hd18日本| 看黄网站在线| 91精品视频大全| 欧美日韩福利| 51调教丨国产调教视频| 日韩欧美在线视频观看| 国产主播福利在线| 国产精品一区二区久久精品| 希岛爱理av一区二区三区| 色黄视频免费看| 亚洲国产综合91精品麻豆| 熟妇人妻一区二区三区四区| 奇米四色中文综合久久| 欧洲杯什么时候开赛| 色综合五月婷婷| 亚洲国产成人tv| 青草久久伊人| 国产欧美久久久久久| 欧美午夜不卡影院在线观看完整版免费 | 欧美极度另类| 正在播放国产精品| 成人一区二区三区视频在线观看| 日本一区二区三区免费视频| 亚洲男人7777| 国产一精品一av一免费爽爽| 日韩精品在线观看av| 26uuu精品一区二区在线观看| 日韩不卡高清视频| 欧美成人午夜激情| 天天操综合520| 亚洲黄色av片| 精品免费在线视频| a天堂中文在线88| 97影院在线午夜| 小嫩嫩精品导航| 精品欧美一区二区久久久久 | 亚洲人成人无码网www国产 | 国产精品日韩av| 国产精品hd| 日本精品在线观看视频| 日韩欧美不卡在线观看视频| 免费观看亚洲| 黄色小视频大全| 国产欧美精品一区aⅴ影院| 亚洲精品成av人片天堂无码| 欧美中文在线免费| 欧美三级不卡| 亚洲图片第一页| 日韩经典一区二区三区| 欧美不卡在线观看| 欧美精品一区二区三区免费播放| 一区二区三区四区乱视频|