web-dev-qa-db-fra.com

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

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

"a static méthode qui ne dépend que de ses paramètres et pas d'autres données"

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 qu'une méthode pure doit être pure, la valeur renvoyée dépend uniquement des paramètres et non d'un autre état. La façon dont les méthodes d'instance sont appelées signifie donc peut-être que les variables extraites de l'objet appelant la méthode ne comptent pas. paramètres mais comme un autre "état"?

Autrement, 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 une classe Rational

Vous pouvez ensuite écrire une méthode dans la classe Rational qui retourne un objet Rational sous la forme double par «Méthode un» ou «Méthode deux» ci-dessous.

Méthode 1:

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

Méthode deux:

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

Ils font essentiellement la même chose, mais l’une est une méthode statique et l’autre est une méthode d’instance afin que leurs appels soient dans un format différent. La méthode deux est certes une méthode pure, mais la méthode un, non statique, pourrait-elle également être définie comme une méthode pure dans ces circonstances?

27
Josh Hardman

La partie "statique" de cette définition est superflue. Une méthode étant static ne garantit pas qu'elle ne repose sur aucun 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'un autre côté, techniquement, vous pouvez également considérer une méthode d'instance comme une méthode statique avec un paramètre zéro-ème, l'objet lui-même. Si cet objet est immmutable (ou que la méthode ne change rien dans l'objet), vous pouvez soutenir que la méthode est toujours pure. Fondamentalement, vous considérez "l'objet" comme un paramètre supplémentaire.

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

28

Une méthode pure pourrait aussi bien être statique. Les deux critères pour une méthode pure sont, selon Wikipedia :

  1. La fonction évalue toujours la même valeur de résultat pour le même valeur d'argument (s). La valeur du résultat de la fonction ne peut dépendre d'aucun informations cachées ou état susceptibles de changer pendant l'exécution du programme procède ou entre différentes exécutions du programme, et ne le peut pas non plus dépendent de toute entrée externe de périphériques d’E/S.

  2. L’évaluation du résultat n’entraîne aucune observation sémantique effet secondaire ou sortie, telle que la mutation d'objets mutables ou la sortie aux périphériques 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 une garantie plus grande qu'aucun état d'instance n'était utilisé. Il est donc probablement préférable de la rendre statique.


Selon votre point de vue, une méthode d'instance peut simplement être considérée comme une fonction prenant un argument implicite supplémentaire: l'instance elle-même. De cette manière, une méthode non statique pourrait s'appuyer sur un état d'instance et être considérée comme pure, à condition de ne pas s'appuyer sur un état externe (singletons, etc.) ou de produire des effets secondaires. _ { La réponse de Robert le dit bien . Cela relève de l'interprétation, mais mon opinion personnelle est qu'une telle méthode serait pure.

_ { Voo } _ le dit bien dans les commentaires:

Pourquoi un pointeur caché devrait-il être considéré comme plus spécial que tout autre paramètre à la fonction? Cet argument conduit à un contradiction: supposons que
public static int pureFunc(MyInstance self) est pur, clairement l'isomorphe
public int pureFunc() serait pur en tant que bien.

21
Michael

Conceptuellement, la seule différence entre une méthode statique et une méthode d'instance est que cette méthode d'instance possède un paramètre masqué accessible via le mot clé this.

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.

11
Zdeněk Jelínek

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

Une méthode statique ne doit pas nécessairement être pure car 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.

Ainsi, les concepts de "statique" et "d'instance" ne sont pas directement liés au concept de "pur".

5
Malt

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, sauf des paramètres. Mais pour cette raison, add n'a pas besoin d'être une méthode d'instance!

Je pense que c’est ce à quoi votre manuel s’adresse - des méthodes d’instance qui n’accèdent pas à l’état ou ne changent pas d’état peuvent aussi bien être statiques.

Les méthodes d'instances sont suppose que dépend 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.

1
Sweeper

Rien ne garantit qu'une méthode static est pure. Techniquement, une méthode statique peut avoir un état statique. C'est pourquoi votre hypothèse 

"une méthode statique qui ne dépend que de ses paramètres et pas d'autres données"

ce n'est pas vrai.

EDIT après le commentaire de Bergi

Comme je l'ai dit précédemment, le mot clé static ne garantit pas un état sans état. Si vous omettez le mot clé static dans votre devis, il sera toujours vrai.

Alors répondez à votre question. Une méthode pure doit-elle être statique? La réponse est que cela dépend.

Rendre la fonction pure statique, c’est-à-dire:

  • C'est un autocontrôle qui garantit que vous ne changez pas (accidentellement) d'état dans votre classe;

  • La méthode ne peut pas être remplacée. Ce qui garantit que la méthode ne changera pas d'état à l'avenir.

Mais d'un autre côté, il est difficile de se moquer des méthodes statiques et cela peut poser problème lors des tests.

0
dehasi