Browse Source

Ajout des exercices de refactoring

master
Dimitri Merejkowsky 3 years ago
parent
commit
dc19be8358
13 changed files with 303 additions and 0 deletions
  1. +12
    -0
      saison-2/sources/refactorings/01_renommage_variable.py
  2. +9
    -0
      saison-2/sources/refactorings/02_renommage_parametre.py
  3. +17
    -0
      saison-2/sources/refactorings/03_renommage_fonction.py
  4. +10
    -0
      saison-2/sources/refactorings/04_liste_par_comprehension.py
  5. +12
    -0
      saison-2/sources/refactorings/05_liste_par_intension.py
  6. +26
    -0
      saison-2/sources/refactorings/06_extraction_sous_fonction.py
  7. +20
    -0
      saison-2/sources/refactorings/07_extraction_variable_condition.py
  8. +18
    -0
      saison-2/sources/refactorings/08_sortie_rapide.py
  9. +13
    -0
      saison-2/sources/refactorings/09_if_else_vs_dico.py
  10. +10
    -0
      saison-2/sources/refactorings/10_double_negation.py
  11. +27
    -0
      saison-2/sources/refactorings/11_fonctions_vs_méthodes.py
  12. +39
    -0
      saison-2/sources/refactorings/12_dataclass_vs_paramètres.py
  13. +90
    -0
      saison-2/sources/refactorings/cuisine.py

+ 12
- 0
saison-2/sources/refactorings/01_renommage_variable.py View File

@@ -0,0 +1,12 @@
# Exercice: remplacer n, s et x avec de meilleurs noms
def calcule_moyenne(scores):
n = len(scores)
s = 0
for x in scores:
s = s + x
return s / n


scores = [2, 3, 5, 4]
moyenne = calcule_moyenne(scores)
print(moyenne)

+ 9
- 0
saison-2/sources/refactorings/02_renommage_parametre.py View File

@@ -0,0 +1,9 @@
# Exercice: remplacer le paramètre prénom
# par appellation
def dire_bonjour(prénom):
print("Bonjour " + prénom)


dire_bonjour("Alice")
prénom = "Bob"
dire_bonjour(prénom)

+ 17
- 0
saison-2/sources/refactorings/03_renommage_fonction.py View File

@@ -0,0 +1,17 @@
# Exercice: renommer demander_si_ca_va() en
# demander_des_nouvelles() et être_poli()
# en démarrer_conversation()
def dire_bonjour(appelation):
print("Bonjour", appelation)


def demander_si_ca_va():
print("Ça va?")


def être_poli(appelation):
dire_bonjour(appelation)
demander_si_ca_va()


être_poli("Jeanne")

+ 10
- 0
saison-2/sources/refactorings/04_liste_par_comprehension.py View File

@@ -0,0 +1,10 @@
# Exercice: remplacer le corps de la fonction
# par une liste par intention
def liste_des_carrés(n):
résultat = []
for i in range(n):
résultat.append(i * i)
return résultat


print(liste_des_carrés(5))

+ 12
- 0
saison-2/sources/refactorings/05_liste_par_intension.py View File

@@ -0,0 +1,12 @@
# Exercice: remplacer le corps de la fonction
# par une liste en compréhension
def garde_les_positifs(nombres):
résultat = []
for nombre in nombres:
if nombre > 0:
résultat.append(nombre)
return résultat


nombres = [1, -3, 2, -5, 2, 4]
print(garde_les_positifs(nombres))

+ 26
- 0
saison-2/sources/refactorings/06_extraction_sous_fonction.py View File

@@ -0,0 +1,26 @@
# Exercice: découper la fonction servir_le_thé() en trois
from cuisine import *


def servir_le_thé():
# Faire bouillir l'eau
allumer_bouilloire()
attendre_que_ca_bout()
eteindre_bouilloire()

# Remplir une tasse
ouvrir_placard()
prendre_une_tasse()
mettre_eau_dans_tasse()
mettre_thé_dans_tasse()
attendre_que_ca_infuse()
fermer_placard()

# Servir sur un plateau
prendre_un_plateau()
mettre_tasse_sur_plateau()
mettre_sucrière_sur_plateau()
apporter_le_plateau()


servir_le_thé()

+ 20
- 0
saison-2/sources/refactorings/07_extraction_variable_condition.py View File

@@ -0,0 +1,20 @@
# Exercice: rendre la fonction peut_voter() plus lisible
# et plus explicite
class Personne:
def __init__(self, age, nationalité, inscrite):
self.age = age
self.nationalité = nationalité
self.inscrite = inscrite


def peut_voter(personne):
return (
personne.age >= 18 and personne.nationalité == "Française" and personne.inscrite
)


martine = Personne(42, "Française", True)
assert peut_voter(martine)

kevin = Personne(12, "Française", True)
assert not peut_voter(kevin)

+ 18
- 0
saison-2/sources/refactorings/08_sortie_rapide.py View File

@@ -0,0 +1,18 @@
# Exercice: se débarrasser des ifs imbriqués
def controlle_conducteur(*, sobre, accompagné, permis):
if sobre:
if permis:
return True
else:
if accompagné:
return True
else:
return False
else:
return False


assert controlle_conducteur(sobre=True, accompagné=False, permis=True)
assert controlle_conducteur(sobre=True, accompagné=True, permis=False)
assert not controlle_conducteur(sobre=True, accompagné=False, permis=False)
assert not controlle_conducteur(sobre=False, accompagné=False, permis=True)

+ 13
- 0
saison-2/sources/refactorings/09_if_else_vs_dico.py View File

@@ -0,0 +1,13 @@
# Exercice: remplacer tous les if/else
# avec un dictionnaire
def conversion(mesure, unité):
if unité == "m":
return mesure
elif unité == "km":
return mesure * 1000
elif unité == "miles":
return mesure * 1609


print("3 km =", conversion(3, "km"), "m")
print("2 miles =", conversion(2, "miles"), "m")

+ 10
- 0
saison-2/sources/refactorings/10_double_negation.py View File

@@ -0,0 +1,10 @@
# Exercice: ne pas utiliser la double négation
def faire_le_café(sans_sucre):
if not sans_sucre:
print("avec du sucre")
else:
print("sans sucre")


faire_le_café(sans_sucre=True)
faire_le_café(sans_sucre=False)

+ 27
- 0
saison-2/sources/refactorings/11_fonctions_vs_méthodes.py View File

@@ -0,0 +1,27 @@
# Exercice: introduire une classe Article
# pour éviter la répétition de paramètres
# titre, contenu, lien, résumé
def crée_page_web(titre, contenu):
print("création de la page web")
slug = titre.lower().replace(" ", "-")
return "https://blog.e2li/" + slug


def envoi_email(titre, résumé, lien):
print("envoi email à propos de", titre)


def envoi_tweet(titre, résumé, lien):
print("envoi tweet à propos de", titre)


def publie_article(titre, résumé, contenu):
lien = crée_page_web(titre, contenu)
envoi_email(titre, résumé, lien)
envoi_tweet(titre, résumé, lien)


titre = "Un super titre"
résumé = "Un super résumé"
contenu = "Du contenu de qualité"
publie_article(titre, résumé, contenu)

+ 39
- 0
saison-2/sources/refactorings/12_dataclass_vs_paramètres.py View File

@@ -0,0 +1,39 @@
# Exercice: introduire une classe Commande pour
# éviter las répétition des paramètres
# allongé, noisette et sans_sucre
from cuisine import *


def commande_café(allongé, noisette, sans_sucre):
print("Je voudrais un café", end=" ")
if allongé:
print("allongé", end=" ")
else:
print("serré", end=" ")
if noisette:
print("noisette", end=" ")
if sans_sucre:
print("sans sucre", end=" ")
print()

faire_le_café(allongé, noisette, sans_sucre)
servir_café()


def faire_le_café(allongé, noisette, sans_sucre):
avec_sucre = not sans_sucre
if allongé:
rajouter_eau()
if noisette:
rajouter_lait()
if avec_sucre:
rajouter_sucre()


def servir_café():
print("voici")


commande_café(False, False, False)
commande_café(False, True, False)
commande_café(True, True, False)

+ 90
- 0
saison-2/sources/refactorings/cuisine.py View File

@@ -0,0 +1,90 @@
# Rien à changer ici :)
import time


def pause(f):
def res():
f()
time.sleep(0.3)

return res


@pause
def allumer_bouilloire():
print("Bouilloire allumée")


@pause
def ouvrir_placard():
print("Placard ouvert")


@pause
def fermer_placard():
print("Placard fermé")


@pause
def attendre_que_ca_bout():
print("...")


@pause
def eteindre_bouilloire():
print("Bouilloire éteinte")


@pause
def prendre_une_tasse():
print("Tasse en main")


@pause
def mettre_eau_dans_tasse():
print("Versement de l'eau dans la tasse")


@pause
def mettre_thé_dans_tasse():
print("Ajout du thé dans la tasse")


@pause
def attendre_que_ca_infuse():
print("...")


@pause
def prendre_un_plateau():
print("Plateau en main")


@pause
def mettre_tasse_sur_plateau():
print("Le plateau contient une tasse")


@pause
def mettre_sucrière_sur_plateau():
print("Le plateau contient une sucrière")


@pause
def apporter_le_plateau():
print("Le plateau arrive sur la table")


@pause
def rajouter_eau():
print("Rajouter eau")


@pause
def rajouter_lait():
print("Rajouter lait")


@pause
def rajouter_sucre():
print("Rajouter sucre")