電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 45|回復(fù): 0
收起左側(cè)

業(yè)務(wù)邏輯代碼怎樣寫(xiě)才規(guī)范

[復(fù)制鏈接]

300

主題

300

帖子

2202

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
2202
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-10-11 12:06:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)注+星標(biāo)公眾號(hào),不錯(cuò)過(guò)精彩內(nèi)容來(lái)源 | qryc
寫(xiě)代碼這件事,有經(jīng)驗(yàn)的老司機(jī)都比較“煩惱”,直接寫(xiě)吧,能快速寫(xiě)完代碼,但會(huì)有一堆bug讓你加不完的班;慢慢整理業(yè)務(wù)邏輯、理清思路再寫(xiě)吧,老板天天催進(jìn)度。。。
今天就來(lái)分享一下關(guān)于業(yè)務(wù)邏輯與代碼的這些事兒。業(yè)務(wù)邏輯與代碼
1.代碼是需求邏輯的一種展現(xiàn)形式需求文檔是業(yè)務(wù)邏輯的一種展現(xiàn)形式,而代碼不過(guò)是業(yè)務(wù)邏輯的另一種表現(xiàn)形式;
如果邏輯本身有問(wèn)題,那么它的各種展示形式自然也是錯(cuò)的,所以寫(xiě)代碼前應(yīng)該先思考清楚業(yè)務(wù)邏輯。
2.Review代碼很多時(shí)候是邏輯問(wèn)題在Review代碼經(jīng)驗(yàn)中發(fā)現(xiàn):混亂的代碼并不僅僅是代碼編寫(xiě)技藝問(wèn)題,很多時(shí)候是因?yàn)檫壿嫑](méi)有梳理清楚。邏輯混亂,自然代碼也混亂。梳理清楚業(yè)務(wù)邏輯,就為代碼打下了良好的基礎(chǔ)。
當(dāng)然業(yè)務(wù)邏輯梳理清楚后,業(yè)務(wù)邏輯到代碼的映射依然有可能出問(wèn)題,這是編程技藝要解決的問(wèn)題。
下面通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)演示這個(gè)過(guò)程。
業(yè)務(wù)需求示例
我們要做一件事情doSomething:第一步先做A,A過(guò)程要先執(zhí)行a1,然后執(zhí)行a2,然后執(zhí)行a3這三個(gè)子過(guò)程。第二步再做B,B過(guò)程需要執(zhí)行b1,然后b2這兩個(gè)子過(guò)程。
這個(gè)示例邏輯的圖形表述如下:是一個(gè)樹(shù),包含樹(shù)的根,枝干,和葉子。

例子是有通用性的,現(xiàn)實(shí)世界的任何事情或業(yè)務(wù)都可以用類似的樹(shù)形結(jié)構(gòu)來(lái)表述。

正確的代碼實(shí)現(xiàn)
1.和邏輯樹(shù)映射的代碼樹(shù)正確的代碼結(jié)構(gòu)應(yīng)該是和邏輯映射的,代碼結(jié)構(gòu)如下:

我們真實(shí)寫(xiě)代碼的時(shí)候,一般并不會(huì)直接寫(xiě)出如上結(jié)構(gòu),而是會(huì)先寫(xiě)出「2.代碼塊+注釋」的結(jié)構(gòu)來(lái)。
2.代碼塊+合理注釋如下代碼通過(guò)代碼塊來(lái)映射邏輯,上面圖中的子函數(shù)對(duì)應(yīng)代碼中的注釋。
  • void doSomething(){    //A    a1邏輯偽代碼.....;//a1    a2邏輯偽代碼.....;//a2    a3邏輯偽代碼.....;//a3
        //B    b1邏輯偽代碼;//b1    b2邏輯偽代碼;//b2}
    3.抽取小函數(shù)可以再上面的基礎(chǔ)上更優(yōu)秀些,對(duì)代碼塊進(jìn)行抽取小函數(shù),更符合業(yè)務(wù)描述(更符合業(yè)務(wù)的樹(shù)形結(jié)構(gòu))
  • void doSomething(){    doA();    doB();}
    void doA(){    a1邏輯偽代碼.....;    a2邏輯偽代碼.....;    a3邏輯偽代碼.....;}
    void doB(){    b1邏輯偽代碼;    b2邏輯偽代碼;}
    當(dāng)然你也可以繼續(xù)對(duì)a1,a2,a3,b1,b2等小邏輯映射為小函數(shù),以上提到幾種寫(xiě)法都是正確的,關(guān)于小函數(shù)是否抽取,后續(xù)單獨(dú)在《代碼長(zhǎng)度與母語(yǔ)的關(guān)系》中討論。下面我們來(lái)看看不正確的寫(xiě)法。
    不正確的代碼實(shí)現(xiàn)
    當(dāng)你看到下面的不正確的寫(xiě)法的時(shí)候,你也許會(huì)覺(jué)得不可思議,真的會(huì)寫(xiě)出這樣的代碼?
    現(xiàn)實(shí)是:項(xiàng)目中我見(jiàn)到很多更糟糕的代碼,會(huì)把下面提到的問(wèn)題,以及其他編程技藝的問(wèn)題排列組合出現(xiàn)。
    第一種問(wèn)題:不對(duì)等第一種常見(jiàn)的問(wèn)題不太嚴(yán)重,只對(duì)部分邏輯進(jìn)行了抽取,造成函數(shù)中執(zhí)行不對(duì)等;比如只對(duì)b()邏輯進(jìn)行了抽取,但對(duì)等的a()邏輯并未抽;


  • void doSomething(){    a1邏輯偽代碼.....;    a2邏輯偽代碼.....;    a3邏輯偽代碼.....;    doB();}
    void doB(){    b1邏輯偽代碼;    b2邏輯偽代碼;}
    改進(jìn)辦法參考上面第3部分正確的寫(xiě)法,至少可以在doB();之前加空行,并對(duì)a1,a2,a3加個(gè)注釋,也會(huì)易讀很多(當(dāng)然這是一種妥協(xié)寫(xiě)法)。
  • void doSomething(){        //a邏輯    a1邏輯偽代碼.....;    a2邏輯偽代碼.....;    a3邏輯偽代碼.....;
        //b邏輯    doB();}
    void doB(){    b1邏輯偽代碼;    b2邏輯偽代碼;}
    第二種問(wèn)題:部分抽取第二種是對(duì)整體的部分邏輯進(jìn)行了抽取,這種方法很難命名,會(huì)給個(gè)詞不達(dá)意的名字,或使用整體的名字,這個(gè)就相對(duì)嚴(yán)重了,已經(jīng)影響到了代碼閱讀和理解。
    比如電腦是一個(gè)整體,可以命名是電腦;如果只給你一部分(CPU,主板,顯卡)怎么命名讓人能明白?電腦部分零件?但電腦部分零件并不能讓人明白,因?yàn)樗皇且粋(gè)邏輯主體。CPU是一個(gè)邏輯主體,封裝了運(yùn)算。
    如下圖,只對(duì)a1,a2進(jìn)行了抽取,然后名字依然稱為a,看到代碼會(huì)很疑惑,a3明顯也屬于a。

  • void doSomething(){    doA();    a3邏輯偽代碼.....;    doB();}
    void doA(){    a1邏輯偽代碼.....;    a2邏輯偽代碼.....;}
    void doB(){    b1邏輯偽代碼;    b2邏輯偽代碼;}
    第三種問(wèn)題:抽取錯(cuò)誤第三種是最嚴(yán)重的問(wèn)題,抽取錯(cuò)誤,和邏輯不匹配。
    如下:把A的部分邏輯和B的部分邏輯一起抽取。
    如果在這個(gè)基礎(chǔ)上再對(duì)抽取的部分起個(gè)晦澀的名字(其實(shí)這種抽取也起不到好名字),然后應(yīng)用一些設(shè)計(jì)模式來(lái)把代碼更分散(缺點(diǎn)隱藏起來(lái)),就成功的完成了只有自己可以看懂的代碼(可能表面看起來(lái)還很高大上)。

    由此得出結(jié)論,先別想著抽取小函數(shù)或應(yīng)用設(shè)計(jì)模式。先能平鋪直敘的寫(xiě)出符合邏輯的代碼吧。
    小函數(shù)抽取和設(shè)計(jì)模式不一定能解決問(wèn)題,也能隱藏問(wèn)題。

    很多難以讀懂的代碼都是受《重構(gòu)》和《設(shè)計(jì)模式》的包裝,質(zhì)量差的代碼不可怕,如果再抽取和包裝,可以想想是多恐怖。
    補(bǔ)丁和模式思考
    補(bǔ)丁代碼思考,代碼的腐爛很多人看到這里,會(huì)覺(jué)得自己絕對(duì)不會(huì)寫(xiě)出這么爛的代碼;確實(shí)一開(kāi)始也許不會(huì),但伴隨新需求,不同人不斷打補(bǔ)。榱瞬挥绊懢上,老代碼不讓動(dòng)),最后就會(huì)演進(jìn)未這幾個(gè)問(wèn)題綜合展現(xiàn)的代碼。閱讀這樣的代碼不看到最底層代碼,根本不知道代碼在做什么,因?yàn)楹瘮?shù)名已經(jīng)不可信。
    不要急于使用設(shè)計(jì)模式,寫(xiě)好基礎(chǔ)代碼寫(xiě)出一個(gè)好的基礎(chǔ)代碼的過(guò)程:先梳理清楚邏輯樹(shù)(樹(shù)形結(jié)構(gòu),同層對(duì)等),然后做到代碼符合邏輯樹(shù)(代碼樹(shù)自然也符合樹(shù)形結(jié)構(gòu),同層的函數(shù)對(duì)等)。
    打好基礎(chǔ)后,可以再針對(duì)基礎(chǔ)代碼的痛點(diǎn),應(yīng)用復(fù)雜手段(比如設(shè)計(jì)模式)來(lái)解決,關(guān)于函數(shù)抽取和函數(shù)長(zhǎng)度,后續(xù)單獨(dú)文章討論。參考來(lái)源:https://zhuanlan.zhihu.com/p/435871448聲明:本文素材來(lái)源網(wǎng)絡(luò),版權(quán)歸原作者所有。如涉及作品版權(quán)問(wèn)題,請(qǐng)與我聯(lián)系刪除。
    ------------ END ------------



    ●專欄《嵌入式工具
    ●專欄《嵌入式開(kāi)發(fā)》
    ●專欄《Keil教程》
    ●嵌入式專欄精選教程

    關(guān)注公眾號(hào)回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。
    點(diǎn)擊“閱讀原文”查看更多分享。
  • 發(fā)表回復(fù)

    本版積分規(guī)則

    關(guān)閉

    站長(zhǎng)推薦上一條 /1 下一條


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表