If语句:你们到底想把我放到哪儿?
本文轉載自?碼農翻身?
順序、循環、分支,是你們所說的程序的三個基本元素。
我就是你們最常用的分支,名字叫做if語句。
今天上午,菜鳥張大胖寫了一段代碼:
public?class?Customer{private?int?type;......void?validate(){if?(type?==?Employee){//針對內部員工做處理}else?if(type?==?Partner){//如果是合作伙伴,做另外的處理}?????????} }看到我沒有? 在那個validate函數中, ? if ...... else if ,那就是我。
張大胖寫這段代碼的時候其實猶豫了一下, 因為他聯想到之前看到的面向對象的文章:?出現了if語句, 可以用多態來消除。
這里要不要試用多態呢?
他把疑惑給師傅Bill講了一下, Bill說道:“暫時不用,這里的邏輯太簡單了,用if else 就可以搞定,使用多態完全是多此一舉!”
到了下午,菜鳥張大胖寫了一個新函數:?getDiscount(), 把我if ...else if 又寫了一遍:
這一次,張大胖心里打鼓了: 同樣的if語句在新的方法中又出現了,如果再增加新的方法,if語句還會重復 !
Bill也在一旁幫腔: 是時候用多態了。
于是張大胖定義了一個抽象類,然后讓兩個新的子類去繼承,就把我從類中給徹底移除了:
public?abstract?class?Customer{abstract?void?validate();abstract?float?getDiscount();...... } public?class?Employee?extends?Customer{void?validate(){//對員工類型的Customer做處理}float??getDiscount(){//對員工類型的Customer做處理} }public?class?Partner?extends?Customer{void?validate(){//對合作伙伴做處理}float??getDiscount(){//對合作伙伴做處理} }我很生氣,這些代碼中連一個If 都沒有,業務邏輯都被分散到了各個具體的類中去了!
可是我轉念一想: 雖然在Customer中消除了if語句,可是你總得創建具體的Customer對象吧! 創建的時候不還得使用If else ?
果然, 在OrderProcessor這個類中, 張大胖寫下了下面的代碼:
我哈哈大笑,我只是從Customer類被轉移了到了OrderProcessor類而已,現在的代碼更加凌亂了。
Bill 大驚:“大胖,可不能這么做啊,這么做重復代碼更要命了,如果增加一個新的Customer的子類, 那得改多少地方啊!”
張大胖說:“那我把這些可惡的If 移到哪里去?”
“我們要提倡把對象和對象的創建分開!?對象只負責業務邏輯,對象的創建由factory, builder這些類來完成。”
public?Customer?createCustomer(int?type,String?id){if(type?==?Employee){return?new?Employee(id);}???if(type?==?Parnter){return?new?Partner(id);}...... }Bill這個辦法好厲害,一下子就把我集中關到了“工廠”小黑屋,無法分散到個各類了。
“奧,這就是設計模式中的簡單工廠吧!原來集中式創建對象,好處很大啊!” 張大胖恍然大悟。
“不過,” 張大胖開始舉一反三,“如果對象之間的依賴關系很復雜呢? 比如A依賴B, B依賴C..... ?用factory的方式寫起來也很麻煩啊!”??
“你想想,能不能用聲明式的方式來描述這種依賴關系,然后由某個程序自動地把這些對象給裝配好?” Bill開始循循善誘。?
我覺得大事不好,他們要把我放到某個通用的程序中去了。
“明白了,我們用的Spring就起到了這個作用,?在Spring當中,只要用聲明的方式表達對象之間的依賴,什么構造器注入,setter方法注入,autowired等等, 然后Spring就可以自動把這些對象給裝配起來,供我們使用,就不用擔心創建對象的問題了。 ” 張大胖突然頓悟Spring的一個重大作用,喜不自勝。
Spring接管了對象的創建,不用在應用代碼中寫if語句創建對象了,但是在業務邏輯中,if語句還是跑不掉的,我下次再說說發生在那里的故事吧。
后記1:多態雖然好用,但也不能濫用!
后記2:本文受到這個視頻的啟發而寫:https://www.youtube.com/watch?v=4F72VULWFvc
總結
以上是生活随笔為你收集整理的If语句:你们到底想把我放到哪儿?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不同时重写equals和hashCode
- 下一篇: Hadoop 之父:普通程序员到顶级公司