我的評(píng)論
re: 使用重構(gòu)移除丑陋的if else代碼(5) polygoncell 2008-08-08 15:33
@zhuxing
有些年頭了,不過(guò)寫java代碼還沒超過(guò)10年,你呢?
你覺得這樣做繁瑣,請(qǐng)問(wèn)如何做才簡(jiǎn)單?能不能貼出你認(rèn)為簡(jiǎn)單的代碼?有時(shí)候旁觀和自己動(dòng)手做的感覺是完全不一樣的。還有,別忘了要把簡(jiǎn)單留給使用你代碼的人,而把繁瑣留給自己。
有msn么?咱倆好好聊聊。:-)
有些年頭了,不過(guò)寫java代碼還沒超過(guò)10年,你呢?
你覺得這樣做繁瑣,請(qǐng)問(wèn)如何做才簡(jiǎn)單?能不能貼出你認(rèn)為簡(jiǎn)單的代碼?有時(shí)候旁觀和自己動(dòng)手做的感覺是完全不一樣的。還有,別忘了要把簡(jiǎn)單留給使用你代碼的人,而把繁瑣留給自己。
有msn么?咱倆好好聊聊。:-)
re: 使用重構(gòu)移除丑陋的if else代碼(5) polygoncell 2008-08-07 19:59
@zhuxing
那個(gè)反射主要是為了分析@FactoryMethod注釋,用意很清晰:減少不必要的編碼。狀態(tài)增加后,程序員只需要增加一個(gè)帶@FactoryMethod的方法就行了。
那個(gè)反射主要是為了分析@FactoryMethod注釋,用意很清晰:減少不必要的編碼。狀態(tài)增加后,程序員只需要增加一個(gè)帶@FactoryMethod的方法就行了。
re: 申請(qǐng)加入“架構(gòu)師之家” polygoncell 2008-08-05 18:16
申請(qǐng)加入,謝謝。
ID: polygoncell
ID: polygoncell
re: 使用重構(gòu)移除丑陋的if else代碼(5) polygoncell 2008-08-05 17:03
@zhuxing
我又仔細(xì)的考慮了一下,覺得靜態(tài)方法在這里并不適用,因?yàn)槲覀冃枰槍?duì)不同的狀態(tài)寫出完全不同的邏輯來(lái)處理狀態(tài)。靜態(tài)方法通常適用于參數(shù)實(shí)例繁多而邏輯相同的情況。
我又仔細(xì)的考慮了一下,覺得靜態(tài)方法在這里并不適用,因?yàn)槲覀冃枰槍?duì)不同的狀態(tài)寫出完全不同的邏輯來(lái)處理狀態(tài)。靜態(tài)方法通常適用于參數(shù)實(shí)例繁多而邏輯相同的情況。
re: 使用重構(gòu)移除丑陋的if else代碼(5) polygoncell 2008-08-05 02:21
@隔葉黃鶯
這位兄弟挺逗的!呵呵。那個(gè)4是怎么得來(lái)的?
兄弟沒必要這么針對(duì)我吧,我沒招惹你吧。真的是做個(gè)實(shí)驗(yàn),你可以看看我以前的文章。
哦,對(duì)了,樓上眾位兄弟哪位能夠幫我分析一下:我應(yīng)該有如何處理自己原創(chuàng)的文章的自由吧? 而且看與不看全憑自愿,為什么有些朋友的反應(yīng)會(huì)這么激烈?最好那些反應(yīng)過(guò)激的朋友能站出來(lái)說(shuō)說(shuō)你們的想法,大家交換一下意見,謝謝。
這位兄弟挺逗的!呵呵。那個(gè)4是怎么得來(lái)的?
兄弟沒必要這么針對(duì)我吧,我沒招惹你吧。真的是做個(gè)實(shí)驗(yàn),你可以看看我以前的文章。
哦,對(duì)了,樓上眾位兄弟哪位能夠幫我分析一下:我應(yīng)該有如何處理自己原創(chuàng)的文章的自由吧? 而且看與不看全憑自愿,為什么有些朋友的反應(yīng)會(huì)這么激烈?最好那些反應(yīng)過(guò)激的朋友能站出來(lái)說(shuō)說(shuō)你們的想法,大家交換一下意見,謝謝。
re: 使用重構(gòu)移除丑陋的if else代碼(5) polygoncell 2008-08-04 22:22
@BeanSoft
map沒有使用一大團(tuán)if else,HashMap的代碼如下:
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
而且Map已經(jīng)封裝好了,對(duì)于我們使用者來(lái)說(shuō)是沒有if else的。 現(xiàn)在編碼強(qiáng)調(diào)的是粒度適度,便于測(cè)試,便于閱讀。
map沒有使用一大團(tuán)if else,HashMap的代碼如下:
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
而且Map已經(jīng)封裝好了,對(duì)于我們使用者來(lái)說(shuō)是沒有if else的。 現(xiàn)在編碼強(qiáng)調(diào)的是粒度適度,便于測(cè)試,便于閱讀。
re: 使用重構(gòu)移除丑陋的if else代碼(5) polygoncell 2008-08-04 18:46
@zhuxing
理論上來(lái)說(shuō),creation method也是可以的,不過(guò)這樣一來(lái)就導(dǎo)致Performer類和過(guò)多的其他類產(chǎn)生耦合(因?yàn)樘幚砻恳粋€(gè)狀態(tài)需要用到完全不同的類),我用factory就是為了保持performer干凈。要是一定要用creation method的話,performer都可以省了,直接寫一個(gè)復(fù)雜的enum,而每一個(gè)enum實(shí)例正好就是creation method。
理論上來(lái)說(shuō),creation method也是可以的,不過(guò)這樣一來(lái)就導(dǎo)致Performer類和過(guò)多的其他類產(chǎn)生耦合(因?yàn)樘幚砻恳粋€(gè)狀態(tài)需要用到完全不同的類),我用factory就是為了保持performer干凈。要是一定要用creation method的話,performer都可以省了,直接寫一個(gè)復(fù)雜的enum,而每一個(gè)enum實(shí)例正好就是creation method。
re: 使用重構(gòu)移除丑陋的if else代碼(5) polygoncell 2008-08-04 18:34
@Unmi
我也就是這次試驗(yàn)一下這么寫,效果不好的話會(huì)考慮下次換個(gè)方式。
我也就是這次試驗(yàn)一下這么寫,效果不好的話會(huì)考慮下次換個(gè)方式。
re: 使用重構(gòu)移除丑陋的if else代碼(5) polygoncell 2008-08-04 18:33
@千里冰封
呵呵,可別超過(guò)3個(gè)。 對(duì)了,你的那個(gè)音樂(lè)播放器挺不錯(cuò)的。
呵呵,可別超過(guò)3個(gè)。 對(duì)了,你的那個(gè)音樂(lè)播放器挺不錯(cuò)的。
re: 使用重構(gòu)移除丑陋的if else代碼(5) polygoncell 2008-08-04 14:41
呵呵,大家的反應(yīng)很激烈啊!
我這里只是使用一個(gè)簡(jiǎn)單的例子來(lái)解釋如何使用重構(gòu)來(lái)移除if else,實(shí)際應(yīng)用邏輯當(dāng)然要復(fù)雜很多。
的確有一些程序員覺得一個(gè)方法里面使用一大堆if else很方便,其實(shí)這只是對(duì)他自己方便,別人閱讀他的這一大堆if else會(huì)很頭疼。
我這樣重構(gòu)看似增加了代碼量,實(shí)則封裝了大量的技術(shù)細(xì)節(jié)。
建議大家去讀讀refactoring to patterns這本書,書中就講到了一個(gè)結(jié)對(duì)重構(gòu)(該書的作者和一個(gè)程序員)的例子,最開始那個(gè)程序員也覺得重構(gòu)完后,代碼量明顯增加,他很不爽,但是后來(lái)他熟悉了那些模式后才發(fā)現(xiàn)他以前的做法是錯(cuò)誤的,應(yīng)該進(jìn)行這樣的重構(gòu)。
我這里只是使用一個(gè)簡(jiǎn)單的例子來(lái)解釋如何使用重構(gòu)來(lái)移除if else,實(shí)際應(yīng)用邏輯當(dāng)然要復(fù)雜很多。
的確有一些程序員覺得一個(gè)方法里面使用一大堆if else很方便,其實(shí)這只是對(duì)他自己方便,別人閱讀他的這一大堆if else會(huì)很頭疼。
我這樣重構(gòu)看似增加了代碼量,實(shí)則封裝了大量的技術(shù)細(xì)節(jié)。
建議大家去讀讀refactoring to patterns這本書,書中就講到了一個(gè)結(jié)對(duì)重構(gòu)(該書的作者和一個(gè)程序員)的例子,最開始那個(gè)程序員也覺得重構(gòu)完后,代碼量明顯增加,他很不爽,但是后來(lái)他熟悉了那些模式后才發(fā)現(xiàn)他以前的做法是錯(cuò)誤的,應(yīng)該進(jìn)行這樣的重構(gòu)。
re: Hibernate user type polygoncell 2008-03-29 00:19
本書的命題是“入門和精通”,網(wǎng)上提供的章節(jié)僅僅是入門級(jí)別的內(nèi)容,是為那些完全沒有Hibernate基礎(chǔ)的同學(xué)準(zhǔn)備的。 那些已經(jīng)了解Hibernate的同學(xué)一定會(huì)覺得這些章節(jié)很乏味,這是很正常的,因?yàn)槟銈円呀?jīng)掌握了這些入門級(jí)別的內(nèi)容,再看一遍,自然乏味。但是請(qǐng)你們?yōu)槟切膩?lái)沒有接觸過(guò)Hibernate的同學(xué)考慮一下,他們非常需要一個(gè)相對(duì)淺顯易懂的臺(tái)階來(lái)幫助他們“入門”。這就是我撰寫前幾章入門內(nèi)容的初衷。
對(duì)于那些已經(jīng)了解Hibernate的朋友們,請(qǐng)你們靜下心來(lái)閱讀后面深入內(nèi)核的章節(jié),在這些章節(jié)中,我是從構(gòu)架的角度講解了Hibernate的幾個(gè)主要的模塊,舉例印證,圖文并茂,大部分內(nèi)容源于實(shí)際項(xiàng)目。如果通讀完全書,還有朋友認(rèn)為這本書“不怎么樣”,那么我作為這本書的作者,在這里誠(chéng)心誠(chéng)意的期盼著你們的寶貴意見,對(duì)于正確的意見,我將會(huì)在本書的后續(xù)版本中加以采納。
不論如何,非常感謝大家對(duì)本書的關(guān)注。