設(shè)計(jì)模式——開題報(bào)告

這個(gè)文集的系列是關(guān)于《JavaScript設(shè)計(jì)模式于開發(fā)實(shí)踐》一書,建議大家在厭倦業(yè)務(wù)代碼的時(shí)候可以看看,受益匪淺。

從第一章看到第十三章,津津有味,但是過目就忘,畢竟這樣的例子在實(shí)際應(yīng)用中還需要靈活變通。就好比學(xué)習(xí)高數(shù),你學(xué)會(huì)了一個(gè)方程式的解題方法和過程,但是同樣的問題放到實(shí)際的物理模型中,未必能馬上發(fā)現(xiàn)其中的解法。

多次閱讀,在思考問題時(shí)慢慢代入設(shè)計(jì)模式的思維,在重構(gòu)時(shí)遵循其中的法則,這就是大神們常說的“你應(yīng)該這樣做”。為什么突然就停下來寫這節(jié)職責(zé)鏈模式呢?歸功于下面這段代碼(題目和代碼均從書中摘?。?。

假設(shè)我們負(fù)責(zé)一個(gè)售賣手機(jī)的電商網(wǎng)站,經(jīng)過分別交納500元定金和200元定金的兩輪預(yù)定后(訂單在此時(shí)生成),現(xiàn)在已經(jīng)到了正式購買的階段。
公司針對支付過定金的用戶有一定的優(yōu)惠政策。在正式購買后,已經(jīng)支付過500元定金的用戶會(huì)收到100元的商城優(yōu)惠券,200元定金的用戶可以收到50元的優(yōu)惠券,而之前沒有支付定金的用戶只能進(jìn)入普通購買模式,也就是沒有優(yōu)惠券,而且?guī)齑嬗邢薜那闆r下不一定保證能買到。

這里簡略地描述一下...

orderType: 訂單類型 | 1 => 500元定金用戶, 2 => 200元定金用戶, 3 => 普通購買用戶
pay: 是否已經(jīng)支付定金。(如果用戶下過500/200元定金訂單但是沒有支付,降級為普通購買模式)
stock: 表示當(dāng)前用于普通購買地手機(jī)庫存數(shù)量,已經(jīng)支付過定金地用戶不受限制

//代碼實(shí)現(xiàn)
var oder = function( orderType, pay, stock) {
  if( orderType === 1 ) { // 500元定金購買模式
    if ( pay === true ) {
      console.log('500元定金預(yù)購,得到100元優(yōu)惠券');
    }else {
      if ( stock > 0 ) {
        console.log('普通購買, 無優(yōu)惠券');
      }else {
        console.log('手機(jī)庫存不足');
      }
    }
  }

  else if ( orderType === 2 ) { // 200元定金購買模式
    if ( pay === true ) {
      console.log('200元定金預(yù)購,得到50元優(yōu)惠券');
    }else {
      if ( stock > 0 ) {
        console.log('普通購買, 無優(yōu)惠券');
      }else {
        console.log('手機(jī)庫存不足');
      }
    }
  }

  else if ( orderType === 3 ) { // 200元定金購買模式
    if ( stock > 0 ) {
      console.log('普通購買, 無優(yōu)惠券');
    }else {
      console.log('手機(jī)庫存不足');
    }
  }
};

order(1, true, 500); //輸出: 500元定金預(yù)購,得到100元優(yōu)惠券

作者評論這段代碼: 恐怕只有最“新手”地程序員才會(huì)寫出這樣的代碼。
于是我很尷尬地想: 哈哈,算我一個(gè)。


實(shí)習(xí)期間,我面臨的實(shí)際情況稍復(fù)雜一點(diǎn),簡單描述一下:
一個(gè)產(chǎn)品管理系統(tǒng),第一層分支便是 不同系列的產(chǎn)品 ,第二層分支是 不同角色 ,第三層分支便是對應(yīng)的action(這層相當(dāng)于上面的log,可以不列入在內(nèi))。

那么在沒有真正熟悉整個(gè)流程的情況下,我常常會(huì)寫出else-if許多分支,這些分支往往一開始沒有那么多(一般一開始只有2鐘情況,3個(gè)的時(shí)候一般會(huì)考慮功能的封裝等等狀況了),往往項(xiàng)目往前走,會(huì)臨時(shí)地加入一些狀況,else-if分支開始爆炸,每寫一行代碼就像在牛糞上種花,你都不愿意回頭欣賞這些“花”。
整個(gè)過程就像溫水里的青蛙,你能怪產(chǎn)品燒的水么?產(chǎn)品說,我也沒蓋鍋蓋呀,你自己沒意識(shí)到要及時(shí)跳出來么?

思考
1.如果接到新需求,如何意識(shí)到代碼需要重構(gòu)?
2.如果需要重構(gòu),如何有前瞻性的將代碼重構(gòu)好?


曾經(jīng)讀過一句話: 代碼只能重構(gòu)一次。
作為一個(gè)不合格的程序員,我花過大把的時(shí)間重構(gòu),深知其中的痛苦。

level5的時(shí)候, 我會(huì)嘗試2遍重構(gòu)

  • 代碼整理+注釋整理
  • 功能分離
Emily Morter  2017-01-11.jpg
Emily Morter 2017-01-11.jpg

level6的時(shí)候, 我看透了代碼重構(gòu)是模式上的變化,于是我不再去改動(dòng)一些功能性代碼,例如交互事件

  • 解耦代碼、處理違反封閉-開放原則的代碼

level7的時(shí)候,我還沒做到。我不改了,因?yàn)檫@只會(huì)讓你厭惡你最喜歡的東西。


最后,真心推薦這本書《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》,拯救業(yè)務(wù)代碼中天天抱怨的你。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單例模式 適用場景:可能會(huì)在場景中使用到對象,但只有一個(gè)實(shí)例,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見的單例模式,...
    Obeing閱讀 2,311評論 1 10
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,110評論 2 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評論 25 709
  • D30~3月23日 我現(xiàn)在有個(gè)“優(yōu)點(diǎn)”就是忘的比記的快。就在昨晚下班著急把手機(jī)落在單位了。下班前還在反復(fù)提醒自己結(jié)...
    sky冬日暖洋洋閱讀 159評論 0 0
  • 夏天,買了很多帽子,布帽子、草帽子、滌綸帽子,空頂帽、大檐帽、運(yùn)動(dòng)帽……各式各樣的,最初只是因?yàn)閼械么蛱杺?,解?..
    游蕩在異想世界的惡魔閱讀 336評論 1 1

友情鏈接更多精彩內(nèi)容