看板 Soft_Job 關於我們 聯絡資訊
※ 引述《csfgsj (Lazy bone)》之銘言: : ※ 引述《oaz ()》之銘言: : : B. 關於將資料和程序放在一起 : : 我個人覺得更精確的說法是:將「相關的」資料和程序放在一起 : : 想像我們現在在蓋一間房子,有兩種可能: : : I. 每間房有各自的家電用品,開關都在各自的房間 : : II. 每間房有各自的家電用品,開關都集中在某一間房 : : 那麼,我們會蓋哪一種? : 貴司所舉的例子是一個典型的封閉體系 你舉的例子真是讓我不理解 clas 和封閉體系、開放體系的關連 我的建議是:你不妨考慮開放原始碼的 oop 函式庫。 完全不會有你說的「租車公司倒了,那你再也沒有車子可用」的情形 : 以下我對您所舉例子的認知,假設有兩個房間好了 : 兩個房間就是兩個獨立的Class,互不相干 : 房間的開關就是Class所屬資料成員 : 只有在那個房間裡面的人才能操作該房間內的開關 : 也就是成員函式 : 在這邊Class模型可以成立的原因是: : 開關屬於房間,也封閉在房間內,房間外的人不會來操作 : 何謂開放體系? : 房間內有一雙鞋 : 我可以將它穿出房間外,走到任何其它的地方 : 甚至房間垮了,鞋子還在 那我再舉例,假設鞋子(資料)有一個動作(程序)叫綁鞋帶 你會預期 I. 鞋子.綁鞋帶() 會只作用在這雙鞋? II. 鞋子.綁鞋帶() 不但會作用在我腳上的鞋子,還會作用在隔壁鄰居的鞋子上 III. 所有人的鞋子的綁鞋帶動作,都統一在某間放裡 請注意,不管你是在房間內、房間外, 還是房間垮了,大家都會預期是第一個例子。 而且再舉例,你要將鞋子到處帶著走是吧: case 1: A(int 尺寸, color 顏色) { B(尺寸, 顏色); } B(int 尺寸, color 顏色) { } case 2: A(鞋子 x) { B(x); } B(鞋子 x) { } 請問是 1, 還是 2 的例子比較簡單? 如果有一天,鞋子新增一個屬性:男用、女用 對第 1 種情形,所有用到的函式都要修改 對第 2 種情形,只有鞋子類別和 B() 要修改, A() 是不變的 : 再舉一個交叉的例子 : 跟車廠買了一部車(資料),車子就是你的了 : 車子離開車廠 : 你要找老王(另外一個不相干的處理函式)改車 : 在路上飆車給警察追 : 甚至把車放火燒了,車廠都管不著 : 這是開放體系,車子屬於客戶,控制權在客戶手上 假設你是車廠,若你跟別家買引擎 有幾種情形: 1. 若你完全不想涉足引擎的 domain knowledge 那你要知道那麼多彈性、內部細節幹嘛? 你只需要知道怎麼把它裝在正確的位置,如何與其它零件結合 若引擎公司倒了怎麼辦? 你當初就應該把引擎的規格定好,若這家公司倒了,就發包 此外,OOP 還有另外一個作法, 就是在引擎外面再包一層自己的 wrapper。 所以,以後若後再換引擎,只要再改寫 wrapper 就好。 wrapper 外的元件可以不被影響到 2. 若你完全不想涉足引擎的 domain knowledge 基本上,這已經是一間很大的公司了,一定也會分部門 如果你不是引擎部門的,你要知道那麼多彈性、內部細節幹嘛? 你只需要知道怎麼把它裝在正確的位置,如何與其它零件結合 如果你是引擎部門的,你的責任是「把引擎做到其它部門不需要了解內部細節」 不管是哪種情形 重要的都是:把「相關的」資料和程序放一起。 : 而封閉體系,就是租來的車 : 客戶想如何使用車,都要通過租車公司(Class) : 遵守許多規定,雖然車子是因你而產生的,可是你沒有主控權 : 也沒有彈性 : 如果租車公司倒了,那你再也沒有車子可用 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.30.46 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1425558816.A.CB5.html ※ 編輯: oaz (140.112.30.46), 03/05/2015 20:39:08
psliurt: 推這篇,把引擎的責任抽象出來,並給予幾乎所有引擎都會 03/08 00:34
psliurt: 有的方法抽象出來,成為抽象方法或是virtual function 03/08 00:35
psliurt: 而這個引擎的介面或抽象類別對於其他零件來說,都只會看 03/08 00:36
psliurt: 到這個引擎所公開(public)的方法,而這些public method就 03/08 00:37
psliurt: 是引擎所負責的責任,那只要你弄到的引擎,符合這個抽象 03/08 00:39
psliurt: 出來的引擎類別的規定介面時,你的車子就可以安裝這個引 03/08 00:40
psliurt: 擎。 03/08 00:40
exo123456789: 其實不覺得上面文中將"幾十個小時"換成"幾百個小時" 03/08 02:21
exo123456789: 會有多大的差異,應該不影響原po想表達的意思。@@ 03/08 02:21