如下伪代码,
AService do2对P进行了操作,然后碰到的问题是PService里对P进行操作,如果调用了AService do2那么
由于不是对P最新的引用,save时会把AService do2的修改覆盖掉。
//Update 2015年05月22日17:24:28
@Ke_Wu 这不应该是逻辑问题,事实上,我作为后来的调用者没必要也不可能知道AService::do2里的具体实现,但现在碰到问题了,那么就是设计的问题了
class AService
{
function do2(pid)
{
...
p = P.getById(pid);
p.s = 'zz';
p.save();
...
}
}
class PService
{
function do1(pid)
{
...
p = P.getById(pid);
p.s = 'yy';
AService.do2(pid);
...
p.a = 'a';p.b = 'b';
...
p.save();//p.s 仍旧是yy, zz被yy覆盖
...
}
}
class CService
{
function do4(cid)
{
...
c = C.getById(cid);
pid = c.pid;
AService.do2(pid);
...
}
}
简化下来其实问题就是:
保存了p2的修改(可能是存到数据库),并不意味着内存里的p1随之更新,除非你重新get一遍p1。
重构的目的是用来改善正确工作代码的风格和设计。
这段代码的问题是逻辑错误,对它而言谈重构还为时过早。