Re: [問題] 語法(架構)的問題
※ 引述《tmxcrows (屋裡哈哈)》之銘言:
: 如果有很多容器系列(EX: ArrayList,List,Vector等)
: 那上面應該會有一個抽象的父類別讓他們繼承或implements以提供相同的資料型態,
: (事實上API內也這麼做)
: 而那個父類別提供sort()的抽象方法讓底下的子類別override,(API沒有採取這種作法)
: 這兩種不同的想法在物件導向的設計上有什麼不同呢?
: 有沒有大大可以提出另外一組例子讓小弟我體會一下這之中的奧妙呢?
: 還請大大們提示一下,如果語氣不好還請多多包含,
: 問題如果太過膚淺的話,提示一下我會自刪的!
如果我沒有誤解你的意思 ,
你想問的是為什麼要透過一個第三方的媒介來處理這個問題.
在此先不論調用 Arrays 跟 Collections 的差異 .
(雖然原文用Collections 比較恰當 , 但這跟這個問題沒有直接關聯.)
這個問題的另一種問法應該是這樣的 ,
為什麼是用 Collections 提供 sort method ,
而不是由 AbstractCollection (List/Set 的父類別) 直接寫一個sort method.
這個問題在我的理解 ,
其實是 util (算是外部擴充吧,不太會翻.) 跟 original 的差異 ,
從原本的問題來看 , 這個問題可以從幾個方向下去著手 ,
1. 繼承 AbstractCollection 的類別有規定一定需要排序嗎?
基本上我們在探討的項目是當有 coder 試圖擴充類別時 ,
是否需要進行這個項目 , 當然我們可以強迫性的要求 ,
但是這樣做的結果往往只是讓寫子class變得又複雜又限制重重.
2. 如果有需要排序的情形 , 排序的行為是如何進行
如果排序這個功能是依照各子類別而會有所不同的話 ,
就可能會影響要實作的方式.
不過在這個例子中排序的行為不需要考慮 ,
因為實際上是交給 Collection 中的成員實做 sortable 來作排序依據,
並且提供 Comparator 的方式來作排序行為擴充.
3. 目前的環境條件限制.
有時候基於向下相容以及環境條件的考量(像是用別人的lib等) ,
我們會盡量避免修改(或甚至是無法修改) 現有的class定義 ,
這時候我們也會傾向於撰寫 util class.
我並不曉得當初原始設計者的想法 , 不過 Collections 非常有 util的味道 ,
所謂的 util class 就是用另一個類別來輔助某特定類別的操作 .
舉例而言 , 某第三方套件 (common lang) 就有個好用的 StringUtils ,
以 StringUtils.trim(String)來說 ,
它提供將特定字串去除前後空白的擴充功能 .
這個狀況下 ,
一來是滿足我們無法修改 String 的環境條件 ,
二來是針對 String 進行的功能擴充 ,
三來他還可以確保 null-safe. (註1)
有時候也會為了特殊領域的擴充來寫 util class ,
比方說 String 類在 common lang中還有一個 StringEscapeUtils ,
它可以取得對 String 作 html / java /javascript 等規則的escape結果 .
----
當然這種問題最後的癥結大多在於 "責任" 該交給那個類別 ,
所以也不見得有定論 , 只是設計手法之一而已.
這種設計方案如果跟考試一樣都有個必勝解或者必定要這麼選擇的理由 ,
那寫程式或許會變得很簡單(無趣?) 也不一定 . XD
---
對於 original / util 的議題, 也有一個 original 的範例 ,
Object 的 clone() 就是以原生函式的方式出現,
但他雖然是最底層的 Object 有的 ,
還是需要一個 Cloneable 來確保有 Support . :p
---
註1 . null-safe 是指避免發生以下狀況
String a=null;
String b="hello";
此時若調用 a.equals(b) 會出現 NullPointerException ,
但有引入 common lang 這個lib時 ,
就可採用 StringUtils.equals(a,b)來作判斷 , 可有效避免這問題.
參考資料
API-Collections
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html
API-AbstractCollection
Direct Known Subclasses: AbstractList, AbstractQueue, AbstractSet
http://java.sun.com/j2se/1.5.0/docs/api/java/util/AbstractCollection.html
API-ArrayList
http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html
Common Lang API -org.apache.commons.lang.StringUtils
http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html
Common Lang API -org.apache.commons.lang.StringEscapeUtils
http://0rz.tw/RxxzI
--
What do you want to have ? / What do you have?
從書本中,你可以發現我的各種興趣。
從CD中,你可以瞭解我所喜歡的偶像明星。
或許從文字你很難以瞭解一個人,但從物品可以。
My PPolis , My past. http://ppolis.tw/user/Tony
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 221.169.78.140
※ 編輯: TonyQ 來自: 221.169.78.140 (03/06 21:50)
※ 編輯: TonyQ 來自: 221.169.78.140 (03/06 21:53)
推
03/06 23:53, , 1F
03/06 23:53, 1F
推
03/07 08:56, , 2F
03/07 08:56, 2F
討論串 (同標題文章)