解决项目开发过程需要多个if else的情况

项目开发过程中虽然不建议使用过多的if-else-else if,但是总有一些情况是避免不了,举一个例子:

struct DataBase
{
    std::string type_;
};

void Update(DataBase _data)
{
    if (_data.type_ == "UiSCLKey")
    {

    }
    else if (_data.type_ == "UiRadarKey")
    {

    }
    else if (_data.type_ == "UiChartKey")
    {

    }
}

比如像这种情况,Update函数是一个接口,外部调用该接口给该模块传输zmq的数据,模块拿到这个数据需要判断该数据是哪个topic发出来的数据,对不同的数据做不同的处理,在一个项目开发过程中我们需要接收的数据非常多,topic也非常多,我们不可能每次都通过这种if-else去判断这个数据是属于哪个topic,这太傻了,所以我们可以用映射表这样的方式。

它就是一个unordered_map,key值是topic,value值就是要处理的函数,这样我们在接收到数据的时候直接判断key值存不存在,存在的话就调用函数处理。

写法如下:

// 传输数据的结构体
struct DataBase
{
	std::string type_;
};

// 处理zmq数据
void UiSclData(DataBase _data)
{

}

void UiRadarData(DataBase _data)
{

}

void UiChartData(DataBase _data)
{

}

// 成员变量
std::unordered_map<std::string, std::function<void(DataBase _data)>> data_map_;

// 注册
void Register()
{
    data_map_["UiSCLKey"] = UiSclData;

	data_map_["UiRadarKey"] = UiRadarData;

	data_map_["UiChartKey"] = UiChartData;
}

// 接口,外部调用传输数据
void Update(DataBase _data)
{
	if (data_map_.find(_data.type_) != data_map_.end())
		data_map_[_data.type_](_data);
}

data_map_是成员变量,Register函数可以在订阅数据的函数里调用,每次要订阅一个topic数据时在Register函数里加一行。

但是这样有个弊端,那就是所有处理数据的函数参数必须一致,返回值必须一致,所以有利有弊,看情况使用。

同样我们也可以用设计模式里的策略模式去处理,但是策略模式我们就需要写很多很多算法类,对于某些情况下完全没必要。

你可能感兴趣的:(c++)