Как называется эта техника программирования?

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;а затем написать 3 строки, которые предшествуют ей.

Самым близким методом, который я смог найти, является «желаемое за действительное», и это из SICP, но это касается вызова функций, которые вы собираетесь реализовать позже, а не использования переменных, которые вы собираетесь инициализировать позже.

user2108462
источник
8
Я считаю, что это просто форма сверху вниз дизайна .
Винсент
1
Я не знаю конкретного имени для него, но я видел это довольно часто, когда необходимо проверить сложный набор условий. Эта техника значительно облегчает чтение и понимание сложных условий.
FrustratedWithFormsDesigner
Я сделал это Вы используете код, чтобы набросать идею, не потревожив детали. После этого IDE жалуется, что чего-то не существует, поэтому вы идете и делаете это. Это помогает, когда у вас есть тест, который не пройдет, пока вы не дойдете до финиша.
candied_orange
Если этому предшествует модульное тестирование, то это будет разработка на основе тестирования. При использовании TDD я знаю свой ожидаемый результат и работаю в обратном направлении от этого ожидаемого поведения.
Мартин Спамер,
Я бы назвал это «написанием сложных условий разумно».
Джимми Брек-Макки

Ответы:

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

Это может быть просто предложение из Чистого кода (книга), которое следует использовать, когда функциональная декомпозиция (как объяснил Роберт) неприменима из-за того, что функции не могут использоваться повторно самостоятельно.

Однако, если вы хотите получить техническую информацию об этом, в книге « Реализация шаблонов » Кента Бека эта техника называется « Объяснение локальных переменных» (выделено мной):

Локальная переменная

Локальные переменные доступны только с момента их объявления до конца области видимости. Следуя принципу, что информация должна распространяться как можно меньше, объявляйте локальные переменные непосредственно перед их использованием и в самой внутренней области видимости.

Существует несколько общих ролей для локальных переменных:

  • Collector: переменная, которая собирает информацию для последующего использования. Часто содержимое коллекторов возвращается как значение функции. Когда сборщик будет возвращен, назовите его result или results.

  • Count: специальный сборщик, который собирает счетчики некоторых других объектов.

  • Объяснение: если у вас сложное выражение, назначение битов выражения локальным переменным может помочь читателям сориентироваться в сложности:

    int top = ...;

    int left = ...;

    int height = ...;

    int bottom = ...;

    вернуть новый прямоугольник (сверху, слева, высота, ширина);

    Несмотря на то, что в вычислительном отношении нет необходимости, объясняющие локальные переменные помогают получить длинное и сложное выражение.

MichelHenrich
источник