Pourquoi les méthodes statiques ne sont-elles pas considérées comme une bonne pratique OO?

Je lis programmation Scala . Au début du chapitre 4, L'auteur commente que Java supporte les méthodes statiques, qui sont des "concepts oo pas si purs"."Pourquoi est-ce donc?

29
demandé sur Mike 2010-10-23 06:46:25

7 réponses

Une raison pour laquelle les méthodes statiques ne sont pas très OO qui n'a pas été mentionné jusqu'à présent est que les interfaces et les classes abstraites ne définissent que des méthodes non statiques. Les méthodes statiques ne s'intègrent donc pas très bien dans l'héritage.

Remarque également que les méthodes statiques n'ont pas accès à "super", ce qui signifie que les méthodes statiques ne peuvent pas être remplacées dans un sens réel. En fait, ils ne peuvent pas être remplacés du tout, seulement cachés. Essayez ceci:

public class Test {
    public static int returnValue() {
        return 0;
    }

    public static void main(String[] arg) {
        System.out.println(Test.returnValue());
        System.out.println(Test2.returnValue());
        Test x = new Test2();
        System.out.println(x.returnValue());
    }
}


public class Test2 extends Test {
    public static int returnValue() {
        return 1;
    }
}

Lorsque vous exécutez ceci, vous n'obtiendrez pas ce que vous attendez. Test.returnValue() donne ce que vous attendez. Test2.returnValue() Cache la méthode du même nom dans la superclasse (elle ne la remplace pas), et elle donne ce que vous attendez.

On pourrait naïvement s'attendre à appeler "non statiquement" une méthode statique pour utiliser le polymorphisme. Ce n'est pas le cas. quelle que soit la classe, la variable est déclarée comme celle utilisée pour rechercher la méthode. C'est une mauvaise forme parce que quelqu'un pourrait s'attendre à ce que le code fasse quelque chose de différent de ce qu'il fait réellement.

Cela ne signifie pas, "N'utilisez pas de méthodes statiques!"Cela signifie que vous devez réserver l'utilisation de méthodes statiques pour les instances où vous voulez vraiment que L'objet de classe possède la méthode, et pas seulement comme un moyen paresseux de faire un singleton .

23
répondu Eddie 2010-10-23 03:10:35

L'orientation de l'Objet est d'environ trois choses:

  • messagerie,
  • Conservation et protection locales et masquage du processus d'état, et
  • extrême liaison tardive de toutes choses.

De ces trois, le plus important est de messagerie.

Les méthodes statiques violent au moins la messagerie et la liaison tardive.

L'idée de messagerie signifie que dans OO, le calcul est effectué par des réseaux d'objets autonomes qui envoient des messages à mutuellement. L'envoi d'un message est le seul moyen de communication/calcul .

Les méthodes statiques ne le font pas. Ils ne sont pas associés avec n'importe quel objet. Ce ne sont vraiment pas des méthodes du tout , selon la définition habituelle. Ce ne sont vraiment que des procédures. Il n'y a à peu près aucune différence entre une méthode statique Java Foo.bar et un sous-programme de base FOO_BAR.

Quant à la liaison tardive: un nom plus moderne pour cela est Dynamic dispatch . Méthodes statiques violent que, trop, en fait, c'est même dans leur nom: static méthodes.

Les méthodes statiques cassent de très belles propriétés d'orientation d'objet. Par exemple, les systèmes orientés objet sont automatiquement sécurisés avec des objets agissant comme des capacités. Les méthodes statiques (ou vraiment toute statique, que ce soit cet état statique ou des méthodes statiques) cassent cette propriété.

Vous pouvez également exécuter chaque objet en parallèle dans son propre processus, car ils ne communiquent que par messagerie, fournissant ainsi une concurrence triviale. (Comme Actors , fondamentalement, ce qui ne devrait pas être trop surprenant, puisque Carl Hewitt a créé le modèle D'acteur basé sur Smalltalk-71, et Alan Kay a créé Smalltalk-71 partiellement basé sur PLANNER, qui à son tour a été créé par Carl Hewitt. La relation étroite entre les acteurs et les objets est loin d'être fortuite, en fait, ils sont essentiellement une seule et même chose.) Encore une fois, statique (les deux méthodes statiques, et en particulier état statique) briser cela belle propriété.

51
répondu Jörg W Mittag 2010-10-23 03:45:58

Ne confondez pas "concepts oo pas si purs "avec" mauvaise pratique". Être "pur OO" n'est pas une panacée que vous devriez essayer d'atteindre. Ce n'est pas parce que les méthodes statiques ne prennent pas une variable d'instance comme paramètre qu'elles ne sont pas utiles. Certaines choses ne se prêtent tout simplement pas à des objets, et ils ne devraient pas être forcés dans ce moule juste pour le bien de la "pureté".

Certaines personnes pensent que les choses devraient être "pures", et donc tout ce qui est" impur " est une mauvaise pratique. En réalité, la mauvaise pratique consiste simplement à faire des choses déroutantes, difficiles à entretenir, difficiles à utiliser, etc. La création de méthodes statiques qui prennent une instance est une mauvaise pratique, car toute méthode qui prend une instance doit probablement être une méthode d'instance. D'un autre côté, des choses comme les fonctions d'utilité et d'usine ne prennent généralement pas d'instance, donc elles devraient être statiques.

Si vous vous demandez pourquoi ils ne sont pas "pure OO", c'est parce qu'ils ne sont pas des méthodes d'instance. Un" pur " OO le langage aurait tout comme un objet et toutes les fonctions seraient des méthodes d'instance. Bien sûr, ce n'est pas très utile tout le temps. Par exemple, considérons la méthode Math.atan2. Il prend deux nombres et ne nécessite aucun état. Quel objet pourriez-vous même en faire une méthode de ? Dans un langage OO "pur", Math pourrait lui-même être un objet (un singleton, probablement), et atan2 serait une méthode d'instance, mais puisque la fonction n'utilise aucun État dans l'objet Math, ce n'est pas non plus le cas un concept "pur OO".

29
répondu Gabe 2012-01-19 13:30:18

Les méthodes statiques provoquent un couplage serré, ce qui est une violation d'une bonne conception orientée objet. Le couplage serré du code appelant et du code dans la méthode statique ne peut pas être évité par L'Inversion de dépendance car les méthodes statiques ne supportent pas les techniques de conception orientées objet telles que L'héritage et le polymorphisme.

En outre, les méthodes statiques sont difficiles à tester en raison de ces dépendances étroitement couplées, qui conduisent souvent à une infrastructure tierce que le code dépend-comme une base de données, et il est très difficile de changer le comportement sans réellement entrer et changer le code.

5
répondu Ilia Anastassov 2017-10-19 19:44:47

Les méthodes statiques ne sont pas des concepts OO si purs car ils peuvent être invoqués sans qu'un objet leur soit réellement associé. Vous utilisez la classe elle-même. Vous les invoquez comme ceci Classname.method(...);

1
répondu Luis Miguel Serrano 2010-10-23 02:48:06

Les méthodes statiques ne sont pas considérées comme une bonne pratique OO pour les raisons suivantes:

1) empêche de réutiliser:

Les méthodes statiques ne peuvent pas être remplacées. Il ne peut pas être utilisé dans l'interface.

2) La durée de vie de L'objet est très longue:

Les méthodes statiques restent dans la mémoire pendant un temps de journal et sa récupération de place prend beaucoup de temps. Les développeurs n'ont pas le contrôle sur la destruction ou la création de variables statiques. L'utilisation Excessive de variables statiques peut entraîner la mémoire débordement.

3) aussi, quelques autres points:

Il ne respecte pas l'encapsulation car l'objet ne reste pas dans le contrôle complet de son état. Il ne suit pas des concepts comme L'Inversion du contrôle, le couplage lâche, l'injection de dépendance, etc.

1
répondu Gul Md Ershad 2017-10-21 17:27:13

Le Concept de OO parle de contrôler / accéder aux données d'un objet, mais les méthodes statiques n'ont pas besoin d'être appelées en utilisant un objet et elles appartiennent à la classe plutôt qu'à l'objet.

--Acclamations

0
répondu Koteswara sarma 2010-10-23 02:51:09