Wo ist das richtige Gleichgewicht von Prädikaten in einer einzigen if-Anweisung?

8

Ich persönlich habe kein Problem mit dem folgenden Code

%Vor%

Weil ich denke, das folgende ist zu ausführlich

%Vor%

Aber ich würde mit diesem Standpunkt nicht so weit gehen, wenn ich sage, dass es fünf Prädikate gibt und ich den Text in den Editor einpacken musste, um sie alle auf einmal zu sehen, gibt es eine logische "Linie", die du zeichnest viele Prädikate, die Sie in eine einzige if-Anweisung aufnehmen, in einem ähnlichen Sinn wie die Aussage, dass Methoden niemals mehr als 7 Parameter benötigen sollten

    
Nick Allen 14.04.2009, 10:02
quelle

10 Antworten

10

Ich denke nicht, dass das Umschreiben von if-Anweisungen in zwei der richtige Weg ist, besonders wenn man bedenkt, dass das Hinzufügen einer else -Klausel zu Ihren Beispielen zu unterschiedlichen Ergebnissen führt. Wenn ich die Anzahl der atomaren Aussagen in der Bedingung reduzieren wollte, würde ich einige, die zusammen Sinn ergeben, mit einer eigenen Funktion vergleichen, wie:

%Vor%     
jpalecek 14.04.2009, 10:55
quelle
9

Ich denke, es ist ein Gleichgewicht der verschiedenen Arten von Operatoren und korrekte Formatierung. Wenn alle Operatoren gleich sind (alle "und" oder alle "oder"), dann können Sie wahrscheinlich eine unbestimmte Anzahl von Ausdrücken miteinander verketten, ohne das Verständnis zu verlieren:

%Vor%     
1800 INFORMATION 14.04.2009 10:09
quelle
5

Kurzzeitgedächtnis hat eine Kapazität von sieben Elementen, geben oder nehmen Sie zwei. Dies impliziert, dass ein Ausdruck, der mehr als fünf verschiedene Objekte umfasst, möglicherweise eine Pause erfordert und darüber nachdenkt.

    
Don Reba 14.04.2009 10:48
quelle
4

Ich glaube nicht, dass es eine magische Zahl gibt. Wenn alle Prädikate zusammen Sinn ergeben, dann werde ich sie zusammensetzen. Dies könnte beinhalten, dass die if-Anweisung über zwei Zeilen aufgeteilt wird, aber ich führe normalerweise keine zusätzlichen if-Anweisungen ein, die überflüssig sind. Aber wenn es besonders lang ist, sollten Sie sich fragen, ob alle Aussagen wirklich notwendig sind. Vielleicht könnten Sie einige der Werte früher oder etwas in der Art herausfiltern. Das größte Problem ist die Lesbarkeit. Wenn es für jemanden anders schwer ist zu verstehen, müssen Sie Ihren Code umgestalten. Aber die Aufspaltung des Codes in zwei verschiedene if-Anweisungen macht den Code selten lesbarer, er benötigt nur mehr Zeilen.

    
swampsjohn 14.04.2009 10:09
quelle
3

Nicht die Anzahl der Prädikate, sondern die Komplexität zählt. Solange Sie verstehen, was der Code mit minimalem Aufwand tut, sieht es für mich in Ordnung.

Um das hinzuzufügen, würde ich nicht zu multiple if's wechseln, sondern eine Funktion für die Prädikate hinzufügen. Insbesondere, wenn an mehreren Stellen die gleiche Anzahl von Prädikaten verwendet wird.

    
Toon Krijthe 14.04.2009 10:05
quelle
3

Es hängt davon ab, was Sie tun. Die zweite Anweisung erzeugt ein anderes Ergebnis, wenn Sie es umkehren. (fügen Sie ein "nicht" davor hinzu) und ist eine sehr häufige Quelle von Fehlern.

Ich habe Code mit ungefähr 20 Prädikaten gesehen, der funktioniert (oder zumindest gut genug funktioniert!) Die Faustregel, die ich verwende, wenn es wie ein Hundedinner aussieht, erwäge ich Refactoring.

    
Chris Huang-Leaver 14.04.2009 10:09
quelle
1

Ich denke jedoch, dass es keine Regeln gibt:

  1. ist es ausreichend komplex, dass, wenn du es jemand anderem zeigst, es schwierig ist, es zu verstehen?
  2. Muss es mehrere Zeilen abdecken?
  3. Haben Sie mehrere Bedingungen mehrmals geprüft, wenn 'if' Klauseln? Dies würde auf ein erforderliches Refactoring in eine Methode hinweisen

Wenn einer der obigen Punkte zutrifft, würde ich es nachbearbeiten.

    
Brian Agnew 14.04.2009 10:07
quelle
1

Dieses Problem mit langen Listen von Bedingungen ist nicht so sehr der Verlust der Lesbarkeit , sondern der Verlust der Testbarkeit . Besonders im Umgang mit schlechten Methodenargumenten ist es manchmal einfacher, um Vergebung als um Erlaubnis zu bitten (siehe zB Antwort auf diese Frage ). Auf diese Weise halten Sie Ihren Code sauber und testbar und beheben entweder den Aufrufer oder lassen ihn mit der resultierenden Ausnahme umgehen.

    
CurtainDog 14.04.2009 11:55
quelle
0

Welcher Weg ist besser? Weder. Die Semantik von beiden ist unterschiedlich.

Ich stimme zu, obwohl Splitting das Debuggen erleichtert, aber auch bedingte Breakpoints:)

Wenn es eine einfache Kombination aus ANDs oder ORs ist, die länger als 3 Tests sind, refaktorisieren Sie sie.

    
leppie 14.04.2009 21:15
quelle
0

Alles hängt davon ab, was zu tun ist. Aber eine Sache, auf die Sie achten sollten, um bestimmte Algorithmen weniger ausführlich zu machen, ist eine switch-Anweisung:

%Vor%

Das wäre in anderen Aussagen ziemlich ausführlich gewesen. Irgendein Code wird Tonnen von if und else Aussagen brauchen, einige werden kondensiert werden können, etc. Nimm niemals die Qualität der Ausführung des Codes für die Schönheit der Quelle des Codes auf.

    
Bryan Grezeszak 14.04.2009 21:10
quelle