2 Stimmen

Sollte ich immer überprüfen, ob ein Objekt NULL ist?

Ich habe ein Objekt durch eine Fabrik gebaut, die meine Parameter aus der Url gelesen enthält.

Von diesem Objekt kann ich den Sprachparameter

$Sprache = $my_parameters->getLanguage();

$language ist NULL, wenn es nicht gesetzt wurde.

$language kann auch ungültig sein ($language->isValid() liefert false).

Um meine Seite zu erstellen, benötige ich also einige Parameter.

Die Seite wird auch durch eine Fabrik gebaut. Dann weiß ich, welche Parameter ich brauche, um sie zu erstellen. Wenn die Parameter fehlen, baue ich sie mit einem gültigen Standardwert entsprechend der angeforderten Seite.

An diesem Punkt, in die Seite Fabrik, wenn ein ungültiger Parameter haben, werfe ich eine Ausnahme.

Mein Seitenobjekt enthält ein Body-Objekt, das einen Sprachparameter benötigt. Ich weiß, dass meine Parameter gültig sind, wenn ich mein Body-Objekt erstelle.

In mein Körperobjekt rufe ich die Sprache

$Sprache = $my_parameters->getLanguage();

Zu diesem Zeitpunkt ** MUSS ** $language gültig sein. Ich überprüfe also erneut

$language = $my_parameters->getLanguage();
if( is_null( $language ) or !$language->isValid() ) {
   throw new Exception( 'Language must be valid.' );
}

Wenn ich 4 Parameter brauche, habe ich 4 ifs die überprüfen, ob das Objekt nicht NULL und nicht ungültig ist.

Ich tue es, weil die Methode ist öffentlich wobei $language im body-Objekt verwendet wird.

Und das Körperobjekt kann außerhalb der Fabrik gebaut werden. Wer weiß...

Ist es richtig, in diesem Fall zu überprüfen?

Was sind die besten Praktiken dafür?

3voto

pc1oad1etter Punkte 8229

Hier ist der Fall für pas Prüfung auf Null in einem kürzlich erschienenen Blogbeitrag im Google Testing Blog.

Das Argument ist, dass es im Weg steht, klare, einfache Unit-Tests zu schreiben, weil man die Teile, die nicht wichtig sind, nicht wirklich fälschen kann, weil die Ausnahmen/Assertions geworfen werden.

Der Autor (Miško Hevery) schränkt den Kommentar ein, indem er sagt, dass, wenn es sich um eine externe API handelt, es sich trotzdem lohnen könnte, auf eine Fehlerbedingung zu prüfen.

1voto

Dustin Getz Punkte 20462

Ich weiß sehr wenig über Ihre Domäne, aber im allgemeinen Fall, ich mag zu behaupten (nicht null) überall, denn in der Regel, wenn ich am Ende mit einem null-Objekt irgendwo, seine ein Fehler.

Es ist auch eine gute Praxis, Referenztypen zu bevorzugen, die normalerweise nicht einmal null sein können.

1voto

Suroot Punkte 4231

Ich stamme aus einer sehr alten Schule der C-Programmierung; daher bin ich der Meinung, dass Variablen, die nicht verwendet werden oder die mit free() belegt wurden, immer NULL sein sollten. Das ist aber nur meine Meinung.

Editer : Darauf aufbauend sollten Sie immer prüfen, ob eine Variable NULL ist, bevor Sie sie verwenden. Wenn die Variable NULL ist und nicht sein sollte, sollten Sie einen Fehler protokollieren. Abstürze sollten kein Merkmal sein.

1voto

too much php Punkte 85034

Sie können sich das Leben einfacher machen, indem Sie die Methode getLanguage() in zwei Methoden aufteilen:

function getLanguageIfValid() {
  // this method return a Language object, but only if it can be created
  // correctly and the isValid() method returns TRUE. If the Language object
  // can't be created correctly, then it will return null instead.
}

function getLanguageMustBeValid() {
    // this method will always return an instance of Language, or else
    // an exception will be thrown
    if($return = $this->getLanguageIfValid())
        return $return;
    throw new Exception("Couldn't get Language object");
}

Wenn Sie das getan haben, verwenden Sie an Stellen, an denen man davon ausgehen kann, dass das Sprachelement nicht richtig erstellt wurde, die erste Methode:

// we may or may not be able to get our Language object here
if($language = $my_parameters->getLanguageIfValid())
    do_stuff($language);

Wenn Sie sicher sind, dass das Sprachobjekt erstellt werden soll, verwenden Sie die zweite Methode, die die Ausnahme für Sie auslöst.

// we know the Language object is created at this point
$language = $my_parameters->getLanguageMustBeValid();
do_stuff($language);

Die Antwort auf Ihre Frage lautet also Nein - Sie müssen nicht überprüfen, ob ein Objekt nicht null ist, solange Sie es von einer Funktion erhalten können, die garantiert nicht null zurückgibt.

1voto

Mario Punkte 1507

Werfen Sie Ihre Ausnahme von ->getLanguage().

Für mich sollten Ausnahmen automatisch ausgelöst werden. Was Sie tun, scheint eine Mischung aus Fehlercodeüberprüfung und Auslösen von Ausnahmen zu sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X