Laravist 半月談特別篇 - 超神的可維護代碼

首先我們要熟記幾個原則

第一個原則: 單一職責

一個類應該只做一類事情,?一個方法最多只做一件事情

郵件類就應該只發(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個授權器(名稱好難聽)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峭咒,一起剝皮案震驚了整個濱河市税弃,隨后出現(xiàn)的幾起案子凑队,更是在濱河造成了極大的恐慌则果,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件西壮,死亡現(xiàn)場離奇詭異,居然都是意外死亡叫惊,警方通過查閱死者的電腦和手機款青,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門霍狰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抡草,“玉大人蔗坯,你說我怎么就攤上這事康震。” “怎么了腿短?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長谚咬,這世上最難降的妖魔是什么鹦付? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任择卦,我火速辦了婚禮敲长,結果婚禮上,老公的妹妹穿的比我還像新娘祈噪。我一直安慰自己,他們只是感情好尚辑,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杠茬,像睡著了一般月褥。 火紅的嫁衣襯著肌膚如雪瓢喉。 梳的紋絲不亂的頭發(fā)上宁赤,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天栓票,我揣著相機與錄音决左,去河邊找鬼。 笑死佛猛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的厉斟。 我是一名探鬼主播挚躯,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼擦秽!你這毒婦竟也來了码荔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤感挥,失蹤者是張志新(化名)和其女友劉穎缩搅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體触幼,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡硼瓣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿傅。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瘟栖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情半哟,我是刑警寧澤酬滤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布寓涨,位于F島的核電站盯串,受9級特大地震影響戒良,放射性物質(zhì)發(fā)生泄漏体捏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一译打、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拇颅,春花似錦、人聲如沸樟插。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搪缨。三九已至鸵熟,卻和暖如春副编,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背流强。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留打月,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓奏篙,卻偏偏與公主長得像柴淘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子为严,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)第股,斷路器荸型,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1.蘋果+哈密瓜+枸杞+木瓜 豐胸養(yǎng)顏 2鳳梨+奇異果+紅棗+紅火龍 清火瘦身 3紅棗+蘋果+哈密瓜+西瓜...
    黑布妞秋閱讀 223評論 0 0
  • 1 今天小歐過來跟我訴苦梭冠,說自己好像心理變態(tài)了,因為她太在意男友的前女友了改备。 小歐是第一次談戀愛,男友對她很好悬钳,但...
    三面辰光閱讀 9,986評論 5 7
  • 我家的老房子 汪云海 在我有記憶的時候盐捷,我們家就住在汪圩莊的中間默勾,房子坐西向...
    馬慶洲閱讀 1,324評論 2 0