前面咱們討論了什麼樣的命名更可以讓你賞心悅目,今天來討論一下面向對象編程過程當中最重要的環節,編寫類和函數。咱們仍然用Java來演示,什麼樣的類和函數纔算是整潔的。java
首先討論函數,函數定義好了,類也就容易了。編程
短小微信
相信你們在讀代碼的時候都會遇到過冗長的函數定義。沒有的話能夠私信我,我把原來寫過的一段300+行的函數發給你,不過不要問我這個函數是作什麼的,由於我也忘了,並且不想回顧。固然若是你足夠耐心研究出來了,請教教我。編輯器
言歸正傳,爲何函數要短小呢,如何才能是本身的函數更加短小?第一個問題我也沒法證實,只能告訴你短小的函數看起來更加清晰,更加容易理解。那怎麼才能讓函數變得更加短小呢?很簡單,抽離方法。將一些代碼抽離成另外一個函數。什麼樣的長度纔是合適的呢?我認爲沒必要過於追求短。這裏的長度咱們能夠以代碼塊的層來定義,對於下面這種代碼相信任何人看了都會崩潰吧。函數
public void doSomething() {
for() {
...
while() {
...
if() {
...
}else {
...
}
}
}
}
因此每一個函數中有一層或兩層爲最佳,每層代碼塊最好不超過3行。這是我認爲最佳的函數長度,固然,這個也能夠根據我的習慣稍做調整。測試
只作一件事flex
若是說長度還能夠根據我的習慣,那麼「只作一件事」的要求應該是你們都應該遵照的公約了。若是一個函數中作了太多的事,那麼代碼閱讀起來的難度將會成倍增長,並且文檔書寫難度一樣增大。還有就是給其餘代碼調用形成不便。好比我定義了函數A作了1和2兩件事,函數B想作2和3,怎麼辦?這時B只能再寫一遍A中作2的代碼。而這樣就會有大量重複代碼出現,不但增長工做量,對往後的維護工做也形成很大的負擔。而把1和2分別定義爲函數C和函數D的話,只須要在AB中分別調用就能夠了。ui
命名spa
這裏很少解釋,函數的命名須要具備描述意義,函數越短也就越容易描述。.net
函數參數
參數數量越少越好(這個我目前也沒有作到),究其緣由,首先是讀代碼時每次都要搞清楚每一個參數的意義,因此天然越少越好。另外一方面就是爲測試的同事提供方便,若是有多個函數,測試的同窗就須要考慮更多的測試用例對其進行覆蓋。若是一個函數有3個以上的參數,那測試的同窗可能想要打人了。
使用異常代替返回錯誤碼
這樣就能夠將Try/catch代碼塊抽離出來,由於Try/catch代碼塊影響了正常程序的流程,看起來很醜陋。
函數的主要規則就是這些,那麼如何才能寫出這樣的函數呢?其實沒有什麼特別的技巧,就是記住這些規則,在每次寫完代碼以後再斟酌一番,對代碼進行反覆的打磨,修改不合適的命名,抽離冗長的函數。長此以往,你的代碼必定會被人稱讚的。
說完函數再來講一下如何寫好一個類。
仍是短小
沒錯,類也應該短小,不過這裏短小的定義和函數短小的定義稍有不一樣,咱們一般以「權責」來衡量。先看下面這個類。
public class SuperDashboard extends JFrame implements MetaDataUser {
public Component getLastFocusedComponent()
public void setLastFocused(Component lastFocused)
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
這個類只提供了5個方法,應該不算長,可是我要說,它仍然不知足咱們「短小」的條件,緣由就是違反了單一權責原則。單一權責指的是一個類只描述一類事。上面這個類有對最後焦點組件的讀寫方法,還有獲取版本號和序列號的方法。只要咱們描述一個類時,用到了相似於「還有」這樣的字眼時,那麼這個類就違反了單一權責原則,就須要對其中的方法進行抽離。
爲了修改而組織
大多數系統都會進行持續的迭代,而這也意味着咱們須要不斷對代碼進行修改。而修改代碼每每伴隨着風險。因此,咱們須要作的就是,修改一個方法時,不對其餘方法形成影響。當咱們開始修改時,就要評估好影響,而後將方法進行抽象,拆分。力求作到每次修改都不影響其餘類(即下降耦合)。
對於寫好一個類,總結來講就是「高內聚,低耦合」。想要寫好一個類一樣須要反覆琢磨。沒有人一開始就能寫出很優雅的代碼。最後祝點讚的人寫的代碼愈來愈優雅把。
本文分享自微信公衆號 - 代碼潔癖患者(Jackeyzhe2018)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。