Comment faire connaître les programmes génériques aux membres de l'équipe?


20

Je reste dans un environnement où les gens croient:

  1. Les génériques Java sont la fonctionnalité exclusivement utilisée pour l'écriture de bibliothèque et non pour le véritable codage.
  2. C ++ est un langage de programmation OO; templateest une fonctionnalité optionnelle et évitable

Cependant, ces personnes dépendent fortement des bibliothèques écrites en utilisant une programmation générique (par exemple STL, conteneurs Java). Si j'écris un code à l'aide de templates ou generics, le réviseur de code est le plus susceptible de le rejeter et fera un commentaire pour l'écrire de manière "appropriée / compréhensible / élégante" .

Une telle mentalité est applicable du programmeur normal au cadre supérieur. Il n'y a pas d'issue, car 90% du temps, ces gens ont leur lobbying.

Quelle est la meilleure façon ( sans se couper la gorge ) de les expliquer, l'approche pratique de l'écriture de code qui constitue OO et une programmation générique à la fois?


11
Je vous souhaite bonne chance, mais vous allez probablement devoir partir si vous le souhaitez.
The Muffin Man

3
@TheMuffinMan, vous avez raison. J'ai quitté ce lieu de travail et maintenant j'ai ma propre entreprise. Ici, j'ai un contrôle total sur le codage!
iammilind

Réponses:


14

Il y a encore des gens dans le monde qui n'utilisent pas de génériques jave dans le "codage ordinaire". Je peux le croire avec des modèles C ++, mais des génériques? Ils ne sont même pas difficiles à apprendre / à utiliser. Sérieusement, les meilleures fonctionnalités de Java et C ++ sont respectivement les génériques et les modèles.

La meilleure façon de convaincre les gens est de faire un argument convaincant, de ne pas menacer et d'avoir raison.

Tant que vous ne faites pas quelque chose comme l'utilisation de modèles comme langage de programmation, le polymorphisme paramétrique (génériques / modèles) est presque certainement bon.

1. Évite la duplication de code.

C'est évident, mais le code polymorphe est un code général. C'est pourquoi il est appelé générique.

2. Prend en charge une meilleure vérification statique.

Sans polymorphisme paramétrique, vous finissez par écrire des choses comme public Object clone()ou public boolean equals(object b)qui ne sont pas que des abominations, ils ont des types qui ne fournissent aucune information sur ce qu'ils font et finissent invariablement par lancer des exceptions partout. L'alternative au polymorphisme paramétrique est le lancer partout

3. Le code OOP du polymorphisme non paramétrique est fondamentalement incapable de gérer correctement les "méthodes binaires".

Vous les utilisez souvent.

4. C'est la meilleure pratique

En Java, l'utilisation de génériques est considérée comme la meilleure pratique (voir Effective Java par Josh Bloch). Les grands penseurs C ++ comme Sutter et Alexandrescu encouragent également l'utilisation de modèles pour résoudre une variété de problèmes.

5. Il correspond au paradigme OO.

Souvent, les gens ne le remarquent pas, mais la combinaison de sous-typage et de génériques produit un système beaucoup plus puissant expressif et orienté objet que n'importe quel système avec un seul d'entre eux.

Considérez les mixins de Scala. Il s'agit d'une fonctionnalité intéressante qui vous permet de rassembler vos objets à partir de composants. Les génériques et les modèles peuvent simuler certains de ces avantages. Par exemple, supposons que l'un de vos objets utilise une base de données. Une bonne conception vous permettrait d'abstraire l'accès à la base de données dans une classe distincte. Si cela est fait correctement, cela vous permet non seulement de vous moquer de votre magasin de données (clé de la testabilité), cela signifie également que vous pouvez ajouter des implémentations alternatives comme cette nouvelle base de données sans SQL. Ici cependant, vous pourriez avoir un problème, quelle que soit l'implémentation que vous utilisez, vous obtiendrez différentes capacités de votre objet métier.

Des génériques à la rescousse!

   public class Business<S extends Datastore>{
      private S store; ...
   }

Vous pouvez maintenant commencer à différencier statiquement vos Businessobjets en fonction de la capacité à utiliser des fonctionnalités spécifiques à la base de données. Vous avez encore besoin de vérifications d'exécution et de cast, mais vous pouvez commencer à construire BEAUCOUP de meilleur code.

et

6. Le code normal n'existe pas.

Il n'y a que trois choses dans l'univers de programmation:

  1. bibliothèques,
  2. configurations, et
  3. mauvais code.

Si vous ne pensez pas à votre code comme à une bibliothèque, vous avez de sérieux problèmes lorsque les exigences de votre projet changent. L'architecture est (sans doute) l'art de concevoir de bonnes API.

Je trouve cette attitude stupéfiante. Après vous être habitué à la programmation avec des types paramétrés, ne pas les utiliser rend tout simplement pénible. Et, Java et C ++ ont un tas de points difficiles auxquels ils aident à remédier.


7
Je aime l'idée que normal coden'existe pas et qu'il n'y a que trois sortes: libraries, configurationset bad code. C'est un raisonnement idéaliste, mais vous devez toujours l'expliquer à vos collègues qui ne sont peut-être pas aussi idéalistes que vous. Je suis d'accord cependant que l'utilisation de types paramétrés est tout simplement géniale une fois que vous avez compris.
Spoike

3
Heck, même les modèles C ++ ne sont pas si difficiles à utiliser si vous ne les utilisez pas à des fins de métaprogrammation de modèles. :-)
In silico

-1 pour avoir suggéré que tous ceux qui décident de ne pas utiliser de génériques le font simplement parce qu'ils ne savent pas comment fonctionne la fonctionnalité.
tp1

étant donné le risque d'utilisation abusive, je dirais que restreindre / ne pas utiliser de génériques / modèles peut être une bien meilleure décision que vous lui accordez.
Ryathal

Les personnes qui refusent d'utiliser des génériques / modèles pour l'ingénierie logicielle à grande échelle construiront accidentellement et inévitablement un "deuxième langage" - un interprète qui fonctionne sur Java, qui implémente le "langage métier" qu'ils ont en tête. en.wikipedia.org/wiki/Inner-platform_effect
rwong

16

Il s'agit d'une forme spécialisée de la question plus générale "comment convaincre vos supérieurs de commencer à utiliser une technologie / manière de faire les choses plus récente et meilleure?"

Malheureusement, je ne pense pas que vous le puissiez, et je ne suis pas sûr que vous le deviez. C'est par définition leur choix, car ils vous paient pour faire les choses d'une certaine manière qu'ils ont choisie, pas comme vous voulez. Le mieux que vous puissiez faire est de suggérer que cette technologie existe, que beaucoup de gens l'utilisent et qu'elle semble être la voie de l'avenir. Vous voudrez peut-être même mentionner le fait qu'ils devraient bien sûr déjà savoir: qu'il vaut mieux que les gens ne laissent pas leurs compétences stagner. Mais c'est tout: s'ils ne l'achètent pas, vous ne pouvez rien faire.

Ils peuvent avoir d'autres considérations que vous n'avez pas, car vous ne pensez pas à leur niveau. Vous pensez en tant qu'ingénieur, ils pensent peut-être davantage en termes commerciaux ou même en termes de ressources humaines.

  • Les génériques (ou autre) amélioreront-ils la valeur de leur produit? Probablement pas.

  • Les génériques (ou autre) rendront-ils plus difficile pour les personnes qu'ils ont déjà embauchées de faire leur travail? Oui.

  • Les génériques amélioreront-ils le délai de mise sur le marché? Si le seul ingénieur était toi, peut-être. Mais si tout un tas d'ingénieurs doivent être formés aux génériques avant qu'une autre ligne de code ne soit écrite dans la maison, non.

Donc, vous voudrez peut-être envisager de simplement changer d'emploi. Dans mon dernier travail, j'ai été le premier à utiliser des génériques avec Java, et heureusement, cela n'a pas posé de problème; ils ont dit craindre que les génériques rendent le code «plus difficile à lire», mais ils m'ont laissé faire. Trouvez un travail comme ça.


9

Je voudrais diffuser les mérites des génériques au réviseur de code et à d'autres collègues avant toute révision:

1) En vous permettant de spécifier les types sur lesquels agit une classe ou une méthode générique, la fonction générique transfère la charge de la sécurité des types de vous au compilateur. Il n'est pas nécessaire d'écrire du code pour tester le type de données correct car il est appliqué au moment de la compilation. Le besoin de coulée de caractères et la possibilité d'erreurs d'exécution sont réduits.

2) Les génériques offrent une sécurité de type sans la surcharge de plusieurs implémentations.

Ainsi, [1] et [2] réduisent le risque d'erreur dans le code. Cela fait gagner du temps au développeur et donc à l'argent de l'entreprise.

Si la lisibilité est un problème, la maladresse de l'utilisation de types génériques pourrait être compromise. C'est une des raisons pour lesquelles vous souhaiterez peut-être étendre les directives de codage. Cela peut être fait dans un contexte de journée de travail et pas seulement pour étendre les bibliothèques (cependant, c'est une idée de refactoriser au fur et à mesure et de marquer les méthodes candidates possibles pour les bibliothèques dans le code pour une reconnaissance facile plus tard). Par conséquent, il n'y aurait aucune raison de ne pas les utiliser dans un contexte de travail quotidien.

J'ajouterais quelques déclarations sur la façon dont les autres programmeurs n'ont pas de problèmes avec les génériques: les génériques sont largement utilisés en Java et dans de nombreux autres langages comme C #. Tout programmeur sérieux trouverait la vie difficile sans ce type de blocs de construction sûrs.

Néanmoins, vous voudrez peut-être considérer que certains développeurs peuvent ne pas être à la hauteur. La direction aurait pu prendre une décision consciente de protéger des projets dans le passé, gardant ainsi ces types hors des zones dangereuses. Ici, les innocents et les coupables sont généralement mis en cause car une analyse ou une microgestion suffisante est rarement effectuée.

Si vous présentez un bon dossier et que vous ne recevez pas de réponse motivée en retour, commencez secrètement à rechercher une autre entreprise qui prend la programmation au sérieux.


7

À moins que vous ne soyez l'architecte / responsable technique, il sera difficile d'imposer l'utilisation de génériques / modèles. Vous devriez vraiment proposer la solution générique / modèle bien avant la révision du code, de préférence avant de commencer à l'implémenter.

Ce que vous pouvez faire, c'est de montrer pourquoi vous devriez utiliser un générique dans certains cas. Si vous pouvez démontrer les avantages, alors vos collègues pourraient être d'accord. Les raisons possibles pour lesquelles vous devriez utiliser des génériques / modèles devraient être les suivantes:

  • Il devrait vous permettre d'écrire moins de code pour les tâches répétitives
  • Cela facilite le travail des programmeurs
  • Il applique un modèle défini par l'architecte de la solution
  • Il encapsule des fonctionnalités communes, ce qui forcerait les programmeurs à ne pas copier-coller de code (c'est-à-dire en évitant le double problème de maintenance)
  • Il vérifie raisonnablement l' avenir de votre code (bien que cette avenue soit difficile à raisonner)

Dans un projet Java récent, j'ai réussi à ajouter une classe abstraite générique car elle satisfait certaines choses de base: elle facilite les choses pour les autres membres de l'équipe, applique le modèle que l'architecte a déjà proposé et possède un code commun que les programmeurs n'ont pas besoin de copier et coller. C'était un modèle simple que l'architecte a écrit à propos que des gens raisonnablement compétents se trompaient toujours (en raison de la complexité du système réel en jeu), mais les génériques indiquent quelle classe va où.

Évidemment, je ne peux pas montrer le vrai exemple sans violer l'accord de non-divulgation. Mais comme exemple de ce que j'ai fait, je devrais faire le modèle de stratégie et l'appliquer avec des génériques. Voici donc le modèle de stratégie:

entrez la description de l'image ici

Et pour que les programmeurs appliquent ce modèle, vous pouvez ajouter le type générique sur Contextlequel il doit utiliser quelque chose qui a un Strategytype. Au niveau du code, cela ressemblerait à quelque chose comme ceci en Java:

// declare the generic Context class that has a type "S" 
// that is an upper bound class of Strategy
public class Context <S extends Strategy> {
    S strategy;

    // Constructor with an initial strategy
    public Context(S initialStrategy) {
        this.strategy = initialStrategy;
    }

    public void doSomething() {
      strategy.execute(); // assumes that Strategy has an execute() method.
    }

    public void setStrategy(S strategy) {
        this.strategy = strategy;
    }
}

Pour autant que je sache, vous pouvez le faire à peu près avec n'importe quel modèle. Assurez-vous que vous pouvez tester votre conception générique / modèle avec des tests unitaires pour voir si cela fonctionne, afin d'avoir confiance dans la conception du code.

Si vos collègues n'aiment pas l'idée, ne la prenez pas personnellement, il n'a peut-être pas été aussi facile de gérer une solution que vous le pensiez. C'est pourquoi vous devez proposer une solution générique / modèle avant de commencer à l'implémenter. Vous devez toujours travailler avec vos collègues pour résoudre le problème réel d'une manière différente.


J'adore le diagramme! Quel outil avez-vous utilisé?
yannis

@YannisRizos J'ai utilisé le yuml.me qui crée des diagrammes à partir de la saisie de texte. Le service bêta est cependant un peu bogué pour le moment (vous pouvez cependant télécharger l'image générée vers votre message en utilisant le lien généré).
Spoike

mis en signet, merci pour le partage. bien que je ne veuille pas vraiment apprendre une autre syntaxe, aussi simpliste soit-elle, elle a l'air cool et je vais essayer à un moment donné.
yannis

@YannisRizos Oh, j'oublie constamment la syntaxe moi-même. C'est pourquoi il y a une page d'exemples pratique . J'ai trouvé qu'il était plus rapide d'écrire des diagrammes de classes simples dans yuml que d'utiliser Visio.
Spoike

@YannisRizos yUml est un outil sympa. Voici quelques autres exemples de ce que vous pouvez en faire: carnotaurus.philipcarney.com/tagged/yUML
CarneyCode

4

Il y a toujours plusieurs façons de faire la même chose. Si votre utilisation des modèles est une mauvaise utilisation des modèles, la révision du code devrait échouer.

Cependant, si votre code échoue à l'examen, car ils ne comprennent pas les modèles, le problème est de nature différente. Dans ce cas, conseillez-leur (dans le bon sens) d'apprendre des modèles.


4

Ce que vous traitez ici est une collection de préjugés. Les gens préfèrent le statu quo, une pensée de groupe s'est développée et l'argument a été mené à plusieurs reprises de sorte que les gens se sont enracinés dans leurs croyances.

L'une des stratégies les plus efficaces consiste à se concentrer sur une toute petite victoire. J'ai lu l'exemple suivant dans un livre : l'auteur était un fidèle utilisateur non Apple. Elle ne les aimait pas et elle ne voulait rien avoir à faire avec eux. Elle a eu de nombreuses discussions avec des personnes ayant une position pro-Apple, et chacune a simplement poussé ses talons plus profondément dans le sol. Puis quelqu'un lui a acheté un iPod shuffle et comme ça, ses préjugés ont disparu. Cela ne lui donnait pas envie d'acheter uniquement des produits Apple, mais la position anti-Apple dure et bien ancrée avait été remplacée par un point de vue plus équilibré. Il y avait place pour le compromis, et elle a fini par se convertir lentement à Apple.

N'essayez donc pas de convaincre tout le monde à la fois: cela aura l'effet inverse. Concentrez-vous sur une petite chose et le reste se fera tout seul. Débarrassez-vous simplement de la nature à double sens de l'argument afin que les gens puissent traverser petit à petit, au lieu de tout à la fois.

Le point précis sur lequel vous concentrer dépend de votre situation, mais voici une idée: la division que vous esquissez entre les bibliothèques et le «vrai code» semble très peu naturelle. À mon avis, un programmeur qui crée une application devrait consacrer 80% de son temps à une bibliothèque pour le type d'application qu'il crée et 20% à utiliser cette bibliothèque pour créer l'application. Tout le code qui mérite d'être conservé doit être considéré comme une bibliothèque. Je suggérerais à vos supérieurs de généraliser une partie de votre code dans une bibliothèque interne (si vous ne l'avez pas déjà fait). Par leur propre logique, ils devraient utiliser des génériques pour cela, et selon l'estimation ci-dessus, 80% de votre code peut se retrouver dans la bibliothèque. Une fois que tout le monde utilise des génériques de l'autre côté, ils devraient s'y habituer et les préjugés devraient s'estomper.


Merci Peter, c'était une réponse très perspicace. Vos pensées s'appliquent non seulement à ma question, mais aussi à la philosophie générale de notre vie quotidienne.
iammilind

2

Remarque "compréhensible". Si le réviseur de code ne voit pas les avantages des génériques, alors tout le <<<>>>contenu n'est qu'un bruit incompréhensible, ce qui est inutile.

Je suggérerais de voir combien de bogues actuels (ouverts ou récemment corrigés) que contient votre base de données de bogues qui auraient pu être évités en utilisant des génériques. Recherchez ClassCastExceptions.

Notez également que si vous n'avez pas de bogues qui auraient pu être évités en utilisant des génériques, vos collègues ont raison de ne pas en avoir besoin.


2

J'irais doucement là-dessus. Je suis passé de Java 1.4 à 1.6 il y a quelques années, et les génériques ont été une véritable secousse. C'est simple et très utile si vous essayez de jongler avec quelques collections, cartes et autres structures. Cependant, l'écriture de classes qui prennent des données génériques comme paramètres, les manipulent et les transmettent à d'autres classes devient rapidement une confusion monumentale. Je tire une grande satisfaction de tout faire fonctionner, mais je me demande si le temps et les efforts supplémentaires dépensés en valaient la peine. Je crains également qu'un bon nombre de programmeurs Java ne puissent jamais vraiment comprendre.

Quelques pensées aléatoires de mon parcours générique jusqu'à présent:

  • Les exceptions ClassCastException se produisent au moment de l'exécution, mais elles apparaissent généralement lors des premières exécutions et sont faciles à corriger.
  • Chaque article que j'ai lu sur les génériques déclare que parfois ils ne fonctionnent tout simplement pas et que vous devez les utiliser de @SuppressWarnings(value="unchecked")temps en temps. Comment savez-vous si vous êtes au-delà des limites des génériques, ou si vous êtes juste stupide et devez réfléchir plus longuement?
  • Il peut être difficile de postuler @SuppressWarnings(value="unchecked")à une seule ligne.
  • J'ai ajouté quelques génériques de fantaisie à l'une de mes classes. J'ai connu plusieurs programmeurs qui auraient pu améliorer la classe avant de la générer, qui n'auraient jamais pu la toucher et obtenir une compilation propre par la suite.

Les génériques ont nettoyé mon code et m'ont prévenu des problèmes trop souvent pour que je le rejette, mais je constate également une augmentation du temps de développement, du temps supplémentaire consacré à la formation et des programmeurs Java forcés de travailler en C #, C et Visual Basic. ..ou Java 1.4. Je me concentrerais sur l'écriture de code que vos collègues peuvent comprendre. Si vous pouvez glisser des génériques compréhensibles, tant mieux. Je considère les génériques Java comme une opportunité / un problème qui n'a pas encore été résolu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.