这种编程技术叫什么?


13

我在采访中进行结对编程时遇到了这种编程技术,但在Google上找不到它的名称。

这个想法是,您首先编写使用变量的表达式,然后再编写用于计算变量的代码。

要在此处使用一些示例代码:

private bool ValidPolicyNumber(string policyNumber) 
{
    var hasExpectedPrefix = policyNumber.Substring(0,5) == "POLIC";
    var followedBy7Digits = Regex.IsMatch(policyNumber.Substring(6,7), "^[0-9]{7}$");
    var hasLengthOf12 = policyNumber.Length == 12;

    return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;
}

使用我提到的技术编写此函数时,您将首先写最后一行return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;,然后写在它前面的三行。

我能找到的最接近的技术是“如意算盘”,它来自SICP,但是与调用您稍后要实现的函数有关,而不是使用您稍后要初始化的变量。


8
我相信这只是自顶向下设计的一种形式。
Vincent Savard

1
我不知道它的具体名称,但是当需要检查一组复杂的条件时,我经常会看到这种情况。这种技术使阅读和理解复杂条件变得更加容易。
FrustratedWithFormsDesigner

我已经做到了 您可以使用代码来勾勒出一个主意,而无需先冒充细节。然后,IDE抱怨不存在某些内容,因此您将其设置为存在。当您的测试在完成之前会失败时,它会有所帮助。
candied_orange

如果在此之前进行了单元测试,那么它将是“测试驱动开发”。在使用TDD时,我知道我的预期结果,并且我从预期的行为开始进行反向工作。
Martin Spamer

我称其为“明智地编写复杂条件”。
Jimmy Breck-McKye '17

Answers:


13

这只是功能组成的一种变化

见证人:

private bool ValidPolicyNumber(string policyNumber) 
{
    return hasExpectedPrefix(policyNumber) 
        && followedBy7Digits(policyNumber) 
        && hasLengthOf12(policyNumber);
}

private bool hasExpectedPrefix(string policyNumber)
{
    return policyNumber.Substring(0,5) == "POLIC";
}

private bool followedBy7Digits
{
    return Regex.IsMatch(policyNumber.Substring(6,7), "^[0-9]{7}$");
}

private bool hasLengthOf12
{
    return policyNumber.Length == 12;
}

唯一的真正区别是您的版本将较小函数的计算结果合并到单个函数范围内,这是您想要的,除非较小函数表达式打算在其他地方重用。


9

这可能只是Clean Code(本书)中的建议,当功能分解(如Robert解释)由于功能无法单独重用而无法使用时,可以使用该建议。

但是,如果您想了解有关它的技术,则肯特·贝克(Kent Beck)的《实施模式》一书将这种技术命名为“ 解释局部变量”(强调我的意思):

局部变量

局部变量只能从它们的声明点到其作用域的结尾进行访问。遵循信息应尽可能少地传播的原则,在使用局部变量之前并在其尽可能深的范围内声明局部变量。

局部变量有一些常见的作用:

  • 收集器:一个收集信息以供以后使用的变量。通常,收集器的内容作为函数的值返回。返回收集器时,将其命名为结果。

  • 计数:一个特殊的收集器,用于收集其他一些对象的计数。

  • 说明:如果您有一个复杂的表达式,则将表达式的各个位分配给局部变量可以帮助读者应对复杂性:

    int top = ...;

    int left = ...;

    int height = ...;

    int bottom = ...;

    返回新的Rectangle(top,left,height,width);

    尽管不是计算必需的,但解释性局部变量可以帮助避免原本冗长而复杂的表达式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.