在这种情况下,是否需要打破循环依赖关系

Is breaking circular dependency necessary in this case?

本文关键字:循环 依赖 关系 这种情况下 是否      更新时间:2023-10-16

例如,考虑一个系统,它有一个全局主控制器,该全局主控制器有一个子控制器,子控制器可以调用主控制器来更新:

主控制器.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++软件设计")是将两个类合并为一个。