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

手把手教你,如何先梳理業務邏輯再寫代碼

開發
混亂的代碼并不僅僅是代碼編寫技藝問題,很多時候是因為邏輯沒有梳理清楚。邏輯混亂,自然代碼也混亂。梳理清楚業務邏輯,就為代碼打下了良好的基礎。

一、業務邏輯與代碼

  • 代碼是需求邏輯的一種展現形式:需求文檔是業務邏輯的一種展現形式,而代碼不過是業務邏輯的另一種表現形式;如果邏輯本身有問題,那么它的各種展示形式自然也是錯的,所以寫代碼前應該先思考清楚業務邏輯。
  • Review代碼很多時候是邏輯問題:在Review代碼經驗中發現:混亂的代碼并不僅僅是代碼編寫技藝問題,很多時候是因為邏輯沒有梳理清楚。邏輯混亂,自然代碼也混亂。梳理清楚業務邏輯,就為代碼打下了良好的基礎。當然業務邏輯梳理清楚后,業務邏輯到代碼的映射依然有可能出問題,這是編程技藝要解決的問題。下面通過一個簡單的例子來演示這個過程:

二、業務需求示例

我們要做一件事情doSomething:

  • 第一步先做 A,A 過程要先執行 a1, 然后執行 a2, 然后執行 a3 這三個子過程。
  • 第二步再做 B,B 過程需要執行 b1,然后 b2 這兩個子過程。

這個示例邏輯的圖形表述如下:是一個樹,包含樹的根,枝干,和葉子。

例子是有通用性的,現實世界的任何事情或業務都可以用類似的樹形結構來表述。

三、正確的代碼實現

1. 和邏輯樹映射的代碼樹

正確的代碼結構應該是和邏輯映射的,代碼結構如下:

我們真實寫代碼的時候,一般并不會直接寫出如上結構,而是會先寫出「3.2 代碼塊 + 注釋」的結構來。

2. 代碼塊 + 合理注釋

如下代碼通過代碼塊來映射邏輯,上面圖中的子方法對應代碼中的注釋。

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

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

3. 抽取小方法

可以再上面的基礎上更優秀些,對代碼塊進行抽取小方法,更符合業務描述(更符合業務的樹形結構)。推薦閱讀:看看人家 SpringBoot + vue后臺管理系統,多么優雅...

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

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

當然你也可以繼續對 a1,a2,a3,b1,b2 等小邏輯映射為小方法,以上提到幾種寫法都是正確的,關于小方法是否抽取,后續單獨在《代碼長度與母語的關系》中討論。下面我們來看看不正確的寫法。

四、不正確的代碼實現 ===========

當你看到下面的不正確的寫法的時候,你也許會覺得不可思議,真的會寫出這樣的代碼?現實是:項目中我見到很多更糟糕的代碼,會把下面提到的問題,以及其他編程技藝的問題排列組合出現。

1. 第一種問題:不對等

第一種常見的問題不太嚴重,只對部分邏輯進行了抽取,造成方法中執行不對等;比如只對 b() 邏輯進行了抽取,但對等的 a()邏輯并未抽??;

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

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

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

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

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

2. 第二種問題:部分抽取

第二種是對整體的部分邏輯進行了抽取,這種方法很難命名,會給個詞不達意的名字,或使用整體的名字,這個就相對嚴重了,已經影響到了代碼閱讀和理解。

比如電腦是一個整體,可以命名是電腦;如果只給你一部分(CPU,主板,顯卡)怎么命名讓人能明白?電腦部分零件?但電腦部分零件并不能讓人明白,因為它不是一個邏輯主體。CPU 是一個邏輯主體,封裝了運算。

如下圖,只對 a1,a2 進行了抽取,然后名字依然稱為 a,看到代碼會很疑惑,a3 明顯也屬于 a。

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

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

3. 第三種問題:抽取錯誤

第三種是最嚴重的問題,抽取錯誤,和邏輯不匹配。

如下:把 A 的部分邏輯和 B 的部分邏輯一起抽取。

如果在這個基礎上再對抽取的部分起個晦澀的名字(其實這種抽取也起不到好名字),然后應用一些設計模式來把代碼更分散(缺點隱藏起來),就成功的完成了只有自己可以看懂的代碼(可能表面看起來還很高大上)。

由此得出結論,先別想著抽取小方法或應用設計模式。先能平鋪直敘的寫出符合邏輯的代碼吧。

小方法抽取和設計模式不一定能解決問題,也能隱藏問題。

很多難以讀懂的代碼都是受《重構》和《設計模式》的包裝,質量差的代碼不可怕,如果再抽取和包裝,可以想想是多恐怖。

五、補丁和模式思考

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

很多人看到這里,會覺得自己絕對不會寫出這么爛的代碼;確實一開始也許不會,但伴隨新需求,不同人不斷打補?。榱瞬挥绊懢€上,老代碼不讓動),最后就會演進未這幾個問題綜合展現的代碼。閱讀這樣的代碼不看到最底層代碼,根本不知道代碼在做什么,因為方法名已經不可信。

(2) 不要急于使用設計模式,寫好基礎代碼

寫出一個好的基礎代碼的過程:先梳理清楚邏輯樹(樹形結構,同層對等),然后做到代碼符合邏輯樹(代碼樹自然也符合樹形結構,同層的方法對等)。

打好基礎后,可以再針對基礎代碼的痛點,應用復雜手段(比如設計模式)來解決,關于方法抽取和方法長度,后續單獨文章討論。

責任編輯:趙寧寧 來源: 技術老男孩
相關推薦

2022-07-27 08:16:22

搜索引擎Lucene

2022-12-07 08:42:35

2021-09-26 16:08:23

CC++clang_forma

2020-08-12 09:07:53

Python開發爬蟲

2011-01-10 14:41:26

2025-05-07 00:31:30

2011-05-03 15:59:00

黑盒打印機

2021-07-14 09:00:00

JavaFX開發應用

2024-01-26 08:16:48

Exporter開源cprobe

2021-11-09 06:55:03

水印圖像開發

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 中斷喚醒系統Linux 系統

2021-11-24 16:02:57

鴻蒙HarmonyOS應用

2022-06-06 08:50:40

CIOIT轉型

2014-08-08 13:22:54

測試手機站點移動設備

2021-01-19 09:06:21

MysqlDjango數據庫

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99热都是精品 | 久久久久免费观看 | 国产婷婷色综合av蜜臀av | 99pao成人国产永久免费视频 | 日韩欧美一二三区 | 国产成人精品一区 | 久久国产精品久久国产精品 | 中文字幕韩在线第一页 | 国产成人精品a视频一区www | 久久毛片 | av在线播放不卡 | 久久精品成人一区 | 欧美日韩高清在线观看 | 欧美日韩国产一区二区三区 | 99精品国产一区二区三区 | а_天堂中文最新版地址 | 夜夜操天天干 | 日本在线视频一区二区 | 成人精品鲁一区一区二区 | 日本一区二区三区在线观看 | 999免费网站 | 超碰97人人人人人蜜桃 | 精品九九 | 亚洲综合区 | 久久久久久综合 | 亚洲aⅴ | www.干| 成人国产精品久久久 | 一级a性色生活片久久毛片波多野 | 久久国产精品99久久久久 | 久久综合久色欧美综合狠狠 | 九九视频在线观看视频6 | 国产精品一区二区精品 | 美女网站视频免费黄 | 中文字幕av网 | 国产精品久久久久久福利一牛影视 | 欧美h视频 | 久久四虎| 成人在线视频网址 | 成人福利电影 | 91久久精品 |