GO 中優(yōu)雅編碼和降低圈復(fù)雜度

本次主要是聊聊關(guān)于使用接口抽象和降低圈復(fù)雜度的方式

工作中家妆,難免會(huì)遇到老項(xiàng)目老代碼珊豹,不僅僅需要我們維護(hù)簸呈,可能還需要我們?cè)谠瓉?lái)的垃圾代碼上進(jìn)行新增功能或者是進(jìn)行優(yōu)化調(diào)整

例如

現(xiàn)有的老代碼中關(guān)于用戶系統(tǒng)這一塊就已經(jīng)經(jīng)是搖搖欲墜,牽一發(fā)而動(dòng)全身店茶,并且去弄清其中的業(yè)務(wù)細(xì)節(jié)蜕便,那可以說(shuō)是很難撥開(kāi)迷霧,甚至交接都是一句話的那種贩幻,更是難上加難

這種情況轿腺,相信每個(gè)公司都會(huì)存在,畢竟過(guò)去的需求丛楚,過(guò)去的標(biāo)準(zhǔn)族壳,放到現(xiàn)在來(lái)看,啥也不是

若是很多代碼都是面向過(guò)程的趣些,各種業(yè)務(wù)邏輯仿荆,非業(yè)務(wù)的邏輯都混合在一起,主流程上插入一些亂七八糟的邏輯坏平,上下文并沒(méi)有啥關(guān)系的東西拢操,一個(gè)函數(shù)上千行的代碼也是隨處可見(jiàn),這種情況狗看了都搖頭

對(duì)業(yè)務(wù)函數(shù)需要做基本的封裝

首先咱們編碼前一定會(huì)去捋清楚基本的需求功茴,設(shè)計(jì)庐冯,以及實(shí)現(xiàn)流程,對(duì)于需要用到的工具我們會(huì)對(duì)代碼結(jié)構(gòu)進(jìn)行分層

例如一些與業(yè)務(wù)主邏輯沒(méi)有什么關(guān)聯(lián)的功能就可以獨(dú)立封裝坎穿,便于維護(hù)和使用展父,例如:

  • 工具包(例如語(yǔ)言中的各種計(jì)算,數(shù)據(jù)處理玲昧,加解密等等)
  • 基本的 rpc 通信
  • http 相關(guān)的各種通信方式
  • 基本的中間件栖茉,攔截器,打點(diǎn)接口延時(shí)等等
  • 數(shù)據(jù)庫(kù)操作(獨(dú)立封裝 DAO 層提供出來(lái))
  • 緩存操作
  • 消息隊(duì)列
  • ...等等

盡可能的將這些單獨(dú)的功能模塊拆解出去孵延,獨(dú)立出來(lái)吕漂,單獨(dú)維護(hù)

對(duì)于那種沒(méi)有必要同步的功能,完全可以通過(guò)異步化來(lái)進(jìn)行處理尘应,異步的話相信你會(huì)很容易想到消息隊(duì)列來(lái)進(jìn)行實(shí)現(xiàn)

自然實(shí)際項(xiàng)目中你能夠看到最開(kāi)始可能也會(huì)這樣去做惶凝,但是隨著業(yè)務(wù)越來(lái)越復(fù)雜吼虎,這些獨(dú)立的模塊被各種包進(jìn)行使用,甚至有的開(kāi)始慢慢的弄成定制化的方式

例如

func OpenTenant(){
    // 校驗(yàn)基本租戶信息
    // 檢查租戶是否特權(quán)苍鲜,完成權(quán)限分配
    // 檢查實(shí)際開(kāi)戶的線路思灰,分配各種租戶下的必備賬號(hào)
    // 完成各種系統(tǒng)的對(duì)接交互
    // 進(jìn)行數(shù)據(jù)庫(kù)操作
    // 返回結(jié)果
}

對(duì)于一個(gè)基本的開(kāi)戶流程,我們或許可以在代碼中看到第一步做什么混滔,第二步又做什么洒疚,第三步... ,然而每一個(gè)大步驟下面還有各種小步驟坯屿,每一個(gè)小步驟也會(huì)有自己的復(fù)雜邏輯

雖然有了基本的封裝油湖,但是使用的時(shí)候,可能還是會(huì)寫到哪领跛,需要啥就去按需定義啥

最終就會(huì)看到一個(gè)函數(shù)上千行乏德,讓你去閱讀和維護(hù),你內(nèi)心能不拒絕嗎嗎隔节?

發(fā)現(xiàn)對(duì)模塊進(jìn)行獨(dú)立封裝還是不太夠鹅经,代碼里面太多的冗余代碼,這個(gè)時(shí)候咱們就可以使用接口來(lái)做抽象

用接口來(lái)做抽象

使用接口來(lái)做抽象的話怎诫,相當(dāng)于是提前考慮好這一類的業(yè)務(wù)需要去考慮哪些問(wèn)題瘾晃,需要注意哪些場(chǎng)景,需要實(shí)現(xiàn)哪一些接口

不同的對(duì)象各自去實(shí)現(xiàn)自己的內(nèi)容就可以了幻妓,單獨(dú)去維護(hù)自己的對(duì)象

例如上面的 A 系統(tǒng)的開(kāi)戶流程

// 開(kāi)戶 interface{}
type OpenTenant interface{
   ValidateTenantInfo(xxx)xxx // 校驗(yàn)基本租戶信息
   CheckPrivilege(xxx) xxx // 檢查租戶是否特權(quán)蹦误,完成權(quán)限分配
   CheckLine(xxx) xxx // 檢查實(shí)際開(kāi)戶的線路
   ProcessNeccessaryAccount(xxx) xxx //分配各種租戶下的必備賬號(hào)
   ProcessNoticeMsg(xxx) xxx// 完成各種系統(tǒng)的對(duì)接交互
   AddTenant(xxx) xxx// 進(jìn)行數(shù)據(jù)庫(kù)操作
}

這僅僅是一個(gè) demo,對(duì)于一個(gè)開(kāi)戶 interface{} 來(lái)說(shuō)肉津,A 系統(tǒng)可以去實(shí)現(xiàn)强胰,B 系統(tǒng)仍然也可以去實(shí)現(xiàn),各自完成自己的內(nèi)容妹沙,例如這樣

[圖片上傳失敗...(image-bbfc4f-1696473980873)]

對(duì)于優(yōu)化代碼的話偶洋,我們就可以將上述的一些實(shí)現(xiàn)步驟,放到這個(gè)接口中來(lái)即可

咱們定義接口距糖,更多的是去規(guī)范流程和便于維護(hù)玄窝,這樣還可以讓我們的程序往高內(nèi)聚低耦合方面去靠,不同的對(duì)象之間悍引,完全是安全的恩脂,自己玩自己的一套,只不過(guò)遵循的規(guī)范是一樣的的

盡可能降低圈復(fù)雜度

圈復(fù)雜度也可以理解為條件復(fù)雜度趣斤,是一種用來(lái)衡量代碼復(fù)雜度的標(biāo)準(zhǔn)

例如一些沒(méi)有判斷語(yǔ)句的代碼俩块,圈復(fù)雜度就是 1

如果是 if...else 那么圈復(fù)雜度就是 2 ,簡(jiǎn)單的就可以理解為涉及到判斷條件的數(shù)量,那么就 +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 玉凯,來(lái)看势腮,圈復(fù)雜度就是 4 ,其中有 3 個(gè)判斷條件和一個(gè)默認(rèn)的正常順序壮啊,因此是 3 +1 = 4

這個(gè)時(shí)候嫉鲸,我們可以如何降低圈復(fù)雜度呢?

我們完全就可以使用表格的方式歹啼,訪問(wèn)數(shù)據(jù)直接訪問(wèn)表格就可以了,盡可能的減少這些判斷條件座菠,例如我們就可以這樣來(lái)寫

var openTenantMap = map[string]openTenantObject{
    A: a.New(),
    B: b.New(),
    C: c.New(),
}
func testDemo(){
    op := openTenantMap[TenantType ]
    ...
    op.ValidateTenantInfo()
    ...
}

這種方式狸眼,是不是就可以將圈復(fù)雜度降低到 1 了呢?而且看起來(lái)也優(yōu)雅了很多

總結(jié)

主要叮囑了我們維護(hù)和開(kāi)發(fā)的時(shí)候浴滴,要重視封裝拓萌,重視抽象,重視降低圈復(fù)雜度

只要你用心去打磨升略,自然會(huì)變得越來(lái)越好

但是可別生搬硬套微王,畢竟一些定制化的需求,定制化的代碼你去做接口抽象是沒(méi)有啥意義的品嚣,一起加油吧炕倘,xdm

至此,本次就是這樣翰撑,希望能夠給你帶來(lái)一丁點(diǎn)幫助

歡迎點(diǎn)贊罩旋,關(guān)注,收藏

朋友們眶诈,你的支持和鼓勵(lì)涨醋,是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

[圖片上傳失敗...(image-4d0ab6-1696473980874)]

技術(shù)是開(kāi)放的逝撬,我們的心態(tài)浴骂,更應(yīng)是開(kāi)放的。擁抱變化宪潮,向陽(yáng)而生溯警,努力向前行。

我是阿兵云原生坎炼,歡迎點(diǎn)贊關(guān)注收藏愧膀,下次見(jiàn)~

文中提到的技術(shù)點(diǎn),感興趣的可以查看這些文章:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蟀悦,一起剝皮案震驚了整個(gè)濱河市媚朦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌日戈,老刑警劉巖询张,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浙炼,居然都是意外死亡份氧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門弯屈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜗帜,“玉大人,你說(shuō)我怎么就攤上這事资厉√保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵宴偿,是天一觀的道長(zhǎng)湘捎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窄刘,這世上最難降的妖魔是什么窥妇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮都哭,結(jié)果婚禮上秩伞,老公的妹妹穿的比我還像新娘。我一直安慰自己欺矫,他們只是感情好纱新,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著穆趴,像睡著了一般脸爱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上未妹,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天簿废,我揣著相機(jī)與錄音,去河邊找鬼络它。 笑死族檬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的化戳。 我是一名探鬼主播单料,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扫尖?” 一聲冷哼從身側(cè)響起白对,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎换怖,沒(méi)想到半個(gè)月后甩恼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沉颂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年条摸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兆览。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屈溉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抬探,到底是詐尸還是另有隱情,我是刑警寧澤帆赢,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布小压,位于F島的核電站,受9級(jí)特大地震影響椰于,放射性物質(zhì)發(fā)生泄漏怠益。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一瘾婿、第九天 我趴在偏房一處隱蔽的房頂上張望蜻牢。 院中可真熱鬧,春花似錦偏陪、人聲如沸抢呆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抱虐。三九已至,卻和暖如春饥脑,著一層夾襖步出監(jiān)牢的瞬間恳邀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工灶轰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谣沸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓笋颤,卻偏偏與公主長(zhǎng)得像乳附,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容