第10章 代碼整潔之道 - 類(lèi)和注釋

一、 類(lèi)
類(lèi)通常由變量沃疮、屬性和方法組成盒让。按照書(shū)中所講的Java的約定,類(lèi)應(yīng)該由一組變量開(kāi)始司蔬,如果有靜態(tài)公共常量邑茄,應(yīng)該放在前面,然后是私有靜態(tài)變量和私有實(shí)體變量俊啼。公共函數(shù)跟在變量之后肺缕,一些供公共函數(shù)調(diào)用的私有工具函數(shù)在公共函數(shù)之后。

  1. 和函數(shù)一樣,類(lèi)也應(yīng)該要盡可能的短小同木。但和函數(shù)不同不是以代碼行數(shù)來(lái)權(quán)衡浮梢,而是以職責(zé)。如果無(wú)法準(zhǔn)確的為某個(gè)類(lèi)命名彤路,則有可能是該類(lèi)的職責(zé)過(guò)多秕硝。

  2. 單一職責(zé)原則(SRP):類(lèi)或模塊應(yīng)該有且只有一條加以修改的理由。

在實(shí)際的工作中很多開(kāi)發(fā)人員往往不會(huì)思考這么多洲尊,他們只想著讓代碼可以工作就可以了远豺,所以經(jīng)常出現(xiàn)幾千行的大類(lèi)。系統(tǒng)應(yīng)該是有許多短小的類(lèi)而不是少量巨大的類(lèi)組成坞嘀。每個(gè)小類(lèi)有單一的職責(zé)躯护,只有一個(gè)修改的原因,所有這些小類(lèi)在一起協(xié)同工作完成系統(tǒng)的功能丽涩。

  1. 高內(nèi)聚:如果一個(gè)類(lèi)中每個(gè)變量都被每個(gè)方法所使用棺滞,則該類(lèi)有最大的內(nèi)聚性。

高內(nèi)聚低耦合:提出與結(jié)構(gòu)化編程矢渊,內(nèi)聚表述模塊內(nèi)部功能不同操作邏輯之間的距離继准,如果一個(gè)類(lèi)的每個(gè)變量都被每個(gè)方法所使用為最大的內(nèi)聚;耦合描述模塊之間的依賴(lài)程度昆淡;高內(nèi)聚低耦合以簡(jiǎn)單的方式表述就是功能完備(高內(nèi)聚)對(duì)象之間是通過(guò)穩(wěn)定的接口(低耦合)交互的锰瘸。保持內(nèi)聚性得到許多短小的類(lèi)。

重構(gòu)函數(shù)也會(huì)促使類(lèi)職責(zé)的分離昂灵,看下面場(chǎng)景:

將一個(gè)有許多變量的大函數(shù)拆分成小函數(shù),如果拆出來(lái)的代碼使用了其中4個(gè)變量舞萄,那么就會(huì)將這4個(gè)變量作為參數(shù)傳入到小函數(shù)中眨补,如果使用的變量越多,就意味著小函數(shù)的參數(shù)越多倒脓,這時(shí)可以講這4個(gè)變量升級(jí)成實(shí)體變量撑螺,小函數(shù)就不需要參數(shù)了,可以直接使用這些變量崎弃。這樣就使內(nèi)聚性變低甘晤,因?yàn)轭?lèi)中有很多的變量只為少數(shù)的函數(shù)服務(wù),這時(shí)就可以將這些變量和函數(shù)拆分出來(lái)饲做,單獨(dú)成類(lèi)线婚。

  1. 開(kāi)放閉合原則(OCP)

類(lèi)應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉盆均。我們可以借助接口和抽象類(lèi)來(lái)隔離這些細(xì)節(jié)帶來(lái)的影響塞弊。

  1. 依賴(lài)倒置原則(DIP)

描述組件之間高層組件不應(yīng)該依賴(lài)于底層組件。依賴(lài)倒置是指實(shí)現(xiàn)和接口倒置,采用自頂向下的方式關(guān)注所需的底層組件接口游沿,而不是其實(shí)現(xiàn)饰抒。DI模式很好的就是應(yīng)用IOC(控制反轉(zhuǎn))框架,構(gòu)造方式分為構(gòu)造注入诀黍,函數(shù)注入袋坑,屬性注入。

小結(jié):

  1. 類(lèi)第一原則應(yīng)是是小并足夠的小眯勾。
  2. 單一原則(SRP)
  3. 內(nèi)聚
  4. 依賴(lài)倒置(DIP)
  5. 開(kāi)放閉合原則(OCP)

二枣宫、 注釋

注釋是一把雙刃劍,好的注釋能夠給我們好的指導(dǎo)咒精,不好的注釋只會(huì)將我們誤導(dǎo)镶柱。注釋是彌補(bǔ)代碼子表述不足的一種手段,就像設(shè)計(jì)模式是用來(lái)彌補(bǔ)語(yǔ)言不足一樣模叙。

代碼是我們獲取信息的準(zhǔn)確來(lái)源歇拆,注釋隨著項(xiàng)目人員的更替,反復(fù)的修改最終可能詞不達(dá)意了范咨,因?yàn)楹芏嚅_(kāi)發(fā)人員在整合代碼故觅,修改方法的時(shí)候并不是總是同步修改注釋。

有時(shí)候看到一個(gè)函數(shù)的代碼寫(xiě)的很糟糕渠啊,邏輯很混亂输吏,有開(kāi)發(fā)人員可能想,給這個(gè)函數(shù)加上幾行注釋?zhuān)@樣有可能起到適得其反的作用替蛉,這時(shí)要做的是將函數(shù)整理干凈贯溅。

代碼即注釋?zhuān)芏鄷?shū)和大師都這么講,意思是我們要用代碼本身來(lái)解釋我們的意圖躲查,那就要求我們要控制好函數(shù)只做一件事它浅,函數(shù)名和變量名要規(guī)范和可讀。

當(dāng)然也不是所有的注釋都沒(méi)有用镣煮,像下面幾種類(lèi)型的注釋是有必要的:

具有警示性的注釋?zhuān)?br> 描述一些負(fù)責(zé)業(yè)務(wù)場(chǎng)景姐霍;
有些函數(shù)現(xiàn)在還是一個(gè)空殼,但在將來(lái)可能有用典唇,有必要寫(xiě)镊折。
當(dāng)我們不得不寫(xiě)一些注釋的時(shí)候,要確保言簡(jiǎn)意賅介衔,能夠很好的表達(dá)意思恨胚,不要造成誤解,也不要寫(xiě)多余的廢話夜牡。

還有一種注釋被稱(chēng)為日志式注釋?zhuān)话愠霈F(xiàn)在一個(gè)類(lèi)的開(kāi)始部分与纽,記錄每次修改時(shí)的時(shí)間侣签、人員名稱(chēng)和修改內(nèi)容。隨著時(shí)間的推移這類(lèi)注釋會(huì)變得非常冗長(zhǎng)急迂。這類(lèi)注釋在一些項(xiàng)目中很普遍影所,而且有時(shí)會(huì)被嚴(yán)格要求寫(xiě),但書(shū)中強(qiáng)調(diào)現(xiàn)在的源代碼都會(huì)有源代碼工具來(lái)進(jìn)行管理僚碎,修改記錄在源代碼工具中有保存猴娩,這種日志式的注釋?xiě)?yīng)該全部刪除。

項(xiàng)目代碼中經(jīng)常會(huì)出現(xiàn)被注釋掉的代碼勺阐,這對(duì)后面的維護(hù)人員會(huì)造成困擾卷中,也會(huì)使代碼變得混亂,這種代碼同樣可以刪掉渊抽,因?yàn)槲覀冇性创a管理工具蟆豫。

對(duì)于書(shū)上的這段描述傳結(jié)合親身經(jīng)歷產(chǎn)生了異議,和大家討論一下懒闷。

經(jīng)歷1:
Merge十减。
很多公司都會(huì)為新的feature,或fix defect而開(kāi)辟新的分支愤估,而當(dāng)分支合并時(shí)原始分支的歷史版本帮辟,可能將會(huì)丟失。

經(jīng)歷2:
根據(jù)重構(gòu)的需要玩焰,有些模塊需要搬遷到新的文件中由驹,有些文件需要新命名/重命名。
而在有些版本控制工具中昔园,如SVN蔓榄,重命名一個(gè)文件,它是當(dāng)作刪除然后添加過(guò)來(lái)處理的默刚。這樣一來(lái)润樱,新的文件將會(huì)有新的歷史,而原來(lái)的歷史羡棵,已隨老的文件煙消云散。

也許嗅钻,從版本控制中還能找回被刪除的老的文件皂冰。但如果作為一個(gè)新接觸的員工,對(duì)于將重命名分解為刪除和添加的操作而言养篓,誰(shuí)又知道以前被刪除的文件是哪一個(gè)秃流?時(shí)間長(zhǎng)了,老員工也記不住傲舶胀!

總結(jié):
對(duì)于以后有影響的或者增強(qiáng)性能比對(duì)的注釋?zhuān)?qǐng)不要?jiǎng)h除概说。除非確定以后真的不再需要。因?yàn)橄ィ姹究刂乒ぞ咛桥猓鋵?shí)并不能滿(mǎn)足我們所想象的需求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轩端,一起剝皮案震驚了整個(gè)濱河市放典,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌基茵,老刑警劉巖奋构,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拱层,居然都是意外死亡弥臼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)根灯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)径缅,“玉大人,你說(shuō)我怎么就攤上這事箱吕〗娌担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵茬高,是天一觀的道長(zhǎng)兆旬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)怎栽,這世上最難降的妖魔是什么丽猬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮熏瞄,結(jié)果婚禮上脚祟,老公的妹妹穿的比我還像新娘。我一直安慰自己强饮,他們只是感情好由桌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著邮丰,像睡著了一般行您。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剪廉,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天娃循,我揣著相機(jī)與錄音,去河邊找鬼斗蒋。 笑死捌斧,一個(gè)胖子當(dāng)著我的面吹牛笛质,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捞蚂,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妇押,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了洞难?” 一聲冷哼從身側(cè)響起舆吮,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎队贱,沒(méi)想到半個(gè)月后色冀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柱嫌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年锋恬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片编丘。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡与学,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘉抓,到底是詐尸還是另有隱情索守,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布抑片,位于F島的核電站卵佛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敞斋。R本人自食惡果不足惜截汪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望植捎。 院中可真熱鬧衙解,春花似錦、人聲如沸焰枢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)济锄。三九已至枫匾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拟淮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工谴忧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留很泊,地道東北人角虫。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像委造,于是被迫代替她去往敵國(guó)和親戳鹅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評(píng)論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法昏兆,類(lèi)相關(guān)的語(yǔ)法枫虏,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法爬虱,異常的語(yǔ)法隶债,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,643評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)跑筝,斷路器死讹,智...
    卡卡羅2017閱讀 134,667評(píng)論 18 139
  • 今年的正月連續(xù)好幾天都去廟里拜拜祈福。希望我2017年里曲梗。如魚(yú)得水赞警,游?有余。順風(fēng)得意虏两。事事順心愧旦。我在想,婚姻實(shí)在...
    美麗是吃出來(lái)的閱讀 248評(píng)論 0 0
  • SHINE Program是TNT經(jīng)典人才發(fā)展項(xiàng)目定罢,至今已經(jīng)是第七屆了笤虫,旨在為年輕員工提供一個(gè)整合多種資源的學(xué)習(xí)發(fā)...
    summer_夏天閱讀 265評(píng)論 0 0