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