2016-12-29 2 views
1

Ich bin nicht sicher, was der effizienteste Weg dies zu tun wäre, aber ich glaube, es ist eine gute Praxis, eine Funktion, die einen Datentyp zurückgibt, ob es ein Boolean oder String aber In einigen Situationen kann ich sehen, wie schwierig es wäre, solch eine strenge Regel zu implementieren, zum Beispiel gibt der folgende Code ein Objekt zurück, wenn ein Datenbankdatensatz gefunden wird, andernfalls wird er false zurückgeben.Refactoring eine Funktion, die verschiedene Datentypen

public function get() 
{ 
    $record = $this->db->query('select id, first_name, last_name from users where id = :id', ['id' => 1]); 

    if ($record) { 
     return new User($record['id'], $record['first_name'], $record['last_name']); 
    } else { 
     return false; 
    } 
} 

Meine Frage ist, was ist die empfohlene Best Practice in dieser Situation?

Antwort

1

Es hängt auf Kontext und auf Ihren Vorlieben ab.

Für skalare Typen und Arrays haben Sie einen bestimmten Standardwert wie 0, leere Zeichenfolge, leeres Array usw. Wenn der Standardwert ein reguläres Ergebnis ist, können Sie etwas absichtlich falsch verwenden. Zum Beispiel gibt indexOf in JavaScript -1 zurück, wenn die Teilzeichenfolge nicht gefunden wurde. Aber PHP strpos() gibt false in diesem Fall zurück.

Für Objekte, null (nicht die false) in der Regel als die Abwesenheit von ihnen verwendet. In einigen streng typisierten Sprachen (C#, Java) sind alle Objektreferenzen nullwertfähig: Wenn die Methode ein Objekt zurückgeben kann, kann auch eine null zurückgegeben werden. Aber dieser Ansatz kann auch viele Probleme verursachen. Sie können mit Null Object Muster in einigen Fällen vermieden werden.

Auch PHP 7.1 bietet ein nullable type notation:

function foo(): ?int 
{ 
    return null; // ok 
} 

Am Ende Sie eine Ausnahme keinen Wert, wenn werfen. Zum Beispiel, in der Python-Methode dict.get() löst eine KeyError, wenn der angeforderte Schlüssel nicht im Wörterbuch ist.

Wie Sie sehen, verwenden verschiedene Sprachen und API eine andere Möglichkeit, gibt es keine gemeinsame richtige Antwort.

Meine persönliche Empfehlung für Ihr Beispiel ist Trennverfahren durch Verhalten:

// Get-method should always return a value 
function getObject(): ObjectClass 
{ 
    // ...obtain the $object; 
    if (!$object) { 
     throw new Exception(); 
    } 
    return $object; 
} 

// Find-method can return value or NULL. 
function findObject(): ?ObjectClass 
{ 
    // ...obtain the $object 
    return $object ?: null; 
} 
Verwandte Themen