解耦的好處以及哪來的這麼多好處
關於解耦合的一個現例項子:
“跟大部分餐飲企業一樣,星巴克也主要致力於將訂單處理的吞吐量最大化。顧客訂單越多,收入就越多。為此,他們採取了非同步處理的辦法。你在點單時,收銀員取出一隻咖啡杯,在上面作上記號表明你點的是什麼,然後把這個杯子放到佇列裡去。這裡的佇列指的是在咖啡機前排成一列的咖啡杯。正是這個佇列將收銀員與咖啡師解耦開,從而,即便在咖啡師一時忙不過來的時候,收銀員仍然可以為顧客點單。他們可以在繁忙時段安排多個咖啡師,就像競爭消費者模式(Competing Consumer)裡那樣。”
解耦帶來的好處是:①提高問題的解決概率;②提高問題的解決效果;③提高問題的解決速度;④降低將來爆發隱患的可能性。
這是一篇細究的文章如果只是為了知道一種能解決問題的方案那麼就可以到此為止了,如果想了解解耦的好處是如何帶來的那麼,下面我們就細細分析一下:
例子裡說的時將收銀員與咖啡師解耦開的情況,那麼解耦前是個什麼情況?
解耦前,收銀員與咖啡師是一個人,我們可以稱之為萬能的員工,他什麼都幹。當用戶來了他負責收銀,然後往咖啡機中放入飲品的材料,開動咖啡機等製作準備工作,等待,取出完成品遞給顧客。當然機靈點的員工他會在等待時去讓其他顧客下單然後記下,顧客下單然後記下,直到沒有下一位顧客或者這位萬能的員工記不下了,又或者第一杯咖啡做好了然後他往返於咖啡機與收銀臺之間,在這個例子裡除了必要的收銀時間和製作準備時間,往返於咖啡機與收銀臺之間的時間是不必要的。
當店鋪很受歡迎時,大量湧入的顧客就會壓垮這個萬能的員工,然後顧客沒有得到他們滿意的服務,然後生意一落千丈,GAME OVER。我們需要在問題剛有苗頭的時候做出改變現狀的決斷了,這個時候我有三種想法:①將咖啡機移到收銀臺旁邊,讓收銀員轉身就能製作咖啡,讓往返的距離等於0,甚至然收銀機和咖啡放在一起讓轉身角度等於0;②新增員工。③新增咖啡機。最終在大量顧客的壓力下很有可能這三種想法都實現了,隨著咖啡機的增多咖啡機們從收銀臺移到了收銀臺後面的料理臺上,然後員工們又再次需要轉身180°來往返了。然後多個員工使用這一個收銀機,多個咖啡機歸一個員工調配。員工們大量的往返於收銀臺和料理臺又由此產生了一些交通問題。
當店鋪很受歡迎時,你還有第二種選擇讓原來的萬能員工專門負責收銀,招收專門咖啡師,收銀員收到訂單,之間將訂單打在小票上遞給咖啡師,咖啡師收到小票製作咖啡,然後交由服務員送到顧客手上。然後咖啡製作壓力巨大時增加咖啡師和咖啡機,收銀壓力大時新增收銀員,小票傳遞壓力大時改用傳送帶,傳送帶壓力大時改用軟體自動化。這樣將萬能員工身上的兩項工作分離出來交給兩種不同的角色處理,這就是解耦。解耦之後本來一個綜合性的高效服務顧客問題就可以分解成三個小問題:①如何高效收銀;②如何高效的製作咖啡;③如何高效的在收銀和咖啡製作之間交換資訊。這就是解耦帶來的好處:簡化邏輯,雖然一個問題分解成了三個問題但是問題難度下降帶來的不僅僅是問題的解決概率和解決效果的提升,而且每次只用解決一個問題,這三個問題不會是同時發生的,只會在壓力的提升下一次發生。在實際生產環境中的經驗還告訴我:簡化邏輯還能減少隱患,就比如未解耦的咖啡店中發生的交通問題就沒有出現在解耦的情況下。
說點題外話:
我不知道這個例子最初是來自哪裡,我只是在百度RESTful時在infoq這個網站上看到的,以前也沒有見過這個網站。
但是這不妨礙我覺得這句話說的很對,以前從我聽到的看到的訊息,都在說解耦好解耦好,但是我從來都沒有很明白解耦好在哪裡。只是明白一個人不做兩件事,一個小模組不做一個以上的事務處理。當我在設計程式碼結構的時候也是這麼做的,並且將這個解耦作為說服別人的理由,告訴別人我充分考慮瞭解耦的問題,並且做到了幾乎零耦合的高度。
然而我並沒有深切的體會到解耦和帶來的好處。自從我看到了這個例子,這個例子很有啟發性,雖然例子裡講的不是很透,不經過我們再思考或者遇到一個初學者或許就不能理會例子的意思,但是這並不妨礙我的理解。上面我的解說就講的很透知識密度也很低,不過這是對我來說的,很多對我來說當然如此的部分被我隱藏掉了,不過也不影響細心的初學者們理解。