1

20 から 30 の関数があり、wsse_authenticate を呼び出さなければなりません。この wsse_authenticate 関数は、その値に基づいて値を返します。エラー メッセージを送信します。このコードを改善する方法はありますか?すべての関数で関数 wsse_authenticate(soap) を呼び出し、スイッチケースをより良いコードに置き換えます。もっと効率的にしたいです。いくつかの入力をお願いします

wsse_ret = (wsse_authenticate(soap));

if(wsse_ret)
{
    switch(wsse_ret)
    {
        case 1: onvif_fault(soap,"ter:NoSecuritytoken","ter:Failed_wsse_Aunthentication");

        case 2: onvif_fault(soap,"ter:InvalidUserName","ter:FailedAunthentication");

        case 3: onvif_fault(soap,"ter:InvalidPassword","ter:FailedAunthentication");

    }
}
4

2 に答える 2

2

上記のコードから、関数onvif_faultに引数として渡された「失敗メッセージ」を除いて、すべてのケースで同じ関数を呼び出していることがわかります。また、期待どおりの結果が得られない各 case ステートメントの後にブレークはありません。

break ステートメントを使用するための説明: ret 値が 1 であると仮定すると、最後に break ステートメントがあるため、3 つのケースすべてが実行されます。これは、onvif_faultが予期しない異なるパラメーターで 3 回呼び出されることを意味します。

あなたの質問に対する解決策 実際に障害のリストを持つcの構造を使用してテーブルを作成できます。
これは、Switch ステートメントを 1 行のコードで置き換えることができるということでした。

例:
typedef struct _fault_messages
{
char msg1[254];
char msg2[254];
} fault_messages;

fault_messages msg_table[3] = {  
                    {"ter:NoSecuritytoken", "ter:Failed_wsse_Aunthentication"},  
                    {"ter:error1", "ter:fault1"},  
                    {"ter:error2", "ter:fault2"}  

};

これで、上の表の障害メッセージがマッピングされました。以下に示すように、コードを最適化できます。

wsse_ret = (wsse_authenticate(soap));  

if(wsse_ret)  
{  
    onvif_fault(soap, msg_table[wsse_ret-1].msg1, msg_table[wsse_ret-1].msg2);  
}
于 2013-01-09T08:38:47.210 に答える