国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何應對不斷膨脹的接口

開發 前端
難怪碼農自嘲是 CRUD boy, 每天確實在不斷的堆屎,在別人的屎山上縫縫補補。下面的案例并沒有 blame 任何人的意思,我也是堆屎工^^ 如有雷同,請勿對號入座。

 [[442573]]

本文轉載自微信公眾號「董澤潤的技術筆記」,作者董澤潤。轉載本文請聯系董澤潤的技術筆記公眾號。

難怪碼農自嘲是 CRUD boy, 每天確實在不斷的堆屎,在別人的屎山上縫縫補補。下面的案例并沒有 blame 任何人的意思,我也是堆屎工^^ 如有雷同,請勿對號入座

案例

最近讀一個業務代碼,狀態機接口定義有 40 個函數,查看 commit log, 初始只有 10 個,每當增加新的業務需求時,就不斷的在原接口添加

  1. // OrderManager handles operation on order entity 
  2. type OrderManager interface { 
  3.  LoadOrdersByIDs(ctx context.Context, orderIDs []string) ([]*dbentity.Order, error) 
  4.   ...... 
  5.   TransitOrdersToState(ctx context.Context, orderIDs []string, toState orderstate.OrderState) ([]*dbentity.Order, error) 
  6.   ...... 
  7.  Stop() error 

業務中很多 interface 都是用來 mock UT, 實現依賴反轉,而不是業務多態。OrderManager 就屬于這類,所以接口膨脹后對工程質量影響并不大,就是看著不內聚...

接口為什么要小

The bigger the interface, the weaker the abstraction.

Go Proverbs[1] Rob Pike 提到:接口越大,抽像能力越弱,比如系統庫中的 io.Reader, io.Writer 等等接口定義只有一兩個函數。為什么說接口要小呢?舉個例子

  1. type FooBeeper interface { 
  2.   Bar(s string) (string, error) 
  3.   Beep(s string) (string, error) 
  4.  
  5. type thing struct{} 
  6.  
  7. func (l *thing) Bar(s string) (string, error) { 
  8.   ... 
  9.  
  10. func (l *thing) Beep(s string) (string, error) { 
  11.   ... 
  12.  
  13. type differentThing struct{} 
  14.  
  15. func (l *differentThing) Bar(s string) (string, error) { 
  16.   ... 
  17.  
  18. type anotherThing struct{} 
  19.  
  20. func (l *anotherThing) Beep(s string) (string, error) { 
  21.   ... 

接口 FooBeeper 定義有兩個函數: Bar, Beep. 由于接口實現是隱式的,我們有如下結論:

  • thing 實現了 FooBeeper 接口
  • differentThing 沒有實現,缺少 Bar 函數
  • anotherThing 同樣沒有實現,缺少 Beep 函數

但是如果我們把 FooBeeper 打散也多個接口的組合

  1. type FooBeeper interface { 
  2.  Bar 
  3.  Beep 
  4.  
  5. type Bar interface { 
  6.  Bar(s string) (string, error) 
  7.  
  8. type Beep interface { 
  9.  Beep(s string) (string, error) 

如上述定義,就可以將接口做小,使得 differentThing anotherThing 可以復用接口

組合改造

關于如何改造 OrderManger 可以借鑒 etcd client v3[2] 定義的思想,將相關的功能聚合成小接口,通過接口的組合實現

  1. type Client struct { 
  2.  Cluster 
  3.  KV 
  4.  Lease 
  5.  Watcher 
  6.  Auth 
  7.  Maintenance 
  8.  
  9.  conn *grpc.ClientConn 
  10.  
  11.  cfg      Config 
  12.   ...... 

上面是 clientV3 結構體定義,雖然不是接口,但是思想可以借鑒

  1. // OrderManager handles operation on order entity 
  2. type OrderManager interface { 
  3.  OrderOperator 
  4.  TransitOrders 
  5.  Stop() error 

實際上可能接口只需抽成三個,OrderOperator 負責對 orders 的 CRUD 操作,TransitOrders 負責轉態機流轉,原來的 40 個函數函數都放到小接口里面

冗余改造

只抽成小接口是不行的,LoadOrderByXXXX 有一堆定義,根據不同條件獲取訂單,但實際上這些都是可以轉換的

  1. func LoadOrders(ctx context.Context, FiltersParams options...) 

針對這種情況可以傳入 option, 或是用結構體當成參數容器。再比如狀態機流轉有 TransitOrdersToState, TransitOrdersToStateByEntity, TransitOrdersStateByEntityForRegularDelivery 均屬于冗余定義

還有一種冗余接口是根本沒人用,或是不該這層暴露的

預防

接口拆分本質上是 ISP Interface segregation principle[3], 不應該強迫任何代碼依賴它不使用的方法。IT 行業有一個笑話

當你的 MR 只有幾行時,peer 會提出幾十個 comment. 但是當你的 MR 幾百行時,他們只會回復 LGTM

Peer review 還是要有責任心的,如果成本不高,建議順手把老代碼重構一下。重構代碼有幾項原則,可以參考 重構最佳實踐2

CI lint 不知道是否支持檢查 interface 行數,但是如果行數成為指標,可能又本末倒置了

參考資料

[1]Go Proverbs: https://go-proverbs.github.io/,

[2]etcd client v3: https://github.com/etcd-io/etcd/blob/main/client/v3/client.go#L44,

[3]Interface segregation principle: https://en.wikipedia.org/wiki/Interface_segregation_principle,

 

 

 

責任編輯:武曉燕 來源: 董澤潤的技術筆記
相關推薦

2023-11-14 16:43:17

云計算數據中心

2023-11-09 11:48:41

2021-09-03 15:03:33

數據安全安全風險網絡安全

2015-05-08 12:41:40

2024-10-31 09:51:28

2024-05-06 08:43:00

2022-08-01 12:03:43

首席信息官CIOIT

2025-02-26 07:20:07

2019-11-13 13:37:28

安全內部威脅數據

2022-07-31 00:10:14

數據安全工具數據泄露

2020-08-04 10:49:26

云遷移云計算云平臺

2025-07-02 07:25:00

大型語言模型LLM人工智能

2009-09-24 16:56:12

2012-11-14 16:27:41

2022-05-24 10:19:15

網絡中斷網絡

2020-01-06 22:56:39

物聯網安全可穿戴設備

2021-09-07 12:17:58

網絡攻擊漏洞網絡安全

2013-04-12 09:55:17

遠程網絡訪問VPN虛擬化網絡
點贊
收藏

51CTO技術棧公眾號

国产69精品久久久久毛片| 性做久久久久久久免费看| 国产成人精品综合| 日本一卡二卡四卡精品| 国产一区二区不卡| 99se婷婷在线视频观看| 日韩中文字幕| 日韩成人在线观看| 噜噜噜在线观看播放视频| 国产亚洲午夜高清国产拍精品| 亚洲精品电影在线一区| 中文字幕一区二区精品区| 性日韩欧美在线视频| 2019年精品视频自拍| 精品福利一区二区三区免费视频| 2020中文字幕在线播放| 中文字幕欧美国产| ww国产内射精品后入国产| 蜜臀av在线播放一区二区三区| 91香蕉电影院| 日韩午夜av一区| 暖暖视频在线免费观看| 亚洲精品大片www| 中文字幕 91| 91视频.com| 六月婷婷在线视频| 国产成人午夜精品5599| 99精品一级欧美片免费播放| 手机精品视频在线观看| 蜜桃视频日韩| 国产日韩精品视频一区二区三区| 亚洲自拍欧美色图| 欧美aa国产视频| 99久久精品免费看国产四区| 91精品国产麻豆国产在线观看 | 成人av免费在线播放| www.99av| 久久成人免费日本黄色| 国产美女精品在线观看| 国产探花在线精品一区二区| 欧美中文字幕第一页| 久久国产精品色av免费看| 欧美精品第一页在线播放| 国产欧美在线观看| 最色在线观看| 欧美午夜激情小视频| 中文字幕在线看| 午夜激情一区二区| 羞羞视频在线观看| 欧美自拍偷拍午夜视频| 日本中文字幕在线观看| 91精品国产综合久久精品| 国产一二三区在线观看| 精品日韩一区二区三区 | 日韩中文字幕在线免费| 久久亚洲精精品中文字幕早川悠里| 丰满少妇大力进入| 国产欧美一区二区三区网站| 精品av久久707| 精品视频高潮| 国产拍揄自揄精品视频麻豆| 男人添女人下部高潮视频在观看| www.欧美日韩国产在线| wwwwww.色| 五月婷婷综合在线| 欧美jizzhd69巨大| 1区2区3区在线视频| 亚洲欧美另类综合偷拍| 青青青手机在线视频观看| 51精品久久久久久久蜜臀| 成人国产一区二区| 免费在线黄网| 亚洲福利视频三区| 韩日在线视频| 亚洲国产欧美一区| 宅男噜噜噜66国产精品免费| 人人澡人人澡人人看欧美| 欧美国产激情| 国产福利片一区二区| 久久女同互慰一区二区三区| 在线观看老湿视频福利| 欧美久久久一区| 日本中文字幕一区二区| 97精品免费视频| 好吊视频一区二区三区四区| 一本一本a久久| 国产精品每日更新| 岛国最新视频免费在线观看| 国产在线xxx| 亚洲精品一区二区三区福利| 经典三级久久| 99精品国产高清一区二区| 国产精品一区二区久久不卡 | 男女h黄动漫啪啪无遮挡软件| 久久久亚洲欧洲日产国码αv| 在线成年人视频| 亚洲免费电影在线观看| 国产精品视频3p| 日韩精品一区二区三区丰满| 国产精品久久一卡二卡| 美女网站视频在线| 国产精品久久久久福利| 国产精品主播直播| 麻豆导航在线观看| 久久伊人色综合| 翔田千里一区二区| 精精国产xxxx视频在线动漫| 亚洲第一二三四五区| 欧美韩国日本在线观看| 日本www在线视频| 7777精品久久久大香线蕉| 老司机在线精品视频| 久久av喷吹av高潮av| 欧美亚洲愉拍一区二区| 欧美一性一交| www.av毛片| 日韩欧美激情在线| 午夜av一区| 色偷偷福利视频| 中文字幕亚洲无线码a| 国产福利电影| 成人三级在线视频| 第一页在线观看| 日韩av电影免费观看高清| 成人免费的视频| 国产福利片在线观看| 91文字幕巨乱亚洲香蕉| 亚洲日本中文字幕区| 精品一区二区三区中文字幕| 亚洲午夜精品一区二区三区| 在线观看日韩毛片| 成人激情电影在线| 97影视在线观看| 九九热精品视频在线播放| 国产精品一卡二卡| av老司机在线观看| 日本一区免费看| 5566中文字幕一区二区电影| 综合色一区二区| 午夜视频在线免费| 国产精品久久久久久久久久久新郎| 国产日韩亚洲欧美综合| 欧美aaa级| 18禁裸男晨勃露j毛免费观看| 亚洲精品美女视频| 蜜臀精品久久久久久蜜臀 | 欧美成人午夜视频| 国产精品一区在线| 少妇视频一区| 国产av不卡一区二区| 亚洲国产精久久久久久久| 香蕉久久夜色精品| www红色一片_亚洲成a人片在线观看_| 91性高湖久久久久久久久_久久99| 亚洲午夜久久久久久久久久久 | 亚洲精品黑牛一区二区三区| 777久久精品一区二区三区无码| 欧美一级黄色录像| 亚洲免费播放| 国产激情小视频在线| 久久99欧美| 亚洲成人av中文字幕| 国产一区二区三区四| 不卡av影片| 国产精品第12页| 高清欧美性猛交| 一区二区日韩av| 欧美精品18| 国产网友自拍视频导航网站在线观看 | 日本久久一区| 亚洲狼人综合干| 欧美在线视频a| 欧美日韩一二三四五区| 欧美日韩亚洲国产精品| 影音先锋在线播放| 日韩一级特黄毛片| 色综合久综合久久综合久鬼88| 中文字幕av一区二区三区 | 亚洲精品影视在线观看| 国产a久久麻豆| 国产成人av毛片| 99久热re在线精彩视频| 国产精品久久久对白| 日韩欧美成人激情| 国产福利91精品| 日韩精品福利一区二区三区| 日本一区高清| 伊人色综合久久天天五月婷| 久久久999国产| 在线一区二区三区精品| 日韩av电影在线免费播放| 一本久久综合亚洲鲁鲁五月天| 先锋a资源在线看亚洲| 亚洲成人va| 佐山爱痴汉视频一区二区三区| 日本视频一区二区不卡| 久久在线精品视频| 一本久久a久久精品亚洲| 狠狠狠色丁香婷婷综合激情| 西野翔中文久久精品字幕|