Je n’expliquerai plus les CBV


Les Class Based Views sont des vues génériques réutilisables qui permettent de faire automatiquement des tâches courantes dans Django comme :

  • Récupérer et afficher une ou plusieurs entrées en base de données.
  • Afficher et valider un formulaire.
  • Faire un mix des deux pour modifier des entrées en base.

Je ne les ai jamais aimées. Avant, les vues génériques étaient sous forme de fonction, simples, pratiques, c’était parfait. Et ça a été retiré du framework pour des versions OO sous prétexte que c’était plus flexible.

Maintenant, ce sont ces gros tas immondes, avec un ordre d’appel de méthodes complexes, des mixins dans tous les sens et une chaine d’héritage velue.

Je pense que c’est une bonne occasion pour rappeler que la POO n’est pas faite pour être utilisée partout, tout le temps. Aucun putain de paradigme de programmation n’est fait pour être utilisé partout, tout le temps. C’est pour ça qu’il y en a plusieurs.

Dans notre cas des CBV, la conséquence est que c’est un enfer pour expliquer tout usage qui ne soit pas un hello world, ce que la doc se garde bien de faire.

Après il y a toujours un malin pour dire “mais si tu vois tu fais ça, et ça, ça prend 5 lignes, c’est pas si dur”. Ouai, maintenant va expliquer ça à un stagiaire, et donne lui un exercice avec une form view qui doit modifier un objet, le lier à un user seulement si il a la permission de le faire. Juste pour voir en combien de temps il trouve. Je vais en WE à Barcelone en attendant. Je prévoie une extension à Rome pour quand il devra relire son code le trimestre prochain.

Et si encore c’était pour un gain de productivité évident, je fermerais les yeux. Mais c’est pas le cas. Même moi qui sait utiliser ces… ces choses… je dois regarder dans la doc à chaque fois que j’en utilise une. Et ensuite quand je relis mon code quelques mois plus tard, je chope de pattes d’oies aux coins des yeux.

If you have to refer to the documentation every time you use a module, find (or build) a new module.

Dixit Kenneth Reitz, le mec qui a pondu requests. Donc on va user something else que les CBV, si vous le voulez bien.

Un lecteur m’a (encore) pointé du doigt qu’un schéma du MRO et de l’ordre d’appel des méthodes serait utile. Vous vous rendez compte du truc ? On peut comprendre l’ORM sans schéma alors que c’est une machine de guerre, et il faut une carte pour comprendre comment faire un listing un peu custo avec une CBV ? J’ai évalué la somme de travail pour faire ledit schéma, et elle est énorme : trop de classes, trop de méthodes, trop de subtilités.

Bref, je jette le tablier, fuck les CBV. Je ne les inclurai plus dans mes formations, mes tutos, mes aides sur les forums, etc.

17 thoughts on “Je n’expliquerai plus les CBV

  • foxmask

    Ca te fera pas reviendre en arrière meme avec ça http://ccbv.co.uk/, mais je le pose là au cas où (thx SpoutBe;) – Sinon gros + 1 (sans vouloir faire de la lêche :P) quand on voit que je mets (quasiment) une ligne de commentaire par “if” ; c’est pas que j’ai peur de plus savoir ce que j’ai voulu dire dans 1 mois ; mais j’ai bien quand c’est clair.

    apres j’aime bien les trucs magiques aussi :)

    while(<>) { print ; }
  • mdupuy

    dans le même genre que ccbv, y’a django-vanilla-views, par le même petit génie qui nous a déjà pondu django-rest-framework, Tom Christie : http://django-vanilla-views.org/.

    Après, j’ai essayé aucun des deux, je suis resté au function based views

  • labrut

    Salut,

    Hum! Dans django rest framework, il y aussi les CBV. est-ce le meme probleme ?

    (clavier querty)

  • doublepenetrationalale

    Je suis entièrement d’accord avec vous et je voulais que ça se sache.

    Les CBV c’est un truc de terroriste (c’est à la mode ce mot alors je l’utilise à fond les gamelles).

    D’ailleurs faudrait proposer un amendement à la loi sur le renseignement pour interdire les CBV comme c’est un truc pour terroriser les apprenants (ça aussi c’est un beau mot de management moderne des entreprises apprenantes).

    Je vous laisse, mes gentils collaborateurs (encore un super mot d’entreprise), restez proactif (putain encore un, je suis trop fort niveau corporate).

  • Sam Post author

    @labrut : drf utilise les CBV pour générer une API; django utilise les modèles pour générer des formulaires. On y gagne donc beaucoup plus: archi de routing, sérialisation automatique, auto linking… L’utilisation de l’OO permet un style déclaratif dans la création de son API. Dans ce cadre là, l’effort mis à écrire et maintenir ces classes possède un bien meilleur retour sur investissement. Par ailleurs, former quelqu’un à faire une bonne API est aussi long que de le former à utiliser ce système car apprendre à quelqu’un à prendre en compte les mime types, les headers, les subtilités de la sérialisations, etc, c’est long.

  • batisteo

    par le même petit génie qui nous a déjà pondu django-rest-framework, Tom Christie

    Tiens, j’ai pris un café avec lui jeudi dernier ;)

  • un_pauvre_stagiaire

    Hahaha je suis un de ces petit stagiaire justement qui s’est retrouvé à faire son petit mix perso “FormMixin/ProcessFormView/DetailView”.

    Il m’a fallu 1 semaine et https://ccbv.co.uk/ pour trouver une solution propre et générique ….

  • Raphi

    Ce que j’aime bien avec les CBV, c’est que ça résume assez bien mon avis sur l’OO en général.

    Ca peut simplifier énormément (certaines) chose, ça peut permettre de gagner en flexibilité, et tout plein d’autres trucs chouettes… Mais toujours au prix d’une complexité plus élevée (sans aller jusqu’au festival de mixins: Ma belle ListView déclarative, j’suis content d’l’écrire en deux lignes, mais en tombant dessus comme ça par hasard, je n’ai AUCUNE idée de ce qui s’y passe. Et si j’veux la custom sur un cas juste un peu pas courant, va falloir que j’comprenne comment les classes mères fonctionnent si j’veux piger pourquoi mes surcharges sont pas appelées dans l’bon ordre… (Et moi qui pensais qu’en OO on était censé s’en foutre de l’implémentation, tiens)

    Au final, je les aime assez perso, et j’ai plutôt tendance à démarrer avec elles. Ca m’arrive même d’arriver à les exploiter pas trop cradement pour faire des trucs un peu génériques. Par contre, ca m’arrive aussi souvent de créer des monstres, et c’est seulement à force de creuser ccbv.co.uk ou le code que j’ai fini par retenir les bases et les apprécier. C’est sur qu’une bonne veille fonction, même si tu te répète un peu plus, au moins tout est clair, t’as ton entrée, ta sortie, et toute ce qui se passe entre les deux en pleine vue. Quand à coté de ça t’es rendu a surcharger 25 methodes et ajouter des hacks sur le dispatch de ton listing, il est temps de revenir à quelque chose de moins tordu…

    Je crois que c’est ça le truc (en tout cas pour moi): Commencer avec quand les vues sont super simples en les traitant un peu comme un joujou magique qui permet de démarer le projet rapidement, mais ne surtout pas hésiter à revenir vers une bonnes vieille FBV des que ca devient plus poilu (la définition de poilu variant selon le niveau et / ou la tolérance à la masturbation). C’est pour ça que j’m’en fous qu’ils aie viré les vues génériques versions fonctions: Quand tu arrive au stade ou c’est galère, tu fini par réécrire ta propre finction de tout façon ^^

  • rakweine

    CBV par ci … par là on dirait un diné de fenient.

    ça fait deux années que je code avec django en particulier, je me servais de python avant ça.

    Bien s’il y’a un point à donner à la suite du commentaire de sam c’est juste que les CBV sont complexe et que l’ordre de complexité n’est pas déterminé par les codeurs de django mais plutôt par le codeur qui s’en sert.

    Je pense qu’il faudrait reconnaitre le très profonde faiblesse de certains codeurs python qui quant on parle des CBV sont près à …

    les CBV c’est très très très très bien, elles force à mieux comprendre l’ordonnancement de certains process lié même à django, elles accélèrent considérablement le coding, etc…

    les informaticiens sont particulièrement fenient et egoistes, quant je suis tombé sur ce forum en recherchant justement le fameux MRO pour une listView par exemple ce n’est qu’une séconde plus tard que je me suis rendu compte de la nature et du poids de ma questions (il y’a des chance de comprendre les principaux points clé de django grâce au CBV).

    Un programmeur chevronné bossera sur django des années sans forcement avoir besoin des CBV, il se trouve que django ça evolu, donc pour un novice il faudra plus d’acharnement et de travail, et je le dis je l’assume:<>

    Je m’attendais justement à ce type de commentaire un peut bancal et normal quant on vois les chose de près, c’est pas evident de donner la vie quand on est pas Dieux, encore moins d’accorder une grace si petite soit-elle quant on est pas Dieux.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.