请教大婶,模板化是不是解决交叉依赖的有效方法

qq_30275669 2017-12-27 01:04:13
交叉依赖是一个很常见而且很烦人的现象,比如
老师给学生上课,讲解了一个知识点,问学生懂了没,学生讲懂了(老师调用学生,学生立即返回)
然后老师觉得知识点讲解的差不多了,就让学生做几道练习题(老师调用学生,立即返回),但是老师不会一直盯着学生做完木有,可能去处理别的事情,不知道什么时间,学生可能就会跟老师报告做好了(学生延时调用老师)

如果单纯的老师调用学生,情况很简单,只需要老师知道学生的属性和方法,学生不需要对老师有任何了解,但是一旦学生需要延时调用老师,就必须知道调用老师的方法,例如去哪里找老师,讲什么话才能让老师明白他做好了,等等.放到代码当中,就是老师的实现代码中必须出现学生的指针,而学生的代码中也必须出现老师的指针

这就是我提到的双向依赖,算是最糟糕的设计之一.想要去除这种依赖从根本上讲不可能,除非老师不停的问学生做完没有,这个效率就非常糟糕(当然真要这么用也不是不可以),但是仍然有诸多方法降低这种耦合性,比如
1.回调(函数指针,std::function对象,C井委托,辣么大表达式) (共同依赖一个简单类型)
2.令老师跟学生继承自统一父类,并且交互使用相同的接口 (把相互之间的依赖转换为共同的对父类的依赖)
3.//我还没想到,有的话欢迎补充

双向依赖的弊端:
假设你是一个类的作者,那么你不可能接受自己的源文件中必须出现使用者写的代码

最近我发现,模板化可能时解决双向依赖的可能性之一,例如下面这个代码:
template<class T>
class student
{
private:
void practice_thread()
{
Sleep(1000);//正在处理
pteacher->finish();
}
public:
T * pteacher;
void practice()
{
thread pt(&student::practice_thread, this);
pt.detach();
}
};

class teacher
{
public:
void finish()
{
cout << "做对了,真棒" << endl;
}
void teaching(student<teacher>* stu)
{
stu->pteacher = this;
stu->practice();
}
};

void main()
{
teacher tcher;
student<teacher> stu;
tcher.teaching(&stu);
system("pause");
}

如果我是student类模板作者,我不需要知道teacher类的样子
如果我是使用者(编写teacher类和main函数),我只需要根据说明,写一个void finish()函数就可以了,这件事情似乎没有比回调或派生复杂,其中回调需要准备同类型函数并且要传递函数名,而派生需要覆盖同名同类型虚函数

那么请问大婶们,
工程中最推荐做法是什么
这种做法是否可行,优缺点是什么
...全文
491 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xskxzr 2017-12-31
  • 打赏
  • 举报
回复
你把practice_thread的实现写在cpp文件(include "teacher.h")里不就好了?
幻夢之葉 2017-12-30
  • 打赏
  • 举报
回复
T * pteacher;指针并不能说明模板有解决交叉依赖的功能
tecsunwong 2017-12-27
  • 打赏
  • 举报
回复
解耦最简单的方法就是事件驱动,观察者模式就可以了,就好比公众号,关注的人才能受影响,不关注的人不受影响。模板不模板跟这个一点关系都没有

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧