java 板


LINE

※ 引述《sbrhsieh (sbr)》之銘言: : ※ 引述《TonyQ (沉默是金)》之銘言: : : 這個問題的另一種問法應該是這樣的 , : : 為什麼是用 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的味道 , : 我認為當初不把 sort 列入 List(AbstractList) 規格的考量,主要是基於第一點。 : 泛 List 類一開始就設計成異質容器,一個容器內含不同種類的物件,element 與 : element 之間往往沒有順序(大小)上的意義,所以不應該把排序當作 List 類基本的 : 操作之一。 : 雖然可以選擇把 sort 當作是 List 的 optional operation(不支援此操作的 List : 可丟出 UnsupportedOperationException)。所幸不是,因為我個人不喜歡 interface : 裡有 optional operation 這樣子的設計。 interface 非常不適合定義 optional operation 若真的有 optional operation 還不如移動至另一個介面。 -------------- -------------- <<interface>> 改寫 <<interface>> List Sortable -------------- => -------------- sort() <---------optional operation sort() add(o: Object) -------------- -------------- -------------- <<interface>> List -------------- add(o: Object) -------------- 左圖為有 sort() 的 optional operation。可能有些實體類別支援此方法 但是有些實體類別不支援此方法,使用者難以信任此方法能不能排序串列 中的元素,造成系統模組的缺陷。 解決此種不信任的問題,可以改成右圖的結構。增加一個 Sortable 介面 若實體類別有實作 Sortable 則代表此類別可以排序串列內的元素,使用 者可以信任此方法確實有效果。 然而此例,排序演算法幾乎一模一樣,如果所有實作 Sortable 類別的 sort() 方法內的程式碼都相同,根本沒有必要讓所有類別分別實作一模一 樣的功能和實作細節,這樣只會使程式碼不斷地重複出現。 為了解決相同的排序法頻頻出現的問題,創建一個 Collections 的公用型 類別,將排序法放到這個類別,不要再讓類別們出現一模一樣的排序了。 如此一來,可以減少重複的程式碼,也減少相同實作的方法。您可以發現 List 的子類別中,add, remove 這幾種方法的實作細節不盡相同,然而排 序法卻是對於所有的類別都一模一樣!當然得放到特定的地方嚴加管理了! --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.247.13
1F:推 TonyQ:我倒是覺得責任的意味較重一點 , Collections 是泛指跟 03/08 08:19
2F:→ TonyQ:Collection有關的操作, 但單就節省code 繼承或策略都好用. 03/08 08:21
3F:→ H45:同意 TonyQ, 這個設計決策有很多很多原因支持 :) 03/08 08:33







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP