gpt4 book ai didi

c++ - 在这种情况下是否需要打破循环依赖?

转载 作者:太空宇宙 更新时间:2023-11-04 13:31:58 25 4
gpt4 key购买 nike

例如,考虑一个系统,它有一个全局主 Controller 和一个子 Controller ,子 Controller 可以调用主 Controller 来更新:

主 Controller .h

class SubController;
class MainController{
public:
static void setGlobalMainController(MainController* mainController);
static MainController* getGlobalMainController();
void init();
void updateSystem();
protected:
SubController* subController;
};

主 Controller .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
}

子 Controller .h

class SubController{
protected:
void onButtonPressed();
}

子 Controller .cpp

#include "SubController.h"
#include "MainController"
void SubController::onButtonPressed(){
//do something...
MainController::getGlobalMainController()->updateSystem();
}

SubController 可能会接受按钮事件,然后需要更新主 Controller 。

它有循环依赖,然后我尝试使用继承打破循环依赖:创建一个新类 MainControllerImp 并将 MainController 中的所有具体方法移动到 MainControllerImp:

主 Controller .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;
};

主 Controller .cpp

#include "MainController.h"
#include "SubController.h"
MainController* globalMainController;
void MainController::setGlobalMainController(MainController* mainController){
globalMainController=mainController;
}

MainController* MainController::getGlobalMainController(){
return globalMainController;
}

MainControllerImp.h

#include "MainController.h"
class MainControllerImp : public MainController{
virtual void init();
virtual void updateSystem();
}

MainControllerImp.cpp

#include "MainControllerImp.h"
void MainControllerImp::init(){
this->subController=new SubController();
//wait sub controller to press button...
}

void MainControllerImp::updateSystem(){
//do something
}

子 Controller .h

class SubController{
protected:
void onButtonPressed();
}

子 Controller .cpp

#include "SubController.h"
#include "MainController"
void SubController::onButtonPressed(){
//do something...
MainController::getGlobalMainController()->updateSystem();
}

循环依赖似乎消失了。但是过了一段时间,我开始考虑在这种情况下是否需要打破依赖:它只是将所有方法从父类移动到子类,除此之外似乎没有任何好处。此外,它还多了一个类,可读性较差,代码也不那么直接。

在这种情况下我应该保留循环依赖吗?还是有其他更好的设计模式来打破循环依赖?

最佳答案

循环依赖总是不好的,我总是会尝试移除它。

为什么?因为它让代码变得脆弱,而且直接破坏了开闭原则。如果您必须修改一个类,那么有 99% 的机会您也必须修改另一个类。

打破循环依赖的方法很少,但我最喜欢的方法(我认为来自“大型 C++ 软件设计”)是将两个类合并为一个。

关于c++ - 在这种情况下是否需要打破循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31068535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com