作者H45 (!H45)
看板OOAD
标题Re: [资料] 神之物件 (God object, Blob AntiPattern)
时间Fri Sep 14 20:09:17 2007
※ 引述《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
1F:推 cplusplus:当你遇到READER/WRITER问题就不该用这个方式,另外设计 09/16 00:31
2F:→ cplusplus:这算是两个不同的事情吧,毕竟那个LOCK有特别的用途,就 09/16 00:33
3F:→ cplusplus:是自动解决忘记UNLOCK的问题,基本上...挺好用的不是? 09/16 00:34
4F:→ cplusplus:当然对於要设计一个多功能可覆用的,这方试就不适合了 09/16 00:35