web-dev-qa-db-fra.com

Pourquoi les méthodes statiques ne sont-elles pas considérées comme bonnes OO PRATIQUE?

Je lis Scala de programmation . Au début du chapitre 4, l'auteur commente que Java prend en charge les méthodes statiques, qui sont "non-pur OO concepts". Pourquoi est-ce si ?

36
Mike

Une des raisons que les méthodes statiques ne sont pas très OO qui n'a pas été mentionnée jusqu'à présent est que les interfaces et les classes abstraits ne définissent que des méthodes non statiques. Les méthodes statiques ne correspondent donc pas très bien à héritage.

Notez é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. Essaye ça:

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 courez cela, 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 le remplace pas) et donne ce que vous attendez.

On pourrait naïvement s'attendre à ce que "non statique" appeler 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 devriez réserver l'utilisation de méthodes statiques pour ces instances où vous voulez vraiment que l'objet de classe possède la méthode, et non aussi comme une manière paresseuse de faire un singleton.

27
Eddie

L'orientation objet est d'environ trois choses:

  • messagerie,
  • rétention et protection locales et cachette de processus d'État, et
  • extrême contraignante de toutes choses.

De ces trois, le plus important est 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 les uns aux autres. L'envoi d'un message est le uniquement manière de communication/calcul.

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

En ce qui concerne la contraction tardive: un nom plus moderne pour celui-ci est Dynamic Dispatch . Les méthodes statiques violent cela aussi, en fait, il est même dans leur nom même: Méthodes statiques .

Les méthodes statiques brisent de très belles propriétés d'orientation objet. Par exemple, les systèmes orientés objet sont automatiquement une capacité sécurisée avec des objets qui agissent comme des capacités. Méthodes statiques (ou vraiment Toutes les statiques sont telles que l'état statique ou les méthodes statiques) cassent cette propriété.

Vous pouvez également exécuter chaque objet parallèle dans son propre processus, car ils ne communiquent que via la messagerie, offrant ainsi une concurrence anticienne. (Comme acteurs , essentiellement, ce qui ne devrait pas être trop surprenant, car Carl Hewitt a créé le modèle d'acteur basé sur SmallTalk-71 et Alan Kay a créé Smalltalk -71 partiellement basé sur le planificateur, qui a été créé par Carl Hewitt. La relation étroite entre les acteurs et les objets est loin de coïncident, en fait, elles sont essentiellement une seule et même.) Encore une fois, la statique (à la fois des méthodes statiques et surtout État statique) briser cette belle propriété.

63
Jörg W Mittag

Ne confondez pas les concepts "non-si-pur OO" avec "mauvaise pratique". Être "pur oo" n'est pas une panacée que vous devriez essayer de réaliser. Ce n'est que parce que les méthodes statiques ne prennent pas une variable d'instance en tant que paramètre ne signifie pas qu'ils ne sont pas utiles. Certaines choses ne se prêtent tout simplement pas à des objets, et ils ne doivent pas être forcés dans ce moule juste pour des raisons de "pureté".

Certaines personnes pensent que les choses devraient être "pure", et donc tout "impur" est une mauvaise pratique. En réalité, la mauvaise pratique fait simplement des choses qui sont déroutantes, difficiles à maintenir, difficiles à utiliser, etc. Créer des méthodes statiques qui prennent une instance est une mauvaise pratique Parce que toute méthode qui prend une instance doit probablement une méthode d'instance. D'autre part, des choses comme l'utilité et les fonctions d'usine ne prennent généralement pas une instance, alors elles devraient Soyez statique.

Si vous vous demandez pourquoi ils ne sont pas "pure OO", c'est parce qu'ils ne sont pas des méthodes d'instance. Une langue "pure" OO aurait tout d'objet et toutes les fonctions soient des méthodes d'instance. Bien sûr, ce n'est pas terriblement utile tout le temps. Par exemple, considérons la méthode Math.atan2. Il faut deux chiffres et ne nécessite aucun état. Quel objet pourriez-vous même en faire une méthode de? Dans une langue "pure" OO, Math pourrait être un objet (un singleton, probablement) et atan2 serait une méthode d'instance, mais puisque la fonction ne fonctionne pas réellement Utilisez n'importe quel état de l'objet Math, il n'est pas non plus un concept "pur OO".

32
Gabe

Les méthodes statiques ne sont pas considérées comme bonnes OO PRATIQUE en raison des raisons ci-dessous:

1) empêche la ré-utilisabilité:

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

2) L'objet vie est très long:

Les méthodes statiques restent dans la mémoire pour une heure de journalisation et sa collection de déchets prend beaucoup de temps. Le développeur n'a pas de contrôle sur la destruction ou la création de variables statiques. Une utilisation excessive de variables statiques peut entraîner le débordement de la mémoire.

3) En outre, d'autres points:

Il ne respecte pas l'encapsulation car l'objet ne reste pas dans le contrôle total de son état. Il ne suit pas les concepts tels que l'inversion du contrôle, le couplage desserré, l'injection de dépendance, etc.

5
Gul Md Ershad

Les méthodes statiques ne sont pas si purs OO concepts parce qu'ils peuvent être invoqués sans un objet en train d'être associé à eux. Vous utilisez la classe elle-même. Vous les appelez comme ceci Classname.method(...);

1

Concept de OO Contente des discussions sur le contrôle/l'accès à des données d'un objet, mais des méthodes statiques n'ont pas besoin d'être appelées à l'aide d'un objet et appartiennent à la classe plutôt qu'à un objet.

--À votre santé

0
Koteswara sarma