神級(jí)c/c++程序員教你如何寫(xiě)代碼——十年c/c++編程內(nèi)功心法

C語(yǔ)言是面向過(guò)程的评架,而C++是面向?qū)ο蟮?/p>

C和C++的區(qū)別:

C是一個(gè)結(jié)構(gòu)化語(yǔ)言君丁,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)睛蛛。C程序的設(shè)計(jì)首要考慮的是如何通過(guò)一個(gè)過(guò)程夭坪,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過(guò)程(事務(wù))控制)文判。

C++,首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型室梅,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問(wèn)題域戏仓,這樣就可以通過(guò)獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過(guò)程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問(wèn)題的思想方法不一樣亡鼠。之所以說(shuō)C++比C更先進(jìn)赏殃,是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”。

C與C++的最大區(qū)別:在于它們的用于解決問(wèn)題的思想方法不一樣间涵。之所以說(shuō)C++比C更先進(jìn)仁热,是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”,而就語(yǔ)言本身而言勾哩,在C中更多的是算法的概念抗蠢。那么是不是C就不重要了,錯(cuò)钳幅!算法是程序設(shè)計(jì)的基礎(chǔ)物蝙,好的設(shè)計(jì)如果沒(méi)有好的算法,一樣不行敢艰。而且诬乞,“C加上好的設(shè)計(jì)”也能寫(xiě)出非常好的東西。

很多小伙伴都老是會(huì)碰到疑問(wèn)钠导,其實(shí)還是基礎(chǔ)沒(méi)打扎實(shí)震嫉,這些題如果你不看答案你能知道多少呢?如果還有很多不知道就證明基礎(chǔ)沒(méi)打扎實(shí)牡属,如果你還在入門(mén)糾結(jié)票堵,如果你還在苦惱怎么入門(mén)!小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六九九逮栅,四七零悴势,五九六 】,無(wú)論你是大牛還是小白措伐,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)特纤!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享侥加!

寫(xiě)代碼就是學(xué)一門(mén)語(yǔ)言然后開(kāi)始擼代碼嗎捧存?看完了我一系列文章的同學(xué)或者本身已經(jīng)就是老鳥(niǎo)的同學(xué)顯然不會(huì)這么認(rèn)為。編程是一項(xiàng)非常嚴(yán)謹(jǐn)?shù)墓ぷ鳎‰m然我們自嘲為碼農(nóng)昔穴,但是這工作畢竟不是真正的搬磚镰官,我們是軟件工程師。編程需要關(guān)注的問(wèn)題太多吗货,不僅僅有語(yǔ)言泳唠,還有算法、數(shù)據(jù)結(jié)構(gòu)宙搬、編程技巧警检、編碼風(fēng)格、設(shè)計(jì)害淤、架構(gòu)扇雕、工程化、開(kāi)發(fā)工具窥摄、團(tuán)隊(duì)協(xié)作等方方面面镶奉,涉及到很多層面的問(wèn)題。本文將分享一下根據(jù)我這幾年來(lái)的編程經(jīng)驗(yàn)總結(jié)出的一些關(guān)于如何寫(xiě)代碼的個(gè)人見(jiàn)解崭放。

由于“跟我混”的一些小伙伴編程功底相對(duì)來(lái)說(shuō)比較薄弱哨苛,所以在此總結(jié)一篇“編程內(nèi)功心法”幫助他們渡過(guò)職業(yè)生涯的第一個(gè)瓶頸期。順便币砂,也造福一下路過(guò)的有緣的同學(xué)建峭!于是有了此文。

前言

首先决摧,思考一個(gè)問(wèn)題亿蒸,何謂編程?編程就是寫(xiě)代碼嗎掌桩?

所謂的編程边锁,其實(shí)就是不斷的對(duì)這個(gè)現(xiàn)實(shí)世界中的問(wèn)題建立模型并將其固化為代碼自動(dòng)化執(zhí)行的過(guò)程。

在對(duì)問(wèn)題建立模型的過(guò)程中波岛,我們會(huì)遇到非常多不同層面的問(wèn)題茅坛,所以我們需要很多領(lǐng)域的知識(shí)去解決這些問(wèn)題。

我們需要管理被操作的數(shù)據(jù)则拷,因?yàn)閿?shù)據(jù)與數(shù)據(jù)之前是相互有關(guān)聯(lián)的贡蓖。將數(shù)據(jù)結(jié)構(gòu)化,通常是編程的第一步煌茬。關(guān)于結(jié)構(gòu)化數(shù)據(jù)的相關(guān)理論以及實(shí)踐斥铺,需要有一個(gè)專(zhuān)門(mén)的學(xué)科分支或者說(shuō)課題去研究——數(shù)據(jù)結(jié)構(gòu)

我們需要解決一個(gè)具體的問(wèn)題宣旱,這個(gè)具體的問(wèn)題如何一步步去解決仅父,過(guò)程是怎么樣子的——算法

我們需要將解決方案進(jìn)行自動(dòng)化浑吟,并以代碼的形式進(jìn)行交付——編程語(yǔ)言笙纤。

如果將一個(gè)抽象的模型進(jìn)行編碼實(shí)現(xiàn),如何實(shí)現(xiàn)“這個(gè)功能”组力,如何實(shí)現(xiàn)“那個(gè)功能”——編程技巧省容。

問(wèn)題的規(guī)模大了,眾多代碼糅合在一起燎字,連程序員自己都看不懂了腥椒!怎么來(lái)拆分、模塊化這些代碼——設(shè)計(jì)候衍。

代碼量已經(jīng)到了一個(gè)人無(wú)法完成的地步了笼蛛,需要團(tuán)隊(duì)分工合作才能完成了——工程化

你寫(xiě)的代碼我看不懂蛉鹿,沒(méi)法調(diào)用或者很難調(diào)用滨砍,我寫(xiě)的代碼你也看不懂,或者很難看懂妖异。還怎么愉快的玩送锵罚——編碼風(fēng)格/編碼規(guī)范

問(wèn)題的規(guī)模繼續(xù)擴(kuò)大他膳,到了系統(tǒng)工程的規(guī)模了响逢,之前學(xué)的套路已經(jīng)不管用了!怎么來(lái)構(gòu)建這個(gè)系統(tǒng)才能實(shí)現(xiàn)正確棕孙、安全舔亭、高性能、高可用——架構(gòu)蟀俊。

然而這些也只是一個(gè)系統(tǒng)工程中的冰山一角分歇!這是一個(gè)龐大的體系。也正是因?yàn)檐浖_(kāi)發(fā)需要考慮到的問(wèn)題太多且團(tuán)隊(duì)成員水品參差不齊欧漱,所以團(tuán)隊(duì)開(kāi)發(fā)中并不是每個(gè)程序員做的事情都是一樣的职抡。每個(gè)人都有自己的角色、初級(jí)工程師误甚、中級(jí)工程師缚甩、高級(jí)工程師、架構(gòu)師窑邦、CTO擅威。。冈钦。

所以編程不僅僅只是堆砌代碼郊丛!

說(shuō)到這里,我想起來(lái)了一件事情——為啥業(yè)界普遍鄙視培訓(xùn)出來(lái)半道出家的新人?人與人的區(qū)別是很大的厉熟!我見(jiàn)過(guò)培訓(xùn)出來(lái)也很牛的导盅。其實(shí),說(shuō)到底揍瑟,被鄙視的并不是所有人白翻。而是那些培訓(xùn)了幾個(gè)月之后發(fā)現(xiàn)隨便找個(gè)工作也能拿“高薪”然后還自認(rèn)為編程很簡(jiǎn)單的新人。因?yàn)檫@種經(jīng)歷給了他們一種錯(cuò)覺(jué)——編程如此簡(jiǎn)單绢片,我培訓(xùn)幾個(gè)月也會(huì)嘛滤馍!有點(diǎn)像剛學(xué)會(huì)開(kāi)車(chē)的新司機(jī),很?chē)虖埖膶?duì)老司機(jī)說(shuō)“開(kāi)車(chē)很簡(jiǎn)單嘛底循!你看我也會(huì)俺仓辍!”熙涤。語(yǔ)言和開(kāi)發(fā)工具只是招式纯续,這是外功。而編程思想灭袁、經(jīng)驗(yàn)是內(nèi)功猬错。這些內(nèi)功并不是靠短短幾個(gè)月的培訓(xùn)能夠掌握的,這一點(diǎn)有點(diǎn)像中國(guó)制造業(yè)和日本制造業(yè)的區(qū)別茸歧。動(dòng)不動(dòng)趕英超美可不好倦炒。。软瞎。

編程并不簡(jiǎn)單逢唤!這是一件很?chē)?yán)肅的事情。不過(guò)今天涤浇,我沒(méi)有辦法介紹完所有的方面鳖藕!或者說(shuō),到今天為止只锭,我也并沒(méi)能掌握所有領(lǐng)域的知識(shí)著恩。所以今天我只是分享一些關(guān)于編碼本身的一些經(jīng)驗(yàn)。

另外蜻展,本文主要分享如何寫(xiě)代碼喉誊,并不是如何用Java寫(xiě)代碼。所以文章中各種語(yǔ)言都有可能出現(xiàn)纵顾。

編碼風(fēng)格

先來(lái)一個(gè)圈內(nèi)的段子伍茄。

大部分程序員在工作中都很討厭這四件事情:

寫(xiě)注釋

寫(xiě)文檔

別人不寫(xiě)注釋

別人不寫(xiě)文檔

o(∩_∩)o 哈哈。施逾。中槍了沒(méi)敷矫!

這個(gè)段子其實(shí)反映出來(lái)一個(gè)問(wèn)題例获,即大部分代碼都需要通過(guò)大量注釋和文檔來(lái)說(shuō)明才能將意圖傳達(dá)給維護(hù)這些代碼的程序員!然而曹仗,就像上面的段子說(shuō)的那樣榨汤,寫(xiě)大量的注釋和文檔其實(shí)是一件很麻煩的事情。所以很多時(shí)候整葡,由于嫌麻煩,注釋和文檔就沒(méi)寫(xiě)讥脐,導(dǎo)致維護(hù)代碼的人相當(dāng)?shù)耐纯嘣饩印_@個(gè)苦同學(xué)們肯定都是體會(huì)過(guò)的!相當(dāng)于給你個(gè)精密儀器要你維護(hù)還不給說(shuō)明書(shū)旬渠。

其實(shí)俱萍,打破上面那個(gè)段子描述的那個(gè)怪圈的一個(gè)很有效的手段就是統(tǒng)一編碼風(fēng)格。優(yōu)秀的代碼可以實(shí)現(xiàn)代碼即注釋?zhuān)a本身就可以非常清晰的體現(xiàn)出它的意圖來(lái)告丢,讓別人可以很容易讀懂枪蘑。這就是所謂的可讀性!

命名

計(jì)算機(jī)科學(xué)領(lǐng)域中最難的兩件事是命名和緩存失效岖免!命名并不簡(jiǎn)單岳颇,很復(fù)雜。好的名字可以見(jiàn)名知意颅湘,非常容易理解话侧。之所以說(shuō)命名難是因?yàn)槊倪^(guò)程同時(shí)也是概念提取的過(guò)程!對(duì)問(wèn)題建立模型闯参,需要提取概念并賦予其“術(shù)語(yǔ)”瞻鹏。這個(gè)過(guò)程其實(shí)是“萬(wàn)里長(zhǎng)征”中最難的一步。畢竟鹿寨,設(shè)計(jì)也好新博,架構(gòu)也罷,都有成熟的套路可以參考脚草。唯獨(dú)這個(gè)過(guò)程赫悄,是需要程序設(shè)計(jì)者自己進(jìn)行充分的思考的創(chuàng)造性工作!

以下是總結(jié)出來(lái)的一些命名經(jīng)驗(yàn):

一個(gè)類(lèi)是某物馏慨、某事涩蜘、某人的抽象,是數(shù)據(jù)與行為的集合體熏纯。這恰好符合名詞的定義同诫,因此?類(lèi)名?是一個(gè)名詞!

方法名?或者說(shuō)?函數(shù)名?是某操作或者某過(guò)程的抽象樟澜,是一個(gè)動(dòng)作误窖。這恰好符合動(dòng)詞的定義叮盘,因此函數(shù)名通常是一個(gè)動(dòng)詞。

變量名寧可長(zhǎng)一些說(shuō)明清楚用途也不要用a霹俺、b柔吼、c之類(lèi)的無(wú)意義的名稱(chēng),除非是循環(huán)計(jì)數(shù)器中用i丙唧、j愈魏、k等約定俗成的一些變量名。比如pageIndex和pageSize就要比取名成i和s好想际!取成這種和用混淆器混淆過(guò)后的代碼一樣的名稱(chēng)沒(méi)有什么好處培漏,如果算法比較復(fù)雜的話,過(guò)一段時(shí)間恐怕自己都會(huì)看不懂胡本。

變量名最好包含變量本身的業(yè)務(wù)含義牌柄。比如List studentList = new ArrayList<>();就比List list = new ArrayList<>();好很多。如果同一段代碼里再出現(xiàn)一個(gè)List的話侧甫,這樣就可以很方便的取名為teacherList或者teachers而不是list1和list2這樣的毫無(wú)意義的名稱(chēng)珊佣!

英文不好怎么辦

這個(gè)問(wèn)題怎么說(shuō)呢。披粟。

作為一名程序員吧咒锻,基礎(chǔ)的英文還是要懂的。要不然發(fā)展也容易遇到天花板守屉,學(xué)不好編程的虫碉。畢竟,最新的技術(shù)胸梆、解決方案敦捧、工具都是從國(guó)外傳過(guò)來(lái)的。如果是解決一些基礎(chǔ)性的問(wèn)題碰镜,每天只做做CRUD兢卵,好像英文確實(shí)不怎么用得上。但是一旦遇到一些實(shí)質(zhì)性問(wèn)題绪颖,恐怕只能到英文網(wǎng)站上找嘍秽荤!ㄟ(▔ ,▔)ㄏ 不要跟我說(shuō)你編程可以不需要Stack Overflow。copying and pasting from stackoverflow?可是終極編程大法柠横!o(∩_∩)o 這句話可是編程的真諦扒钥睢!(如果你看不懂這個(gè)梗那你有可能是偽程序員)

其實(shí)牍氛,話說(shuō)回來(lái)晨继,實(shí)在不方便用英文的時(shí)候,我認(rèn)為也可以用拼音命名搬俊。這個(gè)問(wèn)題上可以務(wù)實(shí)一點(diǎn)紊扬,量力而行蜒茄。但是,拼音和英語(yǔ)混用的做法就不太好了餐屎。最好別這樣檀葛!逼格不高。

注釋

怎么添加代碼注釋

關(guān)于注釋?zhuān)覀冃枰鉀Q的第一個(gè)問(wèn)題是如何添加代碼注釋腹缩。

對(duì)于Java屿聋、C#之類(lèi)的語(yǔ)言,有專(zhuān)用的文檔注釋語(yǔ)法藏鹊,很好處理润讥。對(duì)于C/C++,則按約定的格式說(shuō)明一下類(lèi)和函數(shù)伙判、代碼片段的作用和意圖即可象对,至少編譯器會(huì)進(jìn)行靜態(tài)檢查黑忱。在Python中宴抚,有更牛逼的文檔字符串這樣的語(yǔ)言級(jí)特性支持,看注釋用help()很方便甫煞。不過(guò)對(duì)于Lua這樣的弱類(lèi)型解釋型語(yǔ)言菇曲,注釋就比較難處理了。這里以Lua為例給出一種注釋的解決方案抚吠。

借用Java語(yǔ)言文檔注釋的風(fēng)格常潮。

文件注釋?zhuān)蛘哒f(shuō)類(lèi)/模塊注釋。

函數(shù)注釋

小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六九九楷力,四七零喊式,五九六 】,無(wú)論你是大牛還是小白萧朝,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)岔留!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享检柬!

tips:?Lua中可以通過(guò)metatable機(jī)制實(shí)現(xiàn)類(lèi)和繼承献联,這一點(diǎn)與Javascript通過(guò)原型機(jī)制來(lái)實(shí)現(xiàn)類(lèi)和繼承有點(diǎn)類(lèi)似。

注釋里該寫(xiě)些什么

我們首先來(lái)看個(gè)反例何址。

首先這個(gè)方法名本身就取得不好里逆,這個(gè)暫且不說(shuō),先說(shuō)注釋問(wèn)題用爪。這里的注釋犯了幾個(gè)錯(cuò):

方法注釋為“查詢”原押,這簡(jiǎn)直就是廢話!方法名已經(jīng)告訴別人這是查詢方法了偎血,還在這個(gè)注釋里寫(xiě)這兩個(gè)字有什么意義呢班眯?而且到底查詢些什么這里也沒(méi)說(shuō)希停!

參數(shù)沒(méi)有注釋。沒(méi)有描述每一個(gè)參數(shù)的意義以及取值范圍等署隘!

什么情況下會(huì)拋出PageIndexOutOfBoundsException沒(méi)有描述清楚宠能。

“定義一個(gè)整型變量”這種垃圾注釋就不要寫(xiě)了,這么簡(jiǎn)單的語(yǔ)句誰(shuí)看不懂按挪汀违崇!如果要注釋?zhuān)彩菍?xiě)上這個(gè)變量的含義。

這里我們先不考慮設(shè)計(jì)問(wèn)題(分頁(yè)索引號(hào)最好做成可以自己調(diào)整成合理值)诊霹,下面再來(lái)看改善注釋之后的代碼羞延。

改完之后的注釋有沒(méi)有感覺(jué)信息更全很多!雖然說(shuō)代碼本身就是最好的注釋?zhuān)潜匾淖⑨屵€是得寫(xiě)上去脾还,畢竟調(diào)用的時(shí)候別人沒(méi)法猜測(cè)你的索引號(hào)到底從0還是從1開(kāi)始伴箩。另外,如果函數(shù)內(nèi)算法比較復(fù)雜鄙漏,可以在代碼塊內(nèi)注釋?zhuān)部梢栽诤瘮?shù)注釋上直接寫(xiě)清楚這個(gè)函數(shù)內(nèi)部的大概算法/邏輯嗤谚。代碼寫(xiě)出來(lái)就是給別人調(diào)用的,如果沒(méi)有基本的注釋信息怔蚌,那么每次調(diào)用你的代碼的時(shí)候巩步,都得去看一下你的函數(shù)內(nèi)具體邏輯才能知道怎么調(diào)用。這顯然是非常低效的桦踊!

命名與注釋這兩個(gè)基本方面沒(méi)做好的話椅野,會(huì)影響到整個(gè)團(tuán)隊(duì)的運(yùn)作。也就是說(shuō)籍胯,你封裝的東西并沒(méi)有給隊(duì)友節(jié)省什么時(shí)間竟闪,別人用到你的代碼的時(shí)候,又需要花上一些時(shí)間去讀你的代碼杖狼。如果團(tuán)隊(duì)里每個(gè)人都這樣炼蛤,那整個(gè)團(tuán)隊(duì)都會(huì)極其低效。我個(gè)人是非常不愿意與這種代碼風(fēng)格惡劣的人合作的本刽。

參考規(guī)范

關(guān)于編碼風(fēng)格的問(wèn)題鲸湃,本文只說(shuō)命名和注釋這兩個(gè)方面。關(guān)于縮進(jìn)子寓、空格暗挑、斷行、空行等其他方面的問(wèn)題斜友,可以參考本節(jié)給出的參考規(guī)范炸裆。

不同的企業(yè)會(huì)有不同的編碼規(guī)范,所以這里沒(méi)有辦法給出一個(gè)符合所有公司的規(guī)范鲜屏。不過(guò)制定自己團(tuán)隊(duì)的規(guī)范的時(shí)候烹看,可以參考一些大企業(yè)的做法国拇。以下是世界上最大的互聯(lián)網(wǎng)公司谷歌的編碼規(guī)范,同學(xué)們可以參考這個(gè)惯殊。

Google Java Style Guide

Google C++ Style Guide

Google Python Style Guide

Google HTML/CSS Style Guide

Google JavaScript Style Guide

異常處理

異常與返回值有什么不同

在C語(yǔ)言中酱吝,我們的函數(shù)通常會(huì)返回一個(gè)整型值作為狀態(tài)碼用于通知客戶端調(diào)用的結(jié)果。比如0表示成功土思,非0表示失敗务热。并且可以通過(guò)不同的數(shù)值來(lái)表示不同原因?qū)е碌氖 H欢贘ava己儒、C#崎岂、C++一類(lèi)面向?qū)ο笳Z(yǔ)言中,一般不會(huì)用返回值來(lái)表示狀態(tài)闪湾。返回值一般用于表示返回的業(yè)務(wù)值冲甘,而異常用于通知客戶端程序運(yùn)行狀態(tài)改變了。

什么時(shí)候需要拋出異常

關(guān)于這個(gè)問(wèn)題途样,我想到了一句極其精煉的話:當(dāng)函數(shù)無(wú)法完成宣稱(chēng)的任務(wù)的時(shí)候拋出異常江醇!

比如上面的那個(gè)日子,當(dāng)listArticle方法由于種種原因無(wú)法查詢出文章列表的時(shí)候娘纷,則拋出異常嫁审。

拋出異常在這種場(chǎng)景下是非常有必要的跋炕,因?yàn)檫@樣其他人調(diào)用你的代碼時(shí)可以非常放心的去調(diào)用赖晶,只要調(diào)用了你的方法,就會(huì)返回文章列表辐烂。如果無(wú)法返回文章列表遏插,則會(huì)拋出異常。完全不用在調(diào)用這個(gè)函數(shù)的時(shí)候去懷疑是否執(zhí)行成功了纠修。

再來(lái)一句至理名言:

寧愿終止程序也不要帶錯(cuò)運(yùn)行下去胳嘲。

也就是說(shuō),遇到錯(cuò)誤的時(shí)候扣草,寧愿拋出異常終止程序了牛,也不要帶著錯(cuò)運(yùn)行下去。這是在掩耳盜鈴辰妙!

異常需要攜帶什么信息

首先鹰祸,異常的類(lèi)型本身會(huì)帶有異常種類(lèi)信息。其次密浑,異常的message屬性可以帶上更詳細(xì)一些的信息蛙婴。這里需要注意,千萬(wàn)不要像下面這么做尔破。

throw new PageIndexOutOfBoundsException("失斀滞肌浇衬!");

拋出異常了肯定是執(zhí)行失敗了呀!帶上這種信息有什么用餐济,不是帶了一句廢話嘛耘擂!

應(yīng)該是下面這樣

throw new PageIndexOutOfBoundsException("參數(shù)分頁(yè)索引號(hào)pageIndex不能大于分頁(yè)總數(shù)");

此外,異常堆棧也會(huì)攜帶很多信息絮姆。

日志

談到日志梳星,首先要搞清楚一個(gè)問(wèn)題,日志是干嘛用的滚朵?

用來(lái)記錄運(yùn)行時(shí)的錯(cuò)誤信息霸┰帧!

是啊辕近。好像大家都知道日志是干什么用的韵吨,但是為什么寫(xiě)起代碼來(lái)就會(huì)忘記初衷呢!

來(lái)看看代碼:

這里的代碼是什么意思呢移宅?程序員們應(yīng)該都能明白的归粉!很顯然,這位程序員是想借助這些標(biāo)記來(lái)調(diào)試漏峰,想知道代碼到底執(zhí)行到哪一行了糠悼。但是,這里很明顯地犯了兩個(gè)錯(cuò)浅乔。

為什么是System.out.println("");而不是logger.debug("");?

為什么是1倔喂、2而不是一些更明確的文字信息呢?

在這里靖苇,合理的方式是下面這樣席噩。

我想給正在犯上面的錯(cuò)的同學(xué)提個(gè)醒:

使用日志框架,并用合適的級(jí)別輸出日志非常重要贤壁。

好多程序員從來(lái)不負(fù)責(zé)也不參與運(yùn)維相關(guān)的工作悼枢,甚至是做了好幾年的Web都從來(lái)沒(méi)有自己發(fā)布過(guò)網(wǎng)站。所以壓根沒(méi)有后期維護(hù)的意識(shí)脾拆!

如果沒(méi)有這些日志馒索,當(dāng)項(xiàng)目上線之后,運(yùn)維的背鍋俠兄弟發(fā)現(xiàn)網(wǎng)站掛了之后只能直接重啟名船,然后當(dāng)作什么也沒(méi)看到绰上。因?yàn)闆](méi)有排錯(cuò)的線索。

輸出有效信息包帚。

不要去輸出一些像1渔期、2、3、成功疯趟、失敗拘哨、hello這樣的毫無(wú)意義的日志,要輸出logger.debug("郵件發(fā)送任務(wù)成功入隊(duì)。任務(wù)id:" + taskId);這樣的有效信息。

也許當(dāng)時(shí)你調(diào)試的時(shí)候峡迷,在你看來(lái)這些奇怪的字符串是有意義的幔托,但是在其他人看來(lái)鸟废,這些就是天書(shū)。運(yùn)維的背鍋俠會(huì)提刀過(guò)來(lái)砍你的!另外像"-------開(kāi)始執(zhí)行--------"這種對(duì)運(yùn)行期間定位問(wèn)題沒(méi)有半點(diǎn)好處的日志就不要輸出了!自己用可以癣亚,提交代碼前一定要?jiǎng)h掉。

日志中帶上上下文信息获印。

孤立的一句錯(cuò)誤日志通常沒(méi)有什么實(shí)際作用述雾。比如上面的例子中,如果在找不到指定的模板文件的時(shí)候未將發(fā)送郵件時(shí)指定的模板文件名輸出兼丰,那么排錯(cuò)的時(shí)候無(wú)法知道到底是少了哪個(gè)模板文件玻孟。

不要在日志中輸出用戶的敏感信息。

千萬(wàn)不要在日志中輸出像用戶密碼鳍征、郵件內(nèi)容之類(lèi)的涉及用戶隱私的敏感信息黍翎,也不要去輸出像驗(yàn)證碼的值之類(lèi)的敏感信息。

參數(shù)校驗(yàn)

在你對(duì)外公開(kāi)的方法前先插入一些檢查參數(shù)的代碼艳丛,以確保方法被“正確的姿勢(shì)”調(diào)用匣掸。比如:

參數(shù)校驗(yàn)的作用

如果在對(duì)外公開(kāi)的重要方法開(kāi)始的位置不插入校驗(yàn)參數(shù)的代碼,有時(shí)恐怕方法需要運(yùn)行到方法內(nèi)部比較深的位置才會(huì)拋出一個(gè)異常來(lái)质礼。而且那種情況下旺聚,拋出的異持簦可能就會(huì)有各種各樣的了眶蕉。比如空指針、除零異常等唧躲。

這種情況下造挽,很難一眼看出引發(fā)這個(gè)異常的根源是參數(shù)傳錯(cuò)了。需要對(duì)你的代碼進(jìn)行一番調(diào)試才行弄痹!如果一開(kāi)始就在代碼的入口插入了校驗(yàn)參數(shù)的代碼饭入,那么調(diào)用的時(shí)候,一眼就能看出來(lái)是參數(shù)傳錯(cuò)了導(dǎo)致了一個(gè)異常肛真。這樣其他程序員看到這個(gè)異常之后就會(huì)去看一下你的方法注釋谐丢。他一看,哦!原來(lái)分頁(yè)索引號(hào)是從1開(kāi)始計(jì)數(shù)的乾忱,那么這個(gè)問(wèn)題就會(huì)就此打住讥珍,給團(tuán)隊(duì)節(jié)省了時(shí)間。

參數(shù)校驗(yàn)問(wèn)題是會(huì)影響團(tuán)隊(duì)運(yùn)行效率的一個(gè)很關(guān)鍵的因素窄瘟。所以衷佃,請(qǐng)同學(xué)們重視起這個(gè)問(wèn)題來(lái)。我們都是工程師蹄葱,團(tuán)隊(duì)作戰(zhàn)的氏义,自己寫(xiě)代碼快不叫快,整個(gè)團(tuán)隊(duì)快起來(lái)才叫真的快图云!用好斷言惯悠,可以讓你的代碼更健壯。

tips: Java中默認(rèn)斷言是不開(kāi)啟的竣况,所以建議無(wú)視Java語(yǔ)言的斷言吮螺,自己處理。

什么時(shí)候需要進(jìn)行參數(shù)校驗(yàn)

我認(rèn)為一個(gè)方法或者函數(shù)在滿足以下條件時(shí)有必要進(jìn)行參數(shù)校驗(yàn):

方法或者函數(shù)是對(duì)外公開(kāi)的帕翻,不是私有的鸠补。

參數(shù)有可能為空指針的時(shí)候。

參數(shù)的合理值無(wú)法通過(guò)方法名嘀掸、參數(shù)名紫岩、參數(shù)類(lèi)型一眼看出來(lái)的時(shí)候!比如上面那個(gè)pageIndex是從1開(kāi)始計(jì)數(shù)的睬塌,但別人并不知道你是從1開(kāi)始計(jì)數(shù)的泉蝌。

如果對(duì)每一方法都進(jìn)行校驗(yàn)的話,其實(shí)挺麻煩的揩晴。程序員的時(shí)間是很寶貴的勋陪,沒(méi)這么多閑工夫。不過(guò)在滿足上面條件的情況下硫兰,最好還是校驗(yàn)一下诅愚。因?yàn)樽隽诉@個(gè)校驗(yàn),你自己是會(huì)稍微浪費(fèi)幾分鐘的時(shí)間劫映,不過(guò)從團(tuán)隊(duì)整體來(lái)看违孝,總的調(diào)試損耗的時(shí)間卻降下來(lái)了。要記住方法/函數(shù)寫(xiě)出來(lái)就是給別人調(diào)用的泳赋!

參數(shù)校驗(yàn)需要做到什么程度

我有一個(gè)標(biāo)準(zhǔn)雌桑,就是把自己當(dāng)成調(diào)用這些代碼的那個(gè)人,把自己想象成有可能以任何“姿勢(shì)”調(diào)用的菜鳥(niǎo)(實(shí)際上也有可能是不了解你的代碼的大牛)祖今。如果這個(gè)時(shí)候自己也有可能會(huì)犯某些錯(cuò)(比如沒(méi)注意邊界值校坑,沒(méi)注意是否可空)拣技,那么這個(gè)時(shí)候是必須要做校驗(yàn)的。對(duì)于一些已經(jīng)在其他層做過(guò)處理不太可能有錯(cuò)誤的值的情況耍目,可以不做校驗(yàn)过咬。比如你的UserService中有一個(gè)簽名為public void register(User user)的方法,用于注冊(cè)一個(gè)用戶制妄。這種情況下掸绞,可以只校驗(yàn)一下user參數(shù)是否為空,而不用對(duì)user的username耕捞、password屬性進(jìn)行校驗(yàn)(用戶名密碼長(zhǎng)度是否合法等)衔掸。因?yàn)槟阍谏弦粚涌刂破鲗幽P徒壎ǖ臅r(shí)候已經(jīng)做過(guò)非常嚴(yán)謹(jǐn)?shù)男r?yàn)了。當(dāng)然俺抽,這里如果你有充足的時(shí)間敞映,也可以校驗(yàn)一下。具體做到什么程度磷斧,還需要你根據(jù)情況去自己把握振愿。

后記

編碼規(guī)范就是用來(lái)約束別人的!

o(∩_∩)o 哈哈弛饭!開(kāi)玩笑的啦冕末!

其實(shí)很多時(shí)候,出于各種原因侣颂,如“項(xiàng)目周期緊”档桃、“項(xiàng)目還在探索階段可行性未知,先實(shí)現(xiàn)了再說(shuō)”憔晒、“項(xiàng)目中其他代碼已經(jīng)這樣了藻肄,破罐子破摔”等,最終導(dǎo)致的結(jié)果可能就是我們這些自稱(chēng)“有經(jīng)驗(yàn)”的程序員自己也不一定能寫(xiě)出完全符合這些理念的代碼來(lái)拒担∴谕停或許是吧!

ㄟ(▔ ,▔)ㄏ

我承認(rèn)从撼,我也寫(xiě)過(guò)奇葩代碼州弟。

但是,這好像并不是你這個(gè)作為未來(lái)優(yōu)秀程序員的人不思進(jìn)取的理由谋逻。

小時(shí)候呆馁,老師教我們要誠(chéng)實(shí),但是老師自己也不見(jiàn)得能完全做到毁兆。我們可以因?yàn)檫@個(gè)鄙視他。

長(zhǎng)大后阴挣,體驗(yàn)過(guò)了生活中會(huì)有很多的無(wú)奈气堕,不再鄙視“不誠(chéng)實(shí)”的老師。甚至低下了高貴的頭,自己也變得那般模樣茎芭。

未來(lái)揖膜,你還會(huì)教育你的后代“要誠(chéng)實(shí)”嗎?

恐怕會(huì)梅桩!

因?yàn)橐妓冢瑑?yōu)秀的理念,不管結(jié)局如何宿百,都應(yīng)該去提倡趁仙!

小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六九九,四七零垦页,五九六 】雀费,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)痊焊!裙內(nèi)有開(kāi)發(fā)工具盏袄,很多干貨和技術(shù)資料分享!

本文的觀點(diǎn)僅代表現(xiàn)在的我薄啥,人是會(huì)成長(zhǎng)的辕羽,明天的我或許又會(huì)有新的見(jiàn)解!?如果你不認(rèn)同部分觀點(diǎn)或者還有其他的優(yōu)秀理念垄惧,可以給我留言逛漫。我們一起成長(zhǎng)!

這些是C/C++能做的

服務(wù)器開(kāi)發(fā)工程師赘艳、人工智能酌毡、云計(jì)算工程師、信息安全(黑客反黑客)蕾管、大數(shù)據(jù) 枷踏、數(shù)據(jù)平臺(tái)、嵌入式工程師掰曾、流媒體服務(wù)器旭蠕、數(shù)據(jù)控解、圖像處理旷坦、音頻視頻開(kāi)發(fā)工程師掏熬、游戲服務(wù)器、分布式系統(tǒng)秒梅、游戲輔助等

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旗芬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捆蜀,更是在濱河造成了極大的恐慌疮丛,老刑警劉巖幔嫂,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異誊薄,居然都是意外死亡履恩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)呢蔫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)切心,“玉大人,你說(shuō)我怎么就攤上這事片吊≌阑瑁” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵定鸟,是天一觀的道長(zhǎng)而涉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)联予,這世上最難降的妖魔是什么啼县? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮沸久,結(jié)果婚禮上季眷,老公的妹妹穿的比我還像新娘。我一直安慰自己卷胯,他們只是感情好子刮,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著窑睁,像睡著了一般挺峡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上担钮,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天橱赠,我揣著相機(jī)與錄音,去河邊找鬼箫津。 笑死狭姨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苏遥。 我是一名探鬼主播饼拍,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼田炭!你這毒婦竟也來(lái)了师抄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诫肠,失蹤者是張志新(化名)和其女友劉穎司澎,沒(méi)想到半個(gè)月后欺缘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體栋豫,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挤安,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丧鸯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛤铜。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丛肢,靈堂內(nèi)的尸體忽然破棺而出围肥,到底是詐尸還是另有隱情,我是刑警寧澤蜂怎,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布穆刻,位于F島的核電站,受9級(jí)特大地震影響杠步,放射性物質(zhì)發(fā)生泄漏氢伟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一幽歼、第九天 我趴在偏房一處隱蔽的房頂上張望朵锣。 院中可真熱鬧,春花似錦甸私、人聲如沸诚些。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诬烹。三九已至,卻和暖如春弃鸦,著一層夾襖步出監(jiān)牢的瞬間绞吁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工寡键, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掀泳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓西轩,卻偏偏與公主長(zhǎng)得像员舵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子藕畔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理马僻,服務(wù)發(fā)現(xiàn),斷路器注服,智...
    卡卡羅2017閱讀 134,716評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,334評(píng)論 25 707
  • 文/閑云 天上的星光鋪亮了街道的時(shí)候韭邓,街燈不是很友好措近,瞪著冷冷的眼,不敢對(duì)視女淑,看不清黑透的天瞭郑。 尋著南行,那兒有黃...
    2b4c67af34a7閱讀 214評(píng)論 2 3
  • 請(qǐng)撕掉遮住我感官的標(biāo)簽 撕掉我自己穿上的衣物 剝?nèi)ミ@身連我都厭惡的皮囊 讓我赤裸鸭你,讓我脫個(gè)精光 從什么時(shí)候我開(kāi)始背...
    云雀在叫閱讀 257評(píng)論 0 1