Come si chiama questa tecnica di programmazione?


13

Mi sono imbattuto in questa tecnica di programmazione durante la programmazione di coppia in un'intervista e non sono riuscito a trovarne 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 seguito.

Per usare 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 citato, prima scrivi l'ultima riga return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;e poi le 3 righe che la precedono.

La tecnica più vicina che ho trovato è il "pio desiderio", che proviene dalla SICP, ma si riferisce alle funzioni di chiamata che verranno implementate in seguito anziché utilizzare le variabili che verranno inizializzate in seguito.


8
Credo che questa sia solo una forma di design top-down .
Vincent Savard,

1
Non conosco un nome specifico per questo, ma lo vedo abbastanza spesso quando è necessario controllare un insieme complesso di condizioni. Questa tecnica semplifica molto la lettura e la comprensione di condizioni complesse.
FrustratedWithFormsDesigner

L'ho fatto. Usa il codice per delineare un'idea senza prima sudare i dettagli. Successivamente l'IDE si lamenta che qualcosa non esiste, quindi vai a farlo esistere. Aiuta quando si ha un test che fallirà fino a quando non si arriva alla fine.
candied_orange,

Se questo fosse preceduto da un unit test, sarebbe Test Driven Development. Quando utilizzo TDD conosco il mio risultato atteso e lavoro all'indietro da quel comportamento previsto.
Martin Spamer,

Lo definirei "scrivere sane condizioni complesse".
Jimmy Breck-McKye il

Risposte:


13

È solo una variazione sulla 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 è quello che desideri a meno che le espressioni funzionali più piccole non siano destinate a essere riutilizzate altrove.


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 essere tecnico a riguardo, il libro Implementation Patterns , di Kent Beck, nomina questa tecnica come Explaining Local Variables (sottolineatura mia):

Variabile locale

Le variabili locali sono accessibili solo dal loro punto di dichiarazione fino alla fine del loro campo di applicazione. Seguendo il principio secondo cui le informazioni dovrebbero diffondersi il meno possibile, dichiarare le variabili locali appena prima che vengano utilizzate e nella portata più interna possibile.

Esistono alcuni ruoli comuni per le variabili locali:

  • Collector: una variabile che raccoglie informazioni per un uso successivo. Spesso i contenuti dei collezionisti vengono restituiti come valore di una funzione. Quando verrà restituito un raccoglitore, denominalo risultato o risultati.

  • Conte: un collezionista speciale che raccoglie il conteggio di alcuni altri oggetti.

  • Spiegazione: se si dispone di un'espressione complicata, assegnare bit dell'espressione a variabili locali può aiutare i lettori a esplorare la complessità:

    int top = ...;

    int left = ...;

    int height = ...;

    int bottom = ...;

    ritorna nuovo rettangolo (in alto, a sinistra, altezza, larghezza);

    Sebbene non siano necessarie dal punto di vista computazionale, le variabili locali che spiegano aiutano quella che altrimenti sarebbe un'espressione lunga e complicata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.