0

就编码风格而言,以下两种实现中哪一种更好,为什么?

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 回答