Jak nazywa się ta technika programowania?


13

Zetknąłem się z tą techniką programowania podczas wywiadu z programowaniem par i nie mogłem znaleźć jej nazwy w Google.

Chodzi o to, że najpierw piszesz wyrażenie, które używa zmiennych, a następnie piszesz kod, który oblicza zmienne później.

Aby użyć przykładowego kodu tutaj:

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;
}

Pisząc tę ​​funkcję za pomocą wspomnianej wcześniej techniki, należy najpierw napisać ostatni wiersz, return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;a następnie 3 poprzedzające go wiersze.

Najbliższą techniką, jaką mogłem znaleźć, jest „myślenie życzeniowe”, które pochodzi z SICP, ale dotyczy to wywoływania funkcji, które zamierzasz zaimplementować później, zamiast używania zmiennych, które później zainicjujesz.


8
Wierzę, że to tylko forma odgórnego projektu .
Vincent Savard

1
Nie znam konkretnej nazwy, ale widziałem to dość często, gdy trzeba sprawdzić złożony zestaw warunków. Ta technika znacznie ułatwia czytanie i rozumienie złożonych warunków.
FrustratedWithFormsDesigner

Zrobiłem to. Używasz kodu, aby naszkicować pomysł bez uprzedniego pocenia się szczegółów. Następnie IDE skarży się, że coś nie istnieje, więc idź, aby to istnieć. Pomaga, gdy masz test, który się nie powiedzie, dopóki nie przejdziesz do końca.
candied_orange

Gdyby to było poprzedzone testem jednostkowym, byłby to Test Driven Development. Korzystając z TDD, znam oczekiwany wynik i pracuję wstecz od tego oczekiwanego zachowania.
Martin Spamer

Nazwałbym to „zdrowym pisaniem złożonych warunków”.
Jimmy Breck-McKye

Odpowiedzi:


13

To tylko wariacja na temat składu funkcjonalnego.

Świadek:

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;
}

Jedyną prawdziwą różnicą jest to, że twoja wersja łączy obliczone wyniki mniejszych funkcji w jednym zakresie funkcjonalnym, czego potrzebujesz, chyba że mniejsze wyrażenia funkcjonalne mają być ponownie użyte w innym miejscu.


9

Może to być po prostu sugestia z Czystego Kodu (książki), którą można zastosować, gdy Rozkład Funkcjonalny (jak wyjaśnił Robert) nie ma zastosowania, ponieważ wynikające z niego funkcje nie nadają się do ponownego użycia.

Jeśli jednak chcesz się na ten temat dowiedzieć technicznie, książka Implementation Patterns autorstwa Kenta Becka nazywa tę technikę Objaśnianiem zmiennych lokalnych (moje podkreślenie):

Zmienna lokalna

Zmienne lokalne są dostępne tylko od punktu deklaracji do końca zakresu. Zgodnie z zasadą, że informacje powinny się rozprzestrzeniać jak najmniej, zadeklaruj zmienne lokalne tuż przed ich użyciem i w możliwie najszerszym zakresie.

Istnieje kilka typowych ról dla zmiennych lokalnych:

  • Kolektor: zmienna, która zbiera informacje do późniejszego wykorzystania. Często zawartość kolektorów jest zwracana jako wartość funkcji. Kiedy kolektor zostanie zwrócony, nazwij go wynikiem lub wynikami.

  • Liczba: specjalny kolektor, który zbiera liczbę innych obiektów.

  • Wyjaśnienie: jeśli masz skomplikowane wyrażenie, przypisanie bitów wyrażenia do zmiennych lokalnych może pomóc czytelnikom w nawigacji po złożoności:

    int top = ...;

    int left = ...;

    int wysokość = ...;

    int bottom = ...;

    zwraca nowy prostokąt (góra, lewa strona, wysokość, szerokość);

    Wyjaśniające zmienne lokalne, mimo że nie są konieczne obliczeniowo, pomagają w tym, co byłoby długim, skomplikowanym wyrażeniem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.