1

Ich bin also Geocodierer Adressen von der Google Places API. Es gibt 38 Arten von Google Adress-Komponenten, und wir haben ~ 5 interne Adress-Komponententypen. Daher benötige ich ein System zur Zuordnung mehrerer Google-Typen zu unseren internen Typen mit Fallbacks.Sauberste Möglichkeit, eine Kette von Fallbacks einzurichten?

Zum Beispiel:

var neighbourhood = googleResponse.neighborhood || googleResponse.sublocality_level_2 || googleResponse.sublocality_level_1 

Was ist der beste/sauberste/effizienteste Weg, dies zu tun? Grundsätzlich muss ich einem zurückgegebenen Wert eine var zuweisen, es sei denn, dass der zurückgegebene Wert nicht definiert ist, und dann die Kette nach unten verschieben.

Antwort

1

Ich denke, Ihre Herangehensweise ist solide - die Verwendung der Kurzschluss-ORs fühlt sich viel sauberer an, als irgendeine Art von Verzweigungsaussage zu haben. Meine beiden Empfehlungen wären:

  • Sie sollen wahrscheinlich eine Art von hartcodierte Wert hinzufügen (? Ein leerer String, vielleicht abhängig von Ihrem Anwendungsfall) als letzten Rückfall, so dass, wenn alle Optionen ‚aren Wenn Sie nicht gefunden haben, endet die Variable nicht auf etwas Unerwartetes. Ich denke, es ist immer eine gute Übung, zu allen möglichen Dingen, die zurückgegeben werden könnten, 100% explizit zu sein.
  • Ich würde empfehlen, diese Logik in eine Funktion zu ziehen, so dass, wenn Sie es an anderer Stelle wiederverwenden wollen, es wartbarer sein wird. Selbst wenn Sie nicht glauben, dass Sie es noch einmal verwenden müssen, ist es immer noch sinnvoll, falls Sie es sich später anders überlegen - jedes Mal, wenn Sie ein Stück Code austauschen müssen, ist unglaublich mühsam! Es macht auch Ihren Code viel einfacher zu testen - Sie können eine fest codierte googleResponse übergeben und überprüfen, ob die Ausgabe Ihren Erwartungen entspricht.

So wäre mein Ansatz wahrscheinlich so etwas wie folgt aussehen:

function getNeighborhood(googleResponse) { 
    return googleResponse.neighborhood 
     || googleResponse.sublocality_level_2 
     || googleResponse.sublocality_level_1 
     || ""; 
} 

var neighborhood = getNeighborhood(googleResponse); 

EDIT:

Als Antwort auf Ihren Kommentar, es gibt ein paar Optionen, die ich von für Werte denken kann, die haben verkettet werden.

Wenn es nur eine Frage des „alles oder nichts“, könnte man das sehr elegant mit einem ternären Ausdruck schreiben:

function getStreet(googleResponse) { 
    return googleResponse.street_number && googleResponse.route 
     ? googleResponse.street_number + googleResponse.route 
     : ""; 
} 

Wenn Sie jedoch zu nisten versuchen beginnen diese mit Fallbacks, es geht zu erhalten sehr unlesbar sehr schnell. An diesem Punkt ist es besser, man verlässt sich einfach auf ein if/else if/else - es ist ein bisschen langatmig, aber es ist verständlich, und das ist in meinen Augen wichtiger.

function getStreet(googleResponse) { 
    if (googleResponse.street_number && googleResponse.route) { 
     return googleResponse.street_number + googleResponse.route; 
    } 
    else if (/* fallback */) { 
     return /* concat here */; 
    } 
    else { 
     // Make sure to always return a value, even if all of 
     // the other fallbacks fail! 
     return ""; 
    } 
} 
+0

Die einzige schwierige Situation ist eine, bei der ein Wert der Verkettung zweier Strings, zB 'var street = googleResponse.street_number + googleResponse.route' ... In diesem Fall habe ich die Existenz von zwei Werte überprüfen Das ist komplizierter. –

Verwandte Themen