Peut-être un peu ironique, mais comme je ne peux « trouver cette réponse nulle part sur Google, alors pour vous assurer que le génie logiciel a la réponse:

Quest-ce quun helper?

Jai vu le nom utilisé partout (noms de modules, noms de classes, noms de méthodes), comme si la sémantique était profonde et significative, mais dans le contexte de linformatique (même si je nai pas de diplôme), je nai jamais vu de description ou de définition nulle part !

Est-ce un modèle de conception? Est-ce un algorithme? Jai déjà travaillé sur un programme dans lequel le module et la classe étaient tous deux appelés Somethingsomethinghelper (où Somethingsomething était assez générique aussi) et je lai rapidement renommé en quelque chose qui avait du sens pour moi, mais jai limpression quil me manque quelque chose ici!

Commentaires

  • Helper est ce que vous appelez quelque chose lorsque vous ‘ ne savez pas comment lappeler mais y Tu connais un de ses amis. Un peu comme vous appeler ‘ ami de Zack ‘ au lieu dAaron. Double plus ungood.
  • Un assistant est nimporte quel membre privé, jusquà lisomorphisme.
  • @ThomasEding désolé de revenir 3 ans plus tard – mais je ‘ Jai vu de nombreux membres  » public  » appelés  » helper « , y compris les interfaces. Je ‘ aimerais une source sur votre définition (la meilleure qualité est meilleure) parce que cela me donnerait certainement un sens pour plus dodeurs de code.

Réponse

Une classe Helper est une odeur de code moins connue où un codeur a identifié certaines opérations diverses et couramment utilisées et a tenté de les rendre réutilisables en les regroupant ensemble dans un groupement artificiel. Les développeurs successifs sont alors venus sur le projet et nont pas réalisé que la classe helper existe, et ont par conséquent réécrit les mêmes opérations courantes, ou même créé plus de classes Helper.

Mais sérieusement, le principal problème avec les classes Helper est quil sagit généralement dopérations agissant sur une classe spécifique, ce qui signifie évidemment en termes OO quelles souffrent dun cas aigu de Feature Envy . Cette incapacité à empaqueter le comportement avec les données sur lesquelles il agit est la raison pour laquelle les développeurs échouent si souvent (daprès mon expérience) à le trouver.

En plus de cela, comme vous lavez déjà identifié, SomethingSomethingHelper est en fait un nom terrible . Il nest pas descriptif et ne vous donne aucune idée du type dopérations effectuées par la classe (cela aide?), Ce qui signifie également quil nest pas évident lors de lajout de nouveaux comportements sils appartiennent ou non à la classe Helper. montez ces classes en fonction des comportements associés qui se regroupent logiquement, puis renommez les nouvelles classes pour refléter ce quelles font.

Commentaires

  • Jolie assurez-vous que SomethingSomethingHelper nest pas le nom réel de la classe. Le fait que ‘ son odeur ou non dépend de la spécificité la classe dassistance est, car les classes dassistance comme Math ne sont pas du tout une odeur de code.
  • @RobertHarvey – Enh, la plupart de celles que jai ‘ jai vu avoir été nommé SomethingSomethingHelper. Bon sang, je ‘ m en train de regarder une classe nommée HelperMethods dans lespace de noms <company>.Helpers. Pour moi, un la classe est dans le même compartiment que *Manager.
  • @Telastyn: Peut-être ‘ Cest donc une expérience. Jai ‘ regardé à travers les classes dassistance dans mon projet actuel (il y en a plusieurs), et elles ont toutes des noms significatifs. Il ny a ‘ quun seul qui ‘ suffixé avec Helper, et je pense que ‘ s pour le dissocier dune classe du .NET Framework portant le même nom. Je ‘ d considère *Helper acceptable si * était quelque chose de significatif. HelperMethods nest quun échec dimagination; il devrait au moins y avoir des compartiments conceptuels spécifiques.
  • @RobertHarvey – Vous ‘ avez probablement raison. Toute ma carrière utilisant des langues modernes a consisté à nettoyer des épaves de train.
  • Il y en a un sous-ensemble, appelé  » fonctions dassistance « , qui sont réellement utiles et un bon modèle.Par exemple, un ensemble commun de lignes qui auraient autrement besoin dêtre répétées dans une fonction – un exemple de lendroit où elles apparaissent est lorsque vous avez besoin dune boucle do..while en Python, dont le langage ne prend pas en charge ‘ t (voir le deuxième exemple ici ). Un autre serait une structure if / elif /…/ else, mais il faudrait répéter un cas en haut et en bas. Si possible, ils doivent être rendus locaux à cette fonction, cependant, et généralement pas appelés  » helper « .

Réponse

Un helper est une classe ou une méthode supplémentaire inoffensive, du moment quelle complète un composant externe. Quand il fait le contraire, cela indique une mauvaise conception parce que le code a été exclu de son autorité, sil y a une autorité du tout.

Voici un exemple daide inoffensive, jutilise une méthode appelée FindRep qui compte le nombre de zéros non significatifs.

 digits = digits.Remove(0, TextHelper.FindRep("0", digits, 0, digits.Length - 2));  

La méthode dassistance est très simple, mais très peu pratique à copier-coller et le framework ne fournit aucune solution.

 public static int FindRep(char chr, string str, int beginPos, int endPos) { int pos; for (pos = beginPos; pos <= endPos; pos++) { if (str[pos] != chr) { break; } } return pos - beginPos; }  

Et voici un exemple de mauvais assistant:

 public static class DutchZipcodeHelper { public static bool Validate(string s) { return Regex.IsMatch(s, @"^[1-9][0-9]{3}[A-Z]{2}$", RegexOptions.IgnoreCase); } } public class DutchZipcode { private string value; public DutchZipcode(string value) { if (!DutchZipcodeHelper.Validate(value)) { throw new ArgumentException(); } this.value = value; } public string Value { get { return value; } } }  

Commentaires

  • Alors montrez-moi comment DutchZipcodeHelper doit être fait?
  • @ Powder366 Validate is a private méthode sur DutchZipcode

Answer

Helper est un appendice de nom couramment utilisé.

Cependant , il communique très peu un à propos de ce quil fait. Chaque fois que je lai vu utilisé, jai trouvé que cétait un nom sous-optimal.

En fait, je considère que cest une odeur de code qui indique plus de problèmes en dessous.

Exemple

Supposons que nous voyions le nom  » WidgetHelper  » (ici  » widget  » est un nom de remplacement pour tout type de fonctionnalité programmable, et pas nécessairement un widget dinterface utilisateur):

 class WidgetHelper: ...  

Que nous apprend ce nom? Nous savons que lobjet ou la fonction effectue une sorte de travail secondaire au widget. Daprès mon expérience, cela pourrait même ne pas être vrai, et on pourrait supprimer  » helper  » du nom et améliorer la communication.

Pour une autre possibilité,  » WidgetHelper  » pourrait envelopper le widget, de sorte que le code du widget lui-même puisse savoir rien à propos de laide. Limplication est que WidgetHelper dans cet exemple de pseudocode fait partie de lAPI publique:

 class WidgetHelper: def __init__(self): self.widget = Widget() ...  

Dans ce cas, quelque chose comme  » WidgetAPI  » serait un meilleur nom, car cela informe au moins lutilisateur de sa relation avec la classe Widget. Ou peut-être supprimons-nous  » Helper  » du nom et renommons également Widget en quelque chose comme WidgetImplementation.

Alternativement, il pourrait être encapsulé et appelé par le widget, ce qui implique quil ne fait pas partie de lAPI publique, mais plutôt une partie des détails de limplémentation.

 class Widget: def __init__(self): self.widget_helper = WidgetHelper() ...  

Même dans ce cas, avec ceci petite quantité dinformations sur laquelle nous avons une amélioration sur  » helper.  » Il serait plus descriptif de lappeler un nom générique comme  » WidgetImplementation.  »

 » Implémentation  » peut être correct car limplémentation peut en faire trop pour lui donner un nom plus précis. Ou il peut lui-même être trop vague – cest à la discrétion du nom.

Mais comme nous lavons vu, le nom,  » helper,  » naide pas à comprendre ce qui se passe dans le code, autre que cela est accessoire à lobjet principal dintérêt.  » Aide,  » pourrait signifier de nombreux types de relations. Ainsi, il est trop vague et nébuleux, et ne convient pas pour informer lutilisateur de ce que fait lobjet.

Conclusion

Nommer les choses est lun des problèmes difficiles en informatique.

Ce qui est souhaitable dans un nom, cest quil informe lutilisateur de ce que la chose nommée est censée faire.

Mais dans tous les cas imaginables, il serait plus descriptif dutiliser un nom autre que  » helper  » ou simplement supprimez-le complètement.

Comme corollaire de mon expérience et de cette discussion, le choix de  » helper  » dans un nom signale également faible effort ou sophistication de la part du nommeur (correctement ou non). Cest, en effet, une odeur de code.

Veuillez ne rien appeler un assistant « .  »

Réponse

Ce nest en fait ni lun ni lautre.

 » Helper  » est un nom collectif pour un groupe de fonctions.

Un helper est quelque chose qui fonctionne dans tout le projet et fait une petite chose. Ces types ne sont souvent même pas organisés en classe, ils ne font quétendre les fonctionnalités ou les capacités du langage lui-même. Voici ce que je considère comme un très bon exemple daide:

 function linesOf($mls) { return preg_split("/\s*\n\s*/",trim($mls)); }  

Cette fonction minuscule peut avoir un grand impact sur la façon dont vous organisez votre code (vous adorerez mettre vos listes littérales dans des chaînes multilignes) mais en soi, cela ne signifie presque rien. Cest un modèle regex glorifié. Pourtant, cela rend votre code beaucoup plus lisible quand vous dites

 $a = linesOf(" apples bananas cherries ");  

au lieu de son équivalent regex pur.

Voilà donc ce que sont les helpers. Petits outils pour des travaux génériques, nappartenant pas à une classe spécifique. Vous pouvez les forcer en un seul (linesOf pourrait être une méthode dune classe de chaînes) mais où ils appartiennent vraiment, cest soit lespace de noms global, soit une collection statique de tels outils.

Règle de pouce: si cest utile mais ne semble pas appartenir à nimporte où, cest probablement une aide.

Réponse

Bien sûr  » cest une zone grise,  » mais mon expérience pragmatique a été que les gens inventent des  » helpers  » lorsquils ont identifié un ensemble de codes communs utiles pour eux « Je ne veux pas réimplémenter. (Certaines langues les appellent  » mixins. « )

Le problème est que le code commun est tangentiellement lié à chacune des autres classes quil pourrait  » aider.  » Au lieu de faire partie de une hiérarchie de classes stricte, elle les  » les aide simplement  » [tous …]. Cette stratégie évite la duplication du code source mais nest pas sans danger.

Réponse

Ma société utilisait auparavant la Base méthodologie de classe / classe dassistance où chaque objet aurait deux classes. Vous auriez une classe Person contenant toutes les propriétés et définitions de classe et une classe PersonHelper contenant toutes les méthodes, instructions SQL et Logic qui ont manipulé la classe Person. Cela a bien fonctionné pour nous car toutes nos applications utilisent des instructions SQL pour manipuler les données et il nous a été très facile de trouver et de modifier les instructions SQL si nécessaire.

Nous avons évolué depuis et maintenant tout mis dans la classe Person / Base. Nous avons arrêté dutiliser la convention de dénomination Helper car nous voulions avoir moins de fichiers dans nos projets. De plus, la longueur de certains noms de classe devenait incontrôlable. MDR.

Ce nest pas un bon exemple mais vous voyez lidée.

s = CompanyName.PersonHelper.GetPerson() s = CompanyName.Person.GetPerson() 

Je ne dis pas que lutilisation de la convention de dénomination des assistants est parfaite solution mais cela a fonctionné pour nous pendant quelques années.

Commentaires

  • Vous navez pas ‘ t expliquez pourquoi.
  • Oui, je ‘ aimerais aussi cette explication.
  • @AaronHall Considérez que cest une bonne chose que vous ne compreniez pas leur choix.
  • La raison habituelle est  » Quelquun a pensé que cétait une bonne idée « .

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *