Methoden, die aussagekräftige Rückgabewerte liefern

8

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?

    
James Jeffery 21.07.2013, 19:50
quelle

6 Antworten

8

Sie könnten enum mit erwarteten LoginResults erstellen und zurückgeben.

%Vor%

Geben Sie dann unter Verwendung des Aufzählungstyps in Ihrer Methode zurück:

%Vor%     
Dan Teesdale 21.07.2013, 19:53
quelle
8

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 ).

    
mc10 21.07.2013 19:54
quelle
6

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)

    
viraptor 21.07.2013 19:56
quelle
3

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.

    
Ben Voigt 21.07.2013 20:10
quelle
0

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 Ссылка

    
xhamr 21.07.2013 19:59
quelle
0

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."

    
phillip voyle 21.07.2013 20:40
quelle

Tags und Links