類抽象的設計問題

來源:互聯網
上載者:User
    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 ,我想它比上述的方法需要書寫的代碼更少,相容的情境更多。

感覺不出來是因為沒疼過

這種時候隨便挑一種寫完再說

等累積了一定的代碼量,來來回回修改迭代了若干版本之後,下次面對類似的情況就有感覺了

“上次我那樣那樣做,後來代碼變成了一坨沒法維護的垃圾,這次得從最開始就避免”

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.