12

我想知道是否有任何关于使用“保护语句”范式与“单功能退出点”范式的项目可维护性的研究(包括随意的和稳健的)?

Guard 语句示例(在 C# 中):

string GetSomeString()
{
    if(necessaryConditionFails) { return null; }
    if(!FunctionWithBoolReturn(someAttribute)) { return null; }
    //all necessary conditions have been met
    //do regular processing...
    return finalStringValue;
}

单个函数退出点示例(在 C# 中):

string GetSomeString()
{
    string valueToReturn = null;
    if(necessaryConditionPasses && FunctionWithBoolReturn(someAttribute)) 
    { 
        //all necessary conditions have been met
        //do regular processing...
        valueToReturn = finalStringValue;
    }
    return valueToReturn;
}

我知道两者的优缺点一直在无休止地争论 SO,但我正在寻找关于每种范式的可维护性的实际研究*。这可能是未知的,但我想如果信息在那里,SO 上的某个人会知道它在哪里。到目前为止,我的网络搜索还没有成功。

**我也知道许多程序员(包括我)在他们的代码中使用这两个原则,这取决于具体情况。我只是希望发现哪一个具有更高可维护性的可靠记录,可用作首选范例。*

4

1 回答 1

13

强制使用单一出口点有其自身的一些问题。

第一个是它可能导致复杂的结构。想象一个函数,您必须在其中打开文件,读取一行,将行转换为数字并返回该数字或如果出现问题则返回零。使用单个退出点,您最终会使用大量嵌套的 if(如果文件存在则打开它,如果打开成功则读取该行,如果读取成功则将值转换为整数),这会使您的代码不可读。其中一些问题可以通过在函数末尾添加标签并使用 goto 来解决(过去我们不得不使用它,因为我们还使用了单个退出点和首选的可读性),但这并不理想。

其次,如果您使用异常,如果您再次想要单个退出点,则必须捕获所有内容。

所以,就个人而言,我更喜欢在函数的开始和执行过程中进行大量检查(和断言),并在出现问题的第一个迹象时退出函数。

于 2010-02-18T22:43:05.673 回答