在代码调试过程中,往往需要花费大量的精力处理业务逻辑。我们先来看一个业务需求
- 实现一个远程调用接口,修改指定网络接口的IP地址,子网掩码,默认网关。
- 需要同步修改/etc/network/interface文件。
- 接口传入参数为json结构。
部分同学会这样实现:
int set_net_work(cJSON *param)
{
if(param != NULL){
const char *eth = cJSON_GetObjectItem(param,"eth");
if(eth != NULL){
const char *ipaddr = cJSON_GetObjecItem(param,"ipaddr");
if(ipaddr != NULL){
if(eth == eth1){ //strcmp!!!!
read_file_get_params(eth1) //读取配置文件获取原始ip地址等信息
change_ipaddr(eth1); //修改ip地址
restore_gwaddr(eth1); //重新保存网关地址
....
}else if(eth = eth2){ //strcmp!!!!
....
}
}
if(gwaddr != NULL){
...
}
.....
}else{
return -1;
}
}else{
return -1;
}
}
上面的代码实现的并不好,逻辑嵌套太深,可读性较低。
其实业务逻辑大致可分为三个处理步骤,参数校验,参数准备,根据参数处理业务。我们根据这三个步骤来处理一下上面的代码
参数校验
参数校验,即检测参数的合法性。代码如下:
int set_net_work(cJSON *param)
{
if(param == NULL)
return -1;
const char *eth = cJSON_GetObjectItem(param,"eth");
if(eth == NULL)
return -1;
....
}
参数准备
即准备参数,包括从传入参数获得,或由于业务逻辑,执行一些其他准备工作。
int set_net_work(cJSON *param)
{
//参数校验
if(param == NULL)
return -1;
const char *eth = cJSON_GetObjectItem(param,"eth");
if(eth == NULL)
return -1;
//参数准备
cJSON *ipaddr == cJSON_GetObjectItem(param,"ipaddr");
cJSON *netmask == cJSON_GetObjectItem(param,"netmask");
cJSON *defgw == cJSON_GetObjectItem(param,"defgw");
net_param = read_file_get_params(eth); //获取指定网卡的参数
if(ipaddr == NULL) //如果没有传入ipaddr,则获取原始信息
ipaddr = net_param.ipaddr;
if(netmask == NULL)
netmask = net_param.netmask;
if(defgw == NULL)
defgw = net_param.defgw;
}
业务逻辑处理
即执行业务逻辑动作,可单独实现一个函数
int do_set_net_work(const char *eth,const char *ipaddr,const char *netmask,const char *defgw)
{
.... //业务逻辑处理。
}
//完整代码
int set_net_work(cJSON *param)
{
//参数校验
if(param == NULL)
return -1;
const char *eth = cJSON_GetObjectItem(param,"eth");
if(eth == NULL)
return -1;
//参数准备
cJSON *ipaddr == cJSON_GetObjectItem(param,"ipaddr");
cJSON *netmask == cJSON_GetObjectItem(param,"netmask");
cJSON *defgw == cJSON_GetObjectItem(param,"defgw");
net_param = read_file_get_params(eth); //获取指定网卡的参数
if(ipaddr == NULL) //如果没有传入ipaddr,则获取原始信息
ipaddr = net_param.ipaddr;
if(netmask == NULL)
netmask = net_param.netmask;
if(defgw == NULL)
defgw = net_param.defgw;
do_set_net_work(...);
}
总结:
业务逻辑代码总是项目中逻辑最复杂的部分,实现的时候尽量少用if嵌套,可读性会提高很多。