プログラムビジネスロジックの一般的な処理方法
3074 ワード
コードデバッグの過程で、ビジネスロジックの処理に多くの精力を費やすことが多い.まずビジネスニーズを見てみましょうは、指定されたネットワークインタフェースのIPアドレス、サブネットマスク、デフォルトゲートウェイを変更するリモートコールインタフェースを実現する. /etc/network/interfaceファイルを同期的に変更する必要があります. インタフェースの入力パラメータはjson構造である.一部の同窓会はこのように実現した:
上のコードは実装がよくなく、論理ネストが深すぎて、可読性が低い.実は業務ロジックは大体3つの処理ステップに分けることができて、パラメータの検査、パラメータの準備、パラメータによって業務を処理します.この3つのステップに基づいて、上記のコードを処理します.
パラメータチェツク
パラメータチェック、すなわちパラメータの合法性を検出します.コードは次のとおりです.
パラメータの準備
すなわち、入力パラメータから取得するパラメータ、またはビジネスロジックのために他の準備作業を実行するパラメータを準備します.
ビジネスロジック処理
すなわち、ビジネスロジック動作を実行し、1つの関数を単独で実現することができる
まとめ:
ビジネスロジックコードは常にプロジェクトの中でロジックが最も複雑な部分であり、実現時にifネストをできるだけ少なくし、可読性が向上する.
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ネストをできるだけ少なくし、可読性が向上する.