Session du 15 octobre 2025 à 21h00
Programmation Orientée Objet (POO)
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Classes abstraites Python et pattern Factory
Découvrez comment utiliser les classes abstraites avec le module ABC et mettre en place une factory simple en Python pour structurer votre code orienté objet.
00:00:00 :Cela fait 5 ans, ça faisait vachement de temps.J'ai l'impression que ça faisait longtemps que je faisais ça tant que je suis faute de langage.
00:00:36 :J'ai l'impression que j'ai oublié quelque chose.Ça a l'air beaucoup mieux.Thomas, tu as essayé une grocque ?Non, je n'ai pas eu le temps cet après-midi.
00:02:17 :Il y en a qui connaissent ici ?Non.En plus, j'allais dire que je suis sûr que Baptiste connaît.C'est obligatoire.C'est cool.On fera un début de mentora avec ça parce que je n'ai pas de compte payant ni rien là-dessus.
00:02:44 :C'est vraiment juste pour le fun.Ce que j'avais Thomas qui demandait cet après-midi, je vais partager mon écran au passage.Une grocque, c'est vraiment très cool.
00:02:57 :Je n'y arrive pas.On va commencer.Une grocque, c'est ça.En gros, je vais me logger.J'utilise basiquement parce que ce n'est pas vraiment mon domaine à 100%.
00:03:20 :J'installe avec Guru, pas de problème.J'ai filé mon token, ça je le changerai.Ce n'est pas grave, je ne m'en sers pas.C'est bon, ce n'est pas grave.
00:03:32 :Ensuite, vous allez lancer par exemple votre application de Van Gogh qui tourne sur le port 8000.Vous allez lancer après une grocque la commande avec le port 8000.
00:03:48 :Ça va vous donner un double domaine qui est ici.Marie-Louise dans le mien.Les gens à qui vous filerez le lien pourront tester votre application.
00:03:56 :Alors que pourtant, vous êtes un serveur local avec Van Gogh.Si ça peut vous servir un jour,c'est un site sympa et qui est vraiment bien foutu.
00:04:10 :Je ne sais pas s'il y en a qui pensent utiliser plus tard ce truc-là, mais je vous le conseille.Je vais essayer.Je vais l'utiliser.
00:04:19 :C'est la première question que je t'avais envoyée cet après-midi.Une grocque.Ok, c'est bon.On va commencer le mentorat.Aujourd'hui, on va parler des classes abstraites.
00:04:50 :Je m'étais mis un truc de côté que je voulais vous montrer aussi.Je ne sais plus si je l'ai...On verra plus tard si ça concerne Van Gogh.
00:05:00 :Bon, on va partir sur les classes abstraites.C'est plus le but aujourd'hui.Je vais mettre ma fenêtre Google Meet ici.Ok.Donc, on a déjà évoqué ici.
00:05:19 :Je pense que...Lui, il s'est chuté.Vous connaissez tous ou pas le module ABC ?Moi, oui.Et je pense que Baptiste, du coup...Baptiste aussi, il dit oui.
00:05:40 :Il a eu le droit à la porte d'Oza en plus.Ok.Je ne sais plus si il y a une question dessus.Les questions sur Oza sont vraiment bidons sur ce module-là.
00:05:51 :Il suffit de savoir ce qu'il fait, l'abstract method, et c'est parti.C'est assez facile.Justement, en parlant de ça, on va importer les abstracts method.
00:06:02 :Du coup, est-ce qu'il y en a qui ont déjà fait...Du coup, Antoine, je sais que oui.La factory.On va faire une factory très simple, vraiment très basique.
00:06:14 :Mais juste pour voir le principe.Est-ce qu'il y en a qui ont déjà fait de la factory ?Oui, un peu en fait.Ok.Sur le site.
00:06:24 :Ok, d'accord.Un très peu aussi.Ok.On va faire un truc très simple.Juste pour utiliser ABC.Je pensais que j'aurais plus de débutants encore ce soir au niveau d'Oza.
00:06:41 :Ça ne vous dérange pas qu'on voit ABC et puis la factory ?Ça vous va ou pas ?Oui.Oui, nickel.Je ne veux pas que vous vous ennuyez non plus.
00:06:51 :Vous me dites...Parce que ça ne fait pas de mal de voir des choses.Oui, ok.Sinon, vu qu'il y a plein de monstres, ça repartit sur du Django.
00:07:00 :J'aurais trouvé un truc à faire sur le Django.Ok, on va rester là-dessus, comme prévu.Pas de problème.Donc, les classes abstraites, du coup.Les classes abstraites, ici,elles servent en fait...
00:07:17 :C'est des classes que vous ne pouvez pas instantier directement.Pour ceux qui redécoulent, entre guillemets.Ou qui ne se tenaient plus trop.Ça va surtout servir d'interface.
00:07:31 :Alors, il y en a qui, sûrement, ont déjà utilisé...Par exemple, je ne sais pas si...Antoine, Baptiste ou les autres ont déjà utilisé Protocol ?
00:07:41 :Non.C'est un peu le...C'est une autre façon de faire, en fait.L'interface, c'est basé sur du backtyping.Vu que moi, je ne suis pas trop du genre à typer.
00:07:53 :Vraiment, si je fais de l'abstraction,je vais vraiment utiliser ABC, en général.Je crois que Protocol a été ajouté avec Python 3.8 ou 3.9.Je ne sais plus.
00:08:04 :Bref.On va se créer l'interface.Imaginons que vous avez un super programme.Vous allez vouloir vous faire un jeu.Je ne sais pas, le jeu, vous allez l'appeler...
00:08:15 :Je ne sais pas ce que j'ai dit.C'est l'année dernière que j'avais annoncé que c'était un des annonces.Voilà.On va faire un jeu.Et on va avoir, du coup,plusieurs classes.
00:08:27 :On pourra avoir des classes vraiment à part.On va avoir un f.Et qu'est-ce qu'il va pouvoir faire, l'f ?Il va pouvoir attaquer.OK.
00:08:40 :Ça va être sa méthode attaquée.Sa méthode d'instance.Et puis, on verra ce qu'il fera.Quand il attaque, on retournera quelque chose.Mais bien sûr, il faut lui donner un nom.
00:08:55 :Hop.OK.Et donc là, on va se dire...OK. Voilà.Imaginons maintenant que c'est pareil.On se dira qu'on ne veut pas avoir qu'un f aussi.
00:09:10 :Je ne sais pas.Je me suis pris des notes.J'ai cliqué sur les classes.Je vais leur donner des noms.J'ai pris nain et roux.
00:09:16 :Des nains et un roucaille, par exemple.Donc là, on va avoir un nain.Hop.Ensuite, on va avoir un roucaille.Désolé.Il y en a quelques qui ne connaissent pas le serre de l'anneauquand j'avais regardé.
00:09:32 :Mais je suis un grand fan.Donc, le problème ici.Est-ce qu'il y en a...Ceux qui n'ont jamais fait beaucoup de...Il y en avait, du coup.
00:09:43 :J'ai demandé la question et on m'a posé à l'envers.Est-ce qu'il y en a qui ne font jamais de ABC ?Qui n'ont jamais fait.
00:09:49 :Ou jamais d'abstraction comme ça.Je ne l'ai pas fait, mais je connais le principe.Tout le monde le connaît.Bon, du coup, vous voyez vite le problème.
00:10:01 :Le code, ça va devenir vite...A chaque fois, on a la même chose.Et ça, vous pouvez le définir dans la plupart des frameworks,dans vos héritages.
00:10:10 :Avec Longos, ce que je fais,je fais beaucoup, moi aussi, d'abstraction comme ça.Je fais des modèles abstraits.Ça ne se gère pas comme ça en héritant d'un ABC.
00:10:18 :Avec Longos, vous allez avoir une classe méta spécifique pour ça.Vous allez spécifier que vous allez avoir l'abstraction.Mais là, c'est comme ça.Le gros souci ici, c'est qu'on risque d'avoir des problèmes.
00:10:32 :Parce que si on veut que nos personnages, à chaque fois,ils aient bien une méthode attaquée,ou une autre méthode, ou ainsi de suite.Je vais prendre l'exemple de se présenter aussi.
00:10:43 :Le personnage va se présenter au moment de la rencontre.Il ne faut pas qu'il y ait d'erreur dans les méthodes.Du coup, ce qui va se passer,c'est qu'on va se créer une classe abstraite.
00:11:02 :Pour l'instant, je vais les effacer.Parce que dans tous les cas, je vais les recoller.On va avoir un PNG.Ici, on aura notre classe abstraite ABC.
00:11:16 :Et c'est ici qu'on va définir le nid.Je vais poser une question maintenant, tout de suite,tant que j'y pense.Est-ce qu'il y en a ici,c'est super important,qui arrivent à avoir le problème qu'on peut avoirsans factory ?
00:11:40 :Ou pas ?Parce que ça va être très difficile de faire abstraction de factory.Je pose la question maintenant, comme ça ?Non.Bon, on va continuer.
00:11:53 :Ça va venir au fur et à mesure, du coup.Donc, voilà, c'est parti.Je vais m'activer un peu.Donc là, on va avoir notre PNG,on va avoir un constructeur,qui va être commun à tout le monde.
00:12:13 :Sauf qu'ici, on va vouloir aussi avoirune abstract méthode qu'on va définir,attaquer.Parce qu'en fait, on va vouloir la redéfinir à chaque fois, cette méthode.
00:12:24 :On va obliger la classe qui va en hériter,de la définir.Donc on va juste mettre un passe.Ensuite,je ne me sois pas sur les trois petits points en général,mais c'est plus un effet outdoor pour dire on revient plus tard.
00:12:42 :On va laisser passer les plus courants.On va se dire présenter.Et là, c'est une méthode qu'on ne va pas redéfinir à chaque fois,parce qu'en fait, on va s'amuser un peu avec les attributs,les attributs de nos classes.
00:12:57 :On pourrait très bien dire ici,j'aime bien ce genre d'attribut là.On va très bien dire ici, je suis.C'est 7.nom.J'ai bien mis nom ou name ? Non.
00:13:12 :J'ai mis en français 7.nom.On va mettre 1.Et là, on va utiliser un super attribut magiquequi est classe.Et il est où ? Il est là.
00:13:27 :Ce qui veut dire qu'à chaque fois, dynamiquement,quand on va arrêter d'une classe,on va récupérer le nomde notre classe.Si on fait une classe elf,je suis, le nom de l'elf, un elf.
00:13:46 :Par exemple, si je vais ici,si je faisclasse elf,on va hériter de png, notre classe abstraite.Ici, on est obligéde hériter,je ne l'ai pas exécuté,je ne l'ai pas redéfini.
00:14:10 :Elf, je vais l'appeler comment ?Je vais l'appeler la stack.Donc là,il y a bien à grandir un peu,ça va là ou pas ?
00:14:25 :Oui.Désolé, depuis le début, j'ai tapé un peu.Ça faisait un peu petit ou ça allait juste avant ?Je suis sur ordinateur, ça va.
00:14:38 :Ouais, ok.Je vais rester comme ça.Du coup, ici, on a bien l'erreur.Qu'est-ce qu'il nous dit ?Il faut implémenter la méthode attaqué.Et là, je ne l'ai pas fait.
00:14:56 :Et pour le fun, on va faire un truc.Est-ce qu'ils ont modifié le message en 3.14 ?Non, c'est le même.Je vais rester en 3.13 pour ce soir.
00:15:08 :Donc, ça, pour l'instant, je vais l'effacer.Et on va revenir sur notre classe.Là, on est obligé de redéfinir notre méthode attaqué.Attaqué, attaqué...Donc, on ne va pas faire un superparce que c'est strictement inutile.
00:15:27 :Ici, on ne va pas faire un super pour avoir place.Et là, ici, on va la personnaliser.Donc, on va se dire...Qu'est-ce qu'il va faire, lui ?
00:15:39 :C'est pour l'exemple.Donc, c'est machin...tirer une flèche.Voilà, machin tirer une flèche.Et donc, ensuite, ces méthodes-là, on ne va pas en hériterpuisqu'elles ne sont pas d'extra-méthodeset elles s'adaptent à toutes nos classes.
00:16:00 :Donc là, on va refaire un...On va se dire...Elf...Je vais mettre l'ego last...Bon, j'avoue que j'instantie un peu quand on vous rend dans le print comme ça.
00:16:16 :Ce n'est pas génial, mais voilà.Donc là, on a bien marqué, je suis l'ego last 1f.Donc, dynamiquement, ici, on va récupérer le nom de la classela plus proche. On ne montre pas l'héritage.
00:16:28 :Pour l'instant, c'est bon pour tout le monde, non ?Oui ?Je parle un peu vite des fois, c'est pour ça que je suis...OK.
00:16:40 :Du coup, maintenant, on va faire pareil.On va prendre... On va juste la modifier.Hop.Donc, on a un elf, on va avoirun nain.
00:16:56 :Et lui, le nain, va...Hop.Avec sa...Et on va avoirun ou, un boucail ici.Et lui, hop,charge dans l'espoird'éclater Aragorn.Donc voilà, on a chaque...
00:17:23 :Chaque classe est bien différente, mais on a bien la même interface à chaque fois.On peut toujours appeler, présenter.On aura toujours le nom de la classe.
00:17:32 :On a bien le unit. Ici, quand on instantie, il faudra bien qu'on mette le nom du personnage.Mais par contre, leur particularité, ça va être la méthode attaquée.
00:17:38 :Pour définir à chaque fois.Donc là, on est pas mal.Imaginez maintenant...Je pense qu'on va se mettre... On va pas faire plusieurs...On va rester sur la même page. Enfin, sur le même fichier, je veux dire.
00:17:53 :Pas sur Word, c'est pas grave.Imaginons qu'on a un module. On va se faire un module.On a un module bataille.Bataille.paille, ici.On va importer à chaque fois les classes.
00:18:08 :On va importer à chaque fois nos classes.Là, comme ça, j'ai pas les imports à faire.On est directement dedans. Imaginez-vous dans un autre module.
00:18:17 :On est dans bataille.paille.Ici, on va se dire...Par exemple, on va vouloir faire popper ou créer, entre guillemets,des... Comment on appelle ça ?
00:18:29 :Des PNG.Là, on pourrait très bien dire...On va faire comme ça, déjà.On va mettre le type PNG, ici.On va dire ELF.Et le nom, ça va être...
00:18:48 :C'est dégueulasse.A chaque fois, dans nos fichiers, on dirait...Si le type PNG, ici, c'est un ELF,qu'est-ce qu'on va faire ?On va l'instantier.
00:19:04 :ELF.Et le nom.Le problème, c'est que...On va faire la suite.On va faire la suite.Pareil, on va faire...Là, on va dire si c'est un E.
00:19:25 :Hop.Si c'est un 1, qu'est-ce qu'on fait ?On va instantier un 1.Et on va mettre le nom.Et ainsi de suite.On va tous les faire. On va tous les faire un ELF, encore.
00:19:43 :On va aller plus vite.On va dire si c'est un...On va instantier...On va instantier la classe Rougail, ici, et ELF.Qu'est-ce qu'on pourrait dire dans le ELF ?
00:19:58 :On pourrait très bien dire...C'est assez commun de faire un truc comme ça.On pourrait se dire...Imaginons que là, on a notre module Bataille.py.
00:20:10 :On a aussi...Je pense qu'il y en a déjà certains qui vont venir.On va avoir un...Un endroit où on fait des quêtes.Il va falloir la même chose.
00:20:25 :Hop.Pour qu'il y ait du type PNJ ou du nom, imaginez qu'on génère aléatoirement.Là, c'est un peu statique, mais c'est pour l'exemple.Donc...Imaginez qu'il y ait...
00:20:40 :Pour le fun, si vous voulez...Un troisième module qu'on va appeler...Vous n'avez pas une idée, s'il vous plaît ?Je n'ai pas d'idée.Hum hum.
00:20:56 :Moi, je n'en sais rien.Il n'y a pas quelqu'un qui a une idée, là ?Je ne sais pas, quêtes...On est avec Bataille, quêtes...
00:21:08 :Exploration. Merci.Donc là, on va s'arrêter là.On est dans chaque module.Notre programme, à chaque fois, va appeler tel module.On a dans une bataille. Hop.
00:21:23 :On va voir un certain type de PNJ.Il va se créer. On arrive dans les quêtes. C'est pareil.Dans l'exploration, c'est pareil. On va créer. Ainsi de suite.
00:21:32 :Est-ce qu'il y en a qui voient le problème, ici ?C'est quand il y a une bête de code.Et du coup, si tu rajoutes une race, tu fais comment ?
00:21:41 :Il faut rajouter un élif et rajouter à chaque fois.Ouais, c'est pour ça.Ça peut être long.Donc là, clairement, ce n'est pas possible.On peut faire une fonction dans un module à côtéqu'on appelle directement dans chaque module, après.
00:22:02 :Ouais. Alors, exactement.Donc là, sur le coup de la factory,on va faire quoi ?Donc là, sur le coup de la factory,je pense à ce que tu viens de me dire,en fonction, pourquoi pas, mais je préfère le faire en classequitte à utiliser une méthode statique.
00:22:23 :En général, quand j'ai une méthode statique, je préfère utiliser une fonction.Mais là, le truc, c'est qu'on va utiliser un attribut de classe,un attribut privé.
00:22:32 :Donc, comment tu fais ?Voilà, une factory.Ouais, tu es là, exactement.Le code qui n'est pas maintenable comme ça,ça existe, j'ai déjà vu des... là, j'ai récupéré un projet.
00:22:47 :Alors, ce n'est pas à ce point-là, je vous rassure.Mais un projet de Django où le codeest difficilement maintenable. C'est une horreur.Et j'étais tellement désespéré, j'ai envoyé tout le code à Nya.
00:22:59 :Je lui ai dit, qu'est-ce que tu penses du code ?Voir si c'est moi qui étais con ou quoi.En gros, pour résumer.C'est pour ça que j'aime bien avoir du code carré dès le début.
00:23:11 :Je m'en parlais avec Thibaud cet après-midi.Là, je suis passé sur une application où j'ai passé trois heuresà configurer des handlers,des classes, entre guillemets, dans des modules.
00:23:23 :Après, je n'ai plus qu'à les appeler une fois.Appeler cette classe-là et juste à modifier ma classedès que j'ai un problème. Au moins, on sait qu'il faut les toucher.
00:23:32 :Que là, on va toucher partout.Vu que ce n'est pas cool ici,on va faire ce qu'on appelle une mini-factory.Parce que si vous partez sur la factory pattern,là vous allez avoir des trucs de fouqui vont sortir dans les livres.
00:23:50 :C'est The Game of the Four, je crois que ça s'appelle.Vous avez les patterns officiels.Là, on va en faire un plus officieux, on va dire.
00:23:59 :C'est suffisant. Dans pas mal de cas, ça pourra vous suffire.Donc, hop, on va avoirune factory de PNG.Ce qui peut être pas mal dans ce cas-là, c'est d'avoirun attribut privé ici. On va voir les différents types.
00:24:19 :Différents types.On va mapper. Alors ça, ça m'arrivetrès souvent de le faire dansle Django même. On va mapper ici les typesde races.
00:24:39 :On va avoir les nains.On va avoir, on avait dit,les Uruk-hai.Et c'est tout.Et en dessous, qu'est-ce qu'on peut avoir ?C'est pour ça que je dis que tu dis une fonctionet c'est largement possibleoù tu pourrais faire à la limiteun module factory PNGet dans ton module, tu auras une variable type
00:25:12 :et une fonction derrière qui l'utilise.Mais tu les auras quoi ?On va faire une classe pour l'exemple.Donc là, vous appelez comment ?Fabrique ?
00:25:27 :Je mets un français.A la base, j'ai commencé français, donc j'aurais pu l'appeler usine.On va l'appeler factory. Fabrique.Allez, on va le mettre en français.
00:25:39 :On va avoir une fabrique.Fabriquer.Ok, donc là, qu'est-ce qu'on va envoyerdedans ? Et ce n'est pas une statique.C'est une classe méthode, ce que je voulais dire tout à l'heure.
00:25:54 :Je reviens sur ce que j'ai dit.Quand je fais une statique, je préfère utiliser une fonction.Mais quand tu as une classe méthode, on va voirsi tu ne veux pas faire un module à partavec ta variable iciqui n'est pas une constante, on pourrait dire une constante
00:26:12 :avec une fonction.Pour ce cas-là, je préfère avoir une méthode de classe largement.C'est rare que je fasse un module à partpour ce genre de choses-là, et je ne l'ai jamais vu.
00:26:25 :Mais c'est quelqu'un, une fois, qui m'a dit que ça, on pourrait le transformer en module.C'est possible aussi.Je ne vais jamais vous le faire, parce que je préfère être comme ça.
00:26:34 :Si vous avez votre avis, n'hésitez pas.Alors, notre classe méthode.Ici, mon premier argument, c'est qu'elle prend la classe.On veut aussi avoir le type de PNG.
00:26:47 :Le type de PNG qu'on va prendreet le nom du PNG.Là, on a tout ce qu'il faut.Maintenant, ici, pour récupérerla classe,on va se faire un get sur le dictionnaire.
00:27:07 :Ok, on va faire ça.On va se faire un simple get.Sur les types, on va récupérer du couple type du PNG.Je vais chanter un peu.
00:27:25 :Vu qu'on utilise la méthode get,on a la méthode get.Comme ça, au moins, ça nous retourne nonsi jamais il n'y a pas de correspondance.
00:27:41 :Donc, si c'est non, ici,tout de suite, on sécurise le truc.On renvoie une erreur, comme ça, au moins, il n'y a pas de surprise.
00:27:50 :Et on dit, on pourrait dire, bon, le type n'est pas inconnu,on va pas s'embêter, on va dire inconnu.Et ensuite, si vous n'avez pas de problème,vous pouvez rapidement retourner la classeici avec le nom.
00:28:05 :Je lance la classe avec le nom.Donc, partie comme ça.Imaginons maintenant qu'on aitle module combat.pyque j'avais tout à l'heure.Par exemple, ici,on a un type de PNG qui va êtreici. Le nom,
00:28:29 :on va reprendre rigolasse.Et maintenant, c'est tout con, parce que le PNG,on a juste à faire un fabricque je l'ai appelé fabric.png, ici.
00:28:41 :Fabriquer.Et ici, on envoie le type de PNG.Et j'ai bien appelé le nom en arguments, en paramètres.Et donc, en fait, vous allez faire ça à chaque foisSi vous faites ça sur tous vos modules,on va prendrel'exploration que j'avais tout à l'heure.
00:29:03 :Pour prouver que ça fonctionne, on va se direfabric.pngC'est pour attaquer que j'ai fait comme méthode.Je regarde si j'ai pas fait d'erreur au passage.
00:29:19 :Là, ce que j'ai fait, du coup,Là, on voit bien que ça fonctionne. On voit que j'ai instanciérigolasse ici pour tirer une flèche.Maintenant, imaginons qu'on rajoute une race.
00:29:31 :Ce qui est propre ici.Alors, j'aurais pu faire une séparation entre...Si on rajoute une race, du coup,on va l'appeler des humains, simplement.On hérite de PNG.
00:29:46 :Et donc,Ok.Qu'est-ce qu'on va mettre ?Je suis en train de me donner la soif.Bon, allez. Je ne suis pas inspiré.Avec son épée, c'est bien.
00:30:07 :Maintenant, au lieu d'aller modifier chaque module,vu qu'il utilise notre fabrique,on va faire quoi ?Humain. Et on va appeler la classehumain.Et du coup, ce qui est génial, là, c'est vraiment doublebénéfice parce quenormalement, il ne peut pas y avoir de problème puisquevous obligez la classe ici
00:30:35 :à hériter de PNG.Elles ont toutes cette interface commune.Ce qui est plus facile pour la suite du programme.Et en plus, toutes ces classesqui héritent de cette interface commune,vous les avez ici dans votre mapping, qui est super important.
00:30:53 :Et vous avez votre fabrique qui les gère.Elle, à la fabrique, elle s'en fout de savoir si c'est un elf, un nain, un roucaille, un humain.
00:30:59 :Elle va vous le sortir. Peu importe.Ça va prendre votre classe qui est iciet elle va vous l'instantier.Et comme ça, ici, vous ne faites plus rien. Là, tout fonctionne, c'est nickel.
00:31:11 :Il y a juste ici où on va aller rajouter aprèsdes classes.Donc voilà pour cette petite démo.Est-ce que ça a été utilepour certains ou est-ce que c'est largement utile pour les autres ?
00:31:28 :Dans la classe humain,il n'y a pas le return, en fait ?Ah oui, je n'ai même pas fait de returnou de print, d'ailleurs.
00:31:40 :Voilà, il y a le return. Excuse-moi.Est-ce que ça a été utile pour certainsou c'est du revu-revu ?Moi, c'est de la révision et de la translationen Python, c'est toujours bien. Merci.
00:31:55 :Eh bien, ça me fait plaisir quand même, tu vois.C'est de la révision, mais ça fait toujours du bien de revoir quand mêmedes choses comme ça.
00:32:04 :Les autres, vous avez déjà vu ça aussi,je pense.Ça, c'est un moment où vous venez au mentorat.Je ne sais pas.Jérémy, c'est de la révision.
00:32:19 :C'est que ça fait du bien de revoir.Je comprends mieux comme ça, en fait.Tu comprends mieux que Fyodor Danov, du coup.Non, mais...Voilà, c'est un exemple tout con, mais en faità petite échelle, on va dire.
00:32:37 :Mais là, au moins, votre codeest largement maintenable.Hier, je prenais l'exemple...Alors, pour ceux qui font du Django, c'est-à-direon va dire presque tout le monde, en fait, ici.
00:32:52 :Je regarde, mais en fait, tout le monde.Ce que je disais hier,vu que là,vous avez tous un niveau de fou.Pour la plupart, là, si je retournesur ce que j'ai finalisé aujourd'hui.
00:33:11 :Bon, c'est entre nous, ça, ici.Donc, c'est pas très grave.Alors, la vue, on s'en fiche.Membre, on s'en fiche.Panier, carte service.Donc, ce que je disais hier, tout calmement,c'est quelle vue, ça ? Je vais juste fermer ça
00:33:32 :et ouvrir ma vue.Voilà.Pour transposer un peu ce principede code maintenable,hier, j'ai commencé à en parler, mais je ne suis pas allé trop loin parce quej'ai posé une question à Eva, et Eva commence, doncc'était encore un peu trop abstrait pour elle.
00:33:53 :Genre, moi, ce que je disais, le problème,c'est que j'avais des...J'ai des problèmes sur une application où j'ai des utilisateursqui veulent passer commandealors qu'ils ne sont pas logués.
00:34:08 :Et j'en ai d'autres qui passent commande qui sont logués.Sauf que ceux qui passent commande qui sont logués,eux, ils ont un panierqui va se créer en base, réellement.
00:34:20 :Sauf que ceux qui ne sont pas logués, eux, ils n'ont pas de panier qui se crée en base.Le panier est rattaché à l'utilisateur.Donc, en fait, j'ai créé une classequi va me servir. C'est une grosse couche d'abstraction, ici, pour moi.
00:34:32 :Je me suis embêté de faire une classe assez complète.Si je vais avancer vite, voilà, elle fait 232 lignes, ma classe.232 lignes, mais j'ai bien des méthodes séparées.
00:34:41 :Donc, je renvoie les informations.Et à chaque fois, je fais bien attention, si la personne est authentifiée,je renvoie les informationsde la base donnée, sinon de la session.
00:34:53 :Parce que j'utilise la session Django.Je charge depuis la base donnée.Sinon, j'utilise ce qu'on appelle la session de Django.Tout le monde a déjà utilisé la session de Django, ou pas ?
00:35:05 :Non.Sans le savoir.Mais tu ne l'utilises pas directement.C'est parce qu'on est un peu dans le codede l'abstraction.Le fait de ne pas avoir à modifier 10 000 fichiersà chaque modification.
00:35:26 :Et en fait, toute logique de gestion de mes paniers,qu'on soit connecté ou non, elle est ici.Et à chaque fois, j'ai bien des actions.
00:35:35 :Par exemple, ici, je parlais de la session.La session, on la récupère avec request en session.Et on va pouvoir récupérer des informations dans la session.
00:35:44 :Là, en l'occurrence, le panier.A chaque fois, ainsi de suite.Si j'ajoute un élément au panier,je ne l'ajoute pas de la même manièreque si je suis connecté ou non.
00:35:59 :Si je suis connecté, j'utilise depuis la base donnée.Sinon, on va le faire directement.Et je vais utiliser un autre type de données.C'est une structure différente.
00:36:11 :Je vais faire un tout-dit.Si vous regardez bien, dans items ici,là, c'est une compréhension plus.Et la deuxième, je fais un retour.En fait, c'est la même structure que je renvoie.
00:36:26 :J'ai bien items, items.Total items, total price.Sauf qu'en fait, la façon de récupérer est complètement différente.Maintenant, ce que j'avais un gros souci, c'était dans les vues.
00:36:43 :Je partais à faire des vues,mais qui allaient faire trois kilomètres de long sinon.Et à dupliquer du code à chaque fois.Est-ce que je vais faire une vue pour les non-connecter ou pour les connecter ?
00:36:55 :Ça commençait à être compliqué.J'ai réfléchi à ça.L'IA était incapable de faire correctement ce que j'avais en tête.L'IA m'a sorti une fonction.Elle m'a fait une fonction géante.
00:37:10 :Le truc, c'était imbuvable.Imaginez une fonction qui fait quasiment plus de 200 lignes, ce n'est pas possible.Moi, ce que j'ai fait, c'est que j'ai créé la classe.
00:37:19 :J'ai créé toutes les méthodes d'avance.Je savais ce que j'allais faire dedans à peu près.Et après, j'ai dit, améliore-moi et corrige-la.Ce que tu veux. Et elle l'a fait.
00:37:31 :J'ai corrigé très peu de choses.Et maintenant, dans mes vues,je n'ai même pas de souci de vérifier s'il est connecté ou pas.C'est mon carton de l'heure que j'appelle qui a été là.
00:37:43 :Et qui va me renvoyer les données sous le format.Et qu'elle soit connectée ou pas, la personne, la vue, elle s'en fout.Pour tout. La vue, elle s'en fiche complètement.
00:37:52 :Voilà.Voilà un peu sur l'intérêt.Pour ceux qui commencent avec Django,si vous voulez en venir,vu qu'il est assez tôt, je définis un peu plus tôt le module ABC.
00:38:07 :Pensez à avoir des vues qui soientle plus courtes possible.C'est super important.Parce que moi, quand j'ai débuté,j'étais arrivé une fois, j'avais une vue qui faisait 100 lignes.
00:38:22 :Peut-être que moi je faisais du Python,un mois je faisais du Django.Donc là au moins, chaque fois mes vues, j'ai vraiment que ce dont j'ai besoin.
00:38:31 :Il vaut mieux qu'on fasse toutes les fonctionsdans un fichier à côté, et qu'on appelle ces fichiers dans la vue,que de les mettre dans la vue en fait.
00:38:40 :Ouais, exactement. Là j'appelle ma classe dans la vue.Et en fait, ce qu'il y a, c'est que la vue,elle n'a pas à savoirqu'un utilisateur soit connecté ou pas. C'est pas son rôle.
00:38:52 :Le rôle c'est à lui de gérer ça.Elle n'a pas de logique à gérer. C'est la logique qui va être gérée par ma classe.Elle veut juste que je renvoie les informations que je veux.
00:39:01 :C'est tout.Il faut créer des modules à côté pour pouvoir ça.Ou, ce que je fais le plus souvent,c'est de créer la blague de modules à côté.
00:39:13 :Je me sers beaucoup de mes modèles,et dans mes modèles j'ai pas mal de méthodes.Au lieu de le faire dans des vues, genre réserver le stock,et donc, si je vais dans mes modèles,par exemple, si je fais unà-toucher-plus-un,c'est pas ça, à-toucher-at-a-place ici.
00:39:34 :Voilà.Ici, c'est un élément de mon panier qu'on a vu dans le modèle juste avant.Réserve stock. Tout est lié.Réserve stock, c'est une méthode que j'appellede panier item.
00:39:49 :Donc, c'est que la logique, elle est vraiment dans les modèles,et dans les modules à part, et mes vues.Moi, j'ai que des infos que je dois renvoyer.
00:39:59 :Voilà.Voilà, c'est ce que je voulais vous montrer ce soir.J'avais prévu de faire ça en bonus,je vais vous montrer ce que j'avais fait cet après-midi.
00:40:11 :Le mec, il s'en fout, il voudrait pas que je montre tout son code,ça l'embêterait, mais c'est juste pour un calcul.Dans le panier,dans la vue ou dans le modèle,c'est question de choix principalement ?
00:40:26 :J'ai pas entendu le début.Si tu peux répéter depuis le début, j'ai pas entendu le début de ta question.La question de faire la logique dans la vue ou dans le modèle,parce qu'on peut le faire en deux endroits,c'est une question de choix par développeur,ou c'est vraiment plus une façon de faire de tous les développeurs ?
00:40:44 :J'ai vu des trucs de ouf,chacun fait comme il veut,mais il y a une règle qui te dit,je ne l'ai plus,je sais plus ce que c'est,c'est d'avoir les vues les plus petites possibleset que toute la logique soit dans les modèles.
00:41:05 :D'accord.Moi en plus j'utilise les modules,mais sinon c'est vraiment modèle en priorité,et après comme ça c'est UTG à ta logique,et c'est beaucoup plus mentionnable au final,parce que tu as juste une méthode à appeler,tu ne vas pas dupliquer du code dans les vues.
00:41:26 :Là tu vas juste appeler la méthode que tu as fait ici,réserve stock, tu vas la rappeler plus tard.C'est une convention qui est faite pour que ça soit fait correctement.
00:41:35 :Oui, complètement.On peut parler de design pattern,mais en fait, sans le savoir,plus tu vas organiser ton code pour que ça soit plus maintenant possible,et plus tu vas faire du design pattern,sans le savoir,après ça devient de la logique,plus ça va aller, plus tu vas apprendre à organiser ton code.
00:42:00 :Parce que si tu vas faire ça aussi,c'est qu'un jour tu vas sûrement vouloir prendre des missions pour des gens,tu vas avoir des...je ne sais pas s'il y en a qui ont déjà eu ce cas-là,mais reprendre des projets,le code tu vas le trouver affreux,et là tu vas dire non plus jamais, c'est pas possible.
00:42:22 :J'ai eu le cas il n'y a pas longtemps,clairement je lui ai dit le code je ne touche pas,si je refais vraiment tout à ma sauce.
00:42:31 :Des fois il vaut mieux repartir à zéro,que de refaire quelque chose qui n'est pas bon.Par exemple, tu as un module panier ici,une application panier,il y en a une application, j'ai déjà vu,où ils appelaient ça cartes,où tu avais une sous-application panier dans le panier,
00:42:53 :mais qu'en fait, s'ils avaient désactivé, ils n'avaient plus le code qui était dedans.Mais ils l'avaient gardé à l'intérieur,et en fait c'était un coup à se mélanger,il y avait une arborescence de fou,après ils avaient mis des applications Django,hors du projet Django,parce qu'à un moment il y a un développeur qui a bossé dessus,
00:43:15 :et qui a fait ça comme ça,et au final à chaque fois c'est à chaque mec qui venait,et qui faisait sa sauce,et qui essayait pas de faire le truc le plus maintenant possible.
00:43:27 :Les tests c'était un peu optionnel,je sais que tu lances les tests,moi je teste vraiment tout ce qui est critique,ça va être testé dans tous les cas.
00:43:39 :Donc là il est long,mais je pense que c'est parce que j'utilise PostgreSQL,et que normalement les tests passent en une seconde,et là je sais pas, ils chargent longtemps au début.
00:43:51 :Je regarde pourquoi, c'est peut-être à cause de mes settings.Ici, on va voir ce qu'il se passe.Voilà.Je sais pas, j'espère que ça vous a plu,en tout cas ce soir, que c'était pas trop barbant, trop du revue.
00:44:06 :C'était intéressant toujours.Intéressant.Je sais pas s'il y a des questions.Non, pas de questions,c'est cool de voir ça,et d'être effectivement alerté sur l'architecture du code,qui est peut-être le point essentiel pour bosser dans ce milieu.
00:44:27 :Ces projets-là, c'est vraiment ça qui...Je crois que le pire, c'est quand tu relis ton propre codedes mois après et que t'arrives plus à te relire.
00:44:36 :Ça fait mal.C'est pour ça qu'il faut pas éviter à l'époque,c'est pour ça qu'il faut pas éviter à commenter le code.Mettre même des commentaires qui nous paraissent inutiles,bien les mettre dedans, ça nous permet que si on reprendquelques temps après, on comprend ce qu'on a fait.
00:44:54 :Vas-y, vas-y.Les commentaires, c'est une chose, l'architecture, bien séparer.Moi j'ai vu un prof qui était carrément,si t'as un fichier de plus en ligne, déjà ça dégage.
00:45:06 :Bien séparer le code, etc.Bien nommer les fichiers, bien nommer les fonctions,bien nommer les classes, faire vraiment attention à tout ça,c'est même encore plus important que le commentaire.
00:45:18 :J'avais un prof qui disait, les commentaires,c'est en plus, c'est si les noms de fonctions, etc.sont pas assez parlants.Ou alors que ça fait un truc un peu spécifique,là tu commentes, mais si t'as besoin de commenter,c'est déjà qu'il y a une application spécifiquequi est déjà retournée par le nom de la fonction en elle-même.
00:45:39 :C'est intéressant la façon dont ils voient ça,mais moi j'ai vraiment cette tendance à mettre 1000 fichiers.Mais mes projets, ils font vraiment beaucoup de fichiers.
00:45:48 :C'est ce que tu as dit à l'instant,c'est que le code se commente de lui-même.C'est lui-même le commentaire.Normalement pas besoin de commenter.Après il y en a qui disent le contraire, qui disent que c'est très bien de commenter le code.
00:46:03 :J'ai toujours entendu un peu d'écho là-dessus.Moi je sais que je commente.Là, on t'entend un peu Baptiste.On t'entend un peu Baptiste.On t'entend, vas-y.
00:46:18 :C'était juste, je voulais intervenir, j'ai retrouvé mon micro.Mais oui, en fait, il y a deux écoles.Moi j'ai bossé avec des mecs qui spécifient que si tu n'es pas capable de comprendre le code,même avec des commentaires, c'est que t'es débile.
00:46:30 :Ça en commentaire c'est que t'es débile.Je pars du principe que tu as un petit commentaire de temps en temps, mais si t'en mets pas beaucoup,ça aide à la maintenabilité par la suite et à la reprise du code.
00:46:39 :J'avoue que j'en ai fait sur ma classe, même sur des vues,j'en ai pas mal sur des choses que je fais pour la première fois.
00:46:48 :Comme ça les concepts je les imprime mieux.On a un peu chacun notre façon de coder.Par exemple sur Django, il y en a qui font,comme on peut faire à plusieurs endroits la même chose,des fois je trouve que de mettre un commentaire,ça peut être bien de se dire pour pouvoir repérer
00:47:11 :que c'est bien qu'on a mis à cet endroit-là la chose.Je ne sais pas comment l'expliquer,mais pour bien savoir où chaque chose se trouve,pourquoi on a mis ce code-là et pas un autre.
00:47:23 :Oui, je suis d'accord.Antoine, tu faisais plein de fichiers,j'ai tendance moi aussi à en faire beaucoup.Oui, moi je fais plein de fichiers,même si c'est des fichiers de 10 ou 30 lignes,mais ça me permet déjà de faire des imports,ce qui est quand même assez pratique et lisible je trouve.
00:47:45 :Ensuite ça dépend aussi, je crois que c'est ce que je te disais l'autre jour,ça dépend du framework dans lequel tu travailles,dans lequel tu as étudié,Symfony j'ai l'impression que la séparation de codesest vraiment mise en avant de tous les côtés,du coup on t'invite à faire beaucoup de fichiers en réalité,
00:48:04 :et ils sont même faits de base,avec Symfony tu crées des trucs avec les lignes de commande,ce qui est très pratique,mais du coup ça fait vraiment des petits fichiers hyper lisibles.
00:48:16 :Moi j'ai appris ça comme ça et c'est vrai que ça me fait du bien.Quand je suis passé sur des projets Next.js notamment,qui n'ont pas un cadre ni des conventions très claires,je suis arrivé sur des gars qui avaient des fichiers de 500 lignes,et là il y avait une certaine envie de m'ouvrir les veines,
00:48:31 :juste pour essayer de comprendrece que le mec voulait faire dans son fichier,ça me prenait des heures de lecture et de compréhension.Et même avec des commentaires en fait,il y en a tellement que ça te prend la tête.
00:48:46 :Alors qu'un petit fichier court, bien construit,mais bon, voilà.Et puis l'organisation du code,pour les employeurs en plus, pour travailler en entreprise,je trouve que ça joue beaucoup.
00:49:01 :On m'a déjà demandé des projets,et en fait ça a beaucoup fait jouer la balance pour moi,l'organisation du code. C'est hyper important.Ben nickel.
Aucune occurrence trouvée pour « ».
00:02:51
Découverte rapide de ngrok
00:05:09
classes abstraites et ABC
00:17:19
Problème sans Factory/Fabrique
00:24:06
Avec une Factory/Fabrique
00:33:02
Discussion autour du code propre