Pour @Chlouchloutte et @Lenny.
Chlouchloutte et moi discutions aujourd'hui du kata de code consistant à écrire un convertisseur de nombre décimaux en nombre romains. Son comportement est le suivant :
- À partir d'un Integer, je dois pouvoir récupérer sa valeur en écriture romaine sous la forme d'une String.
Comment le coder façon Yegor Bugayenko ?
Il y a deux façons de voir ce problème :
- Mettre en avant le concept de nombre
- Mettre en avant le concept de conversion.
1) Représenter d'abord les nombres
Je vais écrire l'interface suivante :
interface Converter {
fun value():String
}
Et un implémentation :
class IntegerAsRomanNumber(
private val number:Integer
) : Converter {
fun value():String {
// Conversion code
}
}
// Usage
val number = 123
val romanNumber = IntegerAsRomanNumber(number).value()
2) Représenter d'abord l'action de conversion
Nous conservons l'interface mais en précisant la structure dans le nom de la méthode :
interface Converter {
fun romanValue():String
}
Et son implémentation :
class Number(
private val number:Integer
) : Converter {
fun romanValue():String {
// Conversion code
}
}
Vous avez du remarquez que l'implémentation sera la même dans les deux cas et que la seul chose qui diffère sera le "wording". En réalité la première façon est verbeuse mais pratique puisqu'elle nous masque la problématique de conversion au profit de la mise en exergue du nouveau type de la donnée. Ce qui nous permettrait de créer plusieurs convertisseurs nous permettant de passer d'un type à un autre comme suit :
interface Converter<OUTPUT> {
fun value():OUTPUT
}
Exemple d'utilisation :
val number = 123
val egyptianNumber:String = RomanAsEgyptian(IntegerAsRoman(number)).value()
Et le concept de décoration fait sens à ce moment.