首先我們要熟記幾個原則
第一個原則: 單一職責
一個類應該只做一類事情,?一個方法最多只做一件事情
郵件類就應該只發(fā)送郵件,但是不關心發(fā)給誰法焰,你告訴我發(fā)給誰我就發(fā)給誰
如果你發(fā)現(xiàn)你在Mail.php里 使用了 User::find(),?這樣的語句存在的時候倔毙,就真的是在亂搞了
第二個原則: 不要做超前的設計
就是,你不要覺得“這代碼以后應該會用到卵蛉,先留著吧”
這樣是不正確的,用到的時候再加吧豌蟋,不要做這些提前的過度設計(當然桑滩,一個良好的可拓展的系統(tǒng)是以后方便拓展的基礎啦)
第三個原則:三次原則
如果一段代碼运准,你在一個地方寫了一次,兩個地方寫的時候你在想该互,我是不是該封裝到另外的方法或者抽到另外的類里去呢
答案是最好在你第三次重復它的時候才抽出
(當然這個為啥是三次韭畸,我的理解是:重復一兩次(當然不是大段大段的,一般是一個小的轉換代碼這樣的幾行)對于閱讀來講比打開另外的一個類随橘,一個文件去找這個方法要方便得多)
(也不是很冗余锦庸,所以說在第三次重復的時候才抽出去,這只是一個折中的點吧)
這三個原則是比較基礎的了, 還有很多當然是可以讓你代碼寫得更好的原則定義萝嘁,可以去翻閱大神的一些文章
另外說一下我個人寫代碼的一些思路牙言,及從大神同事那里學到的一些技巧.
寫代碼的方法怪得,可以考慮以樹狀結構來寫
什么是樹狀結構呢?
比如我們現(xiàn)在寫一個公司內(nèi)部用的圖書館,其中的一個邏輯是擁有一本書的人通過表單創(chuàng)建一條貢獻,那么這是一個action要完成的業(yè)務邏輯
我們第一步,對它進行拆分:
1. 驗證輸入
2. 拿輸入的ISBN從豆瓣取書的信息
3. 創(chuàng)建Book實體并寫入數(shù)據(jù)庫
4. 創(chuàng)建Contribution實體并寫入數(shù)據(jù)庫
5. 響應
這是 postContributon 這個動作所包含的最頂層的邏輯劃分
我們的代碼第一步已經(jīng)完成了, 下一步怎么辦因谎?給每個邏輯起個名,?當然了,第1與第5就不用了颜懊,框架封裝的比較好了.
于是代碼變成了這樣, 這時候 getBookFromDouban createContribution這些方法都還沒有寫的财岔,所以參數(shù)設計并不一定正確风皿,后續(xù)發(fā)現(xiàn)不對再回來修改.?
然后你再去創(chuàng)建這些子方法,記捉宠怠:創(chuàng)建子邏輯方法的時候同樣使用這個方式去拆分
那其實這就是我說的樹狀結構的寫法:1.拆分邏輯變成步驟的注釋桐款,2. 將注釋視復雜度變成方法, 3. 遞歸對方法使用此技巧
聊一下如何拆分“類”
做一個復雜模塊的時候夷恍,很多人一聽到這個需求描述的時候就嚇暈了
比如魔眨,我們現(xiàn)在要做一個登錄模塊(以微博API的登錄為例),微博API的認證流程分為4-5類(有些已經(jīng)廢棄)
比如:1. 賬號密碼登錄,2. 掃碼登錄酿雪,3. QQ, 支付寶等 OAuth 登錄,4. 短信登錄(真的很奇葩)指黎,5. 其它同站業(yè)務使用 access token 登錄
每個業(yè)務的實現(xiàn)都不一樣,?怎么辦朋凉?很多新手已經(jīng)傻了,打開IDE 醋安, if ($method == 1)..elseif ($method == 2).... N,?就開始寫了.
這是不對的.?那么這時候就是理清思路的時候了
幾個詞:Who, How, What 誰杂彭,怎么做,做什么
參與者:這個邏輯里的參與者亲怠, 憑證(Credential),會話狀態(tài)(Session)磺芭,用戶(User)
怎么做:這個是動詞赁炎,所以不應該以動詞來為類命名钾腺,最終它的產(chǎn)物應該是設計模式徙垫,比如這個模塊可以用適配器模式放棒。
做什么:它通常定義了整個模塊的名稱姻报,Login
所以最終的代碼可以寫成:
Manager 是主控,負責接收輸入间螟,創(chuàng)建對應的登錄器Authenticator, 完成登錄動作吴旋,并返回登錄用戶,保存會話這么一些大局觀的動作
Credential 完全就像模型了(或者實體)厢破,只是承載對應授權方式所需要的信息荣瑟,比如Credential\Password 里應該有用戶名與密碼摩泪,同時 getUsername(), getPassword() 提供這些方法
最后兩個就不用講了笆焰,User 是同一個,無論 你用什么方式登錄嚷掠,最后都得到的是一個用戶捏检,所以它只是最后的產(chǎn)出
Session 這里就不講了大家都熟悉
然后在 Manager? (或者AuthorizeManager)里應該有一些方法,比如:login(CredentialInterface $credential), getAuthorizedUser(); ....
所以文件與職責已經(jīng)拆分完成了,過了一個月后不皆,老大說:我要加一個微信登錄9岢恰!EΑ能犯!
沒問題,不就是加一個Credential 與 Authenticator 就完事了项棠,互不干擾.
[疑問] 怎么做:這個是動詞,所以不應該以動詞來為類命名
就是說不能有一個類叫:Login.php香追。怎么做合瓢,這里有5種做法透典,所以就是說有5種授權方式晴楔,最終落地為:5個授權器(名稱好難聽)