java - para - manual de programacion android pdf
¿Un método puro tiene que ser estático? (6)
Estoy trabajando en un libro de texto en este momento que define un método puro como:
"Un método estático que depende solo de sus parámetros y no de otros datos"
¿No sería posible que un método de instancia fuera un método puro sin ser estático (siempre que no modifique los parámetros y no tenga efectos secundarios como la impresión)?
Sé que para que un método puro sea puro, el valor de retorno solo depende de los parámetros y no de ningún otro estado, por lo que quizás la forma en que se llaman los métodos de instancia significa que las variables tomadas del objeto que llama al método no cuentan como parámetros pero como otro "estado"?
Aparte de eso, no puedo pensar en ninguna razón por la que un método no estático no pueda ser un método puro.
Aquí hay un ejemplo:
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;
}
}
Lo anterior define una clase Rational
Luego, puede escribir un método en la clase Rational
que devuelva un objeto Rational
como un double
mediante el ''Método uno'' o el ''Método dos'' a continuación.
Método uno:
public double toDouble() {
double x = this.numer;
double y = this.denom;
double fprat = x / y;
return fprat;
}
Método dos:
public static double toDouble(Rational rational)
{
double x = rational.numer;
double y = rational.denom;
double fprat = x / y;
return fprat;
}
Básicamente, hacen exactamente lo mismo, pero uno es un método estático y el otro es un método de instancia para que sus llamadas estén en un formato diferente. El método dos es ciertamente un método puro, pero ¿el método uno, que no es estático, también se definirá como un método puro en estas circunstancias?
"Puro" básicamente significa "depende solo de sus argumentos y no tiene efectos secundarios".
Un método estático no tiene que ser puro, ya que podría acceder a una estructura de datos estática. De la misma manera, un método de instancia puede ser puro, ya que no accede a ninguna variable de instancia.
De modo que los conceptos de "estático" y "instancia" no están directamente relacionados con el concepto de "puro".
Conceptualmente, la única diferencia entre un método estático y un método de instancia es que el método de instancia tiene un parámetro oculto accesible a través de this
palabra clave.
Por lo tanto, un método de instancia que no muta this
es puro si, de lo contrario, calificaría como un método estático puro.
El problema aquí puede estar más bien relacionado con el envío virtual que se evita mediante static
. Un método de clase base puede ser puro, mientras que un método de clase derivado puede ser impuro mientras que su contrato en el sistema de tipo Java es igual.
Este método:
public int add(int a, int b) {
return a + b;
}
no es estático, pero su valor de retorno no depende de nada, excepto de los parámetros. Pero debido a esto, add
no tiene que ser un método de instancia.
Creo que esto es lo que su libro de texto está obteniendo: los métodos de instancias que no acceden al estado o mutan el estado también pueden ser estáticos.
Se supone que los métodos de instancias dependen del estado del objeto, de lo contrario debería ser un método estático. Y los métodos estáticos que no dependen de estados estáticos son puros.
La parte "estática" de esa definición es superflua. Un método que sea estático no garantiza que no se base en ningún otro estado. Sospecho que la definición solo quería asegurarse de que el método no usa variables de instancia.
Por otro lado, técnicamente también puede pensar en un método de instancia como un método estático con un parámetro de cero, el objeto en sí. Si ese objeto es inmutable (o el método no cambia nada en el objeto), podría argumentar que el método aún es puro. Básicamente consideras el "objeto" como un parámetro adicional.
Las referencias de métodos en Java, por ejemplo, pueden comportarse de esta manera, convirtiendo el primer argumento en el objeto en el que se llama el método.
No hay garantía de que un método static
sea pure
. Técnicamente un método estático puede tener un estado estático. Por eso tu suposición.
"Un método estático que depende solo de sus parámetros y no de otros datos"
no es verdad.
EDITAR después del comentario de Bergi
Como dije antes, la palabra clave static
no garantiza sin estado. Si omite la palabra clave static
en su cotización, todavía será cierto.
Así que respondiendo a tu pregunta. ¿Un método puro tiene que ser estático? La respuesta es, depende.
Hay beneficios al hacer que la función pura sea estática, es decir:
Es una autocomprobación, que garantiza que usted no (accidentalmente) cambie de estado en su clase;
El método no puede ser anulado. Lo que garantiza que el método no cambiará de estado en el futuro.
Pero, por otro lado, es difícil simular métodos estáticos y puede ser un problema durante las pruebas.
Un método puro también podría ser estático. Los dos criterios para un método puro son, en.wikipedia.org/wiki/Pure_function :
La función siempre evalúa el mismo valor de resultado dado el mismo valor de argumento (s). El valor del resultado de la función no puede depender de ninguna información oculta o estado que pueda cambiar durante la ejecución del programa o entre diferentes ejecuciones del programa, ni puede depender de ninguna entrada externa de los dispositivos de E / S.
La evaluación del resultado no causa ningún efecto o efecto secundario observable semánticamente, como la mutación de objetos mutables o la salida a dispositivos de E / S.
(énfasis mío)
No hay razón para que esto no se aplique a un método no estático. Hacer el método estático le daría a la persona que llama garantías más sólidas de que no se estaba utilizando un estado de instancia, por lo que probablemente sea mejor hacerlo estático.
Dependiendo de su perspectiva, uno podría ver un método de instancia como simplemente una función que toma un argumento implícito adicional: la instancia en sí. De esta manera, un método no estático podría depender del estado de instancia y ser considerado puro, siempre que no dependiera de ningún estado externo (singleton, etc.) o produzca efectos secundarios. La respuesta de Robert lo pone muy bien . Esto depende de la interpretación, pero mi opinión personal es que tal método sería puro.
Voo puso muy bien en los comentarios:
¿Por qué un puntero oculto debe considerarse más especial que cualquier otro parámetro de la función? Ese argumento lleva a una contradicción: supongamos que
public static int pureFunc(MyInstance self)
es puro, claramente el isomorfo
public int pureFunc()
sería puro.