0

コーディング スタイルに関して、次の 2 つの実装のうちどちらが優れていますか。また、その理由は何ですか?

UINT Fn1()
{
    HKEY hRegKey;

    if(RegOpenKeyEx(..., KEY_NAME, &hRegKey) != ERROR_SUCCESS)
        return ERROR_KEY_OPEN;
    if(RegQueryValueEx(hRegKey, VAL_A_NAME, ...) != ERROR_SUCCESS)
    {
        RegCloseKey(hRegKey);
        return ERROR_KEYVAL_A;
    }

    if(RegQueryValueEx(hRegKey, VAL_B_NAME, ...) != ERROR_SUCCESS)
    {
        RegCloseKey(hRegKey);
        return ERROR_KEYVAL_B;
    }

    RegCloseKey(hRegKey);
    return ERROR_SUCCESS;
}

UINT Fn2()
{
    UINT rVal;
    HKEY hRegKey;

    if(RegOpenKeyEx(..., KEY_NAME, &hRegKey) == ERROR_SUCCESS)
    {
        if(RegQueryValueEx(hRegKey, VALUE_A_NAME, ...) == ERROR_SUCCESS)
        {
            if(RegQueryValueEx(hRegKey, VALUE_B_NAME, ...) == ERROR_SUCCESS)
                rVal = ERROR_SUCCESS;
            else
                rVal = ERROR_KEYVAL_B;
        }
        else
            rVal = ERROR_KEYVAL_A;
        RegCloseKey(hRegKey);
    }
    else
        rVal = ERROR_KEY_OPEN;

    return rVal;
}

また、まだ良い方法はありますか?
注: スニペットの詳細に惑わされないようにしてください。コード フローとスタイルを強調してください。

4

1 に答える 1

1

これは非常に個人的な好みの問題です。個人的には、どちらも見栄えがよくなく、従うのも簡単だと思います. 私が個人的に好む C の形式は次のとおりです。

int
fn(void)
{
    struct foo *foo;
    int error = 0;
    if ((foo = foo_open(...)) == NULL)
        return FOO_ERROR_OPEN;
    if (foo_do_something(1)) {
        error = FOO_ERROR_1;
        goto out;
    }
    if (foo_do_something(2)) {
        error = FOO_ERROR_2;
    }
out:
    foo_close(foo);
    return error;
}

しかし、前述のように、これは好みの問題であり、プログラマーの数と同じくらい多くの意見があります。私がこのスタイルを好むのは、私がキャリアの早い段階で扱ってきた多くのコードがこのように書かれており、それが私にとって最も読みやすいものだからです。

提示されたスタイルのいずれかを選択する必要がある場合は、1 を選択します。2 は、くぼみが深くて乱雑に見えるだけです。私が持っている経験則は、インデントの深さとともに可読性が低下するということです。

于 2012-10-01T13:01:55.863 に答える