Zu “wenn, wenn, wenn” oder zu “wenn, sonst wenn, sonst wenn, sonst” [closed]

Lesezeit: 7 Minuten

Benutzer-Avatar
qonf

Ich schreibe einen Code für die Datenanalyse und muss Proben basierend auf bestimmten Kriterien ausschließen. In der Praxis schreibe ich am Ende Code wie:

bool Test(SampleType sample)
{
  if( ! SubTest1(sample) )
    return false;
  if( ! SubTest2(sample) )
    return false;
  if( ! SubTest3(sample) )
    return false;

  return true;
}

Folgendes erscheint mir äquivalent:

bool Test(SampleType sample)
{
  if( ! SubTest1(sample) )
    return false;
  else if( ! SubTest2(sample) )
    return false;
  else if( ! SubTest3(sample) )
    return false;
  else 
    return true;
}

Gibt es einen Unterschied in Bezug auf die Rechenkosten? Gibt es einen streitbaren Vorzug in Bezug auf Erweiterbarkeit/Wartbarkeit, Ästhetik usw.?

Ich weiß, dass dies wahrscheinlich ein belangloses Problem ist, aber sobald ich diese Fragen in meinem Kopf habe, MUSS ich die Antwort finden.

PS: Falls es jemanden interessiert, mein aktueller Code vom 15.09. ist unter folgendem zu finden:
http://folk.uio.no/henrikq/conf.tgz

  • Wenn Sie sich Sorgen um die Leistung machen, messen Sie mit echten Daten die konkreten Compiler- und Bibliotheksversionen und auf der Zielplattform. Bis Sie dies getan haben, bevorzugen Sie die Version, die einfacher zu lesen und zu warten ist.

    – sbi

    14. September 2011 um 10:44 Uhr

  • @sbi Mir geht es mehr darum, eine gut durchdachte Antwort auf eine Frage zu bekommen, die in mir steckt, damit ich wieder arbeiten kann. Danke aber für den Vorschlag.

    – qonf

    14. September 2011 um 10:47 Uhr

  • @qonf Es gibt eine einfache Antwort: Der beste Ansatz besteht darin, die OCD mit “unwichtigen Problemen” zu beenden und wieder an die Arbeit zu gehen.

    – R.Martinho Fernandes

    14. September 2011 um 10:50 Uhr


  • @qonf: Es gibt keine gute Antwort. Dies hängt stark vom Codegenerator des Compilers und davon ab, was die Zielplattform mit dem generierten Code macht. Lerne einfach, über solche Fragen hinwegzukommen und zu schreiben sauber zuerst codieren und später profilieren.

    – sbi

    14. September 2011 um 10:50 Uhr

  • Gibt es hier keinen Ort, an dem Sie eine Frage stellen können, wie die Dinge funktionieren, ohne dass andere Ihnen sagen, dass Sie es anders machen sollen?

    – Shahbaz

    14. September 2011 um 11:11 Uhr

Der Compiler generiert für beide Versionen denselben Code. Aber die 1. Version ist besser in Wartbarkeit Aspekt, wenn Sie nur mit der 2. Version vergleichen.

Der Code wird beendet, wenn die return Anweisung wird angetroffen; es nützt also nichts aufzubewahren else im Kommenden if. Dadurch versteht der Entwickler den Code besser.

Auch wenn dies der wörtliche Code ist, können Sie immer noch schrumpfen als,

bool Test(SampleType sample)
{
  return (SubTest1(sample) && SubTest2(sample) && SubTest3(sample));
}

  • Es ist nicht der wörtliche Code, aber danke.

    – qonf

    14. September 2011 um 10:50 Uhr

  • Können Sie nicht argumentieren, dass das zweite besser wartbar ist, weil Sie nicht vergessen werden, das andere zu setzen, wenn es keine vorzeitige Rückkehr mehr ist?

    – R.Martinho Fernandes

    14. September 2011 um 10:52 Uhr


  • @R. Martinho, da kann es viele Möglichkeiten geben. Ich habe den genauen OP-Code beantwortet. Wenn die return ist dies nicht der Fall, ändert sich die gesamte Logik des Codes. Tatsächlich vermeide ich es persönlich, mehrere zu behalten return Werte in der Funktion (da sie dazu neigt, Destruktorcode für automatische Objekte an jeder Stelle zu platzieren return Wert). Die Anforderungen von OP sind jedoch unterschiedlich

    – iammilind

    14. September 2011 um 10:57 Uhr


  • @iammilind Ich habe überlegt, eine Variable zu Beginn der Funktion zu deklarieren und sie dann abhängig von den Ergebnissen des SubTests zu ändern, aber ich bin zu dem Schluss gekommen, dass ich nicht sehen konnte, wie sie etwas hinzufügen würde. Unglücklicherweise versuche ich, zu viel Zeug in meiner “Test”-Funktion zu machen, um sie zu einem Einzeiler zu machen. Es könnte wahrscheinlich mit einer Reihe zusätzlicher Funktionsdefinitionen gemacht werden, aber meiner Meinung nach eignet sich c/c++ nicht für die funktionale Programmierung (nicht dass ich ein Experte für funktionale Programmierung wäre).

    – qonf

    14. September 2011 um 11:38 Uhr

  • @qonf, wenn Sie Ihren Code überprüfen lassen möchten, gibt es eine Schwesterseite codereview.se. Wenn Sie nur eine minimale Menge Ihres Codes produzieren können, ist diese Site eine geeignete Plattform. Viele Leute werden es gut aufnehmen, viele werden es kritisieren; aber ich schätze du wirst zumindest eine vernünftige antwort bekommen.

    – iammilind

    14. September 2011 um 12:56 Uhr

Benutzer-Avatar
Arnaud Le Blanc

Ich würde dies tun:

return SubTest1(sample) && SubTest2(sample) && SubTest3(sample);

Dies wird die Leistung nicht verbessern, aber was die Funktion tut (oder auch nicht), ist offensichtlicher.

  • Whoa, das nenne ich Optimierung 🙂

    – bitte

    14. September 2011 um 10:37 Uhr

  • Das ist cool, aber im Debugger sehr schwer zu überspringen.

    – scharfer Zahn

    14. September 2011 um 10:39 Uhr

  • @plaes Du denkst, es gibt einen Leistungsunterschied?

    – Verkäufer

    14. September 2011 um 10:40 Uhr

  • @selalerer: Nein, Lesbarkeit “Optimierung”.

    – bitte

    14. September 2011 um 10:41 Uhr

  • @plaes: +1 zu deinem Kommentar für „Lesbarkeitsoptimierung“

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    14. September 2011 um 12:27 Uhr

Benutzer-Avatar
scharfer Zahn

Beide sind in Bezug auf das Verhalten völlig gleichwertig, und Compiler werden wahrscheinlich identischen Maschinencode für beide ausgeben.

Sie unterscheiden sich nicht einmal so sehr in Bezug auf die Lesbarkeit – beide haben die gleiche Menge an Verschachtelung. Vergleichen Sie dies mit dem Fall, in dem keine frühe Rückkehr zu einer tiefen Verschachtelung führt.

  • Sie sind nur äquivalent, wenn Sie von jedem if () zurückkehren.

    – Arnaud Le Blanc

    14. September 2011 um 10:38 Uhr


  • @ arnaud576875: Wenn SubTest1(sample) gibt falsch zurück, SubTest2(sample) wird auch nie angerufen. Was vermisse ich?

    – sbi

    14. September 2011 um 10:42 Uhr

  • Solange Sie in jedem if() von der Funktion zurückkehren, gibt es eigentlich keinen Unterschied

    – Arnaud Le Blanc

    14. September 2011 um 10:42 Uhr

  • Aha … Ich habe die Rückkehr verpasst. Das ist richtig, sie sind gleichwertig.

    – Alok Speichern

    14. September 2011 um 11:03 Uhr

Was die Lesbarkeit betrifft,

bool Test( SampleType sample )
{
    return SubTest1( sample )
        && SubTest2( sample )
        && SubTest3( sample );
}

ist viel klarer als jede Ihrer Optionen. Ansonsten will man das auf jeden Fall else um klarzustellen, dass sobald eine der Bedingungen erfüllt ist, keine der anderen getestet wird.

Beide sind identisch. Der Compiler findet wahrscheinlich heraus, wie er sie optimieren kann, damit identischer Maschinencode ausgegeben wird. Ich würde mich für den ersten Code entscheiden, da er einfacher zu lesen ist.

Benutzer-Avatar
Coder

Ich kann mir nicht vorstellen, dass es einen Unterschied in der Leistung macht.

Ich würde den ersten verwenden, wenn es sich um unabhängige Tests handelt, und Sie möchten einfach abbrechen, nachdem einer davon erfolgreich ist, und den zweiten, wenn Sie zwischen einer Reihe logischer Alternativen wählen.

Benutzer-Avatar
Verkäufer

Soweit ich weiß, gibt es keinen Unterschied im resultierenden Maschinencode. Abgesehen davon, wen interessiert das? Haben Sie ein Leistungsproblem mit diesem Code? Leistung ist ein schwieriges Thema, das normalerweise bis zum Ende des Projekts verschoben werden sollte, und nur wenn es Leistungsprobleme gibt, sollten sie gefunden und behoben werden WO ES SIE TATSÄCHLICH GIBT und nicht dort, wo Sie im Voraus denken, dass sie sein könnten.

  • Es stimmt, wenn nur mein Verstand diese Dinge loslassen würde …

    – qonf

    14. September 2011 um 10:42 Uhr

  • Ich bin mit nichts einverstanden, was Sie gesagt haben.

    – Widor

    14. September 2011 um 10:42 Uhr

  • Wenn zwei Codeteile in Bezug auf die Komplexität identisch sind, gibt es keinen Grund, nicht den schnelleren zu wählen.

    – Andreas Brink

    14. September 2011 um 10:46 Uhr

  • Leistung ist ein schwieriges Thema, das normalerweise bis zum Ende des Projekts verschoben werden sollte Warum sollten Sie es für später aufheben, wenn Sie es von Anfang an gut codieren können? Ich stimme zu, dass OP mit diesem Beispiel zu weit geht, aber ich bin nicht damit einverstanden, dass Sie beim Codieren die Leistung ignorieren sollten. Wenn Sie lernen, welche Methoden besser sind (ob Ihr „besser“ „optimierter“ oder „besser lesbar“ ist), sollten Sie sich von Anfang an bewerben, anstatt für Korrekturen zurückzukommen.

    – Shahbaz

    14. September 2011 um 11:10 Uhr

  • @sbi Es kann sehr hilfreich sein, jemanden darauf hinzuweisen, dass er etwas falsch macht. Es kann für den Fragesteller auch extrem frustrierend sein, wenn Sie sich in Ihrer Annahme darüber irren, was das ultimative Ziel des Fragestellers ist! Daher ist eine gewisse Demut angebracht, wenn man auf diese Weise antwortet. Es ist arrogant anzunehmen, dass Sie wissen, was eine Person zu erreichen versucht, wenn Sie nur die technische Frage dieser Person haben.

    – qonf

    14. September 2011 um 12:33 Uhr

1227090cookie-checkZu “wenn, wenn, wenn” oder zu “wenn, sonst wenn, sonst wenn, sonst” [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy