it-swarm.com.de

Wie benenne ich eine Methode, die sowohl eine Aufgabe ausführt als auch einen Booleschen Wert als Status zurückgibt?

Wenn es eine Methode gibt

bool DoStuff() {
    try {
        // doing stuff...
        return true;
    }
    catch (SomeSpecificException ex) {
        return false;
    }
}

sollte es eher IsStuffDone() heißen?

Beide Namen können vom Benutzer falsch interpretiert werden: Wenn der Name DoStuff() lautet, warum wird ein Boolescher Wert zurückgegeben? Wenn der Name IsStuffDone() lautet, ist nicht klar, ob die Methode eine Aufgabe ausführt oder nur das Ergebnis überprüft.

Gibt es eine Konvention für diesen Fall? Oder ein alternativer Ansatz, da dieser als fehlerhaft angesehen wird? Beispielsweise könnte in Sprachen mit Ausgabeparametern wie C # eine boolesche Statusvariable als Eins an die Methode übergeben werden, und der Rückgabetyp der Methode wäre void.

BEARBEITEN: In meinem speziellen Problem kann die Ausnahmebehandlung nicht direkt an den Aufrufer delegiert werden, da die Methode Teil einer Schnittstellenimplementierung ist. Daher kann der Anrufer nicht mit der Bearbeitung aller Ausnahmen verschiedener Implementierungen beauftragt werden. Diese Ausnahmen sind nicht bekannt. Der Aufrufer kann jedoch mit einer benutzerdefinierten Ausnahme wie StuffHasNotBeenDoneForSomeReasonException umgehen, wie in Antwort und Kommentar von npinti vorgeschlagen.

34
Limbo Exile

In .NET gibt es häufig Methodenpaare, bei denen eine von ihnen eine Ausnahme (DoStuff) auslöst und die andere einen booleschen Status und bei erfolgreicher Ausführung das tatsächliche Ergebnis über einen out-Parameter (TryDoStuff) zurückgibt.

(Microsoft nennt dies das "Try-Parse-Muster" , da das vielleicht bekannteste Beispiel dafür die Methoden TryParse verschiedener primitiver Typen sind.)

Wenn das Präfix Try in Ihrer Sprache ungewöhnlich ist, sollten Sie es wahrscheinlich nicht verwenden.

68
ne2dmar

Was ist, wenn Sie einfach die Ausnahme zum aufrufenden Code geworfen haben?

Auf diese Weise delegieren Sie die Ausnahmebehandlung an denjenigen, der Ihren Code verwendet. Was ist, wenn Sie in Zukunft Folgendes tun möchten:

  • Wenn keine Ausnahmen ausgelöst werden, führen Sie Aktion A aus
  • Wenn (zum Beispiel) ein FileNotFoundException ausgelöst wird, führen Sie Aktion B aus
  • Wenn eine andere Ausnahme ausgelöst wird, führen Sie Aktion C aus

Wenn Sie Ihre Ausnahme zurückwerfen, würde die obige Änderung einfach das Hinzufügen eines zusätzlichen catch-Blocks bedeuten. Wenn Sie es so lassen, wie es ist, müssen Sie die Methode und den Ort, von dem aus die Methode aufgerufen wird, ändern. Je nach Komplexität des Projekts können sich diese an mehreren Orten befinden.

18
npinti

DoStuff() ist ausreichend, und der Rückgabewert der Funktion sollte dokumentiert werden. Sie müssen ihn nicht im Funktionsnamen erwähnen, da Sie nach vielen verfügbaren APIs suchen:

PHP

// this method update and return the number affected rows 
// called update instead of updateAndGetAffectedCount
$affected = $query->update(/* values */);

C-Sharp

// Remove item from the List
// returns true if item is successfully removed; otherwise, false.
public bool Remove( T item )
7
amd

In Java definiert die Collection API eine Add-Methode , die einen Booleschen Wert zurückgibt. Grundsätzlich wird zurückgegeben, ob das Hinzufügen die Sammlung geändert hat. Für ein List wird normalerweise true zurückgegeben, da das Element hinzugefügt wurde, während für ein Set möglicherweise false zurückgegeben wird, wenn das Element bereits vorhanden war, da Sets dies zulässt jedes Einzelstück höchstens einmal.

Wenn Sie jedoch ein Element hinzufügen, das von der Auflistung nicht zugelassen wird, z. B. einen Nullwert, wird beim Hinzufügen ein NullPointerException ausgegeben, anstatt false zurückzugeben.

Warum müssen Sie einen Booleschen Wert zurückgeben, wenn Sie dieselbe Logik auf Ihren Fall anwenden? Wenn eine Ausnahme ausgeblendet werden soll, tun Sie dies nicht. Wirf einfach die Ausnahme. Auf diese Weise können Sie sehen, was schief gelaufen ist. Wenn Sie einen Booleschen Wert benötigen, weil er aus einem anderen Grund als einer Ausnahme möglicherweise nicht ausgeführt wurde, benennen Sie die Methode DoStuff(), da dies das Verhalten darstellt. Es macht Sachen.

6
mrjink

Normalerweise lassen Methoden ein OperationResult (oder OperationResult<T>) Zurückgeben und die Eigenschaft IsSuccess für OperationResult entsprechend festlegen. Wenn die 'übliche' Methode ungültig ist, geben Sie OperationResult zurück. Wenn die 'übliche' Methode ein Objekt zurückgibt, geben Sie OperationResult<T> Zurück und setzen Sie die Eigenschaft Item für OperationResult passend. Ich würde auch vorschlagen, Methoden für OperationResult wie .Failed(string reason) und .Succeeded(T item) zu verwenden. OperationResult wird schnell zu einem vertrauten Typ in Ihren Systemen und Entwickler lernen, wie sie damit umgehen.

1
Scott Rickman

Könnte aus verschiedenen Gründen fehlschlagen, Ausnahme, normale Bedingungen, würde dies verwenden:

boolean doStuff() - returns true when successful

Wichtig ist zu dokumentieren, was der Boolesche Wert bedeutet.

1
user136354

Ich würde einen Namen auswählen, der auf der primären Rolle der Methode basiert. Die Tatsache, dass diese Methode einen booleschen Wert zurückgibt, erfordert kein 'Is'-Präfix. Lassen Sie uns etwas Java Code, der das Präfix 'Is' ziemlich ausführlich verwendet. Schauen Sie sich Java.io.File.delete() an. Er gibt boolean zurück, wird aber nicht aufgerufen isFileDeleted(). Der Grund dafür ist, dass die Hauptaufgabe des Metods darin besteht, eine Datei zu löschen. Jemand ruft diese Methode mit der Absicht auf, eine Datei zu löschen.

Der Boolesche Wert dient nur dazu, das Ergebnis der Arbeit wiederzugeben. Auf der anderen Seite sehen wir Java.util.Map.isEmpty(). Offensichtlich rufen Sie eine solche Methode auf, um herauszufinden, ob die Sammlung leer ist. Du willst nichts machen. Sie möchten nur herausfinden, wie der aktuelle Status ist.

Also persönlich würde ich definitiv bei DoStuff() bleiben.

Dies ist für mich ein sehr wichtiges Thema. Wenn ich alten Code pflege, stoße ich oft auf etwas, das ich persönlich als "Lügenmethode" bezeichne. Der Name schlägt Aktion A vor, aber der Körper führt Aktion B aus. Das bizarrste Beispiel ist eine Getter-Methode, mit der Daten in der Datenbank geändert werden.

0
Jacek Prucia

Es hängt wirklich von der Sprache ab, die Sie verwenden. Wie für einige Sprachen gibt es Konventionen und Protokolle, die in vielen oder überhaupt keinen Sprachen existieren.

In der Objective-C-Sprache und im iOS/Mac OS X SDK lauten die Methodennamen normalerweise wie folgt:

- (returndatatype) viewDidLoad {
- (returndatatype) isVisible {
- (returndatatype) appendMessage:datatype variablename with:datatype variablename {

Wie Sie sehen können, gibt es dort eine Methode namens viewDidLoad. Ich bevorzuge diese Art der Benennung, wenn ich meine eigenen Anwendungen mache. Dies könnte verwendet werden, um zu überprüfen, ob etwas passieren sollte, wie Sie sagten. Ich glaube, dass Sie zu tief darüber nachdenken, wie Sie Ihre Methoden nennen. Die meisten Methoden geben unabhängig davon den Status ihrer Aktivitäten zurück. Beispiel:

In PHP gibt mysql_connect () false zurück, wenn die Verbindung fehlschlägt. Es sagt nicht, dass es so sein wird, aber es tut es und die Dokumentation sagt es, damit es für den Programmierer nicht falsch interpretiert werden kann.

0
Gergy008

Ich möchte vorschlagen, das Präfix 'Try' zu verwenden. Dies ist ein bekanntes Muster für Situationen, in denen die Methode erfolgreich sein kann oder nicht. Dieses Namensmuster wurde von Microsoft in . NET Framework (z. B. TryParseInt) verwendet.

Aber vielleicht geht es hier nicht um die Benennung. Es geht darum, wie Sie die Eingabe-/Ausgabeparameter Ihrer Methode entwerfen.

Meine Idee ist, dass, wenn eine Methode einen Rückgabewert hat, der Zweck des Aufrufs dieser Methode darin bestehen sollte, diesen Rückgabewert zu erhalten. Sie sollten daher vermeiden, den Rückgabetyp zu verwenden, um den Status einer Operation anzuzeigen.

In C # bevorzuge ich die Verwendung eines out-Parameters. Mit einem out markiere ich den Parameter als Nebenparameter. Insbesondere unterstützt C # 6 die Inline-Variablendeklaration.

DoStuff(out var isStuffDone); // The out parameter name clearly states its purpose.
DoStuff(out var _); // I use _ for naming parameters that I am ignoring.
0
000