您好,登錄后才能下訂單哦!
這篇“GO怎么降低圈復雜度”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“GO怎么降低圈復雜度”文章吧。
首先咱們編碼前一定會去捋清楚基本的需求,設計,以及實現流程,對于需要用到的工具我們會對代碼結構進行分層
例如一些與業務主邏輯沒有什么關聯的功能就可以獨立封裝,便于維護和使用,例如:
工具包(例如語言中的各種計算,數據處理,加解密等等)
基本的 rpc 通信
http 相關的各種通信方式
基本的中間件,攔截器,打點接口延時等等
數據庫操作(獨立封裝 DAO 層提供出來)
緩存操作
消息隊列
...等等
盡可能的將這些單獨的功能模塊拆解出去,獨立出來,單獨維護
對于那種沒有必要同步的功能,完全可以通過異步化來進行處理,異步的話相信你會很容易想到消息隊列來進行實現
自然實際項目中你能夠看到最開始可能也會這樣去做,但是隨著業務越來越復雜,這些獨立的模塊被各種包進行使用,甚至有的開始慢慢的弄成定制化的方式
例如
func OpenTenant(){ // 校驗基本租戶信息 // 檢查租戶是否特權,完成權限分配 // 檢查實際開戶的線路,分配各種租戶下的必備賬號 // 完成各種系統的對接交互 // 進行數據庫操作 // 返回結果 }
對于一個基本的開戶流程,我們或許可以在代碼中看到第一步做什么,第二步又做什么,第三步... ,然而每一個大步驟下面還有各種小步驟,每一個小步驟也會有自己的復雜邏輯
雖然有了基本的封裝,但是使用的時候,可能還是會寫到哪,需要啥就去按需定義啥
最終就會看到一個函數上千行,讓你去閱讀和維護,你內心能不拒絕嗎嗎?
發現對模塊進行獨立封裝還是不太夠,代碼里面太多的冗余代碼,這個時候咱們就可以使用接口來做抽象
使用接口來做抽象的話,相當于是提前考慮好這一類的業務需要去考慮哪些問題,需要注意哪些場景,需要實現哪一些接口
不同的對象各自去實現自己的內容就可以了,單獨去維護自己的對象
例如上面的 A 系統的開戶流程
// 開戶 interface{} type OpenTenant interface{ ValidateTenantInfo(xxx)xxx // 校驗基本租戶信息 CheckPrivilege(xxx) xxx // 檢查租戶是否特權,完成權限分配 CheckLine(xxx) xxx // 檢查實際開戶的線路 ProcessNeccessaryAccount(xxx) xxx //分配各種租戶下的必備賬號 ProcessNoticeMsg(xxx) xxx// 完成各種系統的對接交互 AddTenant(xxx) xxx// 進行數據庫操作 }
這僅僅是一個 demo,對于一個開戶 interface{} 來說,A 系統可以去實現,B 系統仍然也可以去實現,各自完成自己的內容,例如這樣
對于優化代碼的話,我們就可以將上述的一些實現步驟,放到這個接口中來即可
咱們定義接口,更多的是去規范流程和便于維護,這樣還可以讓我們的程序往高內聚低耦合方面去靠,不同的對象之間,完全是安全的,自己玩自己的一套,只不過遵循的規范是一樣的的
圈復雜度也可以理解為條件復雜度,是一種用來衡量代碼復雜度的標準
例如一些沒有判斷語句的代碼,圈復雜度就是 1
如果是 if...else 那么圈復雜度就是 2 ,簡單的就可以理解為涉及到判斷條件的數量,那么就 +1
例如有這樣的代碼
func testDemo() { var op OpenTenant switch TenantType { case A: op = a.New() case B: op = b.New() case C: op = c.New() default: ... } op.ValidateTenantInfo().... }
那么就如上demo ,來看,圈復雜度就是 4 ,其中有 3 個判斷條件和一個默認的正常順序,因此是 3 +1 = 4
這個時候,我們可以如何降低圈復雜度呢?
我們完全就可以使用表格的方式,訪問數據直接訪問表格就可以了,盡可能的減少這些判斷條件,例如我們就可以這樣來寫
var openTenantMap = map[string]openTenantObject{ A: a.New(), B: b.New(), C: c.New(), } func testDemo(){ op := openTenantMap[TenantType ] ... op.ValidateTenantInfo() ... }
這種方式,是不是就可以將圈復雜度降低到 1 了呢?而且看起來也優雅了很多
以上就是關于“GO怎么降低圈復雜度”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。