Les modèles de conception sont-ils mal vus?

135

J'ai eu une discussion avec l'un de nos développeurs principaux qui travaille dans le secteur depuis 20 ans. Il est assez connu en Ontario pour un blog qu'il écrit.

Ce qui est étrange, c’est ce qu’il m’a dit: il a dit qu’il est difficile de travailler avec un morceau de code parce qu’il a été écrit à partir d’un manuel, et qu’il ne rend pas compte du monde réel. L'ajout d'un nouveau champ à la couche interface utilisateur / base de données / données prend de 2 à 3 heures, alors que dans son code, cela prend 30 minutes.

De plus, il évite les schémas de conception car la plupart des programmeurs ne les comprennent pas et ne sont pas bons du point de vue de la maintenance.

Il y a aussi l'idée que la plupart des développeurs Web au Canada préfèrent que leur modèle de données hérite des classes de couche de données plutôt que de le garder isolé. Je lui ai demandé: "N'est-ce pas une norme industrielle de séparer le modèle de la couche de données?" Il a dit parfois, mais la plupart des gens ici préfèrent ne pas le faire parce que c'est trop de travail.

Il semble que son raisonnement pour ne pas coder en utilisant les meilleures pratiques est parce que c'est un cauchemar de maintenance, peu de nos employés le comprennent (à part moi), et il est lent à travailler avec si vous avez besoin de développer de nouvelles fonctionnalités ou de nouveaux champs dans quelques jours. temps.

C'est tellement étrange d'entendre une telle opinion, sachant que Stack Overflow encourage principalement les utilisateurs à suivre les normes de l'industrie. Est-ce que le problème que nous sommes constamment obligés de créer de nouveaux champs et de nouvelles fonctionnalités en quelques jours ne nous permet pas de déduire un modèle solide qui est suffisamment flexible? Cela semble être l'essentiel de ce que je comprends de cela.

Que faites-vous de ces déclarations?

Igneous01
la source
67
Personnellement, je suis nerveux à l'idée de "meilleure pratique" (sans justification) car cela signifie généralement "je ne sais pas pourquoi c'est une bonne idée mais je veux que vous le fassiez quand même; fin de la discussion"
Richard Tingle
34
norme de l'industrie, modèle de conception et meilleures pratiques ne sont que des termes pour "Ce que quelqu'un a dit fonctionne mieux dans son contexte, donc il en va de même pour le vôtre aussi. Probablement. peut-être". votre développeur senior a raison.
CptEric
86
Cela n'a rien à voir avec Agile.
Courses de légèreté en orbite
68
"senior mvc developer" "Les modèles de conception sont mauvais" la dissonance cognitive
Dan Pantry

Réponses:

239

Ce sont les mots de quelqu'un qui a réussi et qui ignore les personnes qui essaient de lui dire quoi faire dans un jargon de motif qu'il ne comprend pas.

Les modèles de conception et les meilleures pratiques ne sont pas la même chose. Certaines personnes pensent qu’elles le sont et poussent les gens à savoir ce qu’ils font comme des fous. Même s'ils ne connaissent pas le nom exact de ce qu'ils font.

Les modèles de conception existaient avant qu’ils n’aient des noms. Nous leur avons donné des noms pour en parler plus facilement. Un motif qui porte un nom n'en fait pas une bonne chose. Cela en fait une chose reconnaissable.

Ce mec utilise probablement des schémas dont aucun d'entre vous n'a jamais entendu parler. C'est bien, jusqu'à ce que vous ayez besoin de lui parler de la façon dont quelque chose est fait. Soit il va devoir apprendre à vous parler ou vous allez devoir apprendre à lui parler. Cela n'a rien à voir avec qui a "raison".

confits_orange
la source
12
D'accord, avec l'avertissement que, lorsque la plupart des gens utilisent le terme «modèles de conception» de nos jours, ils font généralement référence à la bande des quatre .
Robert Harvey
35
Bon et j'aime utiliser l'anglais, cela me semble logique. Je ne sais pas pourquoi les français mettent si longtemps à l'adopter. Jusque-là, je vais en apprendre un peu plus sur ce système métrique dont on me parle régulièrement.
candied_orange
6
Ce n’est peut-être pas qu’il ne comprend pas, c’est peut-être aussi qu’il comprend mais il sait que tout ne s’applique pas dans toutes les situations.
Whatsisname
148
"Un motif qui porte un nom n'en fait pas une bonne chose. Cela en fait une chose reconnaissable." Oh mon dieu c'est le meilleur résumé du problème que j'ai jamais entendu parler: D
Courses de légèreté en orbite
7
@JanDoggen Ils sont appelés modèles (anti) parce qu'ils sont également des modèles courants dans le développement de logiciels (dont certains sont liés à la conception).
JAB
95

De nombreux modèles de conception, du type de ceux que vous et votre ami décrivez, ne sont en réalité que des solutions de rechange aux lacunes des langages de programmation . Utilisez un langage de programmation plus expressif et la plupart des besoins en modèles de conception disparaissent.

Parce que de bons modèles de conception sont nécessaires pour répondre à de nombreux scénarios d'utilisation possibles, ils ont tendance à être sur-conçus. Un code trop sophistiqué a un coût: vous devez le lire, comprendre ce qu'il fait et comprendre comment il fonctionne dans le contexte de l'ensemble du système logiciel. Par conséquent, comme pour toute autre technique de développement logiciel, vous devez évaluer la technique par rapport au coût d'utilisation de la technique et décider si les avantages sont supérieurs au coût.

Toutes choses égales par ailleurs, moins de code est toujours préférable. Je suis passé par des architectures en couches où vous devez littéralement faire trois à six sauts dans plusieurs projets pour trouver tout code intéressant, c'est-à-dire un code qui accomplit réellement autre chose que d'ajouter des frais généraux.

Les modèles logiciels bien connus sont supposés vous donner un vocabulaire commun permettant de communiquer des stratégies de conception. Malheureusement, de nombreux développeurs de logiciels ne comprennent pas suffisamment le vocabulaire des modèles de logiciels pour l'appliquer correctement à leurs problèmes de programmation. Les développeurs inexpérimentés considèrent que ces modèles relèvent du domaine des experts; ils veulent être vus comme des experts et essaient donc d'apprendre et d'appliquer les modèles trop tôt, avant d'être prêts. Au lieu de cela, ils devraient plutôt se concentrer sur l'apprentissage des principes fondamentaux de la programmation, puis sur le problème que chaque modèle résout eux-mêmes. S'ils le font, ils seront beaucoup mieux placés pour comprendre et appliquer les modèles correctement.

Robert Harvey
la source
19
Eh bien, le problème est différent de celui que vous décrivez dans votre question. La boutique dans laquelle je travaille actuellement est la preuve vivante que vous pouvez être agile tout en conservant un code très propre et facile à gérer, mais ce n’est pas l’entreprise habituelle, des éléments à plusieurs couches que vous voyez dans la plupart des boutiques Java, "non standard" dans son approche. Nous n'avons pas un an pour créer des applications de la manière "entreprise".
Robert Harvey
34
@ Igneous01: Notez que ce qu'un professeur qui n'a jamais eu d'expérience dans le monde réel considère comme "bon" peut être radicalement différent de ce qu'une entreprise essayant de gagner de l'argent considère comme "bonne".
Robert Harvey
8
"Malheureusement, de nombreux développeurs de logiciels ne comprennent pas suffisamment le vocabulaire des modèles de logiciels pour l'appliquer correctement à leurs problèmes de programmation." C'est moi en quelques mots. =) Les quelques-uns dont j'ai vu les noms, j'ai un temps extrêmement difficile à repérer une réelle mise en œuvre. J'ai probablement écrit des blocs de code que l'on pourrait classer comme implémentant des modèles, mais je ne saurais vous dire lesquels. J'en suis venu à penser que les modèles sont beaucoup moins importants que le code déchiffrable et que les exigences ne changent que si quelques emplacements de code seulement.
Jpmc26
35
Bien que je sois objectivement contre "moins de code, c'est toujours mieux" parce que je sais que cela conduit à un code qui ressemble à un brainfuck , je suis d'accord avec enthousiasme avec le point "modèle vacabulaire". Ne vous plaignez pas du fait que mon code est de la merde simplement parce que vous ne le trouvez pas dans votre manuel. Il y a de très bonnes raisons d'appeler ma merde de code, mais ce n'est pas l'une d'elles.
candied_orange
23
"Un code qui accomplit réellement autre chose que d'ajouter des frais généraux" - Je pensais que l'objectif des logiciels d'entreprise était qu'il ne devrait y avoir aucun code qui accomplisse réellement quoi que ce soit . Tout comportement réel du logiciel devrait être soit une propriété émergente de la conception en couches, soit un code basé sur des règles de gestion que le code traite comme des données. Je ne plaisante qu'à 50%.
Steve Jessop
86

Stackoverflow.SE et Programmers.SE encouragent principalement les utilisateurs à suivre les meilleures pratiques telles que SOLID, et non les normes de l'industrie . Et croyez-le ou non, le standard de facto de l’industrie est souvent l’ architecture de la "grosse boule de boue" - au sérieux.

Mais pour répondre directement à votre question: le problème des modèles de conception est similaire à celui de l’héritage - de nombreux développeurs médiocres en abusent, ce qui présente un risque certain de créer un code trop ingénieux et difficile à maintenir. Mais la solution à cela est sûrement de ne pas éviter ou interdire complètement l'utilisation de modèles de conception (ou d'héritage), la solution consiste à apprendre à utiliser ces outils dans des situations où ils ont un sens, et seulement là. Et cela est totalement indépendant de travailler "agile" ou non.

Doc Brown
la source
Je pense que la spécificité de votre affirmation "le problème des modèles de conception est similaire à celle de l'héritage - de nombreux développeurs médiocres en abusent" est inutile ... avec tous les aspects de la programmation, un développeur mal éduqué à la bonne utilisation de quelque chose peut et souvent va en abuser et écrire un code sous-optimal. Cela pourrait être considéré comme un axiome du développement en général.
Jeremy Holovacs
1
@ JeremyHolovacs: pas exactement. Le problème que je vois est que même les développeurs instruits en abusent. J'ai trop souvent vu des solutions dans lesquelles des développeurs expérimentés essayaient de résoudre un problème avec un motif qui "correspondait", mais qui ne convenait pas.
Doc Brown
45
  1. Les modèles de conception ne sont que des noms utilisés pour communiquer des idées. Je me suis souvent retrouvé en train de faire des choses qui plus tard, j'ai trouvé un nom. Ainsi, il n'y a pas de "voie de modèle de conception" par opposition à une "manière de motif non de conception".

  2. Les modèles de conception sont des lignes directrices. Comme tout, chacun d’entre eux présente des avantages et des inconvénients. L'important n'est pas d'apprendre le modèle et de l'appliquer où bon lui semble, mais bien de comprendre l'idée du modèle, ses avantages et inconvénients, et de l'utiliser pour trouver l'inspiration pour la solution à votre problème.

  3. Toute bonne pratique ou directive peut être ignorée s'il existe une raison suffisante. Les raisons valables incluent le temps de développement et les attentes de l'application. Par exemple, je suis conscient du fait que c’est mauvais d’utiliser des valeurs en dur (exemple stupide), mais pour une preuve de concept, les avantages peuvent être supérieurs aux coûts (dans ce cas, principalement le temps de développement). Cependant, si une telle décision est prise, cela pourrait se retourner et, à un moment donné, une refactorisation pourrait être nécessaire.

Paul92
la source
5
RE: numéro 1, oui, j'ai été là - j'ai inventé le modèle de modèle. Je ne l'ai tout simplement pas fait en premier. Ou quelque chose comme premier.
Grimm The Opiner
29

Pour ajouter une autre métaphore à la soupe, les modèles de conception sont Clippy, l’aide de Microsoft Office. "Vous semblez faire la même chose pour tout un tas de choses. Puis-je vous aider avec cela en vous offrant Itérateur ou Visiteur?"

Une bonne description de ces schémas indiquera quand il est utile de faire quelque chose de la même manière que plusieurs fois auparavant, quelles erreurs vous ferez lors de votre première tentative et quels moyens courants ont été trouvés pour les éviter. . Vous lisez donc le motif (ou vous le relisez de mémoire) et vous poursuivez votre travail. Ce que vous ne pouvez pas faire, c'est vous contenter d' utiliser Clippy et des sorciers.

Les personnes inexpérimentées peuvent se tromper et écrire du code qui ne tient pas compte de la réalité, c’est quand elles pensent que leur liste de modèles de conception est une liste complète de toutes les approches possibles pour résoudre les problèmes de logiciels, et essayer de concevoir du code en reliant les éléments de conception. motifs jusqu'à ce qu'il soit fini. Une autre tactique médiocre observée à l’état sauvage consiste à insérer un motif de conception dans une situation à laquelle il ne convient pas vraiment, étant donné que le motif de conception est "la meilleure pratique". Non, cela peut ou peut ne pas être la meilleure pratique pour la classe de problèmes qu’il résout réellement , mais ce n’est certainement pas une bonne pratique pour les problèmes qu’elle ne résout pas, ou pour les problèmes qu’elle résout uniquement en introduisant une complexité inutile lorsque la solution est plus simple .

Bien sûr, il est également possible pour une personne d’éviter une tendance sur la base de YAGNI, puis de réaliser qu’elle en a vraiment besoin et de tâtonner pour trouver la solution normale. Cela est généralement (mais pas toujours) pire que de répondre à l'exigence dès le début. C'est pourquoi, même dans le développement agile, il est frustrant de constater que des exigences totalement prévisibles ne sont pas découvertes à l'avance. Je ne pouvais pas être le seul programmeur C ++ à être très amusé par le fait que Java a initialement rejeté les conteneurs génériques comme étant inutilement complexes, puis les a réintégrés plus tard.

Il est donc presque certainement une erreur d’éviter d’écrire un Iterator par principe car vous préférez éviter les motifs de conception.

L'ajout d'un nouveau champ à la couche interface utilisateur / base de données / données prend de 2 à 3 heures, alors que dans son code, cela prend 30 minutes.

Vous ne pouvez pas vraiment discuter avec ça: par cette métrique, son design est bien meilleur que l’autre. Je ne pense pas que ce soit parce qu’il a évité les modèles de conception, mais je pense que c’est plus probable parce qu’il a considéré les bons problèmes du «monde réel» lorsqu’il a été conçu, et qu’il est plus avantageux de faire de l’expérience que de posséder un manuel et des idéaux élevés.

Il a donc reconnu que tout modèle nécessitant que vous touchiez différents points du code pour ajouter un champ constitue un mauvais modèle pour le travail. "Facilitez l'ajout de champs", et il n'a pas utilisé ces modèles. Les architectures en couches peuvent en effet souffrir à cet égard, et il est faux d’utiliser des modèles de conception sans en apprécier les inconvénients.

Par contre, combien de temps faut-il pour écrire une nouvelle interface utilisateur dans sa conception, et combien de temps faut-il pour une architecture en couches? Si le projet l’avait appelé à constamment créer et déployer de nouvelles interfaces utilisateur sur un modèle de données fixe, au lieu d’ajouter constamment des champs, il espérait qu’il aurait conçu cette solution à la place. Ou bien aussi. Mais malgré tous ses avantages, dire "nous faisons preuve d'agilité" ne signifie malheureusement pas que vous n'aurez jamais à faire d'autre compromis!

La sélection dans un menu de modèles de conception peut certainement vous empêcher de penser aux préoccupations les plus importantes. Mais reconnaître le moment où vous écrivez un visiteur, et documenter ou nommer «visiteur» pour aider les lecteurs à comprendre rapidement le contenu, ne gêne pas vraiment les choses. Écrire "ceci est un visiteur" au lieu de le documenter correctement est une grave erreur pour la raison que votre développeur principal donne - les programmeurs ne le comprendront pas. Même les programmeurs qui savent ce qu'est un visiteur ont besoin de plus d'informations que "c'est un visiteur".

Steve Jessop
la source
5
"Les modèles de conception sont Clippy l'aide de Microsoft Office" Je vais avoir des cauchemars ce soir.
MetalMikester
"Les personnes inexpérimentées peuvent se tromper [quand elles] tentent de concevoir du code en reliant des modèles de conception jusqu'à la fin." Entendre entendre. J'aimerais avoir plusieurs votes positifs à donner. :)
Quuxplusone
J'aimerais aussi avoir plusieurs votes positifs pour le dernier paragraphe. Les modèles de conception sont le vocabulaire de la programmation: vous serez un écrivain meilleur et plus clair si vous avez un vocabulaire étendu. Je peux distinguer une fabrique d'un constructeur quand je la vois, mais je ne l'ai pas non plus obtenue en lisant des livres sur les modèles de conception, pas plus que d'avoir appris à distinguer une falaise d'un bluff en lisant un dictionnaire anglais.
Quuxplusone
20

Votre collègue semble souffrir du syndrome des NIH ("Not Invented Here").

Il est parfaitement plausible que son code facilite l'ajout de nouveaux champs: je suis également beaucoup plus rapide pour mettre à jour mon propre code que celui écrit par d'autres personnes. Mais cette rapidité à court terme ne dit rien sur la maintenabilité et la portabilité du code. Je vais lui donner le bénéfice du doute: le code existant pourrait en effet être mal structuré s’il a mal suivi un manuel ou suivi une bonne recette dans un mauvais contexte.

Éviter les modèles de conception est vraiment surprenant. Au cours de mes 30 dernières années de codage et de gestion de codeurs, les modèles de conception ont permis de mettre des mots sur des choses qui ont été faites instinctivement, aidant ainsi à comprendre plus rapidement l'intention, les avantages, les inconvénients, les risques, les opportunités et les modèles associés. Les modèles de conception se sont révélés être de véritables accélérateurs pour maîtriser la complexité!

  • Peut-être votre collègue est-il vraiment beaucoup plus intelligent que la plupart d'entre nous et peut-il se permettre de réinventer des modèles sans perte de productivité notable?

  • Les arguments selon lesquels "les programmeurs ne comprennent pas les modèles de conception" sonne comme "je ne peux pas vraiment expliquer ce que je fais". Ou "je ne veux pas discuter de ma propre conception". Je pense vraiment que la mise en forme pourrait améliorer la compréhension globale et permettre à des collègues moins expérimentés de partager des opinions valables. Mais peut-être que votre collègue principal veut éviter cela.

Les approches en couches se sont avérées supérieures aux autres architectures dans la plupart des applications d'entreprise. Les packages de pointe de classe mondiale sont structurés autour de cette idée et surpassent les architectures artisanales par des ordres de grandeur. Martin Fowler présente cette approche dans son excellent livre intitulé "Patterns of enterprise architecture". Oh! Désolé encore: il s'agit de modèles éprouvés; Aucune chance dans la vue NIH de votre collègue ;-)

Christophe
la source
Syndrome NIH, intéressant, je n'avais pas entendu parler de cela auparavant. De toute évidence, c’est le problème auquel font face la plupart des employeurs nord-américains pour gérer leurs employés!
payer le
@pay Je ne suis pas sûr que cela se limite à l'Amérique du Nord ;-) Il est toujours tentant de rechercher des solutions que nous utilisions déjà avec un certain succès. C'est la zone de confort. Mais il faut toujours rester ouvert aux nouvelles idées et au dialogue constructif avec des collègues ambitieux. Après tout, " Vous voyagez plus vite seul, mais plus loin l'un de l'autre. "
Christophe
16

Beaucoup de gens oublient que la conception logicielle est contextuelle. Il existe pour atteindre les objectifs de l'entreprise et différents objectifs peuvent nécessiter des approches différentes. Autrement dit, il n'y a pas de conception qui soit toujours la meilleure, même s'il y a toujours une meilleure conception.

Les modèles de conception sont des solutions standard aux problèmes standard. Cependant, si vous n'avez pas le problème, le résoudre est une perte de temps.

La principale différence entre la conception de logiciel agile et agile réside dans les décisions de conception. En cascade, nous rassemblons toutes les exigences, identifions les modèles de conception dont nous avons besoin et commençons seulement à coder. Dans l'architecture agile, nous suivons la règle YAGNI pour reporter les décisions de conception au dernier moment responsable, lorsque nous en savons autant que possible sur le choix.

C'est-à-dire qu'en cas de chute d'eau, les modèles de conception ont tendance à être appliqués si leurs besoins sont anticipés , de manière agile, lorsqu'ils sont réellement nécessaires . En conséquence, les projets agiles ont tendance à appliquer moins souvent les modèles de conception, car les besoins anticipés ne sont pas tous réels.

meriton
la source
1
+1 pour Design patterns are standard solutions to standard problems. Je suis un peu déçu de ne pas voir cela dans des réponses plus votées. Cela nécessite donc d’abord d’identifier si votre problème correspond à un problème standard, et très souvent, ils le seront tout de même.
Walfrat
8

Les modèles de conception ne sont pas vraiment appelés modèles de conception, car ils prescrivent quoi faire. Les modèles de conception sont des modèles de conception car ils décrivent ce qui a été fait auparavant . Certains développeurs ou développeurs ont conçu une méthode qui a bien accompli une tâche particulière et ont été en mesure de l'appliquer à des situations similaires avec des résultats similaires. C'est tout ce que c'est. De nombreux modèles ont des forces et des faiblesses inhérentes, et il appartient au développeur instruit d'évaluer les besoins technologiques et commerciaux afin de déterminer le modèle approprié à appliquer.

Dans cette optique, à moins que vous ne vous engagiez vraiment à écrire du code 100% unique, dans lequel aucun concept ou implémentation ne soient utilisables d'un cas d'utilisation à l'autre, vous utilisez certainement au moins certains modèles de conception. Ils peuvent ne pas avoir de noms flashy et communs tels que "Référentiel" ou "Unité de travail" ou même "MVC", mais cela ne les rend pas "non un modèle de conception".

Jeremy Holovacs
la source
6

J'aime généralement y penser comme "la navigation" à l'aide du GPS. Lorsque vous apprenez les "meilleures pratiques" et les "modèles de conception", vous apprenez à suivre la voie de navigation GPS. Mais lorsque vous connaissez la région, vous apprendrez souvent que conduire sur une route secondaire vous mènera au-delà des zones à problèmes, pour vous y rendre plus rapidement et / ou mieux. C’est à peu près pareil pour ces choses-là: l’expérience vous permet de déconstruire votre boîte à outils et de prendre des raccourcis.

Apprendre les modèles de conception et apprendre les "meilleures pratiques" signifie que vous acquérez une compréhension de l’idée qui vous permet de choisir dans une situation donnée. Parce que les situations de la vie réelle sont souvent plus complexes que les situations théoriques, vous aurez souvent des contraintes et des problèmes qui ne figurent pas dans les manuels. Les clients / clients veulent un produit rapide et généralement bon marché; Vous devez travailler avec le code existant. Vous devez interagir avec des outils tiers qui peuvent très bien être des boîtes noires et inefficaces; et toutes sortes de choses. Votre situation est spécifique - les meilleures pratiques et modèles sont plus généraux.

L'une des principales raisons pour lesquelles de nombreuses personnes sur des sites tels que SE vous donneront des réponses "de bonne pratique" et de "modèle de conception" est qu'elles répondent à des solutions générales et abstraites, ce qui permet de fournir un langage commun pour résoudre un type de problème. problèmes. Et pour que tu apprennes.

Les modèles de conception So - no - ne sont pas mal vus dans les environnements de développement Agile; le développement est cependant rarement assez général et abstrait pour s’adapter parfaitement à un motif et le développeur (expérimenté) le sait bien.

Allan S. Hansen
la source
5

L'ajout d'un nouveau champ à la couche interface utilisateur / base de données / données prend de 2 à 3 heures, alors que dans son code, cela prend 30 minutes.

Si vous voulez "optimiser" une conception, vous devez indiquer ce que vous essayez d'optimiser.

Par exemple, un vélo de course est un véhicule optimisé ... et un Boeing 747 est également un véhicule optimisé ... mais ils sont optimisés pour un ensemble d'exigences différent.

L'idée du motif "MVC", par exemple, optimise des choses comme:

  • Différentes vues du même modèle (la vue est indépendante du modèle)
  • Chaque couche peut être développée séparément (par exemple par des équipes différentes) et testée séparément (tests unitaires) avant intégration
  • etc.

Alors que son code pourrait être optimisé pour autre chose, par exemple:

  • Lignes de code minimales
  • Facile pour une personne d'effectuer un changement qui affecte toutes les couches (en ne disposant pas de couches vraiment distinctes du tout)
  • etc.

Les descriptions de modèle commencent par une description du problème que le modèle est censé résoudre. S'il pense que la "meilleure pratique" consiste à ne pas utiliser un modèle spécifique, alors (en supposant qu'il ne s'agisse pas d'un modèle stupide, en supposant qu'il s'agisse d'un modèle utile parfois), je suppose qu'il n'a pas / expérimente le problème spécifique que ce modèle prétend pour résoudre, et / ou il a un problème différent (plus grand ou plus urgent, concurrent) pour lequel il essaie d'optimiser.

ChrisW
la source
"ne pas avoir de couches vraiment distinctes du tout" - ou, pour être juste, en ayant un "comportement par défaut" acceptable qui se propage à travers les couches. Par exemple, les applications d'administration SQL basées sur le Web sont une couche de présentation qui se met automatiquement à jour lorsque la couche de base de données change. C'est simplement que, hormis pour des utilisations limitées, ils ne présentent pas vos données telles que vous les souhaitez: -) Une demi-heure semble incroyablement rapide pour ajouter un nouveau champ, ce qui suggère qu'il n'y a pas d'interface utilisateur significative dans laquelle concevoir. connexion avec le nouveau champ, en couches ou autrement.
Steve Jessop
4

Les modèles de conception sont des outils. Comme les outils, il y a deux manières de les utiliser: la bonne et la mauvaise. Par exemple, si je vous donne un tournevis et un clou et vous demande de joindre deux morceaux de bois, vous devriez me demander un marteau. Les marteaux sont utilisés pour les clous, tandis que les tournevis sont utilisés pour les vis.

Trop souvent, un modèle de conception est présenté comme la seule façon, ce qui n’est souvent vrai que lorsque des problèmes particuliers se posent. Les développeurs juniors sont souvent comme des enfants lorsqu'ils trouvent quelque chose de nouveau avec lequel jouer. ils veulent appliquer ce modèle à tout . Et il n’ya rien de mal en soi, du moment qu’ils apprennent que le motif A s’applique au problème B et que le motif C s’applique au problème D. De même que vous n’utilisez pas de tournevis pour enfoncer des clous, vous motif juste parce qu'il existe; vous utilisez le motif parce que c'est le meilleur outil (connu) pour le travail.

Le revers des modèles est anti-modèles. Des choses qui se sont maintes fois avérées mauvaises, généralement en termes de temps d'exécution ou de mémoire. Cependant, les modèles et les anti-modèles ne sont pas bénéfiques pour le développeur qui ne comprend pas pourquoi ils existent. Les développeurs aiment penser que ce qu'ils font est nouveau et inventif, mais la plupart du temps, ils ne le sont pas. Il a probablement été pensé avant. Les personnes qui les ont précédés ont créé les modèles en raison de leur expérience.

Bien sûr, les développeurs débutants semblent souvent proposer de nouvelles façons de faire les choses anciennes, et parfois ces méthodes sont meilleures. Cependant, trop souvent, il s’agit de l’effet Dunning-Kruger; le développeur en sait juste assez pour créer un programme fonctionnel, mais ne comprend pas ses propres limites. La seule façon de surmonter ce problème semble être l’expérience, tant positive que négative. Ils ignorent les modèles parce qu'ils se croient supérieurs, mais ne savent pas qu'en réalité, 10 000 développeurs ont déjà utilisé un modèle spécifique, puis l'ont abandonné car il était mauvais.

Agile préfère "faire avancer les choses" en ce qui concerne son adaptation rapide à l'évolution des besoins des clients. Il ne favorise pas les modèles de conception, ni ne les méprise. Si un motif est la méthode la plus rapide et la plus fiable, le développeur doit l’utiliser. Si un modèle particulier coûte plus de temps que simplement "le faire", il est probablement correct d'utiliser quelque chose qui n'est pas un modèle (en supposant, bien entendu, que les performances ne sont pas gravement dégradées, etc.). Si aucun motif connu ne peut être trouvé, il est préférable de concevoir leur propre motif plutôt que de dire «non» à un client. Les clients, en particulier les clients payants, ont généralement raison.

Quiconque prétend que les modèles sont la voie, ou prétend que les modèles sont le fléau de l'existence, ont tort. Les modèles sont des outils destinés à être appliqués à des situations spécifiques et ont des degrés de réussite variables en fonction des circonstances. C’est une vérité, qui ne dépend pas de savoir si vous avez choisi MVC ou non, si vous utilisez des objets de transfert de données, etc. et est raisonnablement exempt de bugs logiques.

Habituellement , les motifs permettent une forme cohérente de conception et donnent de meilleurs résultats que d'ignorer tous les motifs au lieu d'écrire des idées 100% originales, mais vous ne pouvez pas éviter tous les motifs. Par exemple, si y = x + 5, allez-vous vraiment écrire y = x + (5 * 3 + 15/3) / 4, juste pour éviter le motif d'écriture x + 5? Non, vous n'êtes pas. Vous allez écrire y = x + 5 et passer au problème suivant.

Les gens utilisent des modèles tous les jours, et ce n'est pas grave . Ce qui compte le plus, c’est d’avoir un code qui fonctionne logiquement, qui plante et qui est facile à utiliser. Rien d'autre ne compte plus que cela.

Phyrfox
la source
Je pense que les mises en garde relatives à ceci sont des situations qui, en fonction de votre compréhension actuelle du problème et du domaine, vous pouvez créer une nouvelle classe ou suivre un schéma qui s’applique à la situation, mais le jour suivant, un client souhaite que vous personnalisez-les pour une petite facette que d'autres clients ne voudront pas dans leur version. La consolidation d'une base de code qui répond aux besoins de deux douzaines de clients et évite les copies de pâtes semble impossible à réaliser. Je viens d’être confronté à cela aujourd’hui lors de la refactorisation d’un ancien processus de fusion de courrier.
Igneous01
2

Vous ne pouvez pas «éviter les modèles de conception», sauf en évitant de concevoir deux parties de votre système de la même manière (ce que je ne recommande pas et je doute que votre développeur principal le fasse). Ce qu'il veut dire, c'est probablement «éviter d'utiliser aveuglément un dessin simplement parce qu'il adhère à un motif». Réfléchir à ce que vous faites est sans aucun doute une "pratique exemplaire", et une seule université devrait exister pour enseigner. Malheureusement, cela ne semble pas se produire.

Jonathan Cast
la source
2

Les modèles de conception ne sont pas antithétiques aux pratiques agiles. Ce qui est antithétique aux pratiques agiles, c’est l’utilisation de modèles de conception dans le but de les utiliser. La pratique courante chez les nouveaux diplômés et les étudiants consiste à réfléchir à la question "comment allons-nous résoudre ce problème en utilisant un modèle en usine".

Agile signifie choisir le meilleur outil pour le travail, NE PAS essayer de façonner le travail pour l'adapter à l'outil que vous avez sélectionné.
Et c’est ce à quoi TOUTES les pratiques de développement de bon sens se résument (même si, bien sûr, vous devez souvent faire des compromis car la sélection des outils que vous pouvez choisir est généralement limitée par les normes de l’entreprise, les restrictions de licence (comme la GPL et parfois d’autres outils open source). ne peuvent pas être utilisés, en particulier lors de la création de logiciels destinés à la revente), etc.

Votre collègue / ami s’est probablement opposé à votre code non pas parce qu’il utilise des modèles de conception, mais parce qu’il s’agit d’une construction artificielle conçue pour montrer l’utilisation d’un modèle spécifique alors qu’un autre modèle aurait été meilleur (bien que souvent subjectif, j’ai (et beaucoup avec moi sans doute) ont vu de nombreux exemples où l'utilisation forcée d'un modèle de conception spécifique a conduit à un code laid, difficile à maintenir et extrêmement inefficace).

jwenting
la source