Nur Ästetik oder mehr?

Status
Nicht offen für weitere Antworten.

voidee

Mitglied
Hi,

mal wieder ein philospohisches Problem. Oft hat man - naja, wenigstens bei mir ist es so - dass:

Code:
boolean aFunction() {
 
  boolean l_return = false;

  if ( <Bedingung>) {
    // einzeiliger oder zweizeiliger Code
    return l_return;
  }
  else {
    // hier folgen jetzt viele, viele Zeilen Code
    ...
  }
  
  return l_return;
} // -- eof aFunction() -- //

soll ich den else-Block weglassen, ist ja eh obsolet. Oder macht der else-Block irgendeinen Sinn? Oder gibt es für den einen oder anderen Weg das zu kodieren noch weitere Argumente?

Ich bin da hin- und hergerissen. Logisch ist es ein if-else Konstrukt. Programmtechnisch müsste man es aber so nicht umsetzen. Ode soll die "Lange" Bedingung nach vorne, und die "kleinere" in den else-Block. Dann aber, finde ich, übersieht man das else eher mal.

Gruß
Tom
 

mahe

Aktives Mitglied
Weil ich ein sehr fauler Mensch bin, lass ich es immer weg.

Ich finde es auch sehr aufgeräumt wenn zuerst Abbruchbedingungen stehen, möglicherweise Exceptions die geworfen werden und danach die eigentliche Funktionalität.
 

Tobias

Top Contributor
Na, wenn ich doch vorher feststellen kann, das ich den ganzen Aufwand nicht treiben muss, weil ich einfach abbrechen kann ... (mit einer Exception oder einem Standardwert)
 

didjitalist

Bekanntes Mitglied
wenn sehr viele zeilen code folgen (mehr als auf eine 'seite' passt), dann halte ich es aber für schöner, wenn der eigentliche code in eine extra funktion ausgelagert wird, die frei ist von prüfung von vorbedingungen.
 

Marco13

Top Contributor
Ja, ist wohl hauptsächlich Geschmacksache. IMHO ist hauptsächlich wichtig, dass das ganze richtig kommentiert ist - einschließlich solcher "Kleinigkeiten" wie mindestens einer Leerzeile zwischen dem "early return" und dem Rest... da braucht man ggf. nichtmal die Variable für den Returnwert
Code:
/**
 * This function does [this-and-that] if [conditions]
 * otherwise, it does [whatever]
 *
 * @return ...
 * @throws ...
 */
boolean doSomething()
{
    // First check the [conditions]. If they are NOT met, do [whatever]
    if (!conditionsAreMet())
    {
        doWhatever();
        return false;
    }

    // Now, all [conditions] are verified. Do [this-and-that]
    doThisAndThat();
    return true;
}
 

Landei

Top Contributor
Ich halte es zwar nicht ganz durch, versuche aber, die Anzahl der returns zu minimieren, auch wenn man ein paar Zeilen mehr braucht:
Code:
boolean doSomething() {
    boolean result = false;
    // First check the [conditions]. If they are NOT met, do [whatever]
    if (!conditionsAreMet())
    {
        doWhatever();
        result = false;
    } else {

      // Now, all [conditions] are verified. Do [this-and-that]
      doThisAndThat();
       result = true; 
    }
    return result;
}
Der Grund ist, dass man sonst versehentlich etwas hinter die if-Anweisung schreibt, das in *allen* Fällen abgearbeitet werden muss, und übersieht, dass weiter oben schon ein "Ausgang" ist. Natürlich ist das nicht hübsch, aber man vermeidet Fehler und bekommt einen sanften Schubs, zu langen Methoden zwei Untermethoden (für den Test und die eigentliche Arbeit) zu spendieren.
 

hdi

Top Contributor
Ich finde das mit mehreren Methoden nicht gut. Wenn es SEHR viel Code ist, steckt man das
in eine eigene Klasse. Aber nicht eine Klasse zumüllen mit tausend Teil-Methoden, man sieht da auf den
ersten Blick gar nicht mehr, welche Funktionalität diese Klasse eigentlich anbietet.

Wenn man ordentlich kommentiert und den Code für das Auge sauber trennt (zwischen Abbruch-Bedingung
und dem auszuführenden Code), dann passt das und ist mmN viel besser als wenn man jetzt hin und her
springen muss wenn man die Logik einer Methode nachvollziehen will.

Natürlich sind Methoden die öfters gebraucht werden (zB Hilfsmethoden) eine Ausnahme.
 

didjitalist

Bekanntes Mitglied
sobald etwas mehr als einmal benötigt wird, kann man sie bedenkenlos in eine methode auslagern. dabei sollte man auch nicht davor zurückschrecken, 'simple' berechnungen, die lediglich in einer zeile mit ein paar variablen jonglieren, einfach mal in eine methode auszulagern.

viele methoden werden erst dann unübersichtlich, wenn sie schlechte bezeichner haben, oder mehr erledigen, als nötig wäre.

wenn man funktionalität immer schön auslagert und die methoden sehr kurz hält, hat man auch automatisch den vorteil spendiert bekommen, zu erkennen, ab wann sich neue klassen lohnen. es mag auf den ersten blick verlockend erscheinen, einfach alles in 500 zeilen runterzuschreiben, aber solcher code wird irgendwann - meist schneller, als man denkt - schlecht wartbar.

daher code ruhig extrem modular halten.
 

Landei

Top Contributor
Ganz nebenbei: Mir ist immer noch schleierhaft, warum Java das erlaubt:
Code:
public void f() {
   class F{
      F(){
          System.out.println("lokale Klasse"); 
      }
   }
   new F();
}
und das nicht:
Code:
public void f() {
    void g() {
          System.out.println("Hurra!"); 
    }
    g(); g(); g();
}
Letzteres wäre viel nützlicher, oder habt ihr schonmal eine lokale Klasse gebraucht? Mit lokalen Methoden ließen sich größere Methoden hübsch sauber zerlegen, ohne den Namensraum vollzumüllen...
 

Illuvatar

Top Contributor
Naja mit Closures in Java 7 (so sie denn kommen) kannst du vermutlich auch sowas bauen. Schön find ich allerdings nichts davon.

Lokale Klassen hab ich übrigens schon hin und wieder verwendet, an Stellen wo ich normalerweise eine anonyme Klasse verwendet hätte, aber die Klasse mehrfach verwenden musste.

In letzter Zeit versuche ich allerdings, sowas zu vermeiden - außer in irgendwelchen kurz dahingehackten Sächelchen.
 

Landei

Top Contributor
Closures werden allen Anschein nach nicht mit Java7 kommen, obwohl es ja bereits funktionierende Implementierungen für verschiedene Vorschläge gibt.

Damit gerät Java endgültig ins Hintertreffen - die restlichen Änderungen sind im Verhältnis zu Closures so wichtig wie varargs verglichen mit Generics, nämlich nahe null.

Die Sprache hat durchaus noch Schwung, sicher: Ungefähr so, wie ein heranstürmendes Nashorn, dass man im vollen Lauf abgeschossen hat. Zeit, sich neue Gefilde zu suchen...

Übrigens: Lokale Klassen habe ich bisher nur einmal verwendet, nämlich als Key für eine HashMap. Und auch da hätte ich sie nicht gebraucht, wenn Java eine ordentliche Tupel-Implementierung mitbringen würde.
 

byte

Top Contributor
Landei hat gesagt.:
Ich halte es zwar nicht ganz durch, versuche aber, die Anzahl der returns zu minimieren, auch wenn man ein paar Zeilen mehr braucht:
Code:
boolean doSomething() {
    boolean result = false;
    // First check the [conditions]. If they are NOT met, do [whatever]
    if (!conditionsAreMet())
    {
        doWhatever();
        result = false;
    } else {

      // Now, all [conditions] are verified. Do [this-and-that]
      doThisAndThat();
       result = true; 
    }
    return result;
}
Solchen Code mag ich gar nicht, weil er spätere schwerer lesbar ist. Bei einem direkten Return weiss ich genau, wann der Workflow der Methode endet. Bei Deiner Variante muss ich immer die gesamte Methode lesen. Das dauert nicht nur länger, sondern ist häufig auch anstrengender, denn bei der Fehlersuche interessiert häufig nur ein ganz bestimmter Fall.

So schreibe ich es:
Code:
boolean doSomething() {
    if (!conditionsAreMet()) {
        doWhatever();
        return false;
    }

    doThisAndThat();
    return true;
}
Das Else ist unnötig. Weniger Blöcke = besser lesbar imo.

PS: Die Kommentare oben sind imo teilweise unnötig. First check the conditions sagt mir nichts anderes, als der Code eine Zeile darunter.
 

Landei

Top Contributor
Bei solchen einfachen Beispielen mag es noch gehen, aber ich bin schon ein paarmal auf die Nase gefallen, weil ich ein return weiter oben in der Methode übersehen habe - insbesondere dann, wenn ich in fremden Code rumwurschteln musste. Natürlich sieht meine Lösung bei einem 5-Zeilen-Beispiel übertrieben aus, aber wenn du mal in zweihundert-Zeilen-Methoden (die oft so geschrieben sind, dass sie sich auch ja nicht zerlegen lassen) mit zehn returns arbeiten durftest, kommst du bestimmt auch ins Grübeln...
 

byte

Top Contributor
Muss mich auch häufig mit solchen Monolithen rumärgern. Aber grade da finde ich direkte Returns schöner. Wenn ich eine Methode lese und sie returnt in einem Zweig, dann brauche ich die restlichen 500 Zeilen gar nicht mehr angucken. Wenn da nur ein result = blub; steht, dann muss ich alles lesen, bis irgendwann mal das return result; steht. Das finde ich extrem lästig und zeitraubend.
 

tfa

Top Contributor
Bei Eclipse zumindest kann man dem Schlüsselwort "return" einen eigenen Stil im Syntax-Highlighter zuweisen. Wenn du es fett und leuchtend rot machst, wirst du es auch in (zweifelhaften) 200-Zeilen-Monster nicht mehr übersehen.
 

Marco13

Top Contributor
byto hat gesagt.:
PS: Die Kommentare oben sind imo teilweise unnötig. First check the conditions sagt mir nichts anderes, als der Code eine Zeile darunter.

Das waren natürlich "Platzhalter" (genauso wie die Sachen in den [Klammern]) - und zwar für Erläuterungen, die über das hinausgehen, was schon als code dasteht :wink:
 

voidee

Mitglied
didjitalist hat gesagt.:
wenn sehr viele zeilen code folgen (mehr als auf eine 'seite' passt), dann halte ich es aber für schöner, wenn der eigentliche code in eine extra funktion ausgelagert wird, die frei ist von prüfung von vorbedingungen.
da hab ich eine andere Philospie: wenn vor der eigentlichen Funktionsausführung auf fehlerhafte Parameter oder aus klasseninternen Gründen Abbruchkonstellationen bestehen, dann gehört das meines Erachtens auch in diese Funktion.
Wenn ich mir, deiner Idee folgend, irgendwann später die Funktion mal nähers betrachte, werde ich feststellen, dass sie potenziell Buggy ist, weil bestimmte Konstellationen nicht beachtet sind. Dass dies eventuell in einer vorgelagerten Funktion erfolgt, kann ich dann nicht sehen (und will ehrlich gesagt auch nicht allen Funktionen nachjagen, die eventuell diese reine funktionale Funktion aufrufen).

byto hat gesagt.:
Wenn ich eine Methode lese und sie returnt in einem Zweig, dann brauche ich die restlichen 500 Zeilen gar nicht mehr angucken. Wenn da nur ein result = blub; steht, dann muss ich alles lesen, bis irgendwann mal das return result; steht. Das finde ich extrem lästig und zeitraubend.
Dem kann ich mich eigentlich anschliessen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
G @PostConstruct Annotation nicht mehr gültig ? Allgemeine Java-Themen 7
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
A Best Practice Wie viele Referenzen machen Sinn? Weniger ist mehr? Allgemeine Java-Themen 1
X JNA funktioniert nicht mehr Allgemeine Java-Themen 4
G Eclipse Java findet MySQL Driver nach export nicht mehr Allgemeine Java-Themen 2
H IDEA IntelliJ Java Mail funktioniert nach Export nicht mehr! Allgemeine Java-Themen 1
T Plötzlich wird package nicht mehr gefunden Allgemeine Java-Themen 3
D kein Versand von Mails mit Anhang mehr Allgemeine Java-Themen 2
N jre1.8.0_161 mehr CPU Allgemeine Java-Themen 0
E GUI.jfm lässt sich nicht mehr öffnen Allgemeine Java-Themen 1
Joker4632 Klassen Buffered Reader liest die Leerzeichen am Zeilen Ende nicht mehr Allgemeine Java-Themen 2
M JDK installieren MD5 SHA-1 Signatur in JAR nicht mehr vertrauenswürdig Allgemeine Java-Themen 3
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
I nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden Allgemeine Java-Themen 1
Thallius Bekomme keine Exception mit Stacktrace mehr. Was habe ich getan? Allgemeine Java-Themen 13
Tacofan Button nicht mehr anklickbar machen Allgemeine Java-Themen 8
H Alter Java-Programm läuft nicht mehr. Laut strace fehlt libpthread.so.0 Allgemeine Java-Themen 3
B Bild aus Jar kann nach Export nicht mehr gefunden werden Allgemeine Java-Themen 13
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
S Wenn mehr als die Hälfte Großgeschrieben ist. Allgemeine Java-Themen 2
D mouseWheelMoved => erst reagieren, wenn für 1s das Mausrad nicht mehr benutzt wurde Allgemeine Java-Themen 4
T Nach Java Update: Jar Datein öffnen sich nicht mehr mit doppelklick Allgemeine Java-Themen 3
X Logging Messages - mehr Details? Allgemeine Java-Themen 4
Thallius Wie mache ich eine Java App mit Icon startbar die mehr Heap Speicher braucht? Allgemeine Java-Themen 3
M Eclipse Keine Ausgabe mehr bei Fehlern Allgemeine Java-Themen 3
F E-Mail aus JAVA senden nach Umstellung auf Netbean 7.4 mit Java 7U45 nicht mehr möglich Allgemeine Java-Themen 4
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
F Eclipse Eclipse kompiliert nicht mehr die aktuellen Dateien Allgemeine Java-Themen 2
F Nach Export wird PDF Datei nicht mehr gefunden Allgemeine Java-Themen 0
L iText PDF Form-Felder werden nach Bearbeitung mit iText nicht mehr richtig erkannt. Allgemeine Java-Themen 2
W Regulärer Ausdruck für 0 oder mehr Blanks Allgemeine Java-Themen 8
G .jar Dateien lassen sich nicht mehr öffnen Allgemeine Java-Themen 2
B JFreeChart -> TimeSeries-Plot -> mehr y-Achsen Allgemeine Java-Themen 2
GUI-Programmer Mehr als Properties Allgemeine Java-Themen 6
E Anwendung nutzt plötzlich nicht mehr 100% CPU Allgemeine Java-Themen 2
J Java programm lässt sich in win7 nach linux install nicht mehr ausführen Allgemeine Java-Themen 18
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Java funktioniert nicht mehr Allgemeine Java-Themen 21
J Eclipse Elipse gibt mir keine Vorschläge mehr :( Allgemeine Java-Themen 6
N Java geht nicht mehr zu löschen Allgemeine Java-Themen 5
B Berechnung eines sinh abbrechen, wenn 16. Nachkommastelle sich nicht mehr ändert Allgemeine Java-Themen 7
J Java Pfad nicht mehr in Path Variablen??? Allgemeine Java-Themen 2
P Java Anwendung mehr Speicher zur Verfügung stellen?? Allgemeine Java-Themen 3
W 2D-Grafik nach getthumbnail läst sich Quellbild nicht mehr löschen Allgemeine Java-Themen 3
R DocumentListener: Programm Reagiert nicht mehr Allgemeine Java-Themen 2
V "Java(TM) Platform SE binary funktioniert nicht mehr" Allgemeine Java-Themen 5
C Hilfe! Mein Java mag nich mehr ganz... Allgemeine Java-Themen 11
5 Javaw funktioniert nicht mehr Allgemeine Java-Themen 5
Guybrush Threepwood iText de facto nicht mehr verwendbar Allgemeine Java-Themen 15
woezelmann Object nach Deserialisierung nicht mehr gleich Allgemeine Java-Themen 13
D binäres ODER oder mehr Konstanten? Allgemeine Java-Themen 10
Y Auszuführendem Projekt mehr Speicherplatz zuweisen Allgemeine Java-Themen 3
S Jar Datei mit mehr Speicher starten Allgemeine Java-Themen 2
S JAR Datei, mehr Speicher bereitstellen Allgemeine Java-Themen 5
T "Java lernen" in etwas mehr als 8 Tagen Allgemeine Java-Themen 13
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
P not enough space for object heap - Trotz mehr RAM? Allgemeine Java-Themen 6
S HWPF Problem: doc lässt sich nach Bearbeitung nicht mehr lesen Allgemeine Java-Themen 6
M umgebung funktioniert nicht mehr Allgemeine Java-Themen 14
G Java Tool startet von heute auf morgen nicht mehr? Allgemeine Java-Themen 7
P OutOfMemoryError beim XML erstellen bzw parsen, mehr RAM? Allgemeine Java-Themen 4
G Mehr als drei Nullen nach dem Punkt? Allgemeine Java-Themen 8
J Java reagiert nicht mehr auf die Tastatur Allgemeine Java-Themen 2
G Deserialisierung funktioniert n. Refaktorisierung nicht mehr Allgemeine Java-Themen 10
G WindowClosingAdappter und mehr Allgemeine Java-Themen 4
M Klasse Desktop geht nicht mehr (EXCEPTION_ACCESS_VIOLATION) Allgemeine Java-Themen 9
C kann nicht mehr markieren ->TreeCellRenderer Allgemeine Java-Themen 6
S Rechner formatiert - nichts geht mehr. Allgemeine Java-Themen 2
M JLabels löschen (sollen nicht mehr gezeichnet werden) Allgemeine Java-Themen 10
T Eclipse will nicht mehr :( Allgemeine Java-Themen 2
M Java funktioniert nicht mehr Allgemeine Java-Themen 9
J Eingabeaufforderung funkrioniert nicht mehr! Allgemeine Java-Themen 5
I Weiß nicht mehr weiter! Bitte helft mir! Allgemeine Java-Themen 5
S Java und mehr als ein Prozessor Allgemeine Java-Themen 6
G "mehr" undo Allgemeine Java-Themen 8
M Java funktioniert jetzt nicht mehr Allgemeine Java-Themen 6
B Der Heap Space, ich weiß nicht mehr weiter! Allgemeine Java-Themen 15
G DBzugriff funktioniert nach 'Build Main Project' nicht mehr Allgemeine Java-Themen 2
O Prefixes in Java alt und nicht mehr notwendig oder nützlich Allgemeine Java-Themen 18
F Shell-Programme per Runtime.exec() starten und mehr? Allgemeine Java-Themen 4
N Servlets: Formulardaten auslesen (POST) - mehr Informationen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben