Ist es eine gute Praxis, eine Methode aufzurufen, die in einer if-Anweisung wahre oder falsche Werte zurückgibt?
Etwas wie das:
private void VerifyAccount()
{
if (!ValidateCredentials(txtUser.Text, txtPassword.Text))
{
MessageBox.Show("Invalid user name or password");
}
}
private bool ValidateCredentials(string userName, string password)
{
string existingPassword = GetUserPassword(userName);
if (existingPassword == null)
return false;
var hasher = new Hasher { SaltSize = 16 };
bool passwordsMatch = hasher.CompareStringToHash(password, existingPassword);
return passwordsMatch;
}
Oder ist es besser, sie in einer Variablen zu speichern, als sie mit solchen Werten zu vergleichen?
bool validate = ValidateCredentials(txtUser.Text, txtPassword.Text);
if(validate == false){
//Do something
}
Ich beziehe mich nicht nur auf .NET, ich beziehe mich auf die Frage in allen Programmiersprachen. Es kommt einfach so vor, dass ich .NET als Beispiel verwendet habe
if (!validate)
stattif (validate == false)
.IsValidCredentials
, obwohl grammatikalisch umständlich, ist ein gängiges Format zur Angabe eines booleschen Rückgabewerts.!
ist der Operator "NOT" und negiert jeden booleschen Ausdruck. Soif (!validate)
ist das Gegenteil vonif (validate)
. Die if-Anweisung wird eingegeben, wenn sievalidate
nicht wahr ist.Antworten:
Wie bei all diesen Dingen kommt es darauf an.
Wenn Sie das Ergebnis Ihres Aufrufs nicht verwenden möchten, müssen Sie das Ergebnis
ValidateCredentials
(außer zu Debugging-Zwecken) nicht in einer lokalen Variablen speichern. Wenn es jedoch den Code lesbarer (und damit wartbarer) macht, muss eine Variable dazu passen.Der Code wird nicht messbar weniger effizient sein.
quelle
!ValidateCredentials
ist das besser lesbar, da es explizit angibt, was es im Code tut. Es ist sehr klar. Wenn die von Ihnen aufgerufene Funktion keinen "selbstdokumentierenden" Namen hat, ist es möglicherweise besser, mit der Variablen zu arbeiten. So wie es aussieht, würde ich empfehlen, die Variable wegzulassen und bei dem selbstdokumentierenden Code zu bleiben, den Sie haben.Warum eine zusätzliche Variable verwenden? Ich bevorzuge den ersten Ansatz, er ist lesbarer und einfacher.
quelle
Ja, wenn die Bedingung nicht einfach genug ist, um inline zu sein und lesbar zu sein.
Sie sollten dies nur tun, wenn Sie den Wert an mehreren Stellen verwenden oder benötigen, um den Code besser lesbar zu machen. Andernfalls ist die Zuordnung zu einer Variablen nicht erforderlich. Unnötiger Code ist bestenfalls verschwenderisch und im schlimmsten Fall eine Fehlerquelle.
quelle
Mal sehen ...
Da es nur um KISS geht , müssen Sie keine zusätzliche Variable erstellen, wenn Sie darauf verzichten können. Es ist auch nicht nötig, mehr zu tippen ... wenn es nicht nötig ist.
Aber weil Sie TROCKEN , wissen Sie, dass Sie eine zusätzliche Variable hätten erstellen müssen , wenn Sie später angerufen haben
ValidateCredentials
und sich beim Tippen befindenValidateCredentials(txtUser.Text, txtPassword.Text)
.quelle
Ja, es ist normalerweise in Ordnung, solche Methoden als Bedingungen zu verwenden. Es ist jedoch hilfreich, wenn der Methodenname angibt, dass die Methode einen Bool zurückgibt. Zum Beispiel CanValidateCredentials. In Sprachen im C-Stil wird diese Methode häufig in Form von Is- und Can-Präfixen und in Ruby mit dem '?' Suffix.
quelle
if (cat.canOpenCanOfCatFood())
.Es gibt noch ein weiteres Problem, auf das noch nicht hingewiesen wurde: die Kurzschlussbewertung . Was ist der Unterschied zwischen diesen beiden Codefragmenten?
Ex # 1:
Ex # 2:
Diese beiden Codefragmente scheinen dasselbe zu tun, aber wenn Ihre Sprache die Kurzschlussauswertung unterstützt, sind diese beiden Fragmente unterschiedlich. Kurzschlussauswertung bedeutet, dass der Code das Minimum auswertet, das erforderlich ist, um eine Bedingung zu bestehen oder nicht zu bestehen. Wenn Beispiel 1, wenn foo () false zurückgibt, werden bar () und baz () nicht einmal ausgewertet. Dies ist nützlich, wenn baz () ein lang laufender Funktionsaufruf ist, da Sie ihn überspringen können, wenn entweder foo () false oder foo () true und bar () false zurückgibt.
Dies ist in Beispiel 2 nicht der Fall. foo (), bar () und baz () werden immer ausgewertet. Wenn Sie erwarten, dass bar () und baz () Nebenwirkungen aufweisen, haben Sie Probleme mit Beispiel 1. Das obige Beispiel Nr. 1 entspricht tatsächlich diesem:
Ex # 3:
Beachten Sie diese Unterschiede in Ihrem Code, wenn Sie zwischen den Beispielen 1 und 2 wählen.
quelle
Das Problem der Lesbarkeit etwas erweitern ...
Ich kann mir zwei gute Gründe vorstellen, das Ergebnis in einer Variablen zu speichern:
Wenn Sie die Bedingung mehrmals verwenden, bedeutet das Speichern in einer Variablen, dass Sie die Funktion nur einmal aufrufen müssen. (Dies setzt voraus, dass der gespeicherte Wert noch gültig ist. Wenn Sie ihn erneut testen müssen, gilt dies natürlich nicht.)
Wenn das Speichern in einer Variablen die Lesbarkeit verbessert, indem Sie der Bedingung einen Namen geben, der aussagekräftiger ist als das, was Sie im Funktionsaufruf sehen.
Zum Beispiel:
hilft nicht bei der Lesbarkeit, aber dies:
wahrscheinlich, da es nicht sofort offensichtlich ist,
feof(file1) && feof(file2)
dass wir mit der Verarbeitung fertig sind.Die
passwordsMatch
Variable in der Frage ist wahrscheinlich ein besseres Beispiel als meine.Einwegvariablen sind nützlich, wenn sie einem Wert einen aussagekräftigen Namen geben. (Dies ist natürlich zum Nutzen des menschlichen Lesers.)
quelle
done_processing
Variable einzuführen . Immerhin hat der Namedone_processing
die Funktion eines Kommentars. Und ein echter Kommentar erlaubt mir, ein oder zwei Worte darüber zu sagen, warum diese Bedingung signalisiert, dass wir mit der Verarbeitung fertig sind. Nicht, dass ich ein großartiger Kommentator wäre, aber ich würde wahrscheinlich auch nichts in echtem Code tun ...done_processing
ist eine dauerhaftere Möglichkeit, die Absicht auszudrücken.