Come si chiama questa tecnica di programmazione?

13

Mi sono imbattuto in questa tecnica di programmazione mentre eseguivo la programmazione delle coppie in un'intervista e non ho trovato il nome su Google.

L'idea è che prima scrivi l'espressione che usa le variabili e poi scrivi il codice che calcola le variabili in un secondo momento.

Per utilizzare un codice di esempio qui:

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

Quando scrivi questa funzione usando la tecnica che ho menzionato, devi prima scrivere l'ultima riga return hasExpectedPrefix && followedBy7Digits && hasLengthOf12; e poi scrivere le 3 linee che precedono.

La tecnica più vicina che ho potuto trovare è "wishful thinking" e viene da SICP ma si riferisce alle funzioni di chiamata che implementerete successivamente piuttosto che usare le variabili che verranno inizializzate in seguito.

    
posta user2108462 06.04.2017 - 21:00
fonte

2 risposte

13

È solo una variante di composizione funzionale.

Testimone:

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

L'unica vera differenza è che la tua versione combina i risultati calcolati delle funzioni più piccole in un singolo ambito funzionale, che è ciò che vuoi a meno che le espressioni funzionali più piccole siano destinate ad essere riutilizzate altrove.

    
risposta data 06.04.2017 - 21:42
fonte
9

Questo potrebbe essere solo un suggerimento di Clean Code (il libro), da utilizzare quando la Decomposizione funzionale (come spiegato da Robert) non è applicabile a causa delle funzioni risultanti non riutilizzabili da sole.

Tuttavia, se vuoi approfondire la questione, il libro Modelli di implementazione , di Kent Beck, nomina questa tecnica come Spiegazione delle variabili locali (sottolineatura mia):

Local Variable

Local variables are only accessible from their point of declaration to the end of their scope. Following the principle that information should spread as little as possible, declare local variables just before they are used and in the innermost possible scope.

There are a handful of common roles for local variables:

  • Collector: a variable that collects information for later use. Often the contents of collectors are returned as the value of a function. When a collector will be returned, name it result or results.

  • Count: a special collector that collects the count of some other objects.

  • Explaining: if you have a complicated expression, assigning bits of the expression to local variables can help readers navigate the complexity:

    int top= ...;

    int left= ...;

    int height= ...;

    int bottom= ...;

    return new Rectangle(top, left, height, width);

    While not computationally necessary, the explaining local variables help what would otherwise be a long, complicated expression.

    
risposta data 06.04.2017 - 23:02
fonte

Leggi altre domande sui tag