Simone,
1)
L'operatore "?" di kotiln è un if a tutti gli effetti. In java corrisponde
a:
final Logger log2 = log.ifDebug();
if (log2 != null) {
log2.debug("bla bla" + " bla");
}
Per cui si, si evita la concatenazione delle stringhe
2)
Giusta osservazione, non evito il possibile errore di scrivere
*log.ifDebug()?.info("Blah")*.
Si può fare, ma al costo di instanziare un nuovo oggetto tutte le volte che
si logga.
La libreria kotlin va modificata così (non scrivo tutti i metodi per farla
breve):
package fluentlogger
import org.slf4j.Logger
class TraceLogger(private val log: Logger) {
fun trace(line: String) {
log.trace(line)
}
}
class InfoLogger(private val log: Logger) {
fun info(line: String) {
log.info(line)
}
}
fun Logger.ifTrace(): TraceLogger? = if(this.isTraceEnabled)
TraceLogger(this) else null
fun Logger.ifInfo(): InfoLogger? = if(this.isInfoEnabled)
InfoLogger(this) else null
Alessio
On Wed, Jan 9, 2019 at 8:17 AM Simone Bordet [email protected]
[it-torino-java-jug] <[email protected]> wrote:
>
>
> Ciao,
>
> On Wed, Jan 9, 2019 at 7:47 AM Alessio Santacroce
> [email protected] [it-torino-java-jug]
> <[email protected]> wrote:
> > Ciao a tutti.
> >
> > Come esercizio (o sega) mentale ho pensato a come avrei implementato una
> libreria per logging fluente ma usando kotlin invece di java.
> >
> > La libreria avrebbe un unico file dove aggiungo alcuni metodi alla
> classe Logger:
> > ---------------------------------------------
> > package fluentlogger
> > import org.slf4j.Logger
> > fun Logger.ifTrace() = if(this.isTraceEnabled) this else null
> > fun Logger.ifDebug() = if(this.isDebugEnabled) this else null
> > fun Logger.ifInfo() = if(this.isInfoEnabled) this else null
> > fun Logger.ifWarn() = if(this.isWarnEnabled) this else null
> > ---------------------------------------------
> >
> > Ecco un esempio di come come verrebbe usata:
> > ---------------------------------------------
> > package example
> > import fluentlogger.*
> >
> > private val log = org.slf4j.LoggerFactory.getLogger("myLogger")
> > fun main(args: Array<String>) {
> > val file = java.io..File("myFile.txt")
> > log.ifTrace()?.trace("Writing file ${file.absolutePath}")
> > try {
> > file.writeText("Hello World")
> > log.ifDebug()?.debug("File ${file.absolutePath} written")
> > } catch (e: Exception) {
> > log.error("Error writing file ${file.absolutePath}", e)
> > }
> > }
> > ---------------------------------------------
> >
> > Nota: non c'e nessun bisogno del lazy e non ci sarebbe neanche bisogno
> di slf4j, log4j andrebbe bene lo stesso, visto che il messaggio viene
> costruito solo se necessario.
> > Gli unici costi in termini di performance che vedo sono:
> >
> > un ulteriore chiamata a funzione per controllare il livello del logger,
> visto che wrappo i metodi ifDebugEnabled etc...
> > un ulteriore if per controllare se il logger è nullo fatto con
> l'operatore kotlin "?"
> >
> > Non so se la mia libreria potrebbe essere interessante ma magari
> convinco qualcuno a passare a kotlin :D
>
> Due domande:
>
> 1) la variable expansion nello string template viene effettuata
> comunque? Mi verrebbe da dire di sì (sembra zucchero sintattico che il
> compilatore kotlin converte in una string concatenation).
> 2) come fai (API design) a evitare log.ifDebug()?.info("Blah") - nota
> il mismatch tra ifDebug() e info().
>
> --
> Simone Bordet
> ---
> Finally, no matter how good the architecture and design are,
> to deliver bug-free software with optimal performance and reliability,
> the implementation technique must be flawless. Victoria Livschitz
>
>