2009-02-25 9 views
6

J'ai réfléchi sur un post par Misko Hevery que les méthodes statiques en Java sont un mort à la testabilité. Je ne veux pas discuter de la question de la testabilité, mais plutôt du concept des méthodes statiques. Pourquoi les gens détestent-ils tellement?les méthodes statiques font de Java un langage pseudo-fonctionnel?

Il est vrai que nous n'avons pas de fermetures (mais nous avons des fonctions anonymes légèrement maladroites), les fonctions lambdas & en tant qu'objets de première classe. D'une certaine manière, je pense que les méthodes statiques peuvent être utilisées pour imiter les fonctions en tant qu'objets de première classe.

+1

Je pense que vous confondez fonctionnel avec procédural. Une erreur commune –

+0

Java n'a pas de fonctions anonymes, vous pouvez penser à des classes anonymes. En fait Java n'a pas de fonctions du tout ... seulement des méthodes ;-) –

Répondre

2

Une caractéristique de la programmation fonctionnelle est l'immuabilité des données. static implique que vous n'avez pas besoin d'un objet (instance) représentant l'état, donc ce n'est pas un mauvais début. Vous avez toutefois un état sur le niveau de la classe, mais vous pouvez le faire en final. Puisque les méthodes (statiques) ne sont pas du tout des fonctions de première classe, vous aurez toujours besoin de constructions moche comme des classes anonymes pour approcher un certain style de programmation fonctionnelle en Java.

FP est mieux fait dans un langage fonctionnel, car il a le langage nécessaire support pour des choses comme les fonctions d'ordre supérieur, l'immuabilité, la transparence référentielle et ainsi de suite. Cependant, cela ne signifie pas que vous ne pouvez pas programmer dans un style fonctionnel dans un langage impératif tel que Java. D'autres exemples peuvent également être donnés. Ce n'est pas parce que vous programmez en Java que vous faites de la POO. Vous pouvez programmer avec des données globales et des flux de contrôle non structurés (goto) dans un langage structuré en C++. Je peux faire de la POO dans un langage fonctionnel comme Scheme. Etc.

Steve McConnell mentionne la différence de la programmation dans une langue par rapport à la programmation dans une langue dans le code complet (également une référence très populaire sur le SO). Donc, en bref, si vous dites que "les méthodes statiques imitent les fonctions de première classe", je ne suis pas d'accord. Si, cependant, et je pense que c'était plus le point que vous essayiez de faire passer, vous diriez que "les méthodes statiques peuvent aider à programmer dans un style fonctionnel en Java", je suis d'accord.

4

Les méthodes statiques rendent les tests difficiles car ils ne peuvent pas être remplacés, c'est aussi simple que cela. Comment les méthodes statiques peuvent-elles «imiter» les fonctions d'objets de première classe? ? On peut dire qu'ils sont pires que toute autre chose sur ce front. Vous pouvez "imiter" des fonctions en tant qu'objets de première classe en créant des interfaces à une seule méthode, et en effet les collections Java de Google font exactement cela dans un certain nombre d'endroits (pour les prédicats, les projections, etc.). Cela ne peut pas être fait avec des méthodes statiques - il n'y a pas moyen (sauf avec réflexion) de passer le concept de "quand vous voulez appliquer une fonction, utilisez cette méthode

Non, je ne vois pas comment les méthodes statiques aident ici.Ils découragent le changement d'état (comme le seul état disponible est l'état global et tout état mutable transmis via les paramètres) mais ils n'aident pas sur le côté "fonctions en tant qu'objets de première classe"

C# a mieux soutien à cette (avec des expressions lambda et délégués), mais même ce n'est pas aussi général que cela pourrait être. (Comparer avec F #, par exemple.)


A partir de Java 8, les références de la méthode permettra des méthodes à convertir en cas d'interfaces unique méthode appropriée, qui fera tout cela plus pertinents. En 2009, c'était encore loin ...

+0

Pourquoi voudriez-vous jamais remplacer une méthode de test? Je veux tester la méthode pas le remplacement! – ThomasD

+1

Que faire si la méthode va à un serveur Web sur l'hémisphère opposé et vous ne le voulez pas vraiment, car vous seriez mieux avec des données de simulation statique. –

+1

+1 au commentaire d'Anton. Si vous ne pouvez pas remplacer vos dépendances, vos tests «unitaires» testeront ces dépendances ainsi que la méthode qu'ils essaient vraiment de tester. –

0

Ma plus grande objection contre les méthodes statiques est qu'elles ne sont pas polymorphes et qu'elles ne sont pas utilisées de manière orientée objet, au contraire on a la classe (pas un objet) pour y accéder.

3

fonctionnelle! = Fonction, et pour le compte rendu, je prétendront qu'une méthode! = Fonction ...

Java est un statiquement typé, langage orienté objet. Java a également maintenu une pureté relative de cette manière mais ce n'est pas du tout près d'un langage fonctionnel.

S'il est vrai que vous pouvez imiter le comportement de la programmation fonctionnelle avec une programmation impérative, vous n'obtiendrez jamais cette syntaxe ordonnée que vous voudrez avoir pour le lambda-calcul. D'une certaine manière, si la langue ne supporte pas le lambda-calcul, ce n'est pas un langage de programmation fonctionnel.

C++ a des fonctions, mais C++ a aussi des classes. C++ a donc deux types de fonctions, fonctions membres et fonctions. Quand vous dites méthode, vous voulez dire une fonction de membre. Parce que la méthode est invoquée sur une instance d'un objet. Mais quand vous parlez de méthode statique, vous voulez dire simplement fonctionner (au sens C/C++). Ceci est juste un vocabulaire pour faire référence à des éléments de votre code. Et en Java le code ne peut pas exister en dehors d'une classe, une méthode impliquerait qu'elle appartient à un certain type de classe, c'est-à-dire.Jusqu'à présent, rien de ce que j'ai dit ne concerne la programmation fonctionnelle, mais je pense que vous vous trompez.

Je vous suggère de regarder les langages de programmation fonctionnels purs tels que Haskell ou Erlang. Parce que les langages de programmation fonctionnels n'ont généralement pas de fermetures non plus. Votre affirmation selon laquelle les méthodes statiques peuvent être utilisées pour imiter les fonctions en tant qu'objets de première classe me semble vraiment bizarre. Cela ressemble plus à un langage de programmation dynamique qu'à une programmation fonctionnelle.

0

Si vous utilisez uniquement des méthodes statiques, vous programmez dans un style procédural non orienté objet.

Cependant, le seul contexte auquel je peux penser où cela serait OK est lors de la première leçon de programmation avant l'introduction de l'objet.

0

En Java, vous ne pouvez pas donner une fonction en tant qu'argument à une autre fonction.

Dans un langage fonctionnel, si vous avez une fonction

def addOne(i) = i + 1 

vous pouvez passer à une autre fonction que par exemple que l'applique à tous les éléments d'une liste.

En Java, avec

public static int addOne(int i) { return i + 1; } 

il n'y a pas moyen de le faire.

Questions connexes