JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Software Design » Effective Java  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 [Re:giraffe]
ingramchen

Web monkey



發文: 479
積分: 12
於 2004-06-18 15:03 user profilesend a private message to usersend email to ingramchenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
giraffe wrote:
我個人比較贊成 plutotw 所説,主要的原因是繼承對 caller 而言所須 allocate 的 object 較 delegation 為少,allocate object 基本上是一個高成本動作,雖然繼承會造成的依賴性較多,程式碼也較難維護,但是個人認為盡量去用是正確的方針 。樓上的那個例子,用長方型設單邊長度的 method 去設正方型的兩邊,已經違反了繼承的原則。是一個不理想的例子。


這個例子當然很容易看出來問題在哪裡,它是專用來解釋 LSP 現象的例子啊。
實務的系統就沒那麼簡單了。首先要判斷 domain 的繼承關係 就不是件容易的
事 ( Domain Knowledge 要夠才行) 再加上動輒數百個 class 的規模,複雜度
可不是這麼好釐清的。又或者系統已經上線一陣子了,今天使用者突然來個
special case ,大多數的狀況都會選擇延伸舊有的 class hierarchy (因為快
,而且不用動大刀去大改已經穩固的架構) 久而久之 LSP 的現象就蔓延開來而
不自知。

就拿 plutotw 臨時提的範例好了:
public class Line extends Point ;
public class Square extends Line ;
public class Rectangle extends Square ;

如果使用者多了一個三角形的需求怎麼辦?要像下面這樣子繼續繼承下去嗎?
public class Line extends Point ;
public class Triangle extends Line ; //三角形..
public class Square extends Line ;
public class Rectangle extends Square ;

再多個五角形、六角形..... 然後 class hierarchy 越長越肥,太多層就沒辦法控管了

如果一開始就選擇 composite:
1
2
3
4
5
6
7
8
9
10
public class Point ;
public class Line {
   Point[] ends = new Point[2];
}
public class Triangle {
   Line[] sideLengths = new Line[3];
}
public class Square {
   Line[] sideLengths = new Line[4];
}


這樣有彈性多了,往後要怎麼加變化都簡單,甚至多增加到立方體都沒問題。

我覺得理論上繼承都可以做的很漂亮,但是實務上程式的可維護性更重要,你不會有太多的
時間去做大的 refactoring來維持繼承的合理性,而且維護的人可能並不是原本的設計者,
他可能會誤用你當初設計好的理念。所以 effective java 才會建議,要用繼承 document
一定要解釋清楚啊。


reply to postreply to post
MyBlog | 訂便當管理系統

話題樹型展開
人氣 標題 作者 字數 發文時間
7622 [Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 metavige 1621 2004-05-26 22:16
6555 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 221 2004-05-26 22:37
6637 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 ingramchen 569 2004-05-26 23:29
6661 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 699 2004-05-27 00:44
6805 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 Yoshi 1892 2004-05-27 02:47
6560 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 1172 2004-05-27 04:59
6452 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 giraffe 207 2004-06-18 11:21
6519 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 ingramchen 1349 2004-06-18 15:03
6325 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 648 2004-06-18 17:36
6471 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 ingramchen 443 2004-06-18 19:49
6997 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 263 2004-06-18 20:51
» JWorld@TW »  Software Design » Effective Java

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8