Ich arbeite in C #, also habe ich dies unter C # gepostet, obwohl dies eine Frage ist, die in jeder Programmiersprache beantwortet werden kann.
Manchmal erstelle ich eine Methode, die etwas wie das Einloggen eines Benutzers in eine Website tut. Oft gebe ich einen booleschen Wert von der Methode zurück, aber das verursacht oft Probleme, weil ein boolescher Rückgabewert keinen Kontext liefert. Wenn beim Einloggen des Benutzers ein Fehler auftritt, kann ich nicht wissen, was den Fehler verursacht hat.
Hier ist ein Beispiel für eine Methode, die ich derzeit verwende, möchte aber ändern, so dass es mehr als nur 0 oder 1 zurückgibt.
%Vor%Die obige Methode kann nur True oder False zurückgeben. Das funktioniert gut, weil ich einfach folgendes aufrufen kann:
%Vor%Aber das Problem ist, dass ich nicht wissen kann, warum der Benutzer nicht eingeloggt war. Es könnte eine Reihe von Gründen geben, wie: falsche Benutzername / Passwort-Kombination, gesperrtes Konto, Konto erfordert Aufmerksamkeit der Benutzer usw. Aber Folgendes zu verwenden Methode und Logik ist es nicht möglich, dies zu wissen.
Welche alternativen Ansätze habe ich?
Sie könnten enum
mit erwarteten LoginResults erstellen und zurückgeben.
Geben Sie dann unter Verwendung des Aufzählungstyps in Ihrer Methode zurück:
%Vor% Sie können entweder eine Ausnahme mit einer relevanten Nachricht versehen (und die aufrufende Methode mit der Ausnahme umgehen) oder die Funktion enum
mit verschiedenen Zuständen zurückgeben (z. B. LoginState.Success
, LoginState.IncorrectPassword
usw.).
Wenn Sie Ausnahmen verwenden, ist es wahrscheinlich am besten, wenn Ihre Funktion nichts zurückgibt ( public void LoginToTwitter
), aber wenn Sie enum
verwenden, stellen Sie sicher, dass Sie den Rückgabetyp auf den Namen Ihres enum
setzen. ( public LoginState LoginToTwitter
).
Es gibt zwei Standardmethoden. Wenn Sie nur am Ergebnis, aber nicht an Metadaten interessiert sind, geben Sie stattdessen ein enum ein. Setzen Sie die verfügbaren Werte auf Success
, Suspended
usw. (all Ihre möglichen Ergebnisse)
Wenn Sie weitere Details benötigen, können Sie immer Ausnahmen verwenden. Grundsätzlich folgen Sie der Idee "Tell, do not ask" und schreiben Sie Ihre Funktion so, dass sie die erforderlichen Werte (zB Benutzer-ID oder gar nichts, wenn Sie einen globalen Login-Status haben) nur bei Erfolg zurückgibt und eine Exception mit detaillierten Informationen ausgibt Beschreibung des Fehlers sonst. In Bezug auf die Hierarchie selbst sollten Sie höchstwahrscheinlich ein LoginException
mit einigen spezifischeren Unterklassen implementieren und nur diese abfangen. (es macht es einfach zu überprüfen, dass alle relevanten Ausnahmen behandelt und alle unbekannten an höhere Ebenen übergeben werden)
Sowohl das Zurückgeben einer Aufzählung als auch das Auslösen einer Ausnahme, wie in anderen Antworten vorgeschlagen, sind sinnvoll. Aber ich bevorzuge eine Ausnahme zurückzugeben . Klingt verrückt, aber Ihr Anrufer kann entscheiden, ob er die Fehlerprüfung oder die Ausnahmebehandlung verwendet. Und im Gegensatz zur Enumeration sind Ausnahmen hierarchisch, so dass es viel einfacher ist, ganze Kategorien von Fehlern zu handhaben, und beliebige zusätzliche Daten enthalten kann.
Ich denke, Sayse hatte eine ähnliche Idee, aber er löschte seine Antwort und erklärte sie auch nie wirklich.
Gemäß der Tendenz zum sauberen Code sollten Sie Ihrer Methode einen aussagekräftigen Namen geben, der die Absicht aufdeckt.
Wenn Sie wissen möchten, was passiert ist, wenn der Protokolliervorgang nicht abgeschlossen werden konnte, können Sie ihn in Ihren Flow Exceptions
einfügen und im Aufruferkontext behandeln.
siehe Ссылка
Sie können ein Idiom verwenden, das häufig in c verwendet wird. Das Ergebnis eines Zuweisungsausdrucks ist der Ausdruck selbst. Dies bedeutet, dass Sie einen Ergebniscode gleichzeitig mit der Auswertung eines bestimmten Werts erfassen können:
%Vor%Ich wurde gebeten, einen Link zu einem MSDN-Artikel bereitzustellen - hier ist eine alte Version der Spezifikation: Ссылка
"Das Ergebnis eines einfachen Zuweisungsausdrucks ist der Wert, der dem linken Operanden zugewiesen ist. Das Ergebnis hat den gleichen Typ wie der linke Operand und wird immer als Wert klassifiziert."
Tags und Links c#