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