Java Backend: Ist diese Methode zu komplex?

Es gibt (leider) Optionals in Java und den ternären Operator ? :

den Safe navigation operator ?. gibt es zum Glück in Java nicht.
 
Hehe ich finde es schade, dass es ihn nicht gibt, und Optional als null-check-Ersatz finde ich auch unschön.

Ich meine in Java sieht man häufig solche Dinge:
if (person != null && person.getAddress() != null && person.getAddress().getStreet() != null)
und das hab ich schon "schlimmer" gesehen..

Also mit null-check-Ersatz meine ich dann sowas
if (Optional.of(person).map(Person::getAddress).map(Address::getSteet).isPresent())
 
  • Gefällt mir
Reaktionen: BeBur
tollertyp schrieb:
und das hab ich schon "schlimmer" gesehen
Das wäre wohl ähnlich zu dem hier:

Java:
    int getOrDefault(int[][] p, int r, int c, int d) {
        if (r >= 0 && c >= 0 && r < p.length && c < p[r].length && p[r][c] != -1) {
            return p[r][c];
        }
        return d;
    }

es ist aber "syntaktischer Zucker", denke ich.
 
ne, das meine ich überhaupt nicht.
tollertyp schrieb:
if (person != null && person.getAddress() != null && person.getAddress().getStreet() != null)
könnte halt einfach in
if (person?.getAdress()?.getStreet() != null)
geändert werden.
Und oftmals kann man sich die if-Anweisung auch komplett sparen, wenn man stattdessen einen "Ersatzwert" nehmen kann, wenn es um so etwas geht:
text.add("Straße: " + (person?.getAdresse()?.getStreet() ?? "unbekannt"))
 
... und für den Elvis-Operator gibt es die min- und max-Methoden.
 
Jo, ich auch, auch in C#.
Wobei ich mittlerweile ein C# eher der fan von der is {} varname syntax bin.

Also
C#:
if(input is {} person && person.Address is {} address)
{
    
}
oder via property matching
if(p is {Address: not null} address)
{
}
 
  • Gefällt mir
Reaktionen: tollertyp
tollertyp schrieb:
einen "Ersatzwert" nehmen kann, wenn es um so etwas geht:
text.add("Straße: " + (person?.getAdresse()?.getStreet() ?? "unbekannt"))
Sieht gut aus, aber das impliziert null in Person, Adresse oder Street und gleichzeitig keinen festen Default-Wert. Eigentlich stimmt dann etwas mit den Datentypen nicht. hmm
 
Properties ist halt was, was Java auch nicht kennt.

C# und Java sind sich ähnlich, aber oft auch komplett verschieden.

CyborgBeta schrieb:
aber das impliziert null in Person, Adresse oder Street und gleichzeitig keinen festen Default-Wert.
Die brauchen keinen Default-Wert, wenn die null sind, dann sind sie null und alles danach auch null - der Wert am Ende gilt ja für den gesamten Ausdruck.
 
  • Gefällt mir
Reaktionen: CyborgBeta
tollertyp schrieb:
ich stehe gerade auf dem Schlauch?
Der Elvis-Operator ist

The notation of the Elvis operator was inspired by the ternary conditional operator, ? :, since the Elvis operator expression A ?: B is approximately equivalent to the ternary conditional expression A ? A : B.

https://en.wikipedia.org/wiki/Elvis_operator

und der Safe navigation operator ?. ist etwas anderes.

Ich glaube, wir reden gerade alle aneinander vorbei.

Der SNO scheint, vorsichtig gesagt, sinnvoll zu sein. Aber anstatt a < b ? a : b kann ich auch Math.min(a, b) schreiben.
 
CyborgBeta schrieb:
und der Safe navigation operator ?. ist etwas anderes.
im C# Umfeld ist der null-conditional operator (den du als safe navigation operator bezeichnest) der Elvis Operator, weil null coalescing ?? ist und nicht ?:

In C# hat elvis nur ein Auge :D
 
  • Gefällt mir
Reaktionen: Simon#G und CyborgBeta
CyborgBeta schrieb:
Der SNO scheint, vorsichtig gesagt, sinnvoll zu sein. Aber anstatt a < b ? a : b kann ich auch Math.min(a, b) schreiben.
mir ist schon klar, was der Elvis-Operator ist. Und ja, dafür würde ich auch die min-Funktion nutzen, weil sie klarer sagt was das Ziel des Codes ist (Stichwort Clean Code, hat wie gesagt kaum was mit Sprachen und Sprachfeatures zu tun sondern eher "Denkweisen") und weniger Redundanz hat.
Aber was hat das damit zu tun?
und für den Elvis-Operator gibt es die min- und max-Methoden.
Das habe ich nicht verstanden. Also die min- und max-Methoden gibt es nicht für den Elvis-Operator, sondern um das Minimum oder das Maximum zu bestimmen.

Date antragsdatum = request.getAntragsdatum() != null ? request.getAntragsdatum() : new Date();
geht irgendwie nicht so richtig mit min/max...

Hier ist request.getAntragsdatum() redundant. Und genau deshalb finde ich so einen Ausdruck besser:
Date antragsdatum = request.getAntragsdatum() ?? new Date();

Warum mich die Redundanz stört? Naja, Code wird gerne kopiert...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: BeBur und Simon#G
CyborgBeta schrieb:
Das würde einen Nachmittag füllen.
Ich meine damit: Gib den Funktionen in deinem Beispiel die passenden sprechenden Namen und dann hast du schon quasi dein refactoring.

CyborgBeta schrieb:
Schau dir rein funktionale Programmiersprachen an.
Selbst wenn das relevant wäre, dein Code ist zu guten Teilen imperativ

tollertyp schrieb:
if (Optional.of(person).map(Person::getAddress).map(Address::getSteet).isPresent())
Mein Ruby-Herz schlägt höher bei solchen Zeilen :D. Wobei das in Ruby auch ohne explizites if geht.

tollertyp schrieb:
Date antragsdatum = request.getAntragsdatum() != null ? request.getAntragsdatum() : new Date();
geht irgendwie nicht so richtig mit min/max...
Ruby würde dir bestimmt gefallen. Da gibt es Dinge wie a ||= b für "weise a an b zu, falls a null/false ist". Sehe aber gerade, C# hat das wohl auch.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: tollertyp
Tornhoof schrieb:
Wie wär's mal mit Kommentaren?
Code sollte so geschrieben werden, das er selbsterklaerend ist. Wenn Kommentare benoetigt werden, um Code verstaendlich zu machen, ist in den meisten Faellen ein schlechtes Zeichen.
 
  • Gefällt mir
Reaktionen: Micke, maxpayne80 und tollertyp
@SheepShaver: Sehe ich auch so.
Vor allem "liebe" ich solche Sachen

Code:
// check if product is not whitelisted
if (rules.stream().noneMatch(p -> StringUtils.equalsIgnoreCase(p.getProductState(), ProductStates.WHITE) {
  return ProductStates.GREY;
}

Kommentare sollten sich auf das "Warum" konzentrieren, und nur in Ausnahmefällen auf das "Was". Letzteres ist, wie du sagst, ein Zeichen für schlechten Code. Der Code sollte selbst ausdrücken, was er macht. Und dafür ist der Eröffnungspost ein gutes Beispiel, wie man es nicht machen sollte.
Schön finde ich, dass dann Argumente kommen wie "die zyklomatische Komplexität ist doch in Ordnung".
Das ist wie wenn man sagt "Meine Ausarbeitung ist doch gut, die Rechtschreibprüfung hat keine Fehler gefunden...".

Statische Code-Analysen können schlechten Code aufzeigen, aber sie können nicht attestieren, dass Code gut ist.

Analysen mit KI könnten das schon eher.
 
  • Gefällt mir
Reaktionen: BeBur
Sehe ich nicht so. Wenn man für die drei for-Schleifen eigene Methoden mit sinnvollen Namen einführen würde, dann sind die Methodennamen die Dokumentation bzw. die erklärenden Kommentare, was jeweils geschieht, imho.

Und na ja, wie lang eine Methode sein darf, ist fast subjektiv. Ich stimme aber zu, dass "Anfänger" (oder Teamler) das nicht so machen sollten. Denn der Code soll ja für andere verständlich und wartbar sein und so.
 
tollertyp schrieb:
siehst du nicht so?
Dass hier zwingend Kommentare nötig wären, wenn es Methoden für die Schleifen gäbe. Oder liege ich da falsch?
 
Zurück
Oben