乙個函式只做一件事

2021-09-07 08:51:42 字數 1274 閱讀 2864

過去我以為這句話只是一種好的程式設計習慣,以為即便是不遵守照樣編出正確的程式。而實際上並非如此,不遵循這條規則幾乎無法編出正確的程式。這個法則的重要性不僅僅是可讀性、可維護性,更是深深影響了程式的正確性。

下面乙個具體的例項展示「乙個函式做多件事」的後果,這個例項是乙個下五子棋的大概框架

whoseturn=黑棋

def init():

初始化棋盤

whoseturn=黑棋

def move(著法):

按照著法移動棋子

if 檢查是否結束:

gameover()

def gameover():

是否還玩?

if 還玩:

init()

else:exit()

def 黑棋使用者():

move(黑棋最佳著法)

whoseturn=白棋

def 白棋使用者():

move(白棋最佳著法)

whoseturn=黑棋

如上**,如果黑棋使用者走完一招後,在move()函式中判斷結束條件,發現黑棋贏了,遊戲結束,使用者還想接著玩,所以呼叫init函式進行初始化,先手依然是執黑棋者。init()返回到gameover()函式,gameover()函式返回到move()函式,move()函式返回到黑棋使用者()函式,這時whoseturn突然被置成了白棋!顯然這不是我們想要的結果。

改良的方式就是乙個函式只做一件事,既然move()函式作用是移動棋子,那就讓它專心幹一件事,不要讓它進行遊戲結束的檢測,要把遊戲結束檢測放到黑棋使用者()白棋使用者()中,雖然這樣會多寫一些**,但是這樣能夠增強可維護性。

有些情況下,冗餘的**能增強可維護性

如果黑棋使用者贏了加100分,白棋使用者贏了加10分,那麼很顯然,這時候遊戲結束條件中就需要分別處理一下。如果兩個人共同使用同一件東西,當兩個人的需求發生改變時,這兩個人想對這一件東西做不同的處理,這時必須要分家!不分家二人無法再繼續共用一件東西。這時必須進行分化。

原來二人共用一件東西,這就是一種耦合性強的表現。耦合性強就會導致**更改時需要綜合考慮兩家人的需要,需要協調。協調好了,繼續雅觀優美;協調不好,必須分家。即便是協調好了,如果需要在這段共同的**中加入大量的判斷語句來判斷到底是誰在呼叫這段共同的**,效率必然降低,因為分家之後是誰在呼叫是明確的。

然而,「何時分家」是乙個艱難的決定,沒有準確的答案。這就是程式設計師永恆不變的追求著的「平衡」。

乙個函式只做一件事

最近做code review,有的 是一些單獨的職能,建議開發童鞋抽取為乙個單獨的方法。開發童鞋認為一些小的功能點,如果也抽取單獨的方法,層級會太深。這兩年自己寫 或者做 重構,有時候也會有困惑,什麼內容適合抽取乙個方法,什麼內容適合在乙個方法內。最近在重讀clean code這本書,上周末看到一些...

長期堅持做一件事

閱讀很容易,但每天堅持閱讀20頁,堅持十年以上呢?健身也不難,但每天健身半小時,堅持十年以上呢?寫點東西很容易,但每天寫作,堅持十年以上呢?思考一件事很容易,但每天堅持反思自己的思維邏輯,堅持十年以上呢?所有很容易的事,很簡單的能力,加上乙個時間軸,就會有巨大的威力。因為這些動作就會成為習慣,而習慣...

不是一件事

紀念下第一次雜客。之所以稱之為雜客,是因為不知道這個blog會成為什麼,暫時命這個名字吧。想起最近的事情,不是加班,就是加班,這周好不容易有兩天在家裡休息,去又頹廢了一天,頹廢後的那一刻,卻突然感覺到不安的感覺。哎,不管了,不安就不安吧,下次不這樣了,睡覺先 今晚好像是最後的晚餐,可能是最後一次在這...