成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手把手教你,如何先梳理業(yè)務(wù)邏輯再寫代碼

開(kāi)發(fā)
混亂的代碼并不僅僅是代碼編寫技藝問(wèn)題,很多時(shí)候是因?yàn)檫壿嫑](méi)有梳理清楚。邏輯混亂,自然代碼也混亂。梳理清楚業(yè)務(wù)邏輯,就為代碼打下了良好的基礎(chǔ)。

一、業(yè)務(wù)邏輯與代碼

  • 代碼是需求邏輯的一種展現(xiàn)形式:需求文檔是業(yè)務(wù)邏輯的一種展現(xiàn)形式,而代碼不過(guò)是業(yè)務(wù)邏輯的另一種表現(xiàn)形式;如果邏輯本身有問(wèn)題,那么它的各種展示形式自然也是錯(cuò)的,所以寫代碼前應(yīng)該先思考清楚業(yè)務(wù)邏輯。
  • Review代碼很多時(shí)候是邏輯問(wèn)題:在Review代碼經(jīng)驗(yàn)中發(fā)現(xiàn):混亂的代碼并不僅僅是代碼編寫技藝問(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í)寫代碼的時(shí)候,一般并不會(huì)直接寫出如上結(jié)構(gòu),而是會(huì)先寫出「3.2 代碼塊 + 注釋」的結(jié)構(gòu)來(lái)。

2. 代碼塊 + 合理注釋

如下代碼通過(guò)代碼塊來(lái)映射邏輯,上面圖中的子方法對(duì)應(yīng)代碼中的注釋。

void doSomething(){
    //A
    a1邏輯偽代碼.....;//a1
    a2邏輯偽代碼.....;//a2
    a3邏輯偽代碼.....;//a3

    //B
    b1邏輯偽代碼;//b1
    b2邏輯偽代碼;//b2
}

3. 抽取小方法

可以再上面的基礎(chǔ)上更優(yōu)秀些,對(duì)代碼塊進(jìn)行抽取小方法,更符合業(yè)務(wù)描述(更符合業(yè)務(wù)的樹(shù)形結(jié)構(gòu))。推薦閱讀:看看人家 SpringBoot + vue后臺(tái)管理系統(tǒng),多么優(yōu)雅...

void doSomething(){
    doA();
    doB();
}

void doA(){
    a1邏輯偽代碼.....;
    a2邏輯偽代碼.....;
    a3邏輯偽代碼.....;
}
void doB(){
    b1邏輯偽代碼;
    b2邏輯偽代碼;
}

當(dāng)然你也可以繼續(xù)對(duì) a1,a2,a3,b1,b2 等小邏輯映射為小方法,以上提到幾種寫法都是正確的,關(guān)于小方法是否抽取,后續(xù)單獨(dú)在《代碼長(zhǎng)度與母語(yǔ)的關(guān)系》中討論。下面我們來(lái)看看不正確的寫法。

四、不正確的代碼實(shí)現(xiàn) ===========

當(dāng)你看到下面的不正確的寫法的時(shí)候,你也許會(huì)覺(jué)得不可思議,真的會(huì)寫出這樣的代碼?現(xiàn)實(shí)是:項(xiàng)目中我見(jiàn)到很多更糟糕的代碼,會(huì)把下面提到的問(wèn)題,以及其他編程技藝的問(wèn)題排列組合出現(xiàn)。

1. 第一種問(wèn)題:不對(duì)等

第一種常見(jiàn)的問(wèn)題不太嚴(yán)重,只對(duì)部分邏輯進(jìn)行了抽取,造成方法中執(zhí)行不對(duì)等;比如只對(duì) b() 邏輯進(jìn)行了抽取,但對(duì)等的 a()邏輯并未抽取;

void doSomething(){
   a1邏輯偽代碼.....;
   a2邏輯偽代碼.....;
   a3邏輯偽代碼.....;
   doB();
}

void doB(){
   b1邏輯偽代碼;
   b2邏輯偽代碼;
}

改進(jìn)辦法參考上面第 3 部分正確的寫法,至少可以在doB();之前加空行,并對(duì) a1,a2,a3 加個(gè)注釋,也會(huì)易讀很多(當(dāng)然這是一種妥協(xié)寫法)。

void doSomething(){
		//a邏輯
    a1邏輯偽代碼.....;
    a2邏輯偽代碼.....;
    a3邏輯偽代碼.....;
    
    //b邏輯
    doB();
}

void doB(){
    b1邏輯偽代碼;
    b2邏輯偽代碼;
}

2. 第二種問(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邏輯偽代碼;
}

3. 第三種問(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é)論,先別想著抽取小方法或應(yīng)用設(shè)計(jì)模式。先能平鋪直敘的寫出符合邏輯的代碼吧。

小方法抽取和設(shè)計(jì)模式不一定能解決問(wèn)題,也能隱藏問(wèn)題。

很多難以讀懂的代碼都是受《重構(gòu)》和《設(shè)計(jì)模式》的包裝,質(zhì)量差的代碼不可怕,如果再抽取和包裝,可以想想是多恐怖。

五、補(bǔ)丁和模式思考

(1) 補(bǔ)丁代碼思考,代碼的腐爛

很多人看到這里,會(huì)覺(jué)得自己絕對(duì)不會(huì)寫出這么爛的代碼;確實(shí)一開(kāi)始也許不會(huì),但伴隨新需求,不同人不斷打補(bǔ)丁(為了不影響線上,老代碼不讓動(dòng)),最后就會(huì)演進(jìn)未這幾個(gè)問(wèn)題綜合展現(xiàn)的代碼。閱讀這樣的代碼不看到最底層代碼,根本不知道代碼在做什么,因?yàn)榉椒呀?jīng)不可信。

(2) 不要急于使用設(shè)計(jì)模式,寫好基礎(chǔ)代碼

寫出一個(gè)好的基礎(chǔ)代碼的過(guò)程:先梳理清楚邏輯樹(shù)(樹(shù)形結(jié)構(gòu),同層對(duì)等),然后做到代碼符合邏輯樹(shù)(代碼樹(shù)自然也符合樹(shù)形結(jié)構(gòu),同層的方法對(duì)等)。

打好基礎(chǔ)后,可以再針對(duì)基礎(chǔ)代碼的痛點(diǎn),應(yīng)用復(fù)雜手段(比如設(shè)計(jì)模式)來(lái)解決,關(guān)于方法抽取和方法長(zhǎng)度,后續(xù)單獨(dú)文章討論。

責(zé)任編輯:趙寧寧 來(lái)源: 技術(shù)老男孩
相關(guān)推薦

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2021-09-26 16:08:23

CC++clang_forma

2020-08-12 09:07:53

Python開(kāi)發(fā)爬蟲

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機(jī)

2025-05-07 00:31:30

2021-07-14 09:00:00

JavaFX開(kāi)發(fā)應(yīng)用

2024-01-26 08:16:48

Exporter開(kāi)源cprobe

2021-11-09 06:55:03

水印圖像開(kāi)發(fā)

2010-07-06 09:43:57

搭建私有云

2010-07-06 09:38:51

搭建私有云

2011-02-22 13:46:27

微軟SQL.NET

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中斷喚醒系統(tǒng)Linux 系統(tǒng)

2021-11-24 16:02:57

鴻蒙HarmonyOS應(yīng)用

2022-06-06 08:50:40

CIOIT轉(zhuǎn)型

2014-08-08 13:22:54

測(cè)試手機(jī)站點(diǎn)移動(dòng)設(shè)備

2021-01-19 09:06:21

MysqlDjango數(shù)據(jù)庫(kù)

2023-04-26 12:46:43

DockerSpringKubernetes
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久久久久国产 | 毛片一区二区三区 | 日韩高清国产一区在线 | 成人av在线网站 | 欧美在线播放一区 | 欧美成ee人免费视频 | 欧美一区二区久久 | 成人黄色网址大全 | 亚洲成色777777在线观看影院 | 国产成人av免费看 | 一区二区三区不卡视频 | 91在线影院| 天天干天天操天天看 | 成人在线播放网站 | 免费在线观看成人av | 亚洲bt 欧美bt 日本bt | 综合激情网| 精品欧美一区二区精品久久久 | 国产一区二区精品在线观看 | www.国产精 | 中文字幕日韩欧美一区二区三区 | 一区二区三区免费在线观看 | 国产精品美女www | 国产精品久久久久久吹潮日韩动画 | 日本成人午夜影院 | 天天看片天天干 | 毛片av免费在线观看 | 亚洲精彩视频 | 淫片专区| 色免费看 | 久久久一| 欧美日韩大陆 | 欧美日韩网站 | 视频在线亚洲 | 日韩中文字幕免费在线 | 久久精品亚洲欧美日韩精品中文字幕 | 日韩在线观看中文字幕 | 男女羞羞视频大全 | 中文天堂在线观看 | 欧美在线a| 中文字幕第49页 |