Typesafe Builder en Kotlin

jmdesprez
17.7K views

Open Source Your Knowledge, Become a Contributor

Technology knowledge has to be shared and made accessible for free. Join the movement.

Create Content
Previous: Interlude - Fonctions et Lambda

Typesafe Builder

Reprenons là où nous nous étions arrêtés lors de la partie 1

Pour construire File(a, "a1") nous avons besoin d'un second FileBuilder

[TODO] Modifiez la méthode fun directory(name: String) pour retourner un nouveau FileBuilder. Utilisez ce FileBuilder pour construire "a1" et "a2"

Vous devriez maintenant avoir quelque chose de similaire Ă  :

Pour la prochaine étape nous allons "inverser" les choses. C'est à dire qu'au lieu de retourner un FileBuilder la méthode fun directory(name: String) va prendre en paramètre un bloc de code de type FileBuilder.() -> Unit. De plus, puisque c'est ce bloc de code qui va effectuer les traitements, nous n'avons plus besoin de retourner un FileBuilder

[TODO] modifiez la méthode fun directory(name: String) pour ajouter (et utiliser) le paramètre FileBuilder.() -> Unit. Prenez exemple sur la page précédente si besoin.

[TODO] modifiez aussi la méthode main en conséquence.

Voici un exemple de solution :

Bon, cela commence à ressembler à notre exemple en première page mais il y a encore quelques ajustements à faire.

Puisque la méthode directory attend désormais deux paramètres, nous sommes obligés d'écrire directory("a1", {}). Nous allons changer cela très simplement en ajoutant une valeur par défaut.

[TODO] ajoutez une valeur par défaut sur le paramètre block

Voici un exemple de solution :

Maintenant nous allons nous occuper de la variable builder. Pour la faire disparaitre, nous allons avoir besoin d'un "point d'entrée". Ce point d'entrée sera une fonction quasiment identique à notre fonction directory mais avec quelques différences :

  • elle sera placĂ©e directement dans le fichier (pas dans une classe)
  • le File qui sera crĂ©Ă© n'aura pas de parent donc on utilisera le constructeur File(String)
  • cette mĂ©thode retournera l'objet File crĂ©Ă© (nous en avons besoin dans le main)

[TODO] créez une autre méthode directory comme définit ci-dessus.

Voici un exemple de solution :

fun directory(name: String, block: FileBuilder.() -> Unit = {}): File {
    val file = File(name)
    FileBuilder(file).block()
    return file
}

[TODO] maintenant, remplacez le FileBuilder de la méthode main par ce point d'entrée. Votre méthode main ne doit plus contenir de FileBuilder, uniquement des appels à la fonction directory

Voici un exemple de solution :

Il ne reste plus que la touche finale, celle qui fera vraiment ressembler votre code à un Typesafe Builder. Bonne nouvelle, vous n'avez rien à développer, nous n'avons besoin que d'un sucre syntaxique fourni par le compilateur Kotlin.

En effet, lorsque le dernier paramètre d'une fonction est un 'function type' il est possible de "sortir" ce paramètre des parenthèses.

Ainsi :

directory("a", {
    directory("a1")
    directory("a2")
})

Est exactement Ă©quivalent Ă  :

directory("a") {
    directory("a1")
    directory("a2")
}

[TODO] modifiez votre méthode main pour "sortir" la lambda en dehors des parenthèses (IntelliJ propose un 'code assist' pour cela)

Voilà, votre Typesafe Builder est terminé :

Si vous voulez ajouter des fonctionnalités à votre Builder, il suffit d'y ajouter des méthodes :

Open Source Your Knowledge: become a Contributor and help others learn. Create New Content