Статические методы или статические функции?

Статические методы или статические функции?
Статические методы или статические функции? - cortney_chummoungpak @ Unsplash

(Используя терминологию Java): статические методы могут быть связаны со статическими членами (членами объекта class). Если методы не имеют доступа к статическим членам (ни к ресурсам ввода-вывода, ни к чему-либо еще, что может изменить состояние), или если эти члены являются final примитивами или неизменяемыми объектами (по сути, константами), то такие статические методы можно было бы назвать функциями, но в целом, поскольку они потенциально могут получить доступ к членам объекта class, их обычно называют статическими методами.

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

То есть следующий area является функцией:

class MyClass {
    static final double pi = 3.14;
    static double area(double r) {
        return pi * r * r;
    }
}

в то время как следующее getCallCount не является функцией:

class MyClass {
    static int callCount = 0;
    static int getCallCount {
        return ++callCount;
    }
}

В общем, изменяемые (не-final) статические члены следует использовать с осторожностью — кто-то скажет, что их вообще не следует использовать — потому что они создают глобальное состояние для программы, что, вероятно, оказывается плохим выбором дизайна в долгосрочная перспектива. Есть исключения, но будьте осторожны...

Вам даже не нужны статические члены, чтобы сделать статические не-функции: System.nanoTime() определенно не является чистой функцией (поскольку она возвращает разные значения при последовательных вызовах), хотя она обращается только к часам компьютера, а не к каким-либо статическим членам.

Как ни странно, вы также можете создавать нестатические чистые функции:

class MyClass {
    final double pi = 3.14;
    double area(double r) {
        return pi * r * r;
    }
}

Теперь, хотя это уже не static, area по-прежнему остается чистой функцией: она не затрагивает ничего, что могло бы измениться. Тот факт, что вам придется создать экземпляр MyClass для доступа к area, не снижает его «функциональности». Действительно, можно возразить, что такого рода чистые функции всегда следует делать статическими.

Рекомендую посмотреть эти видео для лучшего погружения в вопрос:

Прикрепленное видео 1 - Статические методы класса зачем нужны. Модификатор static. Как влияет. ООП. Для начинающих. Урок - 94

Прикрепленное видео 2 - JavaScript ООП - 6: Статические методы и свойства классов


LetsCodeIt, 26 мая 2023 г., 08:58