Je suis souvent confronté à des classes d'aide ou d'utilisation en Java ou dans n'importe quel type de langage. Je me demandais donc s'il s'agit d'une sorte d'Anti Pattern et l'existence de ce type de classes n'est qu'un manque de manque dans la conception et l'architecture d'un logiciel.
Souvent, ces classes sont confinées en utilisant uniquement des méthodes statiques, qui font beaucoup de choses. Mais la plupart du temps, cela dépend du contexte et de l'état.
Ma question est, quelle est votre opinion sur ce type de classes d'aide / utilitaire statiques, car l'avantage est bien sûr l'invocation rapide en utilisant uniquement le nom de la classe.
Et à quel type de niveau d'abstraction éviteriez-vous d'utiliser ce genre de classes?
À mon avis, le mot clé "statique" devrait simplement être autorisé dans la déclaration d'une classe (Java) et non pour les méthodes. À mon avis, en l'utilisant de cette façon, cela pourrait être une bonne alternative et un moyen terme pour pouvoir combiner les paradigmes Procuedural et OO en Java et éviter une mauvaise utilisation du mot-clé.
Ajouts dus aux réponses:
Au début, je pense qu'il est tout à fait légal de pouvoir combiner différents paradigmes et même d'utiliser des langages de script interprétés au cours de l'exécution dans du code compilé machine ou vm.
D'après mon expérience, au cours du processus de développement d'un projet, ce type d'aides et d'utilitaires ou quel que soit le nom, grandit et grandit et est utilisé dans tous les coins oubliés de la base de code, qui était à l'origine conçue pour être modulaire et flexible. Et en raison d'un manque de temps pour effectuer des refactorisations ou repenser la conception, vous ne faites qu'empirer les choses au fil du temps.
Je pense que static
devrait être supprimé de Java. Surtout maintenant où il est possible d'utiliser des éléments de langage fonctionnel encore plus sophistiqués.
la source
Réponses:
Eh bien, Java manque de fonctions libres, vous êtes donc obligé de les mettre en tant que fonctions statiques dans une classe pro-forma. Un contournement nécessaire n'est jamais un anti-modèle, bien qu'il puisse manquer d'élégance.
Ensuite, il n'y a rien de mal avec les fonctions gratuites. En fait, l'utilisation de fonctions gratuites réduit le couplage, car elles n'ont accès qu'à l'interface publique au lieu de tous les détails sanglants.
Bien sûr, l'utilisation de fonctions libres / statiques n'atténue en aucun cas les dangers d'un état partagé mutable, en particulier global.
la source
this
, et nécessitent que quelque chose soit instancié de manière appropriéeLes fonctions utilitaires ou d'assistance statiques ne sont pas un anti-modèle si elles respectent certaines directives:
Ils devraient être exempts d'effets secondaires
Ils sont utilisés pour un comportement spécifique à l'application qui n'appartient pas à la classe ou aux classes sur lesquelles ces fonctions opèrent
Ils ne nécessitent aucun état partagé
Cas d'utilisation courants:
Par exemple, dans une application sur laquelle j'ai travaillé, les utilisateurs conservent des entrées de journal pour leurs activités. Ils peuvent spécifier une date de suivi et télécharger un rappel d'événement. Nous avons créé une classe utilitaire statique pour prendre une entrée de journal et renvoyer le texte brut d'un fichier .ics.
Cela ne nécessitait aucun état partagé. Il ne modifiait aucun état et la création d'un événement iCal était certainement spécifique à l'application et n'appartenait pas à la classe d'entrée de journal.
Si les fonctions statiques ou les classes utilitaires ont des effets secondaires ou nécessitent un état partagé, je recommanderais de réévaluer ce code, car il introduit un couplage qui peut être difficile à simuler pour les tests unitaires.
la source
Cela dépendra de votre approche. De nombreuses applications sont écrites avec un état d'esprit plus fonctionnel, contrairement à l'état d'esprit classique (y compris une grande partie de la suite de sites sur laquelle vous vous trouvez).
Avec cet état d'esprit, il y aura de nombreuses méthodes utilitaires sur les classes de travail qui peuvent être regroupées en tant que méthodes statiques. Ils sont nourris / utilisés plus près d'objets simples qui ne contiennent que des données et sont transmis.
C'est une approche valable et peut très bien fonctionner, surtout à grande échelle.
la source
Agent.Save(obj)
rapportagentInstance.Save(obj)
. Avec ce dernier, vous avez la possibilité d' injecteragentInstance
dans le code utilisateur. Par conséquent , vous pouvez injecter une classe enfant deAgent
trop qui permet la réutilisation Og code à l' aide de différents « types » deAgent
sans recompilation. Il s'agit d'un faible couplage .Personnellement, je pense que la seule partie importante de ces classes d'assistance est qu'elles deviennent privées. En plus de cela - ils sont strictement une bonne idée (appliqués avec parcimonie).
La façon dont je pense à cela - c'est si dans l'implémentation d'une classe (ou d'une fonction) - quelque chose comme ça est utile, et rend cette implémentation plus claire, comment cela pourrait-il être mauvais? Et souvent, il est essentiel de définir de telles classes d'assistance privées pour permettre l'intégration et l'utilisation d'autres algorithmes qui dépendent de la forme particulière des données.
Que ce soit pour l'étiqueter «aide» est une petite question de goût personnel, mais cela implique qu'il aide à la mise en œuvre et qu'il ne présente aucun intérêt / utilisation pour un public plus large. Si c'est ce qui a du sens - allez-y!
la source
java.lang.Math
.La prévalence des
static
classes auxiliaires est basée sur une idée fausse. Cestatic
n'est pas parce que nous appelons des classes avec uniquement des méthodes "classes utilitaires" qu'il n'est pas autorisé d'écrire un comportement courant dans les POJO.static
les classes d'assistance sont anti-motif pour trois raisons:L'accès statique à ces méthodes d'assistance masque les dépendances . Si ces "classes d'utilité" étaient des POJO, vous pourriez les injecter dans une classe dépendante en tant que paramètres de constructeur, ce qui rendrait la dépendance évidente pour tout utilisateur d'une classe dépendante.
L'accès statique à ces méthodes d'assistance entraîne un couplage serré . Cela signifie que le code utilisant les méthodes d'assistance est difficile à réutiliser et (comme effet secondaire) difficile à tester.
Surtout s'ils maintiennent l' état, ce ne sont que des variables globales . Et j'espère que personne ne prétend que les variables globales sont bonnes ...
Les classes d'assistance statiques font partie du modèle anti code STUPID .
L'OP a écrit:
Les constructions statiques statiques sont des états globaux.
Oui, de cause. Et presque toutes les applications ont besoin d'une sorte d' état global .
Mais état global ! = Variable globale .
Vous pouvez créer un état global avec des techniques OO via l' injection de dépendances. Mais vous ne pouvez pas éviter un état global avec des structures statiques statiques qui sont des variables globales en bas.
la source
Func<Result, Args>
objets qui sont instanciés ailleurs.