程序业务逻辑的一般处理方法

在代码调试过程中,往往需要花费大量的精力处理业务逻辑。我们先来看一个业务需求

  1. 实现一个远程调用接口,修改指定网络接口的IP地址,子网掩码,默认网关。
  2. 需要同步修改/etc/network/interface文件。
  3. 接口传入参数为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嵌套,可读性会提高很多。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容