作者oaz ()
看板Soft_Job
標題Re: [閒聊] OOP小評
時間Thu Mar 5 20:33:33 2015
※ 引述《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