107 votes

Utilise beaucoup de méthodes statiques une mauvaise chose?

J'ai tendance à déclarer que la statique de l'ensemble des méthodes dans une classe lorsque cette classe n'a pas besoin de garder une trace des états internes. Par exemple, si j'ai besoin de transformer A en B et de ne pas s'appuyer sur un état interne C, qui peuvent varier, j'ai créer un statique de la transformer. Si il y a un état interne C que je veux être en mesure de régler, puis-je ajouter un constructeur de série C et de ne pas utiliser un statique de la transformer.

J'ai lu plusieurs recommandations (y compris sur StackOverflow) de ne PAS abuser des méthodes statiques, mais je n'arrive toujours pas à comprendre à quoi il mal avec la règle ci-dessus.

C'est qu'une approche raisonnable ou pas?

164voto

John Millikin Points 86775

Il y a deux types de communes des méthodes statiques:

  • Un "coffre-fort" méthode statique donnera toujours le même résultat pour les mêmes entrées. Il ne modifie aucune globals, et à ne pas faire appel à toute "dangereux" méthodes statiques d'une classe. Essentiellement, vous utilisez une limité de tri de la programmation fonctionnelle, -- n'ayez pas peur de ces, ils vont bien.
  • Un "dangereux" méthode statique mutation de l'état global, ou des procurations pour un objet global, ou d'une autre non-vérifiables comportement. Ce sont des régressions à la programmation procédurale, et doit être refait si possible.

Il y a quelques utilisations courantes de "dangereux" statique -- par exemple, dans le pattern Singleton -- mais sachez que malgré tout jolis noms vous les appelez, vous êtes juste à la mutation des variables globales. Réfléchissez bien avant d'utiliser dangereuses de la statique.

21voto

S.Lott Points 207588

Un objet sans état interne est une chose de suspect.

Normalement, les objets encapsulent état et le comportement. Un objet que seuls les encapsule le comportement est bizarre. Parfois, il est un exemple de Léger ou à la Mouche.

D'autres fois, c'est de la conception procédurale fait dans une langue d'objet.

6voto

JeeBee Points 11882

L'autre option est de les ajouter en tant que non-statique des méthodes sur l'objet d'origine:

c'est à dire, en train de changer:

public class BarUtil {
    public static Foo transform(Bar toFoo) { ... }
}

en

public class Bar {
    ...
    public Foo transform() { ...}
}

toutefois, dans nombre de situations, il n'est pas possible (par exemple, classe régulière de génération de code à partir de XSD/WSDL/etc), ou elle fera la classe très long, et la transformation des méthodes peut souvent être une vraie douleur pour les objets complexes et vous voulez juste dans leur propre classe. Donc oui, j'ai des méthodes statiques dans les classes utilitaires.

5voto

MunkiPhD Points 2610

Cela semble être une approche raisonnable. La raison pour laquelle vous ne voulez pas utiliser un trop grand nombre de classes statiques/méthodes est que cela vous éloigne de la programmation orientée objet, et plus dans le domaine de la programmation structurée.

Dans votre cas où vous êtes tout simplement la transformation de A à B, de dire tout ce que nous faisons est en train de transformer le texte pour aller de

"hello" =>(transform)=> "<b>Hello!</b>"

Ensuite, une méthode statique aurait du sens.

Toutefois, si vous êtes en invoquant ces méthodes statiques sur un objet fréquemment et il a tendance à être unique pour de nombreux appels (par exemple, la façon dont vous l'utilisez dépend de l'entrée), ou il fait partie de la nature du comportement de l'objet, il serait sage de faire partie de l'objet et du maintien d'un état de il. Une façon de le faire serait de l'appliquer comme une interface.

class Interface{
    method toHtml(){
        return transformed string (e.g. "<b>Hello!</b>")
    }

    method toConsole(){
        return transformed string (e.g. "printf Hello!")
    }
}


class Object implements Interface {
    mystring = "hello"

    //the implementations of the interface would yield the necessary 
    //functionality, and it is reusable across the board since it 
    //is an interface so... you can make it specific to the object

   method toHtml()
   method toConsole()
}

Edit: Un bon exemple de la grande utilisation de méthodes statiques html méthodes d'aide à Asp.Net MVC ou Ruby. Ils créent les éléments html qui ne sont pas liés au comportement d'un objet, et sont donc statiques.

Edit 2: modification de la programmation fonctionnelle, de la programmation structurée (pour une raison que je n'ai pas compris), des accessoires de Torsten pour le pointage.

5voto

Steve Rowe Points 14688

La raison pour laquelle vous êtes averti à l'écart de méthodes statiques est grâce à eux perd un des avantages d'objets. Les objets sont destinés pour l'encapsulation des données. Cela évite des effets secondaires inattendus de passe ce qui évite des bugs. Méthodes statiques ont pas de données encapsulées* et afin de ne pas susciter de cet avantage.

Cela dit, si vous n'avez pas l'utilisation de données internes, ils sont beaux à utiliser et légèrement plus rapide à exécuter. Assurez-vous de ne pas toucher de données mondiale en eux.

  • Certaines langues ont également des variables de niveau classe qui permettrait d'encapsulation des données et des méthodes statiques.

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