Як називається ця методика програмування?


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, але це стосується виклику функцій, які ви збираєтеся реалізувати пізніше, а не використання змінних, які ви збираєтеся ініціалізувати пізніше.


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

Це може бути лише пропозицією з чистого коду (книги), який слід використовувати, коли функціональна декомпозиція (як пояснив Роберт) не застосовується через те, що функції в результаті не підлягають повторному використанню самостійно.

Однак, якщо ви хочете ознайомитись з цим, книга Кент Бек " Шаблони впровадження" називає цю методику " Пояснення локальних змінних" (моє значення):

Локальна змінна

Локальні змінні доступні лише з точки їх оголошення до кінця сфери їх дії. Дотримуючись принципу, що інформація повинна поширюватися якомога рідше, оголошуйте локальні змінні безпосередньо перед їх використанням і в найпотужнішому обсязі.

Існує кілька спільних ролей для локальних змінних:

  • Колектор: змінна, яка збирає інформацію для подальшого використання. Часто вміст колекторів повертається як значення функції. Коли колектор буде повернутий, назвіть його результат або результати.

  • Граф: спеціальний колектор, який збирає кількість інших об'єктів.

  • Пояснення: якщо у вас складний вираз, присвоєння бітів виразу локальним змінним може допомогти читачам орієнтуватися на складність:

    int top = ...;

    int зліва = ...;

    int висота = ...;

    int bottom = ...;

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

    Хоча обчислювально не потрібно, пояснювальні локальні змінні допомагають, що інакше було б довгим, складним виразом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.