在这种情况下,是否需要打破循环依赖关系
Is breaking circular dependency necessary in this case?
例如,考虑一个系统,它有一个全局主控制器,该全局主控制器有一个子控制器,子控制器可以调用主控制器来更新:
主控制器.h
class SubController;
class MainController{
public:
static void setGlobalMainController(MainController* mainController);
static MainController* getGlobalMainController();
void init();
void updateSystem();
protected:
SubController* subController;
};
主控制器.cpp
#include "MainController.h"
#include "SubController.h"
MainController* globalMainController;
void MainController::setGlobalMainController(MainController* mainController){
globalMainController=mainController;
}
MainController* MainController::getGlobalMainController(){
return globalMainController;
}
void MainController::init(){
this->subController=new SubController();
//wait sub controller to press button...
}
void MainController::updateSystem(){
//do something
}
子控制器.h
class SubController{
protected:
void onButtonPressed();
}
SubController.cpp
#include "SubController.h"
#include "MainController"
void SubController::onButtonPressed(){
//do something...
MainController::getGlobalMainController()->updateSystem();
}
子控制器可以接受按钮事件,然后需要更新主控制器。
它有循环依赖关系,然后我尝试使用继承来打破循环依赖关系:创建一个新的类MainControllerImp,并将MainController中的所有具体方法移动到MainControllerImp:
主控制器.h
class SubController;
class MainController{
public:
static void setGlobalMainController(MainController* mainController);
static MainController* getGlobalMainController();
virtual void init()=0;
virtual void updateSystem()=0;
protected:
SubController* subController;
};
主控制器.cpp
#include "MainController.h"
#include "SubController.h"
MainController* globalMainController;
void MainController::setGlobalMainController(MainController* mainController){
globalMainController=mainController;
}
MainController* MainController::getGlobalMainController(){
return globalMainController;
}
主控制器Imp.h
#include "MainController.h"
class MainControllerImp : public MainController{
virtual void init();
virtual void updateSystem();
}
主控制器Imp.cpp
#include "MainControllerImp.h"
void MainControllerImp::init(){
this->subController=new SubController();
//wait sub controller to press button...
}
void MainControllerImp::updateSystem(){
//do something
}
子控制器.h
class SubController{
protected:
void onButtonPressed();
}
SubController.cpp
#include "SubController.h"
#include "MainController"
void SubController::onButtonPressed(){
//do something...
MainController::getGlobalMainController()->updateSystem();
}
循环依赖似乎消失了。但过了一段时间,我开始思考在这种情况下是否需要打破依赖:它只会将所有方法从父类移动到子类,而且似乎没有任何好处。此外,它还有一个类,可读性较差,代码也不那么直接。
在这种情况下,我应该保留循环依赖关系吗?或者还有其他更好的设计模式来打破循环依赖?
循环依赖总是很糟糕,我总是会尝试删除它。
为什么?因为它使代码变得脆弱,而且它直接打破了打开/关闭的原则。如果你必须修改一个类,那么99%的可能性你也必须修改另一个类。
打破循环依赖的选项很少,但我最喜欢的方法(我认为来自"大规模C++软件设计")是将两个类合并为一个。
相关文章:
- C++GTKMM gui循环依赖关系
- 如何在头文件中声明类模板(由于循环依赖关系)
- 如何在具有循环依赖的类中dynamic_cast?
- C++模板方法中的循环依赖关系
- 修复循环依赖项 c++17 标头
- 涉及全局对象的循环依赖C++
- 循环依赖,在继承类的情况下使用覆盖方法
- Wt::D bo 中的循环依赖关系
- 在包含窗口标头时难以解决循环依赖关系问题
- 解决循环依赖关系 c++ 的想法
- C++循环依赖关系,未声明的标识符
- C++ 中的循环依赖关系问题
- 错误 C2512 视觉C++(并且不是循环依赖项)
- CMake 外部和内部静态库的循环依赖关系
- 正在从继承中解析循环依赖项
- "std::shared_ptr"循环依赖关系是如何导致问题的
- 纯引用而不是weak_ptr来打破循环依赖关系
- "invalid use of incomplete type" .解决循环依赖关系
- 如何避免模板方法的循环依赖
- 循环依赖结构,使用前向声明时结构的错误重定义