|
|

楼主 |
发表于 2008-5-9 20:18:00
|
显示全部楼层
Re:敬请兄弟们帮忙斟酌-关于AddRef与函数返回指针
有人说:lz不会用单方面耦合的阿?
----实际上,以前RpgDIY里我就是这么做的。C++起初也是这么做的。
后来觉得,这么做违背了“对称的美”。而且思维纠缠。这不高深,看伪代码:
Parent::AddChild(child);
Parent::RemoveChild(child);
Child::SetParent(parent);
AddChild和RemoveChild里面应该做什么?SetParent里面做什么?
我曾经这么做的:
AddChild(child)
{
child->SetParent(parent);
}
RemoveChild正好相反,child->SetParent(null);
而SetParent里面我什么额外操作都没有做~~
---------------------------------------------------------
有人说,应该自动相互处理,SetParent也会调用AddChild。
----我从未试过----这需要间接递归标志变量。
---------------------------------------------------------
目前的做法是,清爽的做法----AddChild/ RemoveChild/ SetParent
里面不做任何 额外的 操作。
父子的耦合,由用户(第三者)完成。这很简洁,很对称。
===================================================================
打断下,我们看一下C++指针。如果采用现在的做法(对称的方法),
我们没有理由使用 强引用(AddRef),这不对称。
也似乎不应该在destructor中相互解耦----交给用户(第三者)把。
----因为,耦合是用户干的,解耦也交给他算了
---------------------------------------------------------------
还有种做法(我不喜欢)----不对称做法----就是我以前的做法,
SetParent()作为private成员,Parent是friend.
这样,对于用户来说,! 看 不 见 !SetParent.也不知道Child中含有parent的指针。
Add/Remove Child()的时候:
child->m_pParent->RemoveChild(child);
child->m_pParent=this; // 弱 引用
this->m_List->add( SmartPtr<Child>(child) ); // 强 引用
Parent::~Parent(){ RemoveAllChildren(); }
(Child::~Child()不做处理~~~)
这样,很安全,可以说,从外部来看,耦合关系,由Parent全权处理。
(你能够调用private方法吗?)
这样,Child::m_pParent 这个 weak ptr 的“有效期”被嵌套在 Parent的 生命期 之中!
而另一方面,Parent::m_List由于是 SmartPtr,所以,随便你怎么删除children~~
不管你怎么玩,都安全!---- 不 对 称 , 就 要 彻 底 不 对 称 。
---------------------------------------------------------------
还有个方法,就是对称 + 保姆式代码(自动为你耦合解耦,服务一切)
估计我不想尝试这种方法。(注意!不能用SmartPtr,那么干脆都不要用吧)
AddChild, RemoveChild, SetParent, ~Parent, ~Child
这里头会,自动解耦,自动重新耦合。
还有,龌龊的间接递归标志... ...我应该不会用这种方法。 |
|