Должен ли чистый метод быть статичным? - PullRequest
0 голосов
/ 22 мая 2018

В настоящее время я работаю с учебником, в котором чистый метод определяется как:

"метод статический , который зависит только от его параметров и никаких других данных"

Разве невозможно, чтобы метод экземпляра был чистым методом без статичности (если он не изменяет параметры и не имеет «побочных эффектов», таких как печать)?

Я знаю, что если чистый метод является чистым, возвращаемое значение зависит только от параметров, а не от какого-либо другого состояния, поэтому, возможно, способ вызова методов экземпляра означает, что переменные, взятые из объекта, вызывающего метод, не учитываютсяв качестве параметров, но как другое «состояние»?

Кроме этого, я не могу представить себе причину, по которой нестатический метод не может быть чистым методом.

Вот пример:

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;
    }
}

Выше определено Rational класс

Затем можно написать метод в классе Rational, который возвращает Rational объект как double с помощью «первого метода» или «второго метода» ниже.

первого метода:

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

второго метода:

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

По сути, они делают одно и то же, но один - статический метод, а другой - метод экземпляра, поэтому их вызовы будут в другом формате.Второй метод, безусловно, является чистым методом, но будет ли метод Один, который не является статичным, также определен как чистый метод в этих обстоятельствах?

Ответы [ 6 ]

0 голосов
/ 22 мая 2018

Нет гарантии, что метод static равен pure.Технически статический метод может иметь статическое состояние.Вот почему ваше предположение

"статический метод, который зависит только от его параметров и никаких других данных"

неверно.

РЕДАКТИРОВАТЬ после комментария Берги

Как я уже говорил, ключевое слово static не гарантирует сохранение состояния.Если вы опустите ключевое слово static в своей цитате, оно все равно останется верным.

Итак, отвечая на ваш вопрос.Должен ли чистый метод быть статичным?Ответ зависит от этого.

Использование статической функции имеет ряд преимуществ, например:

  • Это самопроверка, гарантирующая, что вы этого не сделаете (случайно)) изменить состояние в вашем классе;

  • Метод не может быть переопределен.Что гарантирует, что метод не изменит состояние в будущем.

Но, с другой стороны, статические методы сложно смоделировать и это может стать проблемой во время тестирования.

0 голосов
/ 22 мая 2018

Концептуально, единственное различие между статическим методом и методом экземпляра состоит в том, что метод экземпляра имеет скрытый параметр, доступный через ключевое слово this.

Поэтому метод экземпляра, который не мутирует this, является чистымесли в противном случае он квалифицируется как чисто статический метод.

Проблема здесь может быть скорее связана с виртуальной диспетчеризацией, которая предотвращается static.Метод базового класса может быть чистым, тогда как метод производного класса может быть нечистым, в то время как их контракт в системе типов Java равен.

0 голосов
/ 22 мая 2018

Этот метод:

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

не является статическим, но его возвращаемое значение не зависит ни от чего, кроме параметров.Но из-за этого add вовсе не обязательно должен быть методом экземпляра!

Я думаю, это то, к чему стремится ваш учебник - методы экземпляров, которые не обращаются к состоянию или не изменяют его, могута также быть статическим.

Методы экземпляров должны зависеть от состояния объекта, в противном случае это должен быть статический метод.А статические методы, которые не зависят от статических состояний, чисты.

0 голосов
/ 22 мая 2018

«Статическая» часть этого определения излишня.Метод, являющийся static , не гарантирует, что он не зависит ни от какого другого состояния.Я подозреваю, что определение просто хотело убедиться, что метод не использует переменные экземпляра.

С другой стороны, технически вы также можете рассматривать метод экземпляра как статический метод с нулевым параметром, объектомсам.Если этот объект неизменен (или метод ничего не меняет в объекте), вы можете утверждать, что метод все еще чистый.По сути, вы рассматриваете «объект» как дополнительный параметр.

Например, ссылки на методы в Java могут вести себя таким образом, делая первый аргумент самим объектом, для которого вызывается метод.

0 голосов
/ 22 мая 2018

Чистый метод также может быть статическим.Два критерия для чистого метода: согласно Википедии :

  1. Функция всегда оценивает одно и то же значение результата при одинаковых значениях аргументов,Значение результата функции не может зависеть от состояния скрытой информации или , которое может изменяться в процессе выполнения программы или между различными выполнениями программы, а также не может зависеть от какого-либо внешнего ввода из I /Устройства O.

  2. Оценка результата не вызывает каких-либо семантически наблюдаемых побочных эффектов или выходных данных, таких как мутация изменяемых объектов или вывод на устройства ввода-вывода.

(выделено мной)

Нет причин, по которым это не может применяться к нестатическому методу.Создание статического метода дало бы вызывающей стороне более надежные гарантии того, что никакое состояние экземпляра не использовалось, поэтому, вероятно, лучше сделать его статическим.


В зависимости от вашей точки зрения, метод экземпляра можно рассматривать как простофункция, принимающая дополнительный неявный аргумент: сам экземпляр.Таким образом, нестатический метод может полагаться на состояние экземпляра и считаться чистым, при условии, что он не зависит от какого-либо внешнего состояния (синглетоны и т. Д.) И не вызывает побочных эффектов. В ответе Роберта это хорошо сказано .Это зависит от толкования, но мое личное мнение таково, что такой метод был бы чистым.

Во , выразив это в комментариях:

Почемускрытый этот указатель можно считать более особенным, чем любой другой параметр функции?Этот аргумент приводит к противоречию: предположим, что
public static int pureFunc(MyInstance self) является чистым, очевидно, что изоморф
public int pureFunc() также будет чистым.

0 голосов
/ 22 мая 2018

«Чистый» в основном означает «зависит только от своих аргументов и не имеет побочных эффектов».

Статический метод не должен быть чистым, поскольку он может обращаться к статической структуре данных.Точно так же метод экземпляра может быть чистым, так как он не имеет доступа к переменным экземпляра.

Таким образом, понятия «статический» и «экземпляр» не имеют прямого отношения к понятию «чистый»..

...