View on GitHub

club-lecture

En cours de redaction

Chapitre 3 - Fonctions

longue, code dupliqué, chaines de caracteres etranges, types de donnees, API, etc = difficile a comprendre trop d’operations, trop de niveau d’abstraction, plusieurs niveau d’imbrication

Faire court

“et encore plus que ca”

25l 80c. 100l, 150c.

Moins de 20 lignes. 5 lignes

bloc et indentation : pas plus de 2 niveaux

Faire une seule chose

“UNE FONCTION DOIT FAIRE UNE SEULE CHOSE. ELLE DOIT LA FAIRE BIEN ET NE FAIRE QU’ELLE.”

1 niveau d’abstraction. Creer un nouvelle fonction ne fait que changer le nom

Pas de sections

Un niveau d’abstraction par fonction

Lire le code de haut en bas : la règle de décroissance

Instruction switch

“nous employons évidemment le polymorphisme” -> langage specifique

Fabrique abstraite

Choisir des noms descriptifs = chapitre 2

principe de Ward : “Vous savez que vous travaillez avec du code propre lorsque chaque fonction que vous lisez correspond presque parfaitement à ce que vous attendiez.”

nom long > nom court

Arguments d’une fonction

ideal = 0, 1 ou 2 = ok, plus de 3 = a eviter

preferer passer une variable comme membre, plutot que comme argument <= purete fonctionnelle ?

Difficulite pour tester <= encore plus dur de tester un etat interne ?

prefere retour de fonction plutot que argument de sortie. <= optional, monade, gestion d’erreur

assertEquals(expected, actual) : ordre des parametres ? <= parametres nommé?

assertExpectedEqualsActual(expected, actual) au lieu de assertEquals(expected, actual)

Éviter les effets secondaires

fait également d’autres choses cachées dans la classe ou dans les membres <= const, passage par valeur, purete fonctionnelle

couplage temporel

faire une chose ?

Séparer commandes et demandes

Une fonction doit modifier l’état d’un objet ou retourner des informations concernant cet objet

if (set(“nomUtilisateur”, “OncleBob”))… <= isSet, tester si un objet est valid. etentre le scope. C++17 declaration dans if. Pointeur C/C++

if (attributeExists(“nomUtilisateur”)) { setAttribute(“nomUtilisateur”, “OncleBob”); … } <= verbosite

Préférer les exceptions au retour de codes d’erreur

violation subtile de la séparation des commandes et des demande

Ne vous répétez pas

DRY, plus de code = plus d’erreurs

Programmation structurée

Dijkstra : chaque fonction, et chaque bloc dans une fonction, doit posséder une entrée et une sortie

Écrire les fonctions de la sorte

Questions

apprendre de l’experience?

object vs fonctionnel. parametre vs membre. Typage fort