Aller au contenu principal

Structurer son code 🧱

Contenu​

On peut rapidement se perdre dans une fonction quand on a plus de 100 lignes de code. Nous allons voir :

  • quand faire une méthode et pourquoi (nommer, réutiliser, etc.)
  • les fonctions de refactor de l'environnement pour faire tout ça sans rien casser (parce qu'un travail qui marche c'est précieux)
Avant la séance (2h)

Regarder la vidéo sur le refactoring en kotlin dans IntelliJ IDEA.

Vidéos
À faire pendant la séance
  • Compléter les exercices de la semaine
  • Penser sérieusement à quel refactor aurait du sens pour ton TP
  • Continuer le TP1 (À remettre bientôt !).
Exercices

Exercice Valeur ou Référence​

Effectue la trace du programme suivant :

fun main() {
var a : Int = 0
var b : Int = testPassageValeur(a)

println(a)
println(b)

var listA : MutableList<Int> = arrayListOf(1, 2, 3, 4, 5)
var listB : MutableList<Int> = testPassageReference(listA)

println(listA)
println(listB)

}

fun testPassageValeur(a : Int ) : Int {
return a + 2
}

fun testPassageReference(a : MutableList<Int>) : MutableList<Int>
{
a.add(6)
return a
}

À chaque étape, porte une attention particulière au contexte d’exécution. Ne te limite pas à examiner le contexte de la fonction utilisée : explore également celui de la fonction appelante en remontant la pile d’appels.

Observes-tu un comportement surprenant ? Si oui, explique-le dans tes propres mots et tente d’en identifier la cause. Pour t'aider, tu peux te référer à ces explications : Types valeur vs types référence (2P6)

Exercice RefactorTonTP​

En utilisant les outils de refactor d'IntelliJ IDEA, améliore la lisibilité de ton TP1.

Après chaque refactor :

  • valide que le comportement de ton application n'a pas changé
  • fais un commit de refactor
  • pousse-le sur ton repo

Exercice Jimmy et Johnny 👨‍🎤👨‍💼​

Jimmy et Johnny se chicanent depuis 10 ans. Chacun a écrit une méthode afin de lire un fichier. Jimmy dit que les deux méthodes sont équivalentes alors que Johnny dit que le résultat n'est pas le même. Qui a raison et pourquoi?

Teste le code pour démontrer si les méthodes sont pareilles ou non.

fun lireDesFichiersJimmy() {
for (i in 0 until 10) {
try {
lireFichier(i)
println("fichier $i lu par Jimmy")
} catch (e: FileNotFoundException) {
println("fichier $i n'existe pas Jimmy")
}
}
}

fun lireDesFichiersJohnny() {
var cpt = 0
try {
for (i in 0 until 10) {
lireFichier(i)
cpt = i
println("fichier $i lu par Johnny")
}
} catch (e: FileNotFoundException) {
println("fichier $cpt n'existe pas Johnny")
}
}