0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

程序員是怎么寫代碼的?常見問詳解

電子工程師 ? 來源:江南一點雨 ? 作者:muggle ? 2021-02-20 15:38 ? 次閱讀

代碼混亂的常見問題

很多時候我們項目迭代到后期,項目會變得很混亂,往往只有少數人能知道某段代碼是干嘛的和該如何去改,或者是干脆誰都不知道,只能靠通過注釋去猜測這段代碼可能的作用。原因有可能是因為團隊內部的人事變動,導致原先寫這段代碼的人不再管理這段代碼了,并且代碼寫的實在是屎沒人捋的清。往往我們稱這類代碼為“祖?zhèn)鞔a”,就像祖宗傳下來的代碼一樣,沒人懂沒人敢動。祖?zhèn)鞔a一多,這個項目就變成了屎一樣,開發(fā)人員在這基礎上迭代就如同屎海翻騰,惡心別人也惡心自己。這是一個很可怕的惡性循環(huán),我們如何去避免這種事情發(fā)生呢?先讓我們分析下這類代碼的通病

代碼又臭又長

我見過最長的方法是5000多行,那段代碼沒人敢動,只敢往下加 if else,每次需要改這段代碼的開發(fā)都戰(zhàn)戰(zhàn)兢兢,生怕出現什么莫名其妙的bug。java 可是一門面向對象的語言,一個方法里面有5000多行可以說是很可惡的事情了。我想一開始代碼長度可能沒這么夸張,是什么導致這種結果的?一個是當初寫這段代碼的人本身寫的是直來直去的方法,一堆if else ;后面迭代的開發(fā),面對這么長的代碼瞬間失去了從頭讀到尾的耐心,直接繼續(xù)在后面加 if else 迭代,最后這個方法就變成了一個縫合怪一樣的玩意。

好的 sql 可以很大程度上簡化代碼的復雜程度,但是太過復雜sql 本身就會給后來的開發(fā)人員造成閱讀困難,結果又是變成一條無人敢動的祖?zhèn)鞔a,我想這應該是不少公司極度抵制存儲過程的原因之一。當然不少銀行應用開發(fā)還是大量使用存儲過程,存儲過程有用武之地的,但是一個又臭又長的存儲過程就等著變成祖?zhèn)鞔a吧。當年我見到一個60多個join的sql,看到第一眼就驚為天人從此難以忘懷,當然那段sql也成了沒人敢去動的代碼了。

代碼邏輯不明

代碼邏輯不明所以是我們開發(fā)很容易去犯的毛病,是一個不致命卻煩人的毛病。在代碼上的體現是,邏輯判斷寫的比較反人類各種雙重否定是肯定,不把你繞暈不罷休?;蛘呤菍懫鸫a來東一榔頭西一棒槌,讓人不知道你想干嘛。導致這個的原因有可能是開發(fā)人員在需求理解上出現偏差,做到后面發(fā)現不對勁,再回去改又不大可能了,只能硬著頭皮往下寫,結果就是代碼彎彎繞繞;還有很重要的鍋是在產品經理,任意變更需求,想一出是一出,開發(fā)人員無奈只能跟著想一出寫一出。還用可能是開發(fā)人員方法或者類命名太藝術了,什么四川方言拼音這種沒有十年腦血栓想不出的命名咱就不說了。就說那種國產凌凌漆式的無厘頭命名——這看上去是個刮胡刀實際上是個吹風機,就這種不知道讓人說什么好。

規(guī)劃代碼的核心思想

吐槽了一堆代碼規(guī)范問題,接下來我們說說如何去規(guī)范我們的代碼以及如何做到就算開發(fā)人員更換了,或者項目轉手給他人了,仍然可以讓后面的開發(fā)可以無礙的去閱讀代碼修改代碼。當然各個公司/團隊都有自己的一套代碼規(guī)范,比如項目的結構、代碼命名風格、代碼格式等等。不同團隊有不同的風格,但核心思想是大同小異的。接下來我就我個人的開發(fā)經驗來分享一下一些代碼規(guī)范的思想。

花葉論

就我個人而言,這個理解是我代碼規(guī)范中最淺顯也是最核心的思想,只要稍微動動腦子就能想出這個思路出來。或許我們做業(yè)務開發(fā)的時候,大部分都在寫crud,感覺似乎這部分代碼沒什么規(guī)范好說的,其實不然。對一段業(yè)務代碼而言,我們可以將其分為四類:

數據校驗

業(yè)務邏輯

數據轉換

數據庫交互(查詢與持久化)

大部分時候我們最關心的是邏輯判斷相關的代碼,其次是數據庫交互,對于遠程調用的方法,我們就視其為一個普通的方法以簡化模型,方法調用算業(yè)務邏輯部分的代碼,對于讀代碼的人而言基本上不關心數據校驗和數據的轉換(DTO轉VO等)。因此,代碼應該分出一個主次,應該盡量把主邏輯給凸顯出來,最好一眼看去就能讓人明白這個方法或者這個類干了啥,步驟是什么樣的。對于那些不重要但必要的代碼我稱其為葉,對于那些主要的代碼我稱其為花。葉是為了襯托花的,因此我們應該將那些葉子代碼精簡或者隱藏起來。

隱藏葉子代碼,突出主干邏輯的一些手法

1)Converter(轉換器

大部分時候我們使用 bean 拷貝使用的是BeanUtils這個類來完成,然而一些稍微復雜的實體轉換,這個類就無法勝任了,這個時候我們只能手動的 get set ,往往就是這些get set 方法掩蓋了主干邏輯,讓代碼結構不清晰。因此我建議在你的業(yè)務邏輯代碼中引入1)Converter這個角色來專門負責數據的傳遞與轉換。

2)manager 層

無論我們使用的持久層框架是哪一種,jpa 或者 mybatis 我覺得我們都應該對持久層的部分方法進行簡單封裝一下,這也是阿里規(guī)范里面提倡的。這樣做好處是明顯的,我們做一個查詢時往往要 set 一些查詢條件或者對查詢結果進行一些簡單的判斷,往往這類操作在業(yè)務代碼可能有比較高的重復性。如果把這些代碼放到業(yè)務邏輯代碼里面,少量還好,多了的話就顯得很臃腫了。如果把這種代碼移到manager層里面去,不僅主業(yè)務邏輯代碼不會被干擾,還能提高一定的代碼復用率。

3)方法簡單封裝

假設我們一個方法要完成一段邏輯要分成三大步,而每一個步驟又分成幾個小步驟,那我們就可以將這個方法拆分成三個方法,然后在這三個方法里面完成各自的步驟。這手法是很簡單的,想必大家都能想到,但是我這里要介紹的是簡化復雜方法封裝的神器——函數式編程,我這里指的函數式編程不僅僅是 stream 流和 lambda 表達式的使用。函數式編程封裝適用的場景是:整個流程比較固定,但是某幾個步驟變化是不確定的。我們可以去看看java.util.function這個包的源碼,你會發(fā)現這個包下面全是接口,這些接口被稱為函數式接口。這些函數式接口總體上分為四類:

Function 類型:傳入一個bean 返回另外一個bean

Consumer 類型:傳入一個bean 無返回值

Predicate 類型:傳入一個bean 返回布爾值

Supplier 類型:沒有入參,有出參

以 Consumer 的使用為例:

public User getUser(Consumer consumer){
User user=new User();
consumer.accept(user);
user=userMapper.getUser(user);
return user;
}

public void doSomething1(){
User user=getUser(user->{user.setId(1L)});
}

public void doSomething2(){
User user=getUser(user->{user.setName("xxx")});
}

函數式編程的想象空間很大,使用的得當必定會簡化你的代碼,提高代碼復用率。但是在多線程中使用函數時要留意數據的可見性問題。

日志和注釋的一些個人經驗

1)日志

首先我們要明白日志是給人看的,你加這段日志時要考慮清楚,有沒有人會去查這段日志,這段日志有沒有用。然后我們查閱日志的時候,一般會通過關鍵詞去搜索;因此我們打的日志一定要有關鍵詞,而且這個關鍵詞不要和其他日志重復,不要過長,便于搜索才是王道。大部分情況我們查看日志都是為了追溯bug,那么一個基本原則就是能通過日志分析出業(yè)務邏輯或者流程的走向,對此我建議打日志的地方:

數據更新:我們有必要知道寫庫的數據是不是正確的數據;

條件分支:便于我們分析業(yè)務走的哪一條邏輯;

批量寫庫:打上數據量大小的日志,便于我們分析性能瓶頸。

并不是所有的這些地方都應該打上日志,有的時候我們可能只需要通過一兩條日志就能分析出整個流程的問題點在哪,這個時候其他的日志就顯得多余了。還有我們打完日志之后應該在本地環(huán)境追溯一下,看看這些日志自己是否能讀懂,是否有必要,是否少了重要參數。

2)注釋

最基本的兩個注釋——類注釋,方法注釋相關規(guī)范阿里開發(fā)手冊上就有,我這里就不復述了,我分享下我寫注釋的個人習慣。方法注釋上除了基本的注釋,我還會將產品需求的原文貼重要的部分上去再寫上日期,這樣做的好處是讓別人明白產品需求要求干啥這個方法該干啥,而且產品經理偷偷改需求你還能有追查的根據,有個小本本偷偷記錄他的罪行。

代碼注釋我分享一個我偷師來的小技巧:

pulic void test(){
/** 1. 從excel 獲取 vo*/
Workbook workBook = getWorkBook(wookbookStream);
//獲取成員信息
Sheet userSheet = workBook.getSheetAt(3);
Map userVOMap = getUserForExcel(file, userSheet);
// 獲取項目vo
Sheet projectSheet = workBook.getSheetAt(0);
ProjectVO projectVO = getProjectForExcel(file, isInsert, userVOMap);
// 獲取任務vo
Sheet taskSheet = workBook.getSheetAt(1);
Map taskVOMap = getTaskListForExcel(file, taskSheet, userVOMap);
/** 2. 插入數據 */
if (isInsert.get()){
......
}
/** 3.寫入異常信息 */
if (!isInsert.get()) {
.....
}
}

如你所見,對于主干的步驟 我用/** 1. *//** 2. */javadoc的注釋來標注了,而普通的注釋我用//標注,因為idea 在純黑主題下會給/**這樣的注釋配上綠色,會比較顯眼。我通過這種方式來強調我代碼哪些是花,哪些是葉子。當然這種方式實際上是不大符合代碼規(guī)范的,小伙伴們理性取舍,這種手法未必好。

六大基本原則

對于面向對象的的語言,六大基本是很重要的開發(fā)準則,但似乎大部分人在寫代碼的時候都不大在意這個,這也是導致一個方法變得又臭又長的一個重要原因之一。對于類的復雜度我們應該遵循單一職責原則——一個類或者方法承擔的職責越多,它被復用的可能性就越小,重構或者修改起來就會變得困難重重,我們應該盡量讓一個方法只去做一件事情。

對于許多代碼我們只要通過一些簡單的手法就能很好的提高其擴展性,比如通過接口去實現類與類之間的協作就能提前解決掉許多未知隱患,而且運用得當的情況下還能滿足開閉原則與里氏替換原則,其實service層的設計就有那么點味道了,而且spring的特性也支持接口注入List和map,然而許多開發(fā)多年的同學都不知道這個特性,這個特性在許多場景下可以提高代碼的擴展性,眾所周知,map可以減少代碼的 if else 分支。

方法命名 ‘潛規(guī)則’

很多時候,好的方法命名本身就是對代碼的一種注釋,我這里好的方法命名是指大家約定俗成的命名規(guī)則。如果你多留心各個開源框架的代碼都會發(fā)現一些特定的命名規(guī)則。阿里開發(fā)手冊里面也列舉不少命名前綴與后綴的規(guī)范,其實各個團隊可以根據自己的實際情況規(guī)定一些命名規(guī)則,降低團隊內部的代碼閱讀的成本。

介紹過部分命名規(guī)則,感興趣的小伙伴可以去看看。

代碼提交及版本控制

正確代碼提交日志格式可以幫助開發(fā)人員及時的縷清代碼的修改歷史,從而快速的定位問題。以git為例,我們大部分人提交日志就是幾個字而已,當然你能夠通過日志去定位到自己的修改歷史的話,這樣做也沒什么大問題,但是對于團隊而言,你的修改日志要讓別人能看懂就得按一定的格式來寫了。Git Commit message的 Angular規(guī)范中定義的 commit message 格式有3個內容:

Header Header部分有3個字段:type(必需), scope(可選), subject(必需)

Body 部分是對本次 commit 的詳細描述,可以分成多行。

Footer不常用,可為空 包括不兼容變動、關閉issue。

這里由于篇幅問題不細說,感興趣的小伙伴可以百度查查資料。我們團隊不一定要按照這么嚴格的規(guī)則來,但是可以制定一個類似的規(guī)范來管理提交日志。

對于團隊而言,gitflow 是一個很不錯的開發(fā)流程??梢院艽蟪潭壬瞎芾砗梦覀兊姆种Тa,避免團隊的人由于誤操作而導致某個重要分支出現問題。下面貼出gitflow 流程圖,對于其具體內容同樣不會介紹太多,感興趣的小伙伴去百度吧

幫助代碼規(guī)范的工具

本節(jié)主要介紹提高代碼質量的idea插件和框架,當然大名鼎鼎的 阿里代碼規(guī)范插件咱就不介紹了,想必大家多少了解。不過本人感覺這個插件并不適合一些團隊,一是感覺這個規(guī)范太過嚴格,對開發(fā)人員素質要求太高,二是有的團隊有自己的規(guī)范規(guī)則,而且有可能和阿里規(guī)范沖突,不適用于這個插件。下面介紹的插件可能不適合一些小伙伴。我列舉出來大家自己尋思吧。

mapstruct

對于我而言是很喜歡這個東西的,這個框架解決的問題其實就是我上文提到的花葉論中的 “數據轉換” 的問題。其實不少公司也有類似的概念——定義一個工具類作用是將 DO轉VO 或者 VO轉DTO等,一般這類類都是以converter結尾。而mapstruct這個框架通過編譯器生成字節(jié)碼來自動的生成bean的轉換類。我們想將一個bean的數據賦值給另外一個bean只需要去定義接口即可。這樣既減輕了開發(fā)人員的工作量還將無意義的get和set方法從邏輯代碼塊中剔除出去。這個框架的缺點是字節(jié)碼緩存問題,用過類似自動生成字節(jié)碼工具的小伙伴應該知道——mapstruct 是根據接口去自動生成類的,當我們更新了接口的時候,這個類有可能沒重新生成,當然這只有用idea調試的時候才會有的問題,所以也不必太擔心。

checkStyle

idea checkStyle 插件可以通過自定義配置文件來統(tǒng)一團隊的代碼風格和代碼規(guī)范,降低團隊的交流成本,一般配合 save actions Reborn 使用更佳。關于checkStyle的配置文件網上也不少,這里也不貼出來占篇幅了。

git flow

前文提到過git flow 給團隊帶來的好處,idea也有對應的插件——git Flow Integration,可以通過這個插件來規(guī)范我們的流程:

開發(fā)新功能選擇 start Feature 拉取分支,修復bug 選擇 Start Bugfix 拉取分支,等等。此外還有 push on finish等功能,小伙伴如果感興趣可以百度。

Git Commit Template

這個主要是用來規(guī)范git commit 的一個idea插件小工具了,github上也有類似的開源插件。團隊內部也可以自己開發(fā)一個類似插件,比較簡單,成本也不高。

代碼規(guī)范的一些個人看法就聊到這了,喜歡的小伙伴可以分享一下哦。

CloudLinux將在本季度推出AlmaLinux取代CentOS

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3544

    瀏覽量

    93482
  • SQL
    SQL
    +關注

    關注

    1

    文章

    751

    瀏覽量

    43990
  • 代碼
    +關注

    關注

    30

    文章

    4697

    瀏覽量

    68095
  • 插件
    +關注

    關注

    0

    文章

    319

    瀏覽量

    22377
  • 調用
    +關注

    關注

    0

    文章

    8

    瀏覽量

    3211
收藏 人收藏

    評論

    相關推薦

    京東上萬程序員都AI用它!

    對大模型生成代碼進行智能修復,為程序員開啟代碼漏洞修復的“自動駕駛”模式,不但減少人工接入、提高工作效率,更為企業(yè)抵御內外部各種攻擊構建起一道堅固的安全屏障,確保業(yè)務的連續(xù)性和穩(wěn)定性。 JoyCoder是京東云自主研發(fā)的一款輔助
    的頭像 發(fā)表于 07-17 16:29 ?196次閱讀
    京東上萬<b class='flag-5'>程序員</b>都AI用它!

    程序員節(jié)視頻創(chuàng)意大賽,用串口屏贏取千元大獎

    10月24日,程序員專屬的節(jié)日里,我們盛大開啟“程序員節(jié)視頻創(chuàng)意大賽”特別活動!這不僅是一場視覺的盛宴,更是智慧與創(chuàng)意的璀璨碰撞。我們誠摯邀請每一位程序員及編程愛好者,拿起你的鏡頭,記錄下那些平凡日子中的不凡瞬間,讓編程的魅力與
    的頭像 發(fā)表于 07-08 10:38 ?72次閱讀
    <b class='flag-5'>程序員</b>節(jié)視頻創(chuàng)意大賽,用串口屏贏取千元大獎

    程序員節(jié)視頻創(chuàng)意盛宴,邀您共襄盛舉!

    10月24日,程序員專屬的節(jié)日里,我們盛大開啟“程序員節(jié)視頻創(chuàng)意大賽”特別活動!這不僅是一場視覺的盛宴,更是智慧與創(chuàng)意的璀璨碰撞。我們誠摯邀請每一位程序員及編程愛好者,拿起你的鏡頭,記錄下那些平凡日子中的不凡瞬間,讓編程的魅力與
    的頭像 發(fā)表于 07-04 09:00 ?67次閱讀
    <b class='flag-5'>程序員</b>節(jié)視頻創(chuàng)意盛宴,邀您共襄盛舉!

    助力程序員告別困擾已久的夢魘-Bug

    程序員的噩夢是什么?不用懷疑,就是讓你加班到崩潰的Bug!下面是經過業(yè)界大佬們“長期加班”積累的小妙招,助力你離早下班又進一步~一、定位Bug范圍及性質要有效解決問題,首先要縮小范圍,集中關注最近
    的頭像 發(fā)表于 07-02 08:10 ?214次閱讀
    助力<b class='flag-5'>程序員</b>告別困擾已久的夢魘-Bug

    阿里云內部全面推行AI代碼

    阿里云正在內部全面推行 AI 編程,使用通義靈碼輔助程序員代碼、讀代碼、查 BUG、優(yōu)化代碼等。
    的頭像 發(fā)表于 04-07 09:22 ?503次閱讀

    適者生存,程序員最終會流向哪……

    程序員沒有永遠的護城河?。【湍壳暗幕ヂ摼W大環(huán)境來看,it行業(yè)已經是……
    的頭像 發(fā)表于 03-11 17:11 ?333次閱讀
    適者生存,<b class='flag-5'>程序員</b>最終會流向哪……

    GitHub Copilot:你的代碼超級助手!程序員的最強福音

    今天小啟給大家安利一款令人興奮的AI工具——GitHubCopilot。它無疑是程序員們的最強福音!無論你是新手還是經驗豐富的開發(fā)者,GitHubCopilot都將成為你的代碼超級助手。想象一下
    的頭像 發(fā)表于 03-05 08:04 ?909次閱讀
    GitHub Copilot:你的<b class='flag-5'>代碼</b>超級助手!<b class='flag-5'>程序員</b>的最強福音

    瑞薩Flash程序員V3 發(fā)布說明

    電子發(fā)燒友網站提供《瑞薩Flash程序員V3 發(fā)布說明.pdf》資料免費下載
    發(fā)表于 02-19 09:37 ?1次下載
    瑞薩Flash<b class='flag-5'>程序員</b>V3 發(fā)布說明

    2024程序員的未來方向如何走?還看今朝

    這幾年的IT行業(yè)想必大家已經感受到了,Android、Java、前端等等程序員都經歷了大廠……
    的頭像 發(fā)表于 02-02 09:45 ?733次閱讀
    2024<b class='flag-5'>程序員</b>的未來方向如何走?還看今朝

    誠邀報名 | GPT驅動的新程序員時代,開發(fā)者如何編程?

    模式,開發(fā)者們迎來了編程范式的全新變革。傳統(tǒng)的編程不再局限于編寫線性代碼和優(yōu)化邏輯,自然語言取而代之,成為了編程的新工具,這大大降低了開發(fā)的門檻。 如今,以ChatGPT、Copilot等為代表的AI工具,將全球的知識庫和代碼庫都呈現在用戶面前,只要有足夠的想象力,每個人
    的頭像 發(fā)表于 12-11 22:20 ?479次閱讀

    程序員表白程序

    電子發(fā)燒友網站提供《程序員表白程序.rar》資料免費下載
    發(fā)表于 11-21 10:41 ?16次下載
    <b class='flag-5'>程序員</b>表白<b class='flag-5'>程序</b>

    嵌入式程序員應知道的幾個基本問題

    電子發(fā)燒友網站提供《嵌入式程序員應知道的幾個基本問題.pdf》資料免費下載
    發(fā)表于 11-20 11:21 ?0次下載
    嵌入式<b class='flag-5'>程序員</b>應知道的幾個基本問題

    代碼即注釋,注釋即代碼的概念是如何形成的

    "代碼即注釋,注釋即代碼"這個概念是如何形成的呢?記得之前看一些討論,程序員應該如何代碼的注釋,大家的意見很多,不過我只對兩句話記憶非常深
    的頭像 發(fā)表于 11-18 16:52 ?676次閱讀
    <b class='flag-5'>代碼</b>即注釋,注釋即<b class='flag-5'>代碼</b>的概念是如何形成的

    智能低代碼洪流涌動程序員節(jié),華為云 Astro 觸發(fā) 1024 的乘法效應!

    ? 從人工智能至量子計算,再到最新的云原生技術,越來越多的榮耀被程序員斬獲。今年 1024 程序員節(jié),華為云 Astro 向全民致敬:「低代碼高產出?拓荒數字化版圖——人人皆是程序員
    的頭像 發(fā)表于 11-13 09:39 ?413次閱讀
    智能低<b class='flag-5'>代碼</b>洪流涌動<b class='flag-5'>程序員</b>節(jié),華為云 Astro 觸發(fā) 1024 的乘法效應!

    中軟國際鴻蒙生態(tài)實踐成果閃耀程序員節(jié),以智聯創(chuàng)新碼動程序世界

    10月24-25日,由中國軟件行業(yè)協會、中軟國際有限公司聯合主辦的2023中國程序員節(jié)活動在北京展覽館隆重舉辦。作為面向程序員群體的年度盛會,本屆中國程序員節(jié)以“技術創(chuàng)新與開源合作”為主題,盛邀院士
    的頭像 發(fā)表于 10-27 09:30 ?448次閱讀
    中軟國際鴻蒙生態(tài)實踐成果閃耀<b class='flag-5'>程序員</b>節(jié),以智聯創(chuàng)新碼動<b class='flag-5'>程序</b>世界