Java int == garnichts?

Ich habe selbst das Problem lösen können und möchte euch mein Ergebnis auch nicht vorenthalten :)

Lösung: equals

// Zähler für die Artikelnummern
do{

// Zähler um die Eingaben zu zählen
i++;
artikel=IO.readString("Bitte geben Sie ihre " +i +". Artikelnummer ein : ");

if(artikel.equals("510")){

anzahl=IO.readInt("Bitte geben Sie die Anzahl ein: ");

if(anzahl==0){

a1++;
}

else{

a1 = a1+anzahl;
}
}

else if(artikel.equals("520")){

anzahl=IO.readInt("Bitte geben Sie die Anzahl ein: ");

if(anzahl==0){

a2++;
}

else{

a2 = a2+anzahl;
}
}

else if(artikel.equals("530")){

anzahl=IO.readInt("Bitte geben Sie die Anzahl ein: ");

if(anzahl==0){

a3++;
}

else{

a3 = a3+anzahl;
}
}

else if(artikel.equals("540")){

anzahl=IO.readInt("Bitte geben Sie die Anzahl ein: ");

if(anzahl==0){

a4++;
}

else{

a4 = a4+anzahl;
}
}

// Bei einer ungültigen Eingabe
else if(!(artikel.equals(""))){

artikel="510";

System.out.println("Bitte geben Sie einen gültigen Wert ein");

// Zähler wird zurückgesetzt
i--;
}

// Bei einem leeren Feld wird die Eingabe beendet
}while(artikel.equals("510") || artikel.equals("520") || artikel.equals("530") || artikel.equals("540"));

Ist einwenig aufwendiger geworden :)
 
Das hier:
Code:
if(anzahl==0){
  a1++;
}
else {
 a1 = a1+anzahl;
}

kannst du so verkürzen:

Code:
  a1 += anzahl == 0 ? 1 : anzahl;
 
@Banthor in den meisten Style Guides die ich für Java kenne ist der ternäre Operator verpönt bis verboten, eben weil er zwar schön kurz, aber nicht sonderlich gut lesbar ist.

@Kai-133 für einen Anfänger ist die Lösung zwar ok, man sieht aber auch schön den "Lernprozess" am Code und wie er immer mehr "erweitert" wurde ohne dabei mal einen Schritt zurück zu machen und das Ganze nochmal zu betrachten (aka Quick&Dirty :p )

Was auffällt sind die vielen (unnötigen) Wiederholungen von Code und if/elses und die "dreckige" Lösung zum abfangen der Fehler (keine/falsche Eingabe).Mal als kleiner Denkanstoß:

Code:
int i = 0;
boolean bearbeitungAbbrechen = false;
do
{
 i++;
 artikel=IO.readString("Bitte geben Sie ihre " +i +". Artikelnummer ein : ");
  if (!artikel.equals(""))
  {
   if(isArtikelnummerGueltig(artikel))
   {
      int anzahl = IO.readInt("Bitte geben Sie die Anzahl für Artikel " + artikel + " ein" );
      [I]//zum speichern der Anzahl der Artikel würde ich mir mal die Klasse HashMap angucken[/I]
    }
    else
    {
      bearbeitungAbbrechen = true;
    }
  }
}
while (!bearbeitungAbbrechen);

//primitive Methode zum prüfen der Artikelnummer
[I]//wenn man beim speichern auf HashMap setzt, geht das viel komfortabler[/I]
private boolean isArtikelnummerGueltig (String artikelnummer)
{
  if (artikelnummer.equals("510") || artikelnummer.equals("520") || ... )
  {
    return true;
  }
  else
  {
    return false;
  }
}
 
Zuletzt bearbeitet:
Ich würde zwar auch niemanden in seinem Stil "korrigieren" indem ich sage "benutz doch hier und da mal den ternären Operator", aber von schlechtem Stil ist das doch meilenweit entfernt.
Ich bin davon überzeugt, dass jeder auch nur halbwegs fortgeschrittene Programmierer einen Ausdruck mit ternärem Operator im Halbschlaf versteht. Da find ich sogar die Verwendung eines prefix operators schwerer verständlich, da eher seltener zu finden als ein ternärer Operator und daher ungewohnter.
Bedenklich wird so ein Ausdruck nur wenn er so lang ist, dass man nach rechts scrollen muss.
 
Tumbleweed schrieb:
...
Ich bin davon überzeugt, dass jeder auch nur halbwegs fortgeschrittene Programmierer einen Ausdruck mit ternärem Operator im Halbschlaf versteht. Da find ich sogar die Verwendung eines prefix operators schwerer verständlich, da eher seltener zu finden als ein ternärer Operator und daher ungewohnter.
Bedenklich wird so ein Ausdruck nur wenn er so lang ist, dass man nach rechts scrollen muss.

Du nimmst mir die Worte aus dem Mund. Ich sehe kein Problem in der Verwendung ternärer Operatoren, wenn sie, wie in diesem Fall, sehr kurz und bündig ausfallen. Es besteht so keine Gefahr ihn nicht verstehen zu können.

Es gibt oft gute und schlechte Gründe etwas zu tun oder zu lassen. Es gilt diese gegeneinander abzuwägen und nicht stur einem Styleguide zu folgen. Die Frage ist nur, wann man als Entwickler die nötige Reife erlangt solche Entscheidungen zu treffen. Für Anfänger ist es daher nicht verkehrt sich an allgemein anerkannte Styleguides zu halten.
 
@Banthor
Code:
a1 += Math.max(anzahl, 1);
finde ich im Übrigen sogar noch schöner, da hier klarer ist, dass das größere von beiden addiert werden soll...
 
Das hört sich ja ganz toll an, aber wie liest man solch einen code?

Code:
a1 += anzahl == 0 ? 1 : anzahl;

Gruß Kai
 
Links vom Fragezeichen ist die Bedingung (also das was bei if in der Klammer steht), rechts daneben ist die Anweisung für den Fall, dass die Bedingung true liefert und nach dem Doppelpunkt hast du quasi den else Bereich.
Denke dir am besten noch Klammen um den ganzen Ausdruck mit ternärem Operator.
 
Code:
a1 += (anzahl == 0)
      ? 1 
      : anzahl;

Diese Schreibweise ist vielleicht ein bisschen lesbarer, als nur dieser Einzeiler.
 
ich reg mich jedesmal auf wenn jemand sowas "kryptisches" einbaut anstatt es wenigstens ohne {} mit if else zu lösen
weil wenn mans schon auf 3 zeilen ausbreiten muss damit ein unerfahrener programmierer es lesen kann, sollte man imho direkt
Code:
if (anzahl == 0)
    a1++;
else
    a1 += anzahl;
schreiben
 
Zuletzt bearbeitet:
Das sehe ich auch so, aber selbst damit haben viele Probleme. Soll ja Leute geben die auf die geschwungenen Klammern bei if- und else-Einzeilern bestehen. :D Das ist aber schon ein Bereich wo es schwierig wird mit was anderem als Geschmack zu argumentieren. Bei dem ternären Operator hingegen verschwindet durch den Umbruch meines Erachtens tatsächlich der Sinn ihn zu benutzen. Dann kann man wirklich direkt if und else nehmen.
 
Naja, ist halt geschmackssache.
Ich persönlich finde das if-else Konstrukt unübersichtlicher.
 
Es ist alles eine Sache des Geschmacks und vor allem der "Sehgewohnheit". z.B. ob man die öffnenden geschweiften Klammern auf der if-Zeile schreibt oder ob man sie in die nächste Zeile alleine stehen läßt. Ich habe mich schon über beide Varianten anfänglich aufgeregt und mich anschließend daran gewöhnt - es ist schlicht eine Sache der Gewohnheit.

Bei if-Anweisung gibt es ein gutes Argument immer geschweifte Klammer zu nutzen. Läßt man die Klammern weg, weil nur eine Anweisung folgt, dann gibt es die Gefahr eines späteren Flüchtigkeitsfehlers, wenn man einen weiteren Befehl in den Block reinnehmen will und dann die Klammern vergißt - in der Praxis schon öft gesehen.

Ich glaube wir driften hier allerdings langsam vom Thema ab.
 
Der ternäre Operator macht nur Sinn, wenn man alles in eine Zeile packt. Beim aufteilen auf 3 Zeilen kann man wie schon gesagt wurde auch gleich if-else nehmen.
 
Also wenn ich das richtig verstehe, wurde aus der Frage "int == garnichts?" eine Diskussion ob nun 6 Zeichen ( if else ) besser seien als 2 Zeichen ( ?: ) ? :D

Ich schließ mich Whiz-zarD an und wiederhole einfach nur "nö".

Ach ich vergaß die Klammer bei if else, somit stehts dann bei 8 gegen 2
 
Zuletzt bearbeitet:
Rossibaer schrieb:
Also wenn ich das richtig verstehe, wurde aus der Frage "int == garnichts?" eine Diskussion ob nun 6 Zeichen ( if else ) besser seien als 2 Zeichen ( ?: ) ? :D
...

es ging nicht darum was "besser" ist. Ich wollte lediglich darauf hinweisen dass der ternäre Operator meiner Erfahrung nach nicht sehr gebräuchlich ist. Einfach weil er für die meisten die ihn nicht regelmäßig verwenden nicht intuitiv lesbar ist (im Gegensatz zu if und else).
Ich hab in den letzten Jahren in 5+ großen Softwareprojekten in diversen Firmen mitgearbeitet und überall war er strikt untersagt (sogar meist das Weglassen von Klammern bei einzeiligen if Anweisungen ;) )

Heutzutage kommt es ja nicht mehr auf die eine Zeile mehr oder weniger an (zumindest nicht im Java Bereich) sondern ausschließlich auf die Wartbarkeit/Lesbarkeit des Sourcecodes.

In banthors Fall ist es sogar noch komplizierter, weil man wissen muss was stärker bindet. Das += oder das ==

Wenn man das Ding jeden Tag benutzt und kleinere Sachen programmiert, ist es sicher nicht schlechter oder besser als alles andere.
 
FunnyName schrieb:
Heutzutage kommt es ja nicht mehr auf die eine Zeile mehr oder weniger an (zumindest nicht im Java Bereich) sondern ausschließlich auf die Wartbarkeit/Lesbarkeit des Sourcecodes.

Es kam noch nie drauf an, dass ein Code wenig Zeilen besitzt.
Ein Newline Befehl ist verbraucht genauso viel Speicherplatz, wie ein Leerzeichen.
Ob ich nun drei neue Zeilen einfüge, oder drei Leerzeichen schreibe, spielt für die Dateigröße des Sourcecodes keine Rolle.

Der ternäre Operator kann aber durchaus nützlich sein.
Ich persönlich verwende ihn immer dort, wenn ein Rückgabe-wert zwei unterschiedliche Werte haben kann. Hier ein kleines Beispiel:

Code:
return (z < 0)
       ? Constants.CLOCKWISE
       : Constants.COUNTERCLOCKWISE;

wenn ich das mit if-else mache, würde es so aussehen
Code:
if (z < 0)
  return Constants.CLOCKWISE;
else
  return Constants.COUNTERCLOCKWISE;
Was zur Folge hätte, dass ich zwei Mal ein return habe, was ich persönlich nicht so elegant finde.
Oder ich müsste eine weitere Variable nehmen, was dann so aussieht:

Code:
if (z < 0)
  result = Constants.CLOCKWISE;
else
  result = Constants.COUNTERCLOCKWISE;

return result;
Was ist aber auch nicht wirklich elegant finde, da ich zusätzlich Speicher benötige, nur damit ich ein return einsparen kann.

Es ist also eine Sache des Geschmacks, ob man den ternären Operator verwendet, oder nicht. Ich finde, der hat schon seine daseinsberechtigung, aber nicht dafür, um Zeilen zu sparen, sondern um grad solche Fälle eleganter zu lösen.
 
Zurück
Oben