La réutilisabilité est-elle à peu près synonyme de bonne conception?

10

La réutilisabilité est une caractéristique d'une bonne conception logicielle .

La réutilisabilité est-elle un gloss acceptable ("brève notation du sens") pour une bonne conception de logiciel? Pourquoi?

Matthew Rodatus
la source
Je dirais que la flexibilité est plus importante. Avoir une architecture sous-jacente qui tente de s'adapter à la réalité que quelque chose va probablement changer ou être ajouté plus tard est la clé de mon avis. La réutilisation vient presque gratuitement à ce stade.
Pemdas
Votre utilisation de la flexibilité ressemble exactement à la réutilisabilité.
Matthew Rodatus
"La réutilisabilité est la probabilité qu'un segment de code source puisse être utilisé à nouveau pour ajouter de nouvelles fonctionnalités avec peu ou pas de modification" - en.wikipedia.org/wiki/Reusability
Matthew Rodatus
Je suis impressionné que la majorité des réponses ci-dessous disent non . Cela aurait été le cas il y a seulement quelques années (enfin ... 5-10 ans), lorsque la réutilisation était à la mode quelque chose de très souhaitable.
Martin Wickman
@MartinWickman La réutilisabilité est bonne, mais elle n'est pas gratuite.
Caleb

Réponses:

13

Non.

La réutilisation est un indicateur d'une bonne conception. Cela indique que le couplage du système est suffisamment lâche et que la cohésion d'une unité particulière est suffisamment élevée pour faciliter la réutilisation sans rencontrer de problèmes de dépendance ou avoir à réécrire la plupart du code.

La réutilisation est largement une illusion. Il est manifestement impossible de mesurer la «réutilisabilité» d'une unité sans savoir à l'avance où ni comment elle va être utilisée. De nombreux développeurs essaieront de concevoir des composants "réutilisables" et découvriront souvent plus tard que les aspects spécifiques qu'ils ont essayé de rendre "flexibles" sont exactement ceux qui n'avaient pas besoin d'être.

J'utiliserais un autre "gloss": la testabilité.

Maintenant, je ne suis pas un partisan du TDD, et je ne ressens pas non plus le besoin de tester tout et n'importe quoi. Mais écrire des tests pour un composant vous donnera une très bonne idée de ses caractéristiques de couplage / cohésion, et très rapidement. Si cela dépend des abstractions, alors c'est un couplage lâche; vous trouverez facile de se moquer des dépendances et cela suggère une bonne conception. S'il a un objectif clair (voir aussi Principe de responsabilité unique ), son comportement sera relativement intuitif, vous trouverez facilement ce qu'il faut tester, ce qui suggère une bonne conception.

Bien entendu, cela ne garantit pas une bonne conception; la mise en œuvre réelle ou même l'ensemble de l'architecture peut être totalement inappropriée pour son objectif déclaré. Mais au moins, cela vous indique que vous ne travaillez pas avec du code spaghetti ou des objets divins.

S'il vous plaît, n'essayez pas de faire des suppositions sauvages quant à la "réutilisabilité" d'un composant, en particulier de ne pas l'utiliser comme preuve de "bonne conception". C'est quelque chose que vous ne pouvez établir qu'avec du recul, une fois qu'il est réellement réutilisé, et que la conception peut alors avoir considérablement changé.

Aaronaught
la source
Bonne réponse. Vous avez répondu à la question que j'aurais dû poser: "Qu'est-ce qu'un bon gloss pour une bonne conception de logiciel?"
Matthew Rodatus
+1: Surtout pour "La réutilisabilité est largement une illusion".
Kramii
Ce n'est qu'un indicateur d'une bonne conception si la réutilisabilité est un objectif. Il souvent est un objectif, si un un implicite, mais le temps passé et l' argent aux composants réutilisables make quand ils ne doivent pas nécessairement être est tout simplement inutile.
Caleb
5

Non.

La réutilisabilité est une bonne caractéristique, car elle peut accélérer le développement futur. (Bien que dans la pratique, très peu d'organisations voient le développement futur accélérer à peu près autant qu'elles l'espéraient.) Cependant, tout élément logiciel important comporte des parties spécifiques à cette application. De plus, lorsque des personnes sans expérience dans le domaine essaient d'écrire des logiciels réutilisables, elles masquent généralement cette pièce et réduisent les performances sans réussir à les rendre réutilisables.

Par conséquent, une bonne conception est modulaire et réutilisable uniquement là où vous pouvez voir que la pièce peut être réutilisée et là où vous avez l'expertise pour réellement atteindre la réutilisabilité. Ailleurs, vous devriez essayer de rendre les choses propres, mais ne vous inquiétez pas de la réutilisation. (Sauf à l'arrière de votre tête où vous prenez des notes de sorte que sur un futur système, vous aurez une idée de comment le rendre réutilisable.)

btilly
la source
Qu'en est-il des tests automatisés? Les tests unitaires ne sont-ils pas une forme de réutilisation?
Matthew Rodatus
@ Matthew-Rodatus: Les tests unitaires font partie de votre logiciel livrable. La réutilisation fait généralement référence à la réutilisation de code dans un autre logiciel.
btilly
Bon point. Je suppose que j'utilise la «réutilisabilité» dans un sens ontologique, ce qui prête à confusion. Cependant, observez comment les fonctionnalités de la réutilisabilité sont également des fonctionnalités du code testable: en.wikipedia.org/wiki/Reusability
Matthew Rodatus
1
@ matthew-rodatus: La réutilisabilité n'est pas, "A cette liste de fonctionnalités de blanchisserie." Si vous essayez d'obtenir la réutilisabilité de cette manière, vous échouerez fort. Faites-moi confiance à ce sujet.
btilly
Bon point. Je vois maintenant que je n'ai pas posé la question que je voulais poser, mais c'est quand même un dialogue intéressant.
Matthew Rodatus
4

Je crois (et c'est ma conviction personnelle) que la relation entre la réutilisabilité et un bon design n'est pas réflexive, donc la réponse de base et simple est non . Si vous êtes intéressé par de bons guides de conception, consultez cet article wikipedia.

Une bonne conception de logiciel doit être réutilisable, au moins dans certaines parties centrales, je pense que très peu de gens réutilisent réellement le code source, car il est extrêmement complexe de concevoir le cœur d'un système pour être réutilisable dans de nombreux contextes différents (Et je dis cela par expérience)

Considérez une classe avec une énorme quantité de responsabilités (alias un Blob) effectuant toutes les tâches dont vous avez besoin mais sans aucune sorte de considérations de conception, vous avez peut-être vu le cas. La plupart des gens avec une classe comme celle-là l'utiliseraient encore et encore et je pense que nous devrons convenir que c'est une réutilisation, une réutilisation sans design.

J'espère que je n'ai pas trop gâché mes explications

David Conde
la source
C'est pourquoi j'ai dit «brillant» (j'entends par là que, pratiquement, la réutilisabilité capture la plupart mais pas tout ce que nous entendons par une bonne conception).
Matthew Rodatus
Mon point est que vous avez besoin de réutilisabilité pour avoir un bon design , mais avoir beaucoup de code "réutilisable" ne signifie pas que vous avez un bon design, donc je dirais toujours non, même pas comme un gloss
David Conde
Ça a du sens. Je ne suis pas sûr d'être d'accord, mais +1 pour une réponse bien pensée.
Matthew Rodatus
2

Je pense qu'un meilleur indicateur d'une bonne conception est l'adhésion à des idées fondamentales telles que le principe de responsabilité unique et le maintien de la cohésion de chaque composant. En utilisant des abstractions avec une interface propre et concise et en maintenant la conformité avec le principal de substitution Liskov, nous encourageons la réutilisation sans essayer de prédire ce qui sera et ne sera pas réutilisé.

Le respect de ces principes de conception fondamentaux facilite le test et la réutilisation du code .

Bonne conception == bonne conception, la réutilisabilité est un sous-produit.

Larry Hector
la source
1

La réutilisabilité est souvent un objectif de conception implicite. Si vous pouvez créer un composant, ou une conception entière, de telle manière qu'il puisse être réutilisé plus tard, il semble évident que vous devriez le faire. Ce qui n'est pas toujours évident, c'est qu'il faut beaucoup de temps et d'efforts (et d'argent) pour rendre quelque chose de réutilisable, et l'avantage de la réutilisabilité doit donc être mis en balance avec son coût.

Une conception réutilisable qui coûte deux fois plus cher et / ou prend deux fois plus de temps à construire que ce dont le client a besoin n'est pas une bonne conception du point de vue du client, en particulier si le client n'a pas besoin de réutilisabilité.

Il existe un certain nombre d'attributs similaires qui sont souvent considérés comme des objectifs de conception implicites car ils semblent évidemment bons:

  • minimiser les coûts

  • minimiser le temps de développement

  • minimiser la complexité

  • maximiser la fiabilité

Ces éléments sont tous objectivement bons, mais peuvent ne pas toujours être importants pour un client particulier à un moment donné, il est donc important de bien comprendre ce dont votre client a besoin (même si ce client n'est que votre patron). Il y a un certain nombre d'aphorismes qui sont censés nous rappeler ce fait (par exemple "Fait mieux que parfait" et "Bon, bon marché, rapide: choisissez-en deux"), mais il est toujours facile de tomber dans le piège d'essayer de créer des logiciels qui sont excellents à tous égards, alors qu'en fait, ils ne sont pas toujours nécessaires à tous égards.

Pour arriver à la question du titre, alors: Non , la réutilisabilité n'est pas synonyme de bon design. La réutilisabilité peut être un élément utile d'une bonne conception particulière, mais uniquement lorsqu'elle est requise.

Caleb
la source
0

Pas nécessairement. Si vous faites quelque chose de réutilisable qui ne sera clairement jamais réutilisé, c'est une mauvaise conception.

Par exemple, si vous écrivez un fichier plein de données qui est unique à votre entreprise et que ces données doivent être importées une fois ailleurs, pourquoi se donner la peine de les rendre réutilisables?

Cela dit, si votre framework n'en a pas déjà un, le code à écrire dans un fichier peut être réutilisable. Ce serait une bonne conception.

pdr
la source
Comment savoir avec certitude si quelque chose ne sera jamais réutilisé?
Matthew Rodatus
1
@Matthew - Ce serait ma définition d'un bon designer: Quelqu'un qui répond habituellement à cette question
pdr
0

Je dirais non, surtout parce qu'il ne décrit qu'un petit segment de code. J'ai trouvé que là où la convivialité est la plus importante se trouve au cœur même et aux bords extérieurs du territoire utilitaire, pas tant entre les deux. Je vais donner quelques exemples de choses où je pense que la réutilisabilité est une mesure utile de conception de qualité.

Élément essentiel

  • Modèles de formulaire Web qui permettent d'ajouter une page facilement et de manière cohérente (ou pour tout type d'interface utilisateur)
  • Assistants de modèle de conception comme une classe de base ViewModel qui sera incluse dans toutes mes applications MVVM

Trucs utilitaires

  • Classe d'email qui envoie un message SMTP (utilisez-le tout le temps)
  • Une classe de calculateur de distance SIG (utilisée dans un tas de nos applications)

Pour les trucs CRUD qui occupent 70 à 80% de la plupart des applications, je ne pense tout simplement pas que la réutilisabilité soit une mesure précieuse.

Morgan Herlocker
la source