代碼語句和函數(shù)的整潔是一個(gè)比較底層的介紹,下面將介紹比之更高層級的類的整潔谐鼎。
1. 類的組織
遵循標(biāo)準(zhǔn)的Java約定舰蟆,類應(yīng)該從一組變量列表開始。如果有公共靜態(tài)常量狸棍,應(yīng)該先出現(xiàn)身害。然后是私有靜態(tài)變量,以及私有實(shí)體變量草戈。很少會有公共變量塌鸯。
公共函數(shù)應(yīng)跟在變量列表之后。把某個(gè)公共函數(shù)調(diào)用的私有工具函數(shù)緊隨在該公共函數(shù)之后唐片。
封裝
優(yōu)先保持變量和工具函數(shù)的私有性丙猬。
2. 類應(yīng)該短小
關(guān)于類的第一條規(guī)則是類應(yīng)該短小。
函數(shù)的第一規(guī)則也是短小费韭。不過對于函數(shù)茧球,我們通過計(jì)算代碼行數(shù)來衡量大小。而對于類星持,我們采用不同的衡量方法抢埋,計(jì)算權(quán)責(zé)(resonsibility)。
2.1 單一職責(zé)原則
單一職責(zé)原則(SRP)認(rèn)為督暂,類或模塊應(yīng)有且只有一條加以修改的理由揪垄。
SRP是OO設(shè)計(jì)中最為重要的概念之一,也是較為容易理解和遵循的概念之一逻翁。但是饥努,SRP往往也是最容易被破壞的類設(shè)計(jì)原則。
系統(tǒng)應(yīng)該由許多短小的類而不是少量巨大的類組成八回。每個(gè)小類封裝一個(gè)權(quán)責(zé)酷愧,只有一個(gè)修改的原因驾诈,并與少數(shù)其他類一起協(xié)同達(dá)成期望的系統(tǒng)行為。
2.2. 內(nèi)聚
類應(yīng)該只有少量實(shí)體變量伟墙。類中的每個(gè)方法都應(yīng)該操作一個(gè)或多個(gè)這種變量翘鸭。通常而言,方法操作的變量越多戳葵,就越黏聚到類上。如果一個(gè)類中的每個(gè)變量都被每個(gè)方法所使用汉匙,則該類具有最大的內(nèi)聚性拱烁。
保持函數(shù)和參數(shù)列表短小的策略,有時(shí)會導(dǎo)致為一組子集方法所用的實(shí)體變量數(shù)量增加噩翠。出現(xiàn)這種情況時(shí)戏自,往往意味著至少有一個(gè)類要從大類中掙扎出來。
2.3 保持內(nèi)聚性就會得到許多短小的類
將大函數(shù)拆分為許多小函數(shù)伤锚,往往也是將類拆分為許多小類的時(shí)機(jī)擅笔。
想想看一個(gè)有許多變量的大函數(shù)。你想把該函數(shù)中某一小部分拆解成單獨(dú)的函數(shù)屯援。不過猛们,你想要拆出來的代碼使用了該函數(shù)中聲明的4個(gè)變量。是否必須將這4個(gè)變量都作為參數(shù)傳遞到新函數(shù)中呢狞洋? 完全沒必要弯淘!只要將4個(gè)變量提升為類的實(shí)體變量,完全無需傳遞任何變量就能拆解代碼了吉懊。應(yīng)該很容易將函數(shù)拆分為小塊庐橙。可惜這意味著類喪失了內(nèi)聚性借嗽,以為堆積了越來越多只允許少量函數(shù)共享而存在的實(shí)體變量态鳖。那么,將這些實(shí)體變量和函數(shù)移到新類中就完美了恶导!
3. 為了修改而合理組織類
遵循OCP(開放閉合原則):對擴(kuò)展開放浆竭,對修改封閉。
隔離修改
需求會改變甲锡,所以代碼也會改變兆蕉。具體類包含實(shí)現(xiàn)細(xì)節(jié),而抽象類則只呈現(xiàn)概念缤沦。
我們應(yīng)該遵循DIP(依賴倒置原則):類應(yīng)該依賴抽象而不是依賴于具體細(xì)節(jié)虎韵。