Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Diskussion um Anfängerfehler == true / == false
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

Diskussion um Anfängerfehler == true / == false

beantworten | zitieren | melden

[EDIT] Abgetrennt von Checkbox-Array | Boxen prüfen u.ä.[/EDIT]

Hallo sh4rk,

nein, im Gegenteil, == true sollte man immer weglassen: Anfängerfehler == true / == false

herbivore
private Nachricht | Beiträge des Benutzers
sh4rk
myCSharp.de - Member



Dabei seit:
Beiträge: 45

beantworten | zitieren | melden

danke für die info...

mfg hannes
private Nachricht | Beiträge des Benutzers
zero
myCSharp.de - Member



Dabei seit:
Beiträge: 43

Sorry herbivore, aber ...

beantworten | zitieren | melden

... das ist nicht ganz wahr, was du da erzählst. Bedauerlicherweise ist dieser Thread (Anfängerfehler == true / == false ) gesperrt und man lässt die Benutzer mit fehlerhaftem/halbem Wissen herumlaufen. Deshalb antworte ich hier auf diese Falschaussage:
Zitat
Wer '== true' benutzt, hat m.E. noch nicht vollständig verstanden, was eine boolsche Variable ist.

Wer '== true' im Vergleich nicht benutzt, hat das Konzept des expliziten Vergleichs - wie er durch "if" eingeleitet wird - nicht verstanden, könnte ich im Gegenzug behaupten. Dabei handelt es sich mitnichten um eine Tautologie, sondern bewirkt neben einer - zweifellos marginal und deshalb bestenfalls als tertiäres Argument tauglich - beschleunigten Kompilierung auch, dass die Autoren es dem Leser - bewusst oder unbewusst - einfacher machen, nachvollziehen zu können, was sie beabsichtigen.

Dementsprechend hinkt dein Beispiel auch gewaltig:
Zitat
... wie bei jeder Verwendung von Integer-Variablen ein '+ 0' anzuhängen.

Abgesehen davon, dass ich von meinen Jungs im Sinne der Lesbarkeit sehr wohl erwarte, dass sie auch '+ 0' addieren, wenn es - beispielsweise in loops - sinnvoll für die Darstellung ist, wäre es zumindest im Kontext der hiesigen Unternehmensrichtlinien sogar ein Kündigungsgrund, vorsätzlich wider die Lesbarkeit zu verkürzen. Dies gilt insbesondere, da Quellcode heute vor allem anderen auf Wiederverwendbarkeit geschrieben und optimiert wird.

Tatsache ist, dass der Quelltext mit der Formulierung if (x==true); lesbarer wird. Die Abfrage if (x); hingegen bietet viel Interpretationsspielraum, den man erst mehr oder weniger aufwändig schließen muss. Aus der Perspektive des Qualitätsmanagements ist es weitaus leichter "!" zu vergessen/übersehen, als "==false" versehentlich falsch einzugeben.
Zitat
fBed == false kann und sollte man ersetzen durch !fBed also die Negation.

Konsequent, dass ich auch daran etwas auszusetzen habe: Das "!"-Zeichen ist, insbesondere beim Debugging extrem schnell überlesen; während die Phrase '== false' nicht nur exakt das gleiche aussagt, sondern zudem auch die Negation ("!") intern vom Compiler nach '== false' rückübersetzt wird.

Es mag vielleicht schicker aussehen und bei der Freundin oder anderen Unbedarften sicher auch toll ankommen. Praktiker und Profis schätzen es jedoch i.d.R., wenn man sich nur dort auf den impliziten "== true/== false"-Vergleich reduziert, wo es die Lesbarkeit nicht beeinträchtigt.


Preisfrage: Wo ist die Fehleranfälligkeit wohl größer?

a) bool o = ((!((!((!((!x) ? true : false)) ? true : false)) ? true : false)) ? true : false);

oder

b) bool o = ((((((((x == true) ? true : false) == true) ? true : false) == true) ? true : false) == true) ? true : false);
und was unterscheidet die snippets oben von denen unten?

a) bool o = ((!((((!((!x) ? true : false)) ? true : false)) ? true : false)) ? true : false);

oder

b) bool o = ((((((((x == true) ? true : false) == true) ? true : false) == false) ? true : false) == true) ? true : false);
Und wenn es schon bei so kleinen Code-Fragmenten möglich ist, den Programmierer für mehrere Minuten "außer Gefecht" zu setzen, wie wahrscheinlich ist es, dass du den Fehler in tausenden von Zeilen findest?

Wenn du also auf die Verkürzungsoption hinweist, dann solltest du das nicht ganz so sehr von oben herab ("Anfängerfehler") machen, sondern berücksichtigen und festhalten, dass es - auch und gerade - im Lebenszyklus von oo-Software das Qualitätsmerkmal Wiederverwendbarkeit gibt.
private Nachricht | Beiträge des Benutzers
Syrinx
myCSharp.de - Member



Dabei seit:
Beiträge: 95

beantworten | zitieren | melden

Hi zero,

es mag teilweise schon stimmen was du da schreibst. Allerdings hat herbivore auch Recht.

Man kann das aber auch nicht so pauschalisieren, sondern muss das eher im Einzelfall betrachten, wie es der einzelne handhabt und wie er es besser lesen kann.

Sicher ist es am Anfang leichter == true / false zu schreiben, aber im Laufe der Jahre wird man sicher für eine der beiden Varianten entscheiden.

Und zu deinem Beispiel muss ich auch was sagen:

Wann kommen wirklich so komplexe Formulierungen vor???

Weil wenn du so programmierst, dann steht das in Widerspruch mit dem von dir Bschriebenem.

Ich würde das dann halt einfach auf mehrere If - Else Statements aufteilen, dann haste auch wieder Lesbarkeit erreicht und da kannste dann auch wieder die kurze Schreibweise reinklatschen ...


so far
Syrinx
Das größte Misstrauensvotum gegen Gott ist ein Blitzableiter auf dem Kirchturm!
private Nachricht | Beiträge des Benutzers
zero
myCSharp.de - Member



Dabei seit:
Beiträge: 43

Zweifellos hat Herbivore auch Recht.

beantworten | zitieren | melden

Es _lässt_ sich verkürzen. Machen sollte man es allerdings nur ausgesprochen selten und _nur_ dort machen, wo es die Lesbarkeit eindeutig nicht beeinträchtigt. Und selbst das nunmehr simple Beispiel oben sollte dir zeigen, dass es schon bei relativ trivialen Dingen wesentlich einfacher zu lesen - und KORRIGIEREN - ist, wenn man den Vergleich explizit macht.
Zitat
Wann kommen wirklich so komplexe Formulierungen vor???
... solche praktisch nie.
Was hingegen aber immer wieder vorkommt, sind tausende Zeilen Quellcode, die einen, zwei oder drei Fehler beinhalten. Und die Suche darin gestaltet sich nicht weniger schwierig, als die Suche in dieser "komplexen" Formulierung. Es ist also nur eine symbolische Erhöhung des Schwierigkeitsgrades, wie er auftritt, wenn du dir 20 lokale und 45 globale Variablen und deren Zustände wenigstens annähernd merken musst.
Zitat
Ich würde das dann halt einfach auf mehrere If - Else Statements aufteilen...

Du meinst, abgesehen davon, dass ich dich dann nach Hause jagen würde? Glaubst du wirklich, es wird lesbarer, wenn du es auseinander ziehst?



bool x = true;

if (x)
  x = !x;
if (!x)
  x = !x;
if (x)
  x = !x;

// Ich erwarte, dass x hier wahr ist.
// Wo ist der Fehler?

// Ist es nicht lesbarer - und damit leichter korrigierbar -, wenn ich schreibe:

bool x = true;

if (x == true)
  x = false;
if (x == false)
  x = true;
if (x == true)
  x = false;

private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo zero,

ich verstehe nicht, was du mit einem Beispiel wie

bool o = ((!((!((!((!x) ? true : false)) ? true : false)) ? true : false)) ? true : false);
zeigen willst, außer das du damit genau die von mir bemängelten Tatutologien benutzt und damit genau den von mir bemängelten Fehler machst. Dass dein Code damit "unlesbar" wird, zeigt mir, dass ich Recht habe, wenn ich sage, dass man Tautologien weglassen soll.

Die Anweisung sollte man entsprechend des Tipps verkürzen zu:

bool o = x;

Ich bleibe vollständig bei meinen Aussagen in Anfängerfehler == true / == false, mal abgesehen davon, dass es in C echt falsch wäre, wenn man == true schreiben würde (egal auf welchen Wert ungleich 0 true definiert wäre).

herbivore
private Nachricht | Beiträge des Benutzers
Thomas B
myCSharp.de - Member



Dabei seit:
Beiträge: 223

beantworten | zitieren | melden

Hiho,

Zero du schreibst, dass du bei deinen Jungs darauf bestehst, dass sie ein "+ 0" schreiben, aber wann sollte man denn +0 schreiben, kannst du da ein konkretes Beispiel geben?

Gruß Thomas
private Nachricht | Beiträge des Benutzers
frisch
myCSharp.de - Member

Avatar #avatar-1724.gif


Dabei seit:
Beiträge: 2.082
Herkunft: Coburg / Oberfranken

beantworten | zitieren | melden

Hallo zero,

tut mir leid aber ich kann deine Ansicht nicht teilen.

Dein Beispiel ist mir auch völlig unlogisch, wer so eine Abfrage erstellt sollte sich imho nochmal überlegen, ob er wirklich Programmierer werden will/kann.
Zitat
Wer '== true' im Vergleich nicht benutzt, hat das Konzept des expliziten Vergleichs - wie er durch "if" eingeleitet wird - nicht verstanden
Lässt sich so schlecht sagen oder nicht? Wer bei boolschen Variablen trotzdem noch == true benutzt kann genauso gut

if((myIntVar == 5) == true) {
}
schreiben.

Ich sehe keinen Punkt, bei dem ich herbivores Beitrag bemängeln kann.
Zitat
Machen sollte man es allerdings nur ausgesprochen selten und _nur_ dort machen, wo es die Lesbarkeit eindeutig nicht beeinträchtigt.
Ich denke mal es ist Geschmakssache.

Ich habe 2 Jahre lang mit "== true" gearbeitet, bis mich jemand in die if-Abfrage richtig eingewiesen hat und was im Kopf der if-Abfrage eigentlich passiert. (War vorher auf einer Informatikschule )
Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de
private Nachricht | Beiträge des Benutzers
Robert G
myCSharp.de - Member

Avatar #avatar-1907.png


Dabei seit:
Beiträge: 347
Herkunft: München

beantworten | zitieren | melden

Wenn ich sowas sehe:
Zitat
fBed == false
...ist mir auch vollkommen klar, warum du mit Händen und Würgen versuchst deutklich zu machen, dass es sich um einen bool'schen Ausdruck handelt.

Du benutzt en Substantiv für ein Feld[1], das einen Boolean enthält.
Woher zum Geier sollte der Leser auch wissen, dass es ein Boolean ist?
Booleans sollten immer so benannt werden, dass ein klarer Ja/Nein-Status erkennbar ist.
Bleistiftsweise: IsBed, IsSomething, AllowDingsBums, UseXyz, Active,...

Jetzt stellst du einfach eine Bedingung anhand dieses Status:

if(AllowDeleteXyz)
  DeleteXyz();
else
  throw new DingsBumsNotAllowedException(blabla);
Das Ganze mag sich für mich als alten Pascalhasen vllt nicht so hübsch lesen wie es mit Wörtern statt Sonderzeichen möglich wäre...
Jedoch ist ein ganz klarer Ablauf erkennbar, OHNE dass der Leser wissen muss ob die Bedingung einen Boolean enthält.
Es könnte genauso gut irgendein Typ sein, der implizit in einen Boolean gewandelt wird.
Vernünftige Benennung und korrektes Benutzen von Sprach features sollte es absolut unnötig für den Leser machen, zu wissen welche Typen benutzt werden um zu verstehen was in einem lokalen Schnipsel Code passiert.
Das ist nur nötig um globale Auswirkungen zu verstehen, aber die Lesbarkeit wird IMHO dadurch bestimmt wie schnell man erfassen kann was lokal passiert.



[1]falls ich ein delphi-like fXXX hier richtig deute
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo Robert G,

hm, mir kommt es so vor, als würde da was durcheinanderer gehen. Wenn meinst du denn mit 'du'?

Das Beispiel fBed == false ist ja von mir. Aber es ist als Negativbeispiel gemeint. Ich meine nämlich, dass klar ist, dass es um einen boolschen Ausdruck geht und versuche gerade nicht mit "hängen und würgen" darauf hinzuweisen, genau im Gegenteil.

herbivore
private Nachricht | Beiträge des Benutzers
Qwald
myCSharp.de - Member



Dabei seit:
Beiträge: 214

beantworten | zitieren | melden

Hallo,
Zitat
Original von frisch

Ich sehe keinen Punkt, bei dem ich herbivores Beitrag bemängeln kann.
Also wenn viele Programmierer mit verschiedenen Prog. Sprachen zusammenarbeiten, sollte man sich schon überlegen, dass jeder if(x== true) schreibt.


Denn bei if(x) wäre es für einen C++-Programmierer nicht klar, dass x unbedingt eine bool Variable sein muss, für ihn kann es z.B. auch eine Int-Variable sein.

Das gleiche, nur andersrum:

if(x)
return 100/x;
else
//Error, keine Division durch 0


Für einen C# Programmierer recht ungewohnt, in C wäre dieser Ausdruck aber kein Problem (und ich sah schon viele Programme/Scripts die soetwas verwendet haben, vorallem in fast jedem PHP Script sieht man so etwas in der Art). Aber zur besseren Lesbarkeit sollte man sich auf:

if(x > 0)

einigen, aber dann auch auf if(x == true) //Sofern x eine bool Variable ist

Meine Meinung dazu


Edit:
PS: Ich verwende == false immer dann, wenn ich dies besonders deutlich hervorheben möchte, also dieses == false so extrem wichtig ist, dass man es auf keinen Fall überlesen darf.
Sonst benutze ich aber auch meistens if(x) bzw. if(!x)
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo Qwald,

gerade in C und C++ wäre es aber in vielen Fällen falsch, == true zu schreiben! Damit bricht aber leider deine Argumentation in sich zusammen.

herbivore
private Nachricht | Beiträge des Benutzers
Robert G
myCSharp.de - Member

Avatar #avatar-1907.png


Dabei seit:
Beiträge: 347
Herkunft: München

beantworten | zitieren | melden

Zitat
Original von herbivore
Hallo Robert G,

hm, mir kommt es so vor, als würde da was durcheinanderer gehen. Wenn meinst du denn mit 'du'?
Ups, sorry.
Aber ich hatte mir seine Variablen angesehen und hatte es schon geschrieben.
Danach bin ich nur wild durch den Thread gescrollt und habe mir die erste var gekrallt von der ich dachte sie wäre seine. Ging wohl nach hinten los.

Aber um mich selbst ein wenig in allgem. verständliche Sprache zu übersetzen: ( )

Wenn man einen Namen eines bool'schen Ausdruckes hat, der ganz klar seinen Jupp/Nope-Status klarmacht, ist ein "if" nur ein halbwegs natürlich lesbar Satzanfang dafür.

Wenn ich DeleteXyz ausführen darf, rufe DeleteXyz auf, andernfalls wirf' dem User was ins Gesicht.
Auf CSharpish sieht das nunmal so aus:

if(AllowDeleteXyz)
  DeleteXyz();
else
  throw new DingsBumsNotAllowedException(blabla);


@ QWald, ob du es willst oder nicht: you made my point!
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

true-Vergleich ist nicht meine Sache. Die genannten Beispiel gehen m.E. an der Praxis vorbei.

Bei der Negation finde ich es aber überlegenswert anstelle des "!" den false-Vergleich zu verwenden. Viel besser gefällt mir in Pascal "not", aber leider hat sich C# an der Stelle zu viel von C abgeschaut.

Das schmale "!" ist leider viel zu leicht zu übersehen.
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

beantworten | zitieren | melden

Da muss ich svenson allerdings Recht geben. Ich entwickle seit Jahren in Pasal/Delphi und da gefällt mir ein "not" ebenfalls besser als ein "!". Liegt aber wahrscheinlich nur an der überschaubarkeit, bzw. das es leßbarer ist. Ein

if (Blub <> 0) and (not GehNachHause) then
finde ich schöner zu lesen als

if (Blub != 0 && !GehNachHause)

Aber das ist reine Geschmackssache und man gewöhnt sich irgendwann an alles. Allerdings kloppe ich meinen Mitarbeitern jedesmal auf die Finger wenn ich konstrukte wie

if (Bla > 0) then X := False else X := True;
oder (sehr beliebt)

if (X) then X := False else X := True;
Könnt ich jedesmal explodieren, weil das überflüssiger Source ist, und alles unübersichtlicher gestaltet.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
zero
myCSharp.de - Member



Dabei seit:
Beiträge: 43

Massenreplik

beantworten | zitieren | melden

@frisch
Zitat
Dein Beispiel ist mir auch völlig unlogisch, wer so eine Abfrage erstellt sollte sich imho nochmal überlegen, ob er wirklich Programmierer werden will/kann.
Wenn das deine einzige Sorge ist, kann ich dich beruhigen: Ich bin seit fast 20 Jahren im Geschäft. Ich habe also quasi die Anfänge des OOP miterlebt und arbeite seit fast 5 Jahren ausschließlich mit meinem Lieblingsspielzeug ".NET". Allerdings, das muss ich wohl gestehen, "programmiere" ich nur noch selten. Zu wenig Zeit. Mein Job ist Projektmanagement und Qualitätssicherung. ... Und was man da erlebt, lässt einen frühzeitig altern.
Zitat
Wer bei boolschen Variablen trotzdem noch == true benutzt kann genauso gut

if((myIntVar == 5) == true) {
}
schreiben.
Sicher "kann" man das. Aber erhöht es auch die Lesbarkeit, frisch? Oder fällt es nicht vielmehr in die Kategorie "Nicht alles was hinkt, ist auch ein Vergleich"?

Wie wäre es mit


if (myIntVar == 5) {;}
// entspricht: if (myBoolVar == true) {;}

// vs. 

if((myIntVar == 5) == true) {;}

// 
// und
// 

if (myIntVar != 5) {;}
// entspricht: if (myBoolVar == false) {;}

// vs.

if (!(myIntVar == 5)) {;}
Zitat
Ich habe 2 Jahre lang mit "== true" gearbeitet, bis mich jemand in die if-Abfrage richtig eingewiesen hat und was im Kopf der if-Abfrage eigentlich passiert.
Würdest du mich bitte aufklären, was im Kopf der if-Abfrage eigentlich passiert?
Zitat
(War vorher auf einer Informatikschule
Beeindruckend...

@Thomas B
Zitat
Zero du schreibst, dass du bei deinen Jungs darauf bestehst, dass sie ein "+ 0" schreiben, aber wann sollte man denn +0 schreiben, kannst du da ein konkretes Beispiel geben?
Ad hoc? Ehrlich gesagt: kein konkretes (Und das, obwohl ich eben rasch durch die aktuellen Leistungen meiner Leute gewühlt habe. ). Ich kann aber eines konstruieren, wenn es dir reicht. (Offensichtlich haben einige hier ein arges Problem mit analytischer Betrachtung, ich hoffe, du gehörst nicht dazu.)


int x = 5;
for (int i= 0;i≤10;i++) {
  y += x;
  x--;
} 
Natürlich könnte man hier mit Hilfe einer - mehr oder minder - komplexen Abfrage verhindern, "0" zu addieren. Jedoch ginge der Sinn verloren: Die Lesbarkeit würde dramatisch vermindert werden, weil der Autor verlangen würde, dass der Leser begreift, warum er hier die "0", die durchaus einen "sinnlosen" und überflüssigen Durchlauf erzeugt, da gebe ich herbivore absolut Recht, ausgrenzt. Das Beispiel müsste also - korrekterweise - erweitert werden, wobei allerdings der Schwierigkeitsgrad und damit die Fehlerwahrscheinlichkeit auf allen Seiten, also beim Autor, beim Lektor und beim Leser, dramatisch ansteigt:


int x = 5;
for (int i= 0;i≤10;i++) {
  if(x!=0) 
   y += x;
  x--;
} 

@herbivore
Zitat
... verstehe nicht, was du mit einem Beispiel wie [Beispiel] zeigen willst, außer das du damit genau die von mir bemängelten Tatutologien benutzt ...
Abgesehen davon, dass du entweder das falsche Beispiel kopiert hast oder den Begriff "Tautologie" missinterpretierst, ist dies ein abstrakt-analytisches Exempel für komplexen Quellcode. Dabei wäre es egal, ob ich hunderte Zeilen Quellcode hineinkopiert hätte, oder ob ich ein einzelnes statement bis zur Unkenntlichkeit verklausuliere. Das Resultat ist das Gleiche: Das Lesen von Quellcode ist einfach; das VERSTEHEN hingegen eine ganz andere Sache. Erst recht, wenn man das Zeug nicht selbst - oder schon in grauer Vorzeit - geschrieben hat.

Ich habe keine Ahnung, wie es bei euch gehandhabt wird, bei allen Unternehmen, für die ich arbeite, liegt die Messmarke bei Qualität des Quellcodes und Geschwindigkeit in der Entwicklung. Immer mit dem Augenmerk auf Wiederverwendbarkeit. Demzufolge ergibt sich auch die Notwendigkeit, lesbaren Code zu produzieren. Im Idealfall so lesbar, dass die änderungswürdigen Stellen in kürzester Zeit ins Auge springen.

Und da ich - aus eigener, leidiger Erfahrung - weiß, dass du deinen Community-Mitgliedern nur die halbe Wahrheit erzählst und dir damit anmaßt (vgl. "Anfängerfehler"), über ihre Zukunft ein ultimatives Urteil zu fällen, habe ich dich darauf hingewiesen, dass du zwar durchaus nicht völlig, aber doch quasi "zu 50%" falsch liegst.

Diese Klausel ("==true/==false") ist nicht nur erlaubt; sie wird sogar zwangsweise vom Compiler erzeugt, wenn du sie weglässt. (Ebenso, wie die Standardeigenschaft im VB zwangsweise hinzugefügt wird, wenn die Codiersau sie weglässt.) Das Resultat ist also einfach nur unübersichtlicherer Quellcode.

// Quellcode:
private void Test()
{
	bool test= true;
	if (test) {;}
	if (test == true){;}
}

// PE-Code:
.method private hidebysig instance void  Test() cil managed
{
  // Code size       24 (0x18)
  .maxstack  2
  .locals init ([0] bool test,
           [1] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  ldc.i4.1
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0004:  ldc.i4.0
  IL_0005:  ceq
  IL_0007:  stloc.1
  IL_0008:  ldloc.1
  IL_0009:  brtrue.s   IL_000d
  IL_000b:  nop
  IL_000c:  nop
  IL_000d:  ldloc.0
  IL_000e:  ldc.i4.0
  IL_000f:  ceq
  IL_0011:  stloc.1
  IL_0012:  ldloc.1
  IL_0013:  brtrue.s   IL_0017
  IL_0015:  nop
  IL_0016:  nop
  IL_0017:  ret
} 

Und? Schon einen Unterschied gefunden, herbivore?

Am Ende stehen wir also vor der Frage: "Lässt du sie aus Faulheit weg oder machst du das, um deine Freunde zu beeindrucken?". Denn die Lesbarkeit eines vieltausend Zeilen langen Scripts erhöhst du nicht einmal im Ansatz, wenn du wahlfrei verkürzt.

Aus dem gleichen Grund ist übrigens die berühmt-berüchtigte Standardeigenschaft von VB nicht nach C# übernommen worden: Was in VB keinen Fehler erzeugt, macht in C# - mit voller Absicht - erhebliche Schwierigkeiten, denn eine derartige Verkürzung vermindert die Lesbarkeit dramatisch.

Die - thematisch identische - Debatte bricht übrigens immer wieder aus, wenn es um die Frage der Kommentare im Quellcode geht. "Keine Zeit zum Kommentieren" ist ein Killerargument, das zumindest eines garantiert: Sobald das QM hinter solchen Leuten steht, haben diese schon bald seeeeeehr viel Zeit, nachzuholen, wozu sie angeblich keine Zeit hatten...
Und du willst dir doch wohl nicht ernsthaft anmaßen, in diesem Kontext Gott spielen zu wollen, oder?!
private Nachricht | Beiträge des Benutzers
frisch
myCSharp.de - Member

Avatar #avatar-1724.gif


Dabei seit:
Beiträge: 2.082
Herkunft: Coburg / Oberfranken

beantworten | zitieren | melden

Zitat
Würdest du mich bitte aufklären, was im Kopf der if-Abfrage eigentlich passiert?
Es wird ein Vergleich gemacht, wenn dieser Vergleich wahr ergibt, wird der Inhalt des Vergleichs durchgeführt.

Richtig?
Zitat
Ich bin seit fast 20 Jahren im Geschäft.
Ahja, meine Kollegen warnen mich vor solchen Leuten... Ich sag jetzt mal nicht warum
Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de
private Nachricht | Beiträge des Benutzers
zero
myCSharp.de - Member



Dabei seit:
Beiträge: 43

Du Schelm. :)

beantworten | zitieren | melden

Zitat
Es wird ein Vergleich gemacht, wenn dieser Vergleich wahr ergibt, wird der Inhalt des Vergleichs durchgeführt.
Na sowas. Dann habe ich gleich noch eine Frage: Wenn ein Vergleich gemacht wird, womit wird denn verglichen, frisch?
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat
Original von zero
Diese Klausel ("==true/==false") ist nicht nur erlaubt; sie wird sogar zwangsweise vom Compiler erzeugt, wenn du sie weglässt. (Ebenso, wie die Standardeigenschaft im VB zwangsweise hinzugefügt wird, wenn die Codiersau sie weglässt.) Das Resultat ist also einfach nur unübersichtlicherer Quellcode.

Die Argumentation kann ich nicht nachvollziehen. " == true" ist Quellcode, das andere MSIL. Die Tatsache, dass auf MSIL-Ebene das Pendant zu "== true" generiert wird, sagt überhaupt nichts über die Verständlichkeit des Quell-Codes aus.

90% aller Bedingungen bestehen nur aus einem Ausdruck und warum if(a == true) lesbarer sein soll als if(a) leuchtet mir nicht ein. Für mich ist genau das Gegenteil richtig.

Aber vielleicht lieferst du uns ja noch ein einleuchtendes Beispiel jenseits völlig akademischer Klammerorgien und Schachtelungen bedingter Ausrücke von der Tiefe des Mariannengrabens.
private Nachricht | Beiträge des Benutzers
frisch
myCSharp.de - Member

Avatar #avatar-1724.gif


Dabei seit:
Beiträge: 2.082
Herkunft: Coburg / Oberfranken

beantworten | zitieren | melden

Pfft...
Zitat
Wenn ein Vergleich gemacht wird, womit wird denn verglichen, frisch?
Eingangsvariable 1 mit Eingangsvariable 2 = Ergebnis. Das Ergebnis ergibt sich aus den beiden Variablen, je nachdem welcher Operator verwendet wird.

Anders ausgedrückt:
Im if-Kopf steht eine Bedingung, wenn diese Bedingung zutrifft, wird die Anweisung im Block ausgeführt.
Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo zero,
Zitat
"Lässt du sie aus Faulheit weg oder machst du das, um deine Freunde zu beeindrucken?"
immerhin schon mal 100 Gummipunkte für Polemik. Das ist so ungefähr auf der Ebene, wenn ich fragen würde, ob bei dir dein Nick Programm ist. :-)

Aber um mal inhaltlich zu werden, weil Polemik für mich immer ein Zeichen ist, dass man auf der inhaltlichen Ebene nicht die passenden Argumente hat.

Dein CIL-Beispiel stützt gerade meine These, weil das == true wegoptimiert wird, es ist nämlich kein Gleichheitsoperator und keine Konstante true zu finden, sondern nur die Vergleichsoperation brtrue.s, die entscheidet, ob der boolsche Ausdruck wahr (ich schreibe extra wahr und nicht true) ist.
Zitat
Wenn ein Vergleich gemacht wird, womit wird denn verglichen, frisch?
Es wird eben nicht auf == true verglichen, sondern ob der boolsche Ausdruck wahr ist. Das ist ja genau der Verständnisunterschied, der meiner Argumentation zu Grunde liegt.
Zitat
Abgesehen davon, dass du entweder das falsche Beispiel kopiert hast oder den Begriff "Tautologie" missinterpretierst,
Ich habe das Beispiel kopiert, dass ich kopieren wollte und das ich als das richtige ansehe, um meinen Gedanken zu untermauern. Der Begriff Tatuologie hat mehrere Bedeutungen (in der Logik steht er für eine Aussage, die immer wahr ist). true ist also eine Tautologie. Ich meinte den Begriff hier aber in dem Sinne, einer überflüssigen/redundanten Information, weil man eben == true weglassen kann und sollte.
Zitat
ist dies ein abstrakt-analytisches Exempel für komplexen Quellcode.
Es ist in meinen Augen ein Besispiel für künstlich aufgeblähten, redundaten und damit tautologischen Quellcode, der durch seine Unübersichtlichkeit meine Meinung stützt, dass unnötige Tautologien zum Nutzen der Lesbarkeit weggelassen werden sollten.

Über Lesbarkeit kann man aber streiten und du bist da wohl eben gegenteiliger Auffassung.

Mein Hauptargument liegt aber, in dem Verständnis, was eine boolsche Variable bzw. eine boolsche Bedingung ist. Das habe ich ja in der FAQ auch schon ausgebreitet.

Noch zu deinem + 0 Beispiel. Das ist für mich ein weiteres Beispiel für eine völlig am Ziel vorbeigehende Argumentation. Wir reden ja über == true, also den Gleichheitsvergleich mit einem Literal, genauso wie + 0 eine Addition mit einem Literals wäre. In deinem Beispiel lässt du dich aber über die Addition mit einer Variablen aus, die in machen Fällen den Wert Null annehmen kann. Das eine hat mit dem anderen überhaupt nichts zu tun.

herbivore
private Nachricht | Beiträge des Benutzers
zero
myCSharp.de - Member



Dabei seit:
Beiträge: 43

*lol

beantworten | zitieren | melden

Zumindest im einzigen insistierten Punkt sind wir uns offensichtlich endlich einig.
Zitat
Über Lesbarkeit kann man aber streiten und du bist da wohl eben gegenteiliger Auffassung.
Genau das war mein Eingangsstatement. Und genau das war meine Aussage während der gesamten Debatte. Die Behauptung "Anfängerfehler" ist demzufolge - bei höflichster Auslegung - bestenfalls die halbe Wahrheit. Richtiger wäre, dass es sich dabei um eine ABSOLUT SUBJEKTIVEN KRITERIEN UNTERLIEGENDE Auslegung handelt, über die jeder seinen Projektbedingungen entsprechend entscheiden muss und kann. Und das solltest du, wenn du dich wirklich deinen Community-Mitgliedern verpflichtet fühlst, zukünftig berücksichtigen.

Schade nur, dass es so lange dauerte...

Anyhow, danke an alle Diskussionsteilnehmer für die interessanten Einsichten in ihre Meinungen.
private Nachricht | Beiträge des Benutzers
Robert G
myCSharp.de - Member

Avatar #avatar-1907.png


Dabei seit:
Beiträge: 347
Herkunft: München

beantworten | zitieren | melden

Geht es nur mir so, oder haben noch andere gerade Wostok 1 vor dem geistigen Auge.
An Board Gagarin und Ptolemäus: Selbst nachdem sie die Erde einmal umrundet haben, will Ptolemäus immer noch nicht einsehen, dass die Erde keine Scheibe ist.

Traurig sowas...
private Nachricht | Beiträge des Benutzers
frisch
myCSharp.de - Member

Avatar #avatar-1724.gif


Dabei seit:
Beiträge: 2.082
Herkunft: Coburg / Oberfranken

beantworten | zitieren | melden

Was jetzt is meine Erkärung für if soweit richtig oder nicht? Ich möchte ja schließlich nicht mein Leben lang als unsicherer Mensch was das angeht umherirren
Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo zero,
Zitat
Zumindest im einzigen insistierten Punkt sind wir uns offensichtlich endlich einig.
An dem Punkt sind wir uns einig, aber wir sind uns nicht einig, dass das der einzig intressierende Punkt ist.
Zitat
Richtiger wäre, dass es sich dabei um eine ABSOLUT SUBJEKTIVEN KRITERIEN UNTERLIEGENDE Auslegung handelt, über die jeder seinen Projektbedingungen entsprechend entscheiden muss und kann.
Nein, das ist aus meiner Sicht unzutreffend.
Zitat
Und das solltest du, wenn du dich wirklich deinen Community-Mitgliedern verpflichtet fühlst, zukünftig berücksichtigen.
Da wir bei der Voraussetzung nicht konform gehen, ist für mich die Schlussfolgerung auch falsch. Mal abgesehen von der unterschwelligen Unterstellung, die ich entscheiden zurückweise und abgesehen davon, dass es sich bei mycharp.de nicht um "meine" Community handelt. Ich bin weder Betreiber, noch Leiter der Community.

Gerade Anfänger brauchen vielfach eine klare Linie und klare Aussagen. Deshalb ist der Beitrag entsprechend formuliert. Und dazu stehe ich und darin sehe ich meine Verpflichtung.

herbivore
private Nachricht | Beiträge des Benutzers
zero
myCSharp.de - Member



Dabei seit:
Beiträge: 43

...und ich sag noch so "Hääääääääääää"?

beantworten | zitieren | melden

Zitat
Gerade Anfänger brauchen vielfach eine klare Linie und klare Aussagen.
Und das ist für dich Grund genug, ihnen deine Meinung aufzudiktieren und sie im Unklaren darüber zu lassen, dass es immer mehr Firmen gibt, die extremen Wert auf Wiederverwendbarkeit und Wartbarkeit legen? ... Statt der Schilderung der tatsächlichen Gegebenheiten (meinetwegen auch mit einer Empfehlung, auch wenn diese dafür sorgen würde, dass alle, die ihr folgen, in nur wenigen der Unternehmen, die mir geläufig sind, eine Anstellung finden würden) einfach nur ein subjektives Diktat? ... Interessant.
Zitat
abgesehen davon, dass es sich bei mycharp.de nicht um "meine" Community handelt. Ich bin weder Betreiber, noch Leiter der Community.

Du bist Moderator dieses Forums, richtig? Damit bist du, ob es dir passt oder nicht, sowas wie ein Halbgott. GERADE für Anfänger.
Zitat
Nein, das ist aus meiner Sicht unzutreffend.
herbivore belieben zu scherzen, oder in welche Kategorie soll ich die folgenden Aussagen einnorden?
Zitat
Es wird eben nicht auf == true verglichen, sondern ob der boolsche Ausdruck wahr ist.
Mit anderen Worten: Es wird nicht auf 'true' verglichen, sondern auf 'wahr' geprüft. ... Ah ja...
Zitat
(Paraphrase) Wir sind uns einig, dass es eine subjektive Frage der Lesbarkeit ist, aber es ist unzutreffend, dass es eine subjektive Auslegung der Projektbedingungen ist.

PS: Kann man hier den Autor in die Zitate aufnehmen?
private Nachricht | Beiträge des Benutzers
zero
myCSharp.de - Member



Dabei seit:
Beiträge: 43

beantworten | zitieren | melden

@frisch
Zitat
Was jetzt is meine Erkärung für if soweit richtig oder nicht?
Sorry, dich habe ich vergessen...
Zitat
Eingangsvariable 1 mit Eingangsvariable 2 = Ergebnis. Das Ergebnis ergibt sich aus den beiden Variablen, ...
Okay, das habe ich verstanden, glaube ich. ... Allerdings frage ich mich, wo bei

if (x){;}
die Eingangsvariable 2 geblieben ist, wenn wir annehmen, dass x die Eingangsvariable 1 darstellt. ... Kannst du mir das bitte sagen?
private Nachricht | Beiträge des Benutzers
purestrain
myCSharp.de - Member

Avatar #avatar-1973.png


Dabei seit:
Beiträge: 89

beantworten | zitieren | melden


if (a > 1000)
{
  fUeberlauf = true;
}
else 
{
  fUeberlauf = false;
}

if (someThingNastyHappend == false)
{
  blubbern();
}


fUeberlauf = a > 1000;
if (!someThingNastyHappend)
  blubbern();

Anfaengerfehler wuerde ich das auch nicht nennen, und deshalb den Titel aendern. Ich halte erstere Variante uebersichtlicher, und benutze auch die == false schreibweise, da sie mehr ins Auge faellt.

Dazu koennte auch locker noch gesagt werden, Anfaengerfehler sind brackets vor einzeiligen Statements => nichts verstanden, oder sind brackets aus uebersichtsgruenden vorhanden? Wobei ich die brackets auch weglasse.

just my 2 cents
private Nachricht | Beiträge des Benutzers
Robert G
myCSharp.de - Member

Avatar #avatar-1907.png


Dabei seit:
Beiträge: 347
Herkunft: München

beantworten | zitieren | melden

Zitat
Original von zero
dass es immer mehr Firmen gibt, die extremen Wert auf Wiederverwendbarkeit und Wartbarkeit legen?
Und wenn du jetzt auch noch Lesbarkeit dazu packst hast du mich komplett verloren.
C# mag einiges sein, aber wenn es um Lesbarkeit geht, dürfte C# ein Witz gegenüber Pascal sein. C# ist schnell zu tippen, right. Aber lesbar und wartbar?


btw: Ich habe absolut kein Problem damit C# lesen zu können, aber als wirklich hübsch und lesbar kann ich C# nun wirklich nicht bezeichnen.
private Nachricht | Beiträge des Benutzers
frisch
myCSharp.de - Member

Avatar #avatar-1724.gif


Dabei seit:
Beiträge: 2.082
Herkunft: Coburg / Oberfranken

beantworten | zitieren | melden

Zitat
die Eingangsvariable 2 geblieben ist, wenn wir annehmen, dass x die Eingangsvariable 1 darstellt. ... Kannst du mir das bitte sagen?
x ist in diesem Fall gleich das Ergebnis.
Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de
private Nachricht | Beiträge des Benutzers