Wie heißt diese Programmiertechnik?

13

Ich bin auf diese Programmiertechnik gestoßen, als ich in einem Interview eine Paarprogrammierung durchgeführt habe, und konnte den Namen bei Google nicht finden.

Die Idee ist, dass Sie zuerst den Ausdruck schreiben, der die Variablen verwendet, und dann den Code, der die Variablen später berechnet.

Um hier einen Beispielcode zu verwenden:

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

Wenn Sie diese Funktion mit der von mir erwähnten Technik schreiben, schreiben Sie zuerst die letzte Zeile return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;und dann die 3 Zeilen davor.

Die nächste Technik, die ich finden könnte, ist "Wunschdenken", und das stammt von SICP, bezieht sich jedoch auf das Aufrufen von Funktionen, die Sie später implementieren werden, anstatt Variablen zu verwenden, die Sie später initialisieren werden.

user2108462
quelle
8
Ich glaube, das ist nur eine Form von Top-Down-Design .
Vincent Savard
1
Ich kenne keinen bestimmten Namen dafür, aber ich habe das ziemlich oft gesehen, wenn ein komplexer Satz von Bedingungen überprüft werden muss. Diese Technik erleichtert das Lesen und Verstehen komplexer Sachverhalte erheblich.
FrustratedWithFormsDesigner
Ich habe das getan. Sie verwenden Code, um eine Idee zu skizzieren, ohne die Details zuerst ins Schwitzen zu bringen. Danach beschwert sich die IDE, dass etwas nicht existiert, und Sie gehen, um es existieren zu lassen. Es hilft, wenn Sie einen Test haben, der fehlschlägt, bis Sie fertig sind.
candied_orange
Wenn diesem Test ein Komponententest vorausging, handelte es sich um testgetriebene Entwicklung. Bei der Verwendung von TDD kenne ich mein erwartetes Ergebnis und arbeite von diesem erwarteten Verhalten zurück.
Martin Spamer
Ich würde es "komplexe Bedingungen vernünftig schreiben" nennen.
Jimmy Breck-McKye

Antworten:

13

Es ist nur eine Variation der funktionalen Zusammensetzung.

Zeuge:

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

Der einzige wirkliche Unterschied besteht darin, dass Ihre Version die berechneten Ergebnisse der kleineren Funktionen in einem einzigen Funktionsumfang kombiniert. Dies ist genau das, was Sie möchten, es sei denn, die kleineren Funktionsausdrücke sollen an anderer Stelle wiederverwendet werden.

Robert Harvey
quelle
9

Dies könnte nur ein Vorschlag von Clean Code (dem Buch) sein, der verwendet werden sollte, wenn die Funktionale Zerlegung (wie von Robert erklärt) nicht anwendbar ist, da die daraus resultierenden Funktionen nicht für sich allein wiederverwendbar sind.

Wenn Sie jedoch technische Informationen benötigen , nennt das Buch Implementation Patterns von Kent Beck diese Technik als Explaining Local Variables (Schwerpunkt Mine):

Lokale Variable

Auf lokale Variablen kann nur vom Zeitpunkt der Deklaration bis zum Ende des Gültigkeitsbereichs zugegriffen werden. Nach dem Prinzip, dass sich Informationen so wenig wie möglich verbreiten sollen, deklarieren Sie lokale Variablen kurz vor ihrer Verwendung und im innersten möglichen Umfang.

Es gibt eine Handvoll gemeinsamer Rollen für lokale Variablen:

  • Collector: Eine Variable, die Informationen für die spätere Verwendung sammelt. Oft wird der Inhalt von Kollektoren als Wert einer Funktion zurückgegeben. Wenn ein Kollektor zurückgegeben wird, benennen Sie ihn result oder results.

  • Count: Ein spezieller Collector, der die Anzahl einiger anderer Objekte sammelt.

  • Erklärung: Wenn Sie einen komplizierten Ausdruck haben, können Sie den Lesern durch Zuweisen von Bits des Ausdrucks zu lokalen Variablen helfen, sich in der Komplexität zurechtzufinden:

    int top = ...;

    int left = ...;

    int height = ...;

    int bottom = ...;

    neues Rechteck zurückgeben (oben, links, Höhe, Breite);

    Die erklärenden lokalen Variablen sind zwar nicht rechenintensiv, helfen aber dabei, einen langen, komplizierten Ausdruck zu erhalten.

MichelHenrich
quelle