Quand les principes SOLID deviennent-ils Yagni?
En tant que programmeurs, nous effectuons des compromis tout le temps, entre la complexité, la maintenabilité, le temps de construire et ainsi de suite. Parmi d'autres, deux des directives les plus intelligentes pour faire des choix sont dans mon esprit les principes SOLID et Yagni. Si vous n'en avez pas besoin; Ne le construisez pas, et gardez-le propre.
Maintenant, par exemple, lorsque je regarde la Série Dimecast sur Solid , je vois que cela commence comme un programme assez simple et finit comme un complexe assez complexe (fin de la complexité de oui est également dans l'œil de la Beholder), mais cela me fait toujours me demander: quandSOLID Les principes se transforment en quelque chose dont vous n'avez pas besoin? Tous les principes solides sont des moyens de travailler qui permettent d'utiliser pour apporter des modifications ultérieures. Mais que se passe-t-il si le problème à résoudre est un simple simple et c'est une application jetable, alors quoi? Ou sont les principes SOLID quelque chose qui s'applique toujours?
Comme demandé dans les commentaires:
Il est toujours difficile de juger une approche basée sur un screencast, car les problèmes choisis pour les démos sont généralement si petits que l'application de principes tels SOLID lui fait rapidement ressembler à la solution complètement survenue.
Je dirais SOLID Principes sont presque toujours utiles. Une fois que vous devenez compétent avec eux, les utiliser ne semble pas quelque chose que vous devez réfléchir délibérément. Cela devient juste naturel. J'ai juste naturel. J'ai juste naturel. J'ai Vu de nombreuses applications one-off imprètes deviennent plus que cela, alors j'ai maintenant peur de dire que je vais jeter quelque chose, parce que vous ne savez jamais.
L'approche que je prends habituellement est que si j'écris une application simple pour une tâche particulière, je deviendrai parfois des principes de gros noms en faveur de quelques lignes de code qui fonctionnent. Si je trouve que je revenais à cette application pour faire de nouveaux changements, je prendrai le temps de le faire SOLID (au moins quelque peu, puisque une application de 100% des principes est rarement réalisable).
Dans les plus grandes applications, je commence petit et que le programme évolue, j'applique SOLID Principes dans la mesure du possible. De cette façon, je n'essaie pas de concevoir le tout à partir de la dernière énumée. Que, Pour moi, est la tache sucrée où yagni et SOLID coexist.
Pensez au problème d'abord et avant tout. Si vous appliquez aveuglément les principes de Yagni ou de Solid, vous pouvez vous blesser plus tard. Quelque chose que j'espère que nous pouvons tous comprendre, c'est qu'il n'y a pas d'approche de conception "une" qui correspond à tous les problèmes. Vous pouvez voir la preuve de cela lorsqu'un magasin vend un chapeau annoncé comme "une taille unique convient à tous", mais cela ne correspond pas à votre tête. C'est trop gros ou trop petit.
Au lieu de cela, il vaut mieux comprendre les principes et les problèmes que SOLID tente de tenter de s'adresser; ainsi que les principes et les problèmes que Yagni tente de s'adresser. Vous constaterez que l'on s'intéresse à la L'architecture de votre candidature et de l'autre concernent le processus de développement dans son ensemble. Bien qu'il puisse se chevaucher dans certains cas, ce sont des problèmes distinctement différents.
Yagni (vous n'aurez pas besoin d'en avoir besoin [pittoresque acronyme américain]) est préoccupé par l'épargne du temps de développeur en ajoutant des fondations en béton ré-associées en acier à un pont destiné à couvrir une ruisseau de 3 pieds de large lorsqu'un pont en bois plus simple sera juste amende. Si nous couvrons une rivière de mille de large et que nous devions soutenir plusieurs remorques de tracteurs, nous aurions bien sûr besoin de ces travaux de fondation supplémentaires. En substance, Yagni vous dit de regarder la plus grande image et conception pour les besoins courant. Il s'agit du problème de la fabrication de quelque chose de trop compliqué car nous anticipons un certain nombre de besoins potentiels que le client n'a pas encore été identifié.
Solid est concerné par la manière dont nous nous assurons que les morceaux du pont correspondent correctement et peuvent être maintenus au fil du temps. Vous pouvez appliquer SOLID Principes sur le pont en bois ainsi que le pont en béton ré-associé en acier.
En bref, ces deux concepts ne sont pas nécessairement en conflit les uns avec les autres. Lorsque vous rencontrez une situation où vous croyez qu'ils sont, il est temps de jeter un coup d'œil à la grande image. Selon votre conclusion, vous pouvez décider de supprimer une partie du SOLID Principes ou vous pourriez décider que vous en avez vraiment besoin.
Il existe une citation attribuée à Einstein (probablement ne variation sur un vrai ):
"Tout devrait être aussi simple que possible, mais pas plus simple."
Et c'est plus ou moins l'approche que je prends lorsqu'il est confronté au SOLID VS Yagni Tradeoff: Appliquez-les, car vous ne savez jamais si un programme est un code "à jetter" ou non. Il suffit d'ajouter une couche de saleté qui fonctionne, puis de le polir à une interface plus propre ... et répétez jusqu'à ce que vous converties sur le niveau droit de l'entropie. Espérons-le.
Il existe de nombreuses façons de concevoir un programme pour un problème donné; SOLID est une tentative d'identification des propriétés d'une bonne conception. Une utilisation correcte de SOLID est censée entraîner un programme plus facile à motiver et à modifier.
Yagni et KISS sont concernés par une portée de fonctionnalité. Un programme qui résout des problèmes plus complexes est plus complexe et abstrait. Si vous n'avez pas besoin de cette généralité, vous avez passé du temps et des efforts à la création de code C'est plus difficile à comprendre et à entretenir mais n'offre aucune valeur ajoutée.
Un programme qui a bien conçu n'est pas nécessairement axé sur les fonctionnalités dont il a besoin. Un programme qui se concentre uniquement sur les fonctionnalités dont il a besoin n'est pas nécessairement bien conçu. Il n'y a pas de compromis, juste deux axes orthogonaux dans l'espace décisionnel. Un programme idéal est à la fois modulaire et n'a que des caractéristiques essentielles.
Je pense que vous devriez commencer Yagni et chaque fois qu'il y a un besoin, solidifiez-le.
Ce que je veux dire, c'est SOLID y a-t-il alors lorsque vous ajoutez une nouvelle classe, vous n'aurez pas au refacteur, changez simplement une implémentation (par exemple), bien, bien à mon avis, écrivez votre code simplement, Et quand vous voyez que vous changez de choses - changez-le avec SOLID (c.-à-d. Le refactoring redouté Le SOLID est censé vous éviter de - t si mauvais quand vous ne commencez que).
Vous ne perdez pas de temps parce que vous devriez faire le travail de toute façon (au début) et où que ce soit nécessaire, votre code est gentil et bien rangé.
Je suppose que vous pourriez l'appeler une évaluation paresseuse de solide.