Frage

Sorry, wenn dies eine comp-sci 101 Frage. Ich bin nur nicht sicher, ob ich offensichtlich etwas fehlt bin.

Sagen wir also einige Benutzereingabe einen Fehler wirft, und ich möchte es fangen und ein Feedback zurück. Der Fehler wird eine Zahl, 0 - 8 0 bedeutet „kein Fehler“. Ich möchte dem Anwender sehr spezifisches Feedback geben, wenn der Fehler 3 (keine Zahlen erlaubt, sagen wir mal). Für die anderen sieben Möglichkeiten, ich will nur das Skript beenden und echo der Fehler.

ich diese aus arbeite und beschlossen, mit diesem zu gehen:

$no_errors ($_error != 0 || $_error != 3) ? FALSE : TRUE;
if (!$no_errors)
echo $error_msg['$_error'];
$error_3 ($no_errors && $_error == 3) ? TRUE : FALSE;
if ($error_3)
   bunch of stuff happens;
else
   bunch of other stuff;

Wie auch immer, ich war zu bemerken, dann wird die OR-Operator in der ersten Zeile und dachte, dass es besser / sichere Benutzer einer AND-Operator sein könnte. Aber je mehr ich in Erwägung ziehen, sehen je weniger ich einen Unterschied.

Die eigentliche Frage ist, wenn Sie zwei Möglichkeiten einer bestimmten Variablen eliminieren wollen, sind AND und OR identisch, oder ist eine logisch / funktionell optimal?

War es hilfreich?

Lösung

logisch folgende identisch sind (mein Pseudo-Code entschuldigen)

(! expression_one || ! expression_two) /** this is the same as the one below **/
! (expression_one && expression_two)

Funktionell welches ist optimal? Sie sind beide so optimal wie jeder andere. Beiden Wege (&& und ||) erlauben Kurzschlüsse, wenn der erste Ausdruck wahr ist (in dem || Fall) oder falsch (im && Fall)

Andere Tipps

Es wird viel besser lesbar sein, wenn Sie eine switch-Anweisung verwenden:

switch ($_error) {
    case 0;
        nothing happens;
        break;
    case 3:
        bunch of stuff happens;
        break;
    default:
        bunch of other stuff;
        break;
}

Zunächst einmal denke ich, dass ich eine andere Art und Weise zu identifizieren Fehler verwenden würde empfehlen, als „magische Zahlen“ verwendet wird. Sie sind schwer zu erhalten, da man leicht vergessen, was „3“ gemeint. Es sieht aus wie Ihre Sprache PHP ist, die Unterstützung für Ausnahmen hat. Ich würde empfehlen, sie stattdessen verwenden, können Sie mehr über sie hier lesen: http://dk.php.net/ Ausnahmen

Wie für logische Operatoren gibt es nicht wirklich, die „good practice“ in Betracht gezogen werden. Verwenden Sie, was Sie wollen. Wenn Sie Schwierigkeiten haben, herauszufinden, wenn Ihr Ausdruck wahr / falsch ist, versuchen Sie eine Wahrheitstabelle machen: http: // en.wikipedia.org/wiki/Truth_table

Performance-weise, bedenken Sie, dass, dass die Bewertung in den meisten Sprachen faul sein. Oder, wenn die erste Bedingung erfüllt ist, wird es wahr zurück, ohne die zweite Bedingung auswertet. Für AND, wird es falsch zurück, wenn die ersten Bedingungen falsch ist, ohne dass die zweite Auswertung.

Ansonsten ist die Leistung des Betreibers ist selbst nicht wirklich anders. Verwenden Sie, was Ihnen am lesbar ist.

Das Beste ist das eine, die hilft Ihnen, Code schneller lesen. Es ist die einzige echte Optimierung können Sie hier machen, und möglicherweise in Millionen von anderen Orten.

Dies würde aussehen einfacher zu lesen:

  if($_error==3)
      do stuff;
    else if($_error>0)
      do some other stuff
    else
      do normal stuff

Niemand bemerkt die Mikrosekunden, die Sie gewinnen können.

  1. Ich persönlich würde die Verwendung dieser Zahlen eliminieren und Konstanten stattdessen verwenden. Neben leichter zu pflegen sind, machen sie die Codierung selbst viel einfacher und ermöglicht es Ihnen, die Werte von morgen zu aktualisieren z.B. wenn einige Umstand foreces Sie die Zahl von 3 bis zu ändern, müssen Sie ziemlich viel Blick durch den gesamten Code
  2. Wie gkrogers vorgeschlagen, ein Schalter während erreichen die gleiche Sache zu lesen und zu pflegen ist viel einfacher,

Performance weise ich glaube, sie sind sehr ähnlich (siehe Beitrag von wvanbergen), aber es offensichtliche Unterschiede im Verhalten sind. Ich denke, dass Ihre aktuelle Buchung kann nicht tun, was Sie erhoffen. In der ersten Zeile, wenn Sie _error $ = 3, dann werden Sie $ no_errors = false haben. Wie Sie für zwei Bedingungen überprüft, die beide erfüllt sein müssen, vielleicht ein und wäre besser geeignet.

Manchmal finde ich die einfachste Möglichkeit, meine Logik zu prüfen ist, um tatsächlich zu sagen, was ich laut wollen raus. Zum Beispiel: "Wir haben keine Fehler, wenn der Fehlercode nicht 0 und nicht 3"

ich, dass im Allgemeinen in Situation mit nur wenigen Variablen wie diese finden, wie ich den Satz schreiben würde in Englisch mir bietet mit dem intuitivsten (und genau) Methode für die logischen Operatoren zu bestimmen.

Wenn Sie feststellen, dass der Code nach diesem Prozess chaotisch aussieht, dann können Sie finden this Link auf De Morgan Gesetze nützlich

(A || B) =! (A && B). So ist es nicht wirklich einen Unterschied machen

EDIT: (A || B) = (A && B) ist falsch. Tks für den Kommentar. Die richtige Form ist (! A ||! B) =! (A && B).

Ich entschuldige mich

Wenn Sie:

$no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE;

Das bedeutet, wenn $ error! = 0 und $ error! = 3, die ungültige Logik ist, weil $ Fehler nicht bis 3 und 0 == werden es 3 sein kann, OR 0, aber nicht beide.
In dem obigen Beispiel, wenn $ error = 0, dann wäre es auf FALSCH zu bewerten, da es nicht 3 && 0 Sie ist auf der Suche nach entweder 3 sein || 0.

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