View Full Version : [JAVA] Scrittura codice in modo elegante
franksisca
26-06-2013, 11:14
c'è qualcosa di più elegante di questo???
calendarId = request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID) == null ? "all" : request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID);
banryu79
26-06-2013, 11:22
Se non è un problema usare variabili locali per aumentare la leggibilità allora io di solito preferisco fare così:
id = request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID);
calendarId = (id != null) ? id : "all";
wingman87
26-06-2013, 11:29
Concordo con banryu79. Altrimenti se hai molte istruzioni di quel tipo puoi crearti un metodo statico...
Per curiosità, in C# c'è questo:
calendarId = request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID) ?? "all";
http://msdn.microsoft.com/en-us/library/ms173224%28v=vs.80%29.aspx
Bellissimo secondo me, anche se spesso lavorando con stringhe finisco per non usarlo perché devo verificare anche che la stringa non sia vuota.
banryu79
26-06-2013, 11:36
Per curiosità, in C# c'è questo:
calendarId = request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID) ?? "all";
Bellissimo secondo me, anche se spesso lavorando con stringhe finisco per non usarlo perché devo verificare anche che la stringa non sia vuota.
In Java il cosidetto "Elvis operator" non c'è, ma la fortuna maggiore nell'usare Java come piattaforma è che la fuori ci sono un fottìo di linguaggi che compilano bytecode, ad esempio Kotlin (http://kotlin.jetbrains.org/) ;) e lui l'Elvis operator ce l'ha, oltre ad avere altri costrutti carini per assicurare la Null-safety (http://confluence.jetbrains.com/display/Kotlin/Null-safety).
franksisca
26-06-2013, 11:46
Se non è un problema usare variabili locali per aumentare la leggibilità allora io di solito preferisco fare così:
id = request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID);
calendarId = (id != null) ? id : "all";
non è un problema, ma la mia non è una necessità lessicale, ma una semplice curiosità
Concordo con banryu79. Altrimenti se hai molte istruzioni di quel tipo puoi crearti un metodo statico...
Per curiosità, in C# c'è questo:
calendarId = request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID) ?? "all";
http://msdn.microsoft.com/en-us/library/ms173224%28v=vs.80%29.aspx
Bellissimo secondo me, anche se spesso lavorando con stringhe finisco per non usarlo perché devo verificare anche che la stringa non sia vuota.
ecco, cercavo qualcosa di simile in java, che intuisco non ci sia.
anche io mi trovo con controllare stringhe non vuote o non nulle...il classico metodo nelle librerie di progetto "stringEmpity" :D :D :D
Dai un occhiata alla libreria guava di Google. C'è una classe che si chiama Optional che modella quello che vuoi fare. Crei un oggetto così:
Optional<String> id = Optional.of(request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID));
Quando devi leggere il valore:
id.or("all");
franksisca
26-06-2013, 11:57
Dai un occhiata alla libreria guava di Google. C'è una classe che si chiama Optional che modella quello che vuoi fare. Crei un oggetto così:
Optional<String> id = Optional.of(request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID));
Quando devi leggere il valore:
id.or("all");
interessante.
Comunque mi sembra di capire che "l'elvis operator" è stato implementato da java 1.7, quindi è utilizzabile in modo diretto
banryu79
26-06-2013, 11:58
Oppure si scrive lui una classe utility (oltre ad essere effettivamente utile, è anche un buon esercizio):
...
public class Option<T> {
public static <T> Option<T> of(T arg) {
return new Option<>(arg);
}
private final T value;
public Option(T value) {
this.value = value;
}
public boolean isEmpty() {
return value == null;
}
public boolean isDefined() {
return value != null;
}
public T getOr(T alt) {
return isEmpty() ? alt : value;
}
public T get() {
return value;
}
public boolean hasValue(T value) {
return isDefined() && get().equals(value);
}
@Override public String toString() {
return String.format("Option[%s]", get());
}
}
E quindi (come Vicius):
Option<String> id = Option.of(request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID));
calendarId = id.getOr("all");
banryu79
26-06-2013, 12:05
Comunque mi sembra di capire che "l'elvis operator" è stato implementato da java 1.7, quindi è utilizzabile in modo diretto
Come scusa?
Language Enhancements in Java 7 (http://docs.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html#javase7)
Direi di no ;)
franksisca
26-06-2013, 12:20
Oppure si scrive lui una classe utility (oltre ad essere effettivamente utile, è anche un buon esercizio):
...
public class Option<T> {
public static <T> Option<T> of(T arg) {
return new Option<>(arg);
}
private final T value;
public Option(T value) {
this.value = value;
}
public boolean isEmpty() {
return value == null;
}
public boolean isDefined() {
return value != null;
}
public T getOr(T alt) {
return isEmpty() ? alt : value;
}
public T get() {
return value;
}
public boolean hasValue(T value) {
return isDefined() && get().equals(value);
}
@Override public String toString() {
return String.format("Option[%s]", get());
}
}
E quindi (come Vicius):
Option<String> id = Option.of(request.getParameter(SoggettiConstant.SUBJECT_CALENDAR_ID));
calendarId = id.getOr("all");
non ho "bisogno" dell'esercizio :Prrr:
anche perchè già faccio qualcosa di simile..
Come scusa?
Language Enhancements in Java 7 (http://docs.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html#javase7)
Direi di no ;)
leggendo in giro sembrava di si, forse è qualche openpoint sulla jdk che avevano proposto e poi non implementato, magari lo implementeranno in java8 o magari no ;)
grazie ancora
banryu79
26-06-2013, 13:05
non ho "bisogno" dell'esercizio :Prrr:
Tutti ne abbiamo bisogno, e sempre :D
franksisca
26-06-2013, 14:20
Tutti ne abbiamo bisogno, e sempre :D
si, come tutti abbiamo bisogno di 48 ore al giorno :D :D :D
purtroppo sai meglio di me che i tempi lavorativi impediscono (con una cattiva progettazione e/o una cattiva analisi) di scrivere il codice come vorremmo. su un altro progetto ho potuto scrivermi un bella libreria personale che faceva qualcosa del genere, ma qui non ho potuta usarla per limiti applicativi
leggendo in giro sembrava di si, forse è qualche openpoint sulla jdk che avevano proposto e poi non implementato, magari lo implementeranno in java8 o magari no ;)
grazie ancora
Si erano stati proposti due nuovi operatori ?: e ?. ma sono stati rifiutati. Per quanto riguarda java non credo li vedremo mai. Se vuoi giocarci c'è sempre groovy che li ha implementati.
zanardi84
27-06-2013, 18:24
L'eleganza secondo me passa anche attraverso l'uso delle parentesi.
Personalmente trovo che la leggibilità sia molto migliore aprendo le graffe a capo in una nuova linea. Questo permette di identificare immediatamente i metodi, i blocchi e i cicli, sfruttando anche l'indentazione del codice, senza dover andare a caccia delle parentesi.
Mi piace anche rendere meno sintetico il codice esplicitando il più possibile per far assumere un significato univoco.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.