Re: [資料] 神之物件 (God object, Blob AntiPattern)

看板OOAD作者 (!H45)時間17年前 (2007/09/14 20:09), 編輯推噓1(103)
留言4則, 1人參與, 最新討論串10/19 (看更多)
※ 引述《cplusplus (大口小口吃炒飯)》之銘言: : 個人看法是...視情況而定 : 在constructor/destructor裡面做些事情也是蠻常見的事情... : 甚至主要功能在裡面完成也是蠻常見的事情.. 個人的看法是「一致就是簡單,視情況而定就是複雜。」 constructor/destructor 要做什麼事情是非常直觀的 而且永遠都一樣的: 「建構子永遠只建立本物件初始的屬性。」 除了初始化屬性之外,其他的事情都不要做。 : 例如做同步化的時候...常用到簡易的lock之類的東西.. : class Lock; : void Function() // syn safe : { : Lock safe("LockName"); //constructor裡面幫你做同步化,加上封鎖 : ... : ... : ... : return; // 在任何一點用任何方式離開都會呼叫destructor,解除封鎖 : } : 這樣不會卡死,也不容易讓使用者誤用 : 當然你要把程式寫成 : Lock safe("LockName"); safe.lock(); : ... : safe.unlock(); : 也是可以,只是程式風格的問題... : 提供lock, unlock等功能也挺不錯,但這樣也提高了誤用的可能性, : 且在上面的例子,每個離開點地方你也得加上 unlock,你也可以說在constructor裡加上 : 檢查做unlock,但這樣就失去lock/unlock對秤性了,你在constructor裡面不自動lock : 在destructor卻自動unlock,這種設計也有人詬病... : 所以如果我只是要一個很簡單的自動lock功能,上面的做法我覺得挺好的, : 也是在constructor/destructor裡完成所有動作。 讓 constructor/destructor 來做 Lock/unlock 反而限制了功能 事實上在許多例子中並不需要把整個函式都鎖起來 著名的 Writer/Reader 問題就是一例。 : 我看本來的討論是說把"整個程式"寫在constructor, : 當然,把"整個程式"寫在constructor當然就是件很糟糕的事情... : 但是如果只是一些小功能的話,視情況我覺得並不一定要這麼排斥 : 所以我覺得不一定說 constructor 只能做物件屬性的初始化 : OO 不是要讓程式變得麻煩,是要變得簡單好管理又好懂 : class Sound; : void Welcome() : { : Sound s("welcome.mp3"); // play welcome background music repeatly : ..... : // leave the function, autoamtically call constructor to stop play. : } : 這樣也不會難懂吧,應該也不至於破壞整個架構吧 如果程式完全不會再修改當然是沒有問題 但是軟體不變的本質就是: 「改變!」 如果把播放聲音的功能直接寫在 constructor 中 未來需要把此聲音進行編碼、加密、過濾都沒辦法使用既有的物件 因為每次建立此物件就是要播放音樂,而事實上新的需求根本不要播放音樂 這個時候原本的設計就出現了大問題 所以把「播放」的功能獨立於另一個函式是非常直觀,而且容易維護的。 : --- : 以上只是個人的想法,可以討論,但不要戰我啊 XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.211.211.53

09/16 00:31, , 1F
當你遇到READER/WRITER問題就不該用這個方式,另外設計
09/16 00:31, 1F

09/16 00:33, , 2F
這算是兩個不同的事情吧,畢竟那個LOCK有特別的用途,就
09/16 00:33, 2F

09/16 00:34, , 3F
是自動解決忘記UNLOCK的問題,基本上...挺好用的不是?
09/16 00:34, 3F

09/16 00:35, , 4F
當然對於要設計一個多功能可覆用的,這方試就不適合了
09/16 00:35, 4F
文章代碼(AID): #16wddk__ (OOAD)
討論串 (同標題文章)
文章代碼(AID): #16wddk__ (OOAD)