- Nouveau
- Tendances
- Classement
-
Tagsnewsletternewsletter46devdev45bonnes-pratiquesBonnes pratiques43phpPHP36programmationprogrammation34veilleVeille15teletravailTélétravail15architectureArchitecture13tddTDD13agiliteAgilité12javascriptJavaScript12design-patternDesign Pattern12codeCode11devopsDevOps10laravelLaravel9conferenceConférence8carriereCarrière8front-endfront-end7retour-d-experienceRetour d'experience7formationFormation6entreprenariatEntreprenariat6gitGit6cultureCulture6clean-codeClean Code6youtubeYoutube6craftCraft5refactoringrefactoring5videoVidéo5interviewinterview5organisationOrganisation5podcastPodcast5code-legacyCode Legacy4compagnonCompagnon4dddDDD4testingTesting4freelancingFreelancing4tech-leadTech Lead4optimisationOptimisation4javaJava3pythonPython3iaIA3humourHumour3reactReact3ethiqueEthique3emploiEmploi3ecologieEcologie3reconversionReconversion3debutantDébutant3remoteremote3cqrsCQRS3covid-19Covid-193securiteSécurité3retrospectiveRetrospective3clean-architectureClean Architecture3ci-cdCI/CD3vue-jsvue.js3blogBlog3architecture-hexagonaleArchitecture Hexagonale3rustrust3performancesperformances3nodejsNodeJS3programmation-fonctionnelleProgrammation fonctionnelle3productivteproductivté3slackSlack2donnees-personnellesDonnées personnelles2ecosystemeEcosystème2pair-programmingPair programming2evenementÉvènement2personal-brandingpersonal branding2produitProduit2gestion-du-tempsGestion du temps2changelogChangelog2cercleCercle2green-itGreen IT2hexagonalehexagonale2vscodevscode2pooPOO2webWeb2tinydbTinyDB1algorithmealgorithme1alignementAlignement1originesOrigines1dbDB1vie-priveeVie privée1androidAndroid1ctoCTO1apiAPI1csscss1restREST1pedagogiePédagogie1coup-de-gueuleCoup de gueule1vision-systemiqueVision systémique1prodprod1atddatdd1audioAudio1autonomieAutonomie1visualstudiovisualstudio1cloudCloud1vite-jsvite.js1slow-techSlow.tech1avenirAvenir1bddbdd1chansonChanson1bffBFF1blazorblazor1ports-and-adaptersPorts and Adapters1queerQueer1goGo1graphqlGraphQL1hibernatehibernate1hommageHommage1net.NET1mvcmvc1ideide1inclusionInclusion1ingenieurieIngénieurie1mutation-testingMutation testing1minimalismeMinimalisme1systeme-de-queueSystème de queue1jobjob1langagelangage1sqlSQL1licorneLicorne1livelive1lowtechLowTech1maisonMaison1buildbuild1theorie-des-contraintesThéorie des contraintes1devtoolDevTool1diversiteDiversité1dockerdocker1dojoDojo1open-sourceOpen Source1onlineonline1energieEnergie1entrainementEntrainement1thematuredevTheMatureDev1entretienentretien1entretien-d-embaucheEntretien d'embauche1event-sourcingEvent sourcing1extreme-programmingeXtreme Programming1flowflow1flowconFlowcon1react-nativeReact-Native1springbootspringboot1testtest1microsoftmicrosoft1
- Mes favoris
- Recevoir par email
- Partager un lien
POO
Quelques règles simples pour écrire vraiment en objet.
Certaines me paraissent un peu trop drastique, qu'en pensez-vous ?
Partagé par Steeven Ramaheridianina
il y a plus de 3 ans
Je vais citer l'article de William Durand:
"Object Calisthenics are programming exercises, formalized as a set of 9 rules invented by Jeff Bay in his book The ThoughtWorks Anthology. The word Object is related to Object Oriented Programming. The word Calisthenics is derived from greek, and means exercises under the context of gymnastics. By trying to follow these rules as much as possible, you will naturally change how you write code. It doesn’t mean you have to follow all these rules, all the time. Find your balance with these rules, use some of them only if you feel comfortable with them." - William Durand williamdurand.fr/...
Les règles sont effectivement difficiles à suivre dans la vie réelle sur tout une base code de production, cependant, c'est un bon exercice pour se rappeler d'éviter certaines mauvaises habitudes.
Ca peut-être un challenge qu'on se donne avec son pair pour certaines features, tout comme se dire qu'on essai de développer une feature en utilisant les paradigmes fonctionnels :p
Pour ma part je trouve que la plupart sont assez simple a suivre, la plus dure serait pour moi les classes de 50 lignes maximum!
Et ensuite :
No classes with more than two instance variables.
No getters or setters.
Un collègue m'a dit que pour lui c'était une "reformulation assez précise des principes Clean Code avec une pointe de DDD".
Je suis assez d'accord dans le sens ou ça permet d'avoir un code lisible ou on capte l'intention et où chaque méthode à un seul niveau d'abstraction à la lecture.
J'ai voulu partagé car, je n'ai malheureusement pas souvent vu du code qui se lit comme "well-written prose" (pour citer Uncle Bob); et je pense qu'en suivant ces quelques règles ça pourrait aider.
Je ne connais pas bien les paradigmes fonctionnels , il faudrait que je liste la ressource : compagnon.artisandeveloppeur.fr/....
Je suis d'accord avec toi et ton collègue sur le fait que c'est un superset de règles allant dans la direction des principes Clean Code.
Quand je parle de vie réelle, je parle de code d'entreprise. La ou dans un exercice, les règles sont données par le contexte de l'atelier, dans un contexte d'entreprise, les règles sont données par le métier.
Je me vois difficilement dire à un expert du domaine, désolé votre dossier (agrégat) ne peut pas "contenir" un client en plus, car il y a déjà un deux référence vers d'autres instances (produit, etc.).
Aussi, ce qui concerne la lisibilité, il faut faire attention. Quand je lis un livre, il n'est pas coupé en plein de petits bouts de papier (fichiers). Je me vois mal faire un "go to reference Paragraphe", tout en arrivant à suivre le fil de l'histoire.
Certains d'ailleurs critiquent les principes SOLID, car cela amène à découper (trop a priori) au détriment de la lecture (si on compare avec du bon procédural). Je ne suis pas de cet avis, évidemment, il est toujours bon de challenger intention et lisibilité vs découpage.
Dans mon quotidien, je t'avouerai que la plupart des règles sont appliquées, mais pas de manière extrêmement formelle qui ferait casser un build. On applique ces règles avec bon sens pour correspondre au mieux au métier en s'appliquant à obtenir une bonne lisibilité et des intentions claire et honnête.
C'est tout le but de l'exercice ! S’entraîner pour goutter aux bienfaits des principes Clean/SOLID, etc., et pouvoir les appliquer au maximum tous les jours :D
C'est un plaisir d'échanger là-dessus avec toi :)
Moi qui suis plus débutant que vous, je trouve qu'il manque un "pourquoi", à l'article.
Exemple : "First Class Collections".
Ok, ça à l'air super mais pourquoi ? Ne me jugez pas trop sévèrement si je suis passé à côté.
Sinon l'article est vraiment cool, beaucoup d'exemple et contre-exemple, c'est génial.
La plupart du temps le pourquoi c'est pour améliorer la lisibilité du code.
Pour l'exemple de "First Class Collections";
Le but est de révéler l'intention métier lié à la collection.
Dans l'exemple on voit bien que
public function getNumberOfSubscriberWhoOpen()
{
return $this->subscriberCollection
->getSubscriberWhoOpen()
->count();
}
révèle l'intention et permet d'abstraire la plomberie technique.
Une source primaire : williamdurand.fr/...
Edit : l'article mentionne ces informations.
""
Object Calisthenics are programming exercises, formalized as a set of 9 rules invented by Jeff Bay in his book The ThoughtWorks Anthology. The word Object is related to Object Oriented Programming. The word Calisthenics is derived from greek, and means exercises under the context of gymnastics. By trying to follow these rules as much as possible, you will naturally change how you write code. It doesn’t mean you have to follow all these rules, all the time. Find your balance with these rules, use some of them only if you feel comfortable with them.
""
On peut par exemple restreindre la collection à l'insertion mais pas à la suppression.
En java, par exemples les collections sont mutables par défaut. Par ex l'interface List expose des méthodes pour ajouter ou modifier des éléments.
La surface d'attaque et les risques de régressions sont augmentées quand les collections ne sont pas wrappées.
Wrapper les collections peut aussi inciter le développeur à nommer le contrat de sa classe (DDD , ubiquitous language).
Ex.
// primitive collection just do collection stuff
shoppingCartItems.add(product);
shoppingCartItems.add(product);
// wrapped collection can be extended with domain semantic and behaviour
shoppingCart.add(product, 2);
shoppingCart.applyDiscountCode("COMPAGNON");
Dans le 2ème exemple la logique d'appliquer un discount n'est qu'à un seul endroit (à l'intérieur de la clases ShoppingCart). Si on manipulait une collection primitive dans tout l'appliacation, cette responsabilité serait déléguée aux clients de la collection qui pourraient faire n'importe quoi avec (leaky abstraction en.wikipedia.org/...