45 votes

Y a-t-il un problème avec une classe avec toutes les méthodes statiques?

Je suis en train de faire de la revue de code et suis tombé sur une classe qui utilise toutes les méthodes statiques. L'entrée méthode prend plusieurs arguments, puis commence à appeler les autres méthodes statiques passant le long de tout ou partie des arguments de la méthode d'entrée reçu.

Ce n'est pas comme un cours de Math avec en grande partie sans rapport avec les fonctions de l'utilitaire. Dans ma propre programmation normale, j'ai rarement méthodes d'écriture où Resharper pop et dit: "cela pourrait être une méthode statique", quand je le fais, ils ont tendance à être aveugle les méthodes de l'utilitaire.

Il n'y a rien de mal avec ce schéma? Est-ce juste une question de choix personnel si l'état de la classe est tenue dans les champs et les propriétés ou passé autour parmi les méthodes statiques à l'aide des arguments?

Mise à JOUR: l'état particulier qui est passé autour est le jeu de résultats à partir de la base de données. La classe a la responsabilité de remplir une feuille de calcul excel modèle à partir d'un ensemble de résultats à partir de la DB. Je ne sais pas si cela fait une différence.

21voto

Thomas Pornin Points 36984

Ce que vous décrivez est simplement une programmation structurée, comme on pourrait le faire en C, Pascal ou Algol. Il n'y a rien de mal intrinsèquement à cela. Il y a des situations où la POO est plus appropriée, mais la POO n'est pas la solution ultime et si le problème à résoudre est mieux servi par la programmation structurée, une classe pleine de méthodes statiques est la solution.

21voto

Juliet Points 40758

Il n'y a rien de mal avec cette motif? Est-ce juste une question de choix personnel si l'état de la la classe est tenue dans les champs et les propriétés ou passé autour parmi statique les méthodes utilisant des arguments?

En parlant de ma propre expérience personnelle, j'ai travaillé sur 100 KLOC applications qui ont très très profond objet des hiérarchies, tout hérite et prime sur tout le reste, tout ce met en œuvre une demi-douzaine d'interfaces, de même que les interfaces hériter d'une demi-douzaine d'interfaces, le système met en œuvre tous les design pattern dans le livre, etc.

Résultat final: une véritable programmation orientée objet-tastic architecture avec plusieurs niveaux d'indirection qui prend des heures à déboguer n'importe quoi. J'ai récemment commencé un travail avec un système de ce type, où la courbe d'apprentissage me l'avait décrit comme "un mur de briques, suivie par une montagne".

Parfois exagérée de la programmation orientée objet, les résultats dans les classes granulaires qu'il en fait un dommage net.

En revanche, de nombreux langages de programmation fonctionnelle, même les OO comme F# et OCaml (et C#!), encourager plat et peu profond hiérarchique. Les bibliothèques dans ces langues ont tendance à avoir les propriétés suivantes:

  • La plupart des objets sont POCOs, ou ont tout au plus un ou deux niveaux de l'héritage, où les objets ne sont pas plus que des récipients pour la logique de données.
  • Au lieu de classes d'appeler les uns les autres, vous avez des modules (l'équivalent de classes statiques) contrôler les interactions entre les objets.
  • Les Modules ont tendance à agir sur un nombre très limité de types de données, et qui ont donc une portée limitée. Par exemple, en OCaml Liste de module représente opérations sur des listes, un Client modules facilite les opérations sur les clients. Alors que les modules ont plus ou moins les mêmes fonctionnalités que les méthodes d'instance d'une classe, la différence essentielle avec le module basé sur les bibliothèques est que les modules sont beaucoup plus autonomes, beaucoup moins précis, et ont tendance à avoir peu ou pas de dépendances sur d'autres modules.
  • Il n'y a habituellement pas besoin de la sous-classe des objets de remplacer les méthodes puisque vous pouvez passer autour des fonctions comme des objets de première classe pour la spécialisation.
  • Bien que le C# ne prend pas en charge cette fonctionnalité, les foncteurs de fournir un moyen à la sous-classe d'une spécialiser modules.

La plupart des grandes bibliothèques ont tendance à être plus large que profonde, par exemple de l'API Win32, des bibliothèques PHP, Erlang BIFs, OCaml et Haskell bibliothèques, des procédures stockées dans une base de données, etc. Donc ce style de programmation est la bataille de test et semble bien fonctionner dans le monde réel.

À mon avis, les mieux conçus à base de module Api ont tendance à être plus facile à travailler que le mieux conçu de la programmation orientée objet Api. Cependant, le style d'écriture est tout aussi importante dans la conception d'API, donc si tout le monde dans votre équipe est à l'aide de la programmation orientée objet et que quelqu'un s'en va et met en œuvre quelque chose dans un style complètement différent, alors vous devriez probablement demander une réécriture pour mieux correspondre à vos équipes des normes de codage.

5voto

Anders Abel Points 36203

Est-il utile de reformuler la question:

Pouvez-vous décrire les données sur lesquelles les méthodes statiques fonctionnent en tant qu'entité ayant:

  • un sens clair
  • la responsabilité de maintenir son état interne cohérent.

Dans ce cas, il doit s'agir d'un objet instancié, sinon, il peut s'agir simplement d'un ensemble de fonctions connexes, un peu comme une bibliothèque mathématique.

4voto

Waylon Flinn Points 8140

Voici un peu de remaniement de flux de travail que j'ai souvent rencontre qui implique des méthodes statiques. Il peut prêter un aperçu de votre problème.

Je vais commencer avec une classe qui a une assez bonne encapsulation. Comme je commence à ajouter des fonctionnalités que je tombe sur un morceau de fonctionnalités que n'a pas vraiment besoin d'accéder aux champs privés dans ma classe, mais semble contiennent des fonctionnalités similaires. Après, cela se passe un peu de temps (parfois juste une fois) je commence à voir les contours d'une nouvelle classe dans les méthodes statiques j'ai mis en place et comment cette nouvelle classe se rapporte à la vieille classe dans laquelle j'ai d'abord mis en œuvre les méthodes statiques.

L'avantage que je vois de transformer ces méthodes statiques dans une ou plusieurs classes, est, quand vous faites cela, souvent, il devient plus facile de comprendre et de maintenir votre logiciel.

3voto

Andy Shellam Points 8120

J'ai l'impression que si la classe est nécessaire pour maintenir une certaine forme d'état (par exemple, les propriétés), alors elle devrait être instancié (c'est à dire "normal" de la classe.)

Si il ne devrait être qu'une instance de cette classe (donc, toutes les méthodes statiques), puis il devrait y avoir un singleton propriété/méthode ou une méthode de fabrique qui crée une instance de la classe la première fois qu'il l'appelle, et puis juste prévoit que l'instance lorsque quelqu'un d'autre le demande.

Cela dit, ce n'est que mon opinion personnelle et la façon dont je voudrais la mettre en œuvre. Je suis sûr que d'autres sont en désaccord avec moi. Sans rien savoir de plus, il est difficile de donner des raisons pour/contre de chaque méthode, pour être honnête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X