Pourquoi ne sont pas les méthodes statiques considéré comme bon OO pratique?
Je suis en train de lire Programmation Scala. Au début du chapitre 4, l'auteur des commentaires que Java prend en charge les méthodes statiques, qui sont "pas-si-pure concepts OO." Pourquoi est-ce donc?
- Je ne suis pas sûr que "pas-si-pur" doit être immédiatement associés à une mauvaise pratique.
- Pas mal pratique. Tout simplement pas une bonne pratique, selon l'auteur.
- L'auteur ne donne pas de raisonnement?
- Aucun. Il est déconcertant. Mais maintenant, il fait sens.
- Cœur du problème: statique choses ne peuvent pas être polymorphes.
Vous devez vous connecter pour publier un commentaire.
L'une des raisons que 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 non des méthodes statiques. Méthodes statiques donc ne rentre pas très bien dans l'héritage.
Note également que des 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 substituée à tous, que caché. Essayez ceci:Lorsque vous exécutez cette opération, 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 super-classe (il n'a pas l'écraser), et ça donne ce que vous attendez.On pourrait naïvement s'attendre à des "non-statique" de l'appel d'une méthode statique pour utiliser le polymorphisme. Il n'a pas. Quelle que soit la classe de la variable est déclarée comme celle utilisée pour rechercher la méthode. Ce est mauvais parce que quelqu'un pourrait s'attendre à ce que le code pour faire quelque chose de différent de ce qu'il fait réellement.
Cela ne veut pas dire "Ne pas utiliser des méthodes statiques!" Cela signifie que vous devez réserver l'utilisation de méthodes statiques pour les cas où vous voulez vraiment l'objet de Classe propre à la méthode, et non pas seulement comme une manière paresseuse de faire un singleton.
L'orientation de l'objet est d'environ trois choses:
De ces trois, le plus important est de messagerie.
Méthodes statiques violer au moins de messagerie et de liaison tardive.
L'idée de 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 la seulement moyen de communication/calcul.
Méthodes statiques ne pas le faire. Ils ne sont pas associés avec n'importe quel objet. Ils ne sont vraiment pas des méthodes à tous les, selon la définition habituelle. Ils sont vraiment juste des procédures. Il y a à peu près pas de différence entre un Java méthode statique
Foo.bar
et un sous-programme BASICFOO_BAR
.Que pour un retard de liaison: un plus moderne nom qui est répartition dynamique. Méthodes statiques violent, trop, en fait, c'est même dans leur nom: statique méthodes.
Méthodes statiques pause de quelques très belles propriétés de l'orientation de l'objet. Par exemple, les systèmes orientés objet sont automatiquement de la capacité de coffre avec des objets agissent comme des capacités. Méthodes statiques (ou vraiment tout statique, que l'état statique ou méthodes statiques) saut de propriété.
Vous pouvez également exécuter chaque objet en parallèle dans son propre processus, puisqu'ils ne communiquent via la messagerie, ainsi trivial de la simultanéité. (Comme Acteurs, fondamentalement, ce qui ne devrait pas être trop surprenant, puisque Carl Hewitt créé l'Acteur Modèle basé sur Smalltalk-71, et Alan Kay créé Smalltalk-71 partiellement basé sur le PLANIFICATEUR, qui à son tour a été créé par Carl Hewitt. La relation de proximité entre les acteurs et les objets est loin d'être une coïncidence, en fait, ils sont essentiellement les mêmes.) Encore une fois, la statique (les deux méthodes statiques, et surtout état statique) briser cette belle propriété.
Ne pas confondre "pas-si-pure concepts OO" avec les "mauvaises pratiques". Être pur "OO" n'est pas la panacée que vous devriez tenter de réaliser. Tout simplement parce que les méthodes statiques ne prenez 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 pas à des objets, et ils ne devraient pas être forcé dans ce moule juste pour le plaisir de "pureté".
Certaines personnes pensent que les choses devraient être "pur", et donc tout ce qui est "impur" est une mauvaise pratique. En réalité, les mauvaises pratiques est juste de faire des choses qui sont confuses, difficiles à entretenir, difficile à utiliser, etc. La création de méthodes statiques qui prennent une instance est une mauvaise pratique parce que toute méthode qui prend une instance doit probablement être une méthode d'instance. D'autre part, des choses comme utilitaire et l'usine des fonctions généralement ne pas prendre un exemple, afin qu'ils devrait être statique.
Si vous vous demandez pourquoi ils ne sont pas "pur OO", c'est parce qu'ils ne sont pas des méthodes d'instance. Un "pur" langage OO aurait tout un objet, et que toutes les fonctions soient les méthodes d'instance. Bien sûr, ce n'est pas très utile tout le temps. Par exemple, considérons le
Math.atan2
méthode. Il prend deux nombres et ne nécessite pas de n'importe quel état. Quel objet pourrait même que vous en faire une méthode de? Dans un "pur" langage OO,Math
peut-être lui-même un objet (un singleton, probablement), etatan2
serait une méthode d'instance, mais puisque la fonction ne fait pas les utiliser n'importe quel état dans leMath
objet, il n'est également pas un "pur OO" concept.atan2
des mesures de la fonction de la radians de l'angle d'un seul point pour l'axe x positif. En d'autres termes, il ne devrait pas prendre le nombre deux arguments, en premier lieu, il convient de prendre un seul point d'argument. Qui, dans OO termes, pourrait être modélisé comme une méthode sur un objet point.stdev
etaverage
fonctions? Devraient-elles être des méthodes deArray
? Ou doivent-ils être les méthodes d'instance de leur propre classe (Stats
) qui contient tous les nombres tels que vous devez convertir votreArray
à unStats
de sorte que vous pouvez leur moyenne? Ou doivent-ils être des méthodes statiques que vous simplement passer un tableau de nombres?Méthodes statiques cause de couplage étroit, ce qui est une violation de la bonne Conception Orientée Objet. Le couplage de code d'appel et le code dans la méthode statique ne peut pas être évitée par Inversion de Dépendance parce que des méthodes statiques, intrinsèquement, ne supportent pas la conception orientée objet des techniques telles que l'Héritage et le Polymorphisme.
En plus de méthodes statiques sont difficiles à tester en raison de ces étroitement couplés de dépendances, qui souvent plomb à la troisième partie de l'infrastructure que le code dépend - comme une base de données, et il est très difficile de changer de comportement sans passe réellement à l'intérieur et modifiant le code.
Méthodes statiques ne sont pas considérés comme de bons OO pratique en raison de raisons ci-dessous:
1) Empêche de Ré-utilisabilité:
Les méthodes statiques ne peuvent pas être surchargée. Il ne peut pas être utilisée dans l'interface.
2) Objet de la durée de Vie est très longue:
Méthodes statiques restent dans la mémoire pour un journal du temps et son la collecte des ordures prend beaucoup de temps. Développeur n'ont pas de contrôle sur la destruction ou de la création des variables Statiques.
Utilisation Excessive de la statique des variables peuvent conduire à la saturation de la mémoire.
3) par ailleurs, certains autres points:
Il ne respecte pas l'encapsulation parce que l'objet ne reste pas dans le contrôle complet de son état. Il ne suit pas des concepts comme l'Inversion de contrôle, couplage lâche, l'injection de dépendance, etc.
Méthodes statiques ne sont pas purs concepts OO parce qu'ils peuvent être invoquées sans un objet fait d'être associé avec eux. Vous utilisez la classe elle-même. Vous appelez comme ça
Classname.method(...);
Concept de l'OO est en pourparlers sur le contrôle/l'accès aux données à partir d'un objet, mais les méthodes statiques ne doivent pas être appelé à l'aide d'un objet et qu'ils appartiennent à une classe plutôt qu'à l'objet.
--Acclamations