28 votes

Une méthode pure doit-elle être statique ?

Je travaille actuellement sur un manuel qui définit une méthode pure comme suit :

"a statique une méthode qui ne dépend que de ses paramètres et d'aucune autre donnée".

Ne serait-il pas possible qu'une méthode d'instance soit une méthode pure sans être statique (tant qu'elle ne modifie pas les paramètres et n'a pas d'effets secondaires comme l'impression) ?

Je sais que pour qu'une méthode soit pure, la valeur de retour ne dépend que des paramètres et d'aucun autre état, alors peut-être que la façon dont les méthodes d'instance sont appelées signifie que les variables prises dans l'objet qui appelle la méthode ne comptent pas comme des paramètres mais comme un autre "état" ?

En dehors de cela, je ne vois pas pourquoi une méthode non statique ne pourrait pas être une méthode pure.

Voici un exemple :

public class Rational {

    private int numer;
    private int denom;

    public Rational() {
        this.numer = 0;
        this.denom = 1;
    }

    public Rational(int numer, int denom) {
        this.numer = numer;
        this.denom = denom;
    }
}

Ce qui précède définit un Rational classe

Vous pourriez alors écrire une méthode dans le Rational qui renvoie un Rational en tant qu'objet double par la "méthode 1" ou la "méthode 2" ci-dessous.

Première méthode :

public double toDouble() {
    double x = this.numer;
    double y = this.denom;
    double fprat = x / y;
    return fprat;
}   

Deuxième méthode :

public static double toDouble(Rational rational)
{
    double x = rational.numer;
    double y = rational.denom;
    double fprat = x / y;
    return fprat;
} 

Elles font essentiellement la même chose, mais l'une est une méthode statique et l'autre une méthode d'instance, de sorte que leurs appels seraient dans un format différent. La méthode deux est certainement une méthode pure mais la méthode une, qui est non statique, serait-elle également définie comme une méthode pure dans ces circonstances ?

28voto

Robert Bräutigam Points 4480

La partie "statique" de cette définition est superflue. Une méthode étant statique ne garantit pas qu'il ne dépende pas d'un autre état. Je soupçonne que la définition voulait simplement s'assurer que la méthode n'utilise pas de variables d'instance.

D'autre part, d'un point de vue technique, vous pouvez également considérer une méthode d'instance comme une méthode statique avec un zéro-ième paramètre, l'objet lui-même. Si cet objet est immuable (ou que la méthode ne change rien à l'objet), on peut dire que la méthode est toujours pure. En fait, vous considérez l'"objet" comme un paramètre supplémentaire.

Références de la méthode en Java, par exemple, peut se comporter de cette manière, en faisant du premier argument l'objet lui-même sur lequel la méthode est appelée.

22voto

Michael Points 20266

Une méthode pure pourrait aussi bien être statique. Les deux critères d'une méthode pure sont , selon Wikipédia :

  1. La fonction évalue toujours la même valeur de résultat pour la même valeur d'argument(s). valeur(s) d'argument. Le site La valeur du résultat de la fonction ne peut dépendre d'aucune information cachée o état qui peut changer pendant l'exécution du programme se déroule ou entre différentes exécutions du programme, et ne peut pas non plus dépendre d'une entrée externe provenant de périphériques d'E/S.

  2. L'évaluation du résultat ne provoque pas d'effet secondaire ou de sortie sémantiquement observable, tel que la mutation d'objets mutables ou de sorties. sémantiquement observables, tels que la mutation d'objets mutables ou la production de résultats. vers des dispositifs d'E/S.

(c'est moi qui souligne)

Il n'y a aucune raison pour que cela ne s'applique pas à une méthode non statique. Rendre la méthode statique donnerait à l'appelant de meilleures garanties qu'aucun état d'instance n'est utilisé, il est donc probablement préférable de la rendre statique.


Selon votre point de vue, on peut considérer une méthode d'instance comme une simple fonction prenant un argument implicite supplémentaire : l'instance elle-même. De cette façon, une méthode non statique pourrait s'appuyer sur l'état de l'instance et être considérée comme pure, à condition qu'elle ne s'appuie pas sur un état externe (singletons, etc.) ou ne produise pas d'effets secondaires. La réponse de Robert le dit bien . Ceci est sujet à interprétation, mais mon opinion personnelle est qu'une telle méthode serait pure.

Voo le dire joliment dans les commentaires :

Pourquoi un pointeur caché de ce type devrait-il être considéré comme plus spécial que tout autre paramètre de la fonction ? Cet argument conduit à une contradiction : Supposons que
public static int pureFunc(MyInstance self) est pure, clairement l'isomorphe
public int pureFunc() serait pure aussi également.

11voto

Zdeněk Jelínek Points 1629

D'un point de vue conceptuel, la seule différence entre une méthode statique et une méthode d'instance est que la méthode d'instance possède un paramètre caché accessible par le biais de l'option this mot-clé.

Par conséquent, une méthode d'instance qui ne mute pas this est pure si elle serait autrement qualifiée de méthode statique pure.

Le problème ici peut être plutôt lié à la répartition virtuelle qui est empêchée par static . Une méthode de classe de base peut être pure tandis qu'une méthode de classe dérivée peut être impure alors que leur contrat dans le système de type Java est égal.

5voto

Malt Points 4082

"Pur" signifie essentiellement "ne dépend que de ses arguments et n'a pas d'effets secondaires".

Une méthode statique n'a pas besoin d'être pure puisqu'elle peut accéder à une structure de données statique. De la même manière, une méthode d'instance peut être pure puisqu'elle n'accède à aucune variable d'instance.

Les concepts de "statique" et d'"instance" ne sont donc pas directement liés au concept de "pur".

1voto

Sweeper Points 1267

Cette méthode :

public int add(int a, int b) {
   return a + b;
}

n'est pas statique mais sa valeur de retour ne dépend de rien d'autre que des paramètres. Mais à cause de cela, add n'a pas besoin d'être une méthode d'instance du tout !

Je pense que c'est ce à quoi votre manuel veut en venir - les méthodes des instances qui n'accèdent pas à l'état ou qui ne mutent pas l'état peuvent aussi bien être statiques.

Les méthodes des instances sont supposée pour dépendre de l'état de l'objet, sinon ce devrait être une méthode statique. Et les méthodes statiques qui ne dépendent pas d'états statiques sont pures.

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