プログラムビジネスロジックの一般的な処理方法

3074 ワード

コードデバッグの過程で、ビジネスロジックの処理に多くの精力を費やすことが多い.まずビジネスニーズを見てみましょう
  • は、指定されたネットワークインタフェースの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;
      }
    }
    

    上のコードは実装がよくなく、論理ネストが深すぎて、可読性が低い.実は業務ロジックは大体3つの処理ステップに分けることができて、パラメータの検査、パラメータの準備、パラメータによって業務を処理します.この3つのステップに基づいて、上記のコードを処理します.
    パラメータチェツク
    パラメータチェック、すなわちパラメータの合法性を検出します.コードは次のとおりです.
    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;
    }
    

    ビジネスロジック処理
    すなわち、ビジネスロジック動作を実行し、1つの関数を単独で実現することができる
    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ネストをできるだけ少なくし、可読性が向上する.