Frage

Angenommen, ich habe eine Methode

public Patient(int id)
{
    ----
}

, die ein id Patient Objekt gegeben zurück .. Ich Vertrag in zwei Arten definieren könnte

  1. Methode würde null zurück, wenn der Patient nicht existiert
  2. Methode würde eine Ausnahme auslösen, wenn der Patient nicht existiert. In diesem Fall würde ich auch eine Abfragemethode definieren, die true zurückgibt, wenn der Patient in der Datenbank vorhanden sind oder andernfalls false ...

Welchen Vertrag soll ich verwenden? Alle anderen Vorschläge?

Update: Bitte nehmen Sie zu diesem Fall zu ... Wenn es nicht eine Datenbank zugeordnet Id ist, und es ist etwas, das ein Benutzer in UI eingeben .. wie SSN .. dann was ist besser ..

Kommentar über Null-Muster von Steve, dass ich denke, gilt: wahrscheinlich keine gute Idee, hier, wie es wäre wirklich nützlich sein, sofort zu wissen, wann eine ID nicht existiert.

Und ich denke, auch hier Null Muster etwas schweres Gewicht würden

Kommentar von Rob Wells auf Ausnahme, weil seine schlechten Id werfen: Ich glaube nicht, ein Tippfehler in dem Namen des Patienten ein außergewöhnlicher Umstand“IMHO ist

War es hilfreich?

Lösung

Beachten Sie, dass gehen „über den Draht“ auf eine andere Ebene (ob eine Datenbank oder ein Anwendungsserver) ist einer der teuersten Aktivitäten, die Sie tun können - in der Regel ein Netzanruf mehrere Größenordnungen länger dauern wird als Ein- Speicher Anrufe.

Es ist daher sinnvoll, während der API Strukturierung redundante Anrufe zu vermeiden.

Man denkt, wenn Ihre API ist wie folgt:

// Check to see if a given patient exists
public bool PatientExists(int id);

// Load the specified patient; throws exception if not found
public Patient GetPatient(int id);

Dann sind Sie wahrscheinlich die Datenbank zweimal getroffen -. Oder angewiesen auf gutes Caching, um dies zu vermeiden

Eine weitere Überlegung ist dies: An einigen Stellen des Code ein „known-good“ id hat, an anderen Orten nicht. Jeder Standort erfordert eine andere Politik auf, ob eine Ausnahme soll geworfen werden.

Hier ist ein Muster, das ich für eine gute Wirkung in der Vergangenheit verwendet habe - haben zwei Methoden:

// Load the specified patient; throws exception if not found
public Patient GetExistingPatient(int id);

// Search for the specified patient; returns null if not found
public Patient FindPatient(int id);

Natürlich GetExistingPatient () kann durch den Aufruf FindPatient () gebaut werden.

Auf diese Weise können Sie Ihre Telefonvorwahl das entsprechende Verhalten bekommen, eine Ausnahme zu werfen, wenn etwas schief gegangen ist, und die Vermeidung von Ausnahmebehandlung in Fällen, in denen es nicht benötigt wird.

Andere Tipps

Eine andere Möglichkeit wäre die Null-Objekt Muster .

Sie sollten wahrscheinlich eine Ausnahme werfen. Wenn Sie eine id haben, die nicht auf einen gültigen Patienten nicht zeigen, wo kommt es her? Etwas sehr Schlimmes ist wahrscheinlich passiert ist. Es ist ein außergewöhnlicher Umstand.

EDIT: Wenn Sie etwas anderes als ein Integer-basierter Retrieval tun sind, wie eine Suche basierend auf Text, dann null Rückkehr ist in Ordnung. Vor allem, da in diesem Fall, dass Sie einen Satz von Ergebnissen zurückgeben, die mehr als ein (mehr als ein Patient mit dem gleichen Namen, gleichem Geburtsdatum, oder was auch immer Ihre Kriterien ist) sein könnte.

Eine Suchfunktion einen anderen Vertrag aus einer Abruffunktion haben sollte.

Es hängt davon ab:

Wenn man bedenkt, die den Normalbetrieb eine pation Nummer führen wird keine Datei in der DB dann ein leerer (NULL) passenden Datensatz zurückgegeben werden sollte.

Aber wenn Sie erwarten, dass eine gegebene ID immer einen Datensatz dann treffen soll, wenn man nicht gefunden wird (was selten sein soll), dann eine Ausnahme verwenden.

Andere Dinge, wie ein DB-Verbindungsfehler sollen eine Ausnahme erzeugen.
Wie Sie unter normalen Umständen die Abfrage an die DB immer zu arbeiten (obwohl es zurückgeben 0 Datensätze oder nicht).

erwarten

P. S. Ich würde nicht einen Zeiger zurück. (Wer besitzt den Zeiger ??)
Ich würde ein Objekt zurück, das den Datensatz nicht hat oder nicht. Aber das kann man innerhalb von für die Existenz des Datensatzes verhört. Potenziell ein Smart-Pointer oder somthing etwas intelligenter als ein Smart-Pointer, der die cotext versteht.

Für diese Umstände würde ich die Methode return null für einen nicht vorhandenen Patienten hat.

Ich neige dazu, bevorzugen Ausnahmen mit graeful Abbau zu unterstützen, wenn es ein Problem mit dem System selbst.

In diesem Fall ist es wahrscheinlich mosdt:

  1. ein Tippfehler in der ID des Patienten, wenn sie in ein Suchformular eingegeben wurde,
  2. ein Dateneingabefehler oder
  3. ein Workflow-Problem in diesem Datensatz er Patienten wurde noch nicht eingegeben.

Damit ein Null eher als eine Ausnahme zurück.

Wenn es ein Problem Kontaktieren die Datenbank ist, dann hätte ich die Methode eine Ausnahme machen.

Edit:. Gerade gesehen, dass die Patienten-ID in der Signatur war eine ganze Zahl, dank Steven Lowe, also habe ich meine Liste von Gründen korrigiert

Mein Basispunkt über abgrenzt, wenn Ausnahmen zu verwenden (für Systemfehler) im Vergleich zu anderen Methoden der einen Fehler zurückgegeben (für einfache Dateneingabe Fehler) steht noch though. IMHO.

HTH

prost,

Rob

In einer einfachen Situation wie dieser 1. scheint mehr als ausreichend zu sein. Sie können so etwas wie eine Callback-Methode implementieren möchten, dass der Kunde zu wissen, warum es nennt null zurückgegeben. Nur ein Vorschlag.

Ihre descriptiong für bare Münze nehmen, müssen Sie wahrscheinlich beides:

  • bad IDs sind Fehler / Ausnahmen, wie Adam wies darauf hin, aber
  • , wenn Sie IDs an anderer Stelle gegeben werden, die verschwunden haben könnte, werden Sie die Abfragemethode müssen für sie überprüfen

ich das richtig gelesen Unter der Annahme ... Wenn Sie Patient (100) nennen es einen Objektverweis für einen Patienten mit der ID 100 zurück. Wenn kein Patient mit einer ID von 100 vorhanden ist, denke ich, es null zurückgeben sollte. Ausnahmen sind überstrapaziert IMO und dieser Fall ruft nicht für sie. Die Funktion zurückgegeben einfach eine Null. Es hat nicht einige errored Fall erstellen, die Ihre Anwendung zum Absturz bringen kann (es sei denn natürlich, beendet Sie nicht, dass die Null-Behandlung auf und übergeben es um zu einem anderen Teil Ihrer Anwendung).

Ich würde auf jeden Fall haben diese Funktion return ‚null‘, vor allem, wenn es Teil einer Suche war, wo ein Benutzer für einen Patienten mit einer bestimmten ID suchen würde und wenn die Objektreferenz null endete als wäre es einfach behaupten, kein Patient mit dieser ID vorhanden ist.

eine Ausnahme aus.

Wenn Sie null zurück, Code wie folgt:

Console.WriteLine(Patient(id).Name);

würde mit einem Nullreferenceexception fehlschlagen, wenn die ID nicht existiert, was nicht so hilfreich ist als ein PatientNotFoundException sagen (id). In diesem Beispiel ist es noch relativ leicht ausfindig zu machen, aber bedenken Sie:

somePatient = Patient(id)

// much later, in a different function:

Console.WriteLine(somePatient);

über eine Funktion hinzugefügt, der überprüft, ob ein Patient vorhanden ist: Hinweis: Das wird nicht PatientNotFoundExceptions vollständig verhindern. Zum Beispiel:

if (PatientExists(id))
    Console.WriteLine(Patient(id).Name);

- ein anderer Thread oder ein anderer Prozess könnte der Patient zwischen den Anrufen zu PatientExists und Patient löschen. Auch würde dies bedeuten, zwei Datenbankabfragen anstelle von einem. Normalerweise ist es besser, nur den Anruf versuchen, und behandelt die Ausnahme.

Beachten Sie, dass sich die Situation für Abfragen unterschiedlich ist, die mehrere Werte zurückgeben, z.B. als Liste; hier ist es angebracht, eine leere Liste zurück, wenn es keine Übereinstimmungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top