public interface A{ void a(); } public abstract class B{ protected abstract boolean lockA(); public void a(){ if(lockA()){ do(); } } protected abstract void do(); } public class C extends B implements A{ public boolean lockA(){ return true; } public void do(){ //TODO one } }
這個時候需要一個新的類D,類D的lockA的規則是和C是一樣的。所以在這裡就出現以下幾種寫法:
寫法一
public class D extends B implements A{ private C c = new C(); public boolean lockA(){ c.lockA(); } public void do(){ //TODO two } }
寫法二
public class D extends C implements A{ public boolean lockA(){ super.lockA(); } public void do(){ //TODO two } }
寫法三
public interface Lock{ boolean lockA(); } public interface DO{ void do(); } public class C extends B implements A{ private Lock lock; private DO do; public boolean lockA(){ return lock.lockA(); } public void do(){ do.do(); } }
寫法一通過把類C組合進類D,然後簡介調用C的方法lockA()
寫法二通過繼承的方法來複用lockA()
寫法三,通過吧Lock和Do做一層抽象,然後通過組合的方式來調用,這個方法的靈活度和可擴充性很高。也是我比較喜歡的做法。
如上述方法一和方法二,在我看來其實也未必不可。我唯一覺得方法三比方法一,二的優勢是在類的層次上設計上更加合理,因為C,D同為A的子集,如果還存在依賴關係就感覺很不合理。
最近自己陷入了一個怪圈,我一直在思考到底什麼樣子的代碼才算是好的代碼。很多時候我都憑著自己的感覺去選擇編碼的方式,比如上述問題,我會憑我的感覺去選擇方法三。還有很多很多情況,我會憑自己的感覺去判斷一段代碼的好壞,但是我有的時候會自己問自己,或者讓我舉一個反例來說明現在的方法不好,我會想很長時間才能想出來,甚至是想不出來,因為很多時候我發現自己是根據感覺去判斷一段代碼是否優雅的。。。。
希望有經驗的老前輩可以指教一二,謝謝。
回複內容:
public interface A{ void a(); } public abstract class B{ protected abstract boolean lockA(); public void a(){ if(lockA()){ do(); } } protected abstract void do(); } public class C extends B implements A{ public boolean lockA(){ return true; } public void do(){ //TODO one } }
這個時候需要一個新的類D,類D的lockA的規則是和C是一樣的。所以在這裡就出現以下幾種寫法:
寫法一
public class D extends B implements A{ private C c = new C(); public boolean lockA(){ c.lockA(); } public void do(){ //TODO two } }
寫法二
public class D extends C implements A{ public boolean lockA(){ super.lockA(); } public void do(){ //TODO two } }
寫法三
public interface Lock{ boolean lockA(); } public interface DO{ void do(); } public class C extends B implements A{ private Lock lock; private DO do; public boolean lockA(){ return lock.lockA(); } public void do(){ do.do(); } }
寫法一通過把類C組合進類D,然後簡介調用C的方法lockA()
寫法二通過繼承的方法來複用lockA()
寫法三,通過吧Lock和Do做一層抽象,然後通過組合的方式來調用,這個方法的靈活度和可擴充性很高。也是我比較喜歡的做法。
如上述方法一和方法二,在我看來其實也未必不可。我唯一覺得方法三比方法一,二的優勢是在類的層次上設計上更加合理,因為C,D同為A的子集,如果還存在依賴關係就感覺很不合理。
最近自己陷入了一個怪圈,我一直在思考到底什麼樣子的代碼才算是好的代碼。很多時候我都憑著自己的感覺去選擇編碼的方式,比如上述問題,我會憑我的感覺去選擇方法三。還有很多很多情況,我會憑自己的感覺去判斷一段代碼的好壞,但是我有的時候會自己問自己,或者讓我舉一個反例來說明現在的方法不好,我會想很長時間才能想出來,甚至是想不出來,因為很多時候我發現自己是根據感覺去判斷一段代碼是否優雅的。。。。
希望有經驗的老前輩可以指教一二,謝謝。
如果你是想考量你所列舉的幾種方法的優劣,我想最好還是套到實際的情況中去決定。所謂設計模式,只是對常用編程思路的一個抽象而已,設計模式之間沒有好壞之分,只有誰更適合實際的情況。所以單純比較幾種設計模式,並不能分析得非常到位。
另外,要實現的上述的這個思路,我想你可以嘗試一下php的 trait ,我想它比上述的方法需要書寫的代碼更少,相容的情境更多。
感覺不出來是因為沒疼過
這種時候隨便挑一種寫完再說
等累積了一定的代碼量,來來回回修改迭代了若干版本之後,下次面對類似的情況就有感覺了
“上次我那樣那樣做,後來代碼變成了一坨沒法維護的垃圾,這次得從最開始就避免”