соответствие ООП концепции java

110
09 февраля 2021, 14:50

На примере нахождения факториала хочется узнать насколько я правильно понимаю ООП. Представим факториал как самостоятельную сущность:

public class Factorial {
  private double number;
  private double result;
  public void setNumber(double number) {
    this.number = number;
  }
  public double getResult() {
    return calcFactorial(this.number);
  }
  private double calcFactorial(double number){
    this.result = 1;
    for (int i = 1; i <=number; i++){
      this.result *= i;
    } return this.result;
  }
}

Правильно ли скрыть поведение или сделать его доступным другим классам? Тогда получается getResult не нужен.. что-то я совсем запутался во всём этом. Подскажите как правильно?

Answer 1

но стоит ли тогда городить класс или есть смысл сделать метод calc в том классе, в котором нужно производить вычисление..

Классы, конечно же, должны соответствовать концепциям ООП, однако не совсем верно говорить о корректности класса, отрываясь от контекста его использования.

Возьмём этот же пример с факториалом и рассмотрим два случая:

  1. Студенту нужно выполнить лабораторную работу (написать программу, выполняющую какие-то вычисления с факториалами из комбинаторики, например, перестановки или сочетания).

  2. Работнику фирмы нужно разработать калькулятор, который "следит" за пользователем, ведёт лог его действий, поддерживает историю операций и их отмену.

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

Во втором случае имеет смысл применить паттерн Команда и сделать отдельный класс факториала и других операций. Будет куча классов, где каждый класс реализует свою операцию и сохраняет свое предыдущее состояние. Программа станет ощутимо более сложная, зато это облегчит реализацию логирования/отмены операций и сделает программу более устойчивой к изменениям. Но эта сложность была бы совершенно избыточна в первом случае.

В итоге, если пример с факториалом выдуман либо взят из какой-то простой программы, то скорее всего отдельный класс факториала избыточен. Если же программа достаточно большая и есть определенные требования предметной области, то возможно есть смысл задуматься о внедрении такого класса.

Answer 2

У вас есть одна нелогичность в цикле. В данном случае нужно итерацию начинать не с 1 а с 2. так как 1*1 не рационально хотя бы с точки зрения скорости выполнения программы. И в методе calcFactorial(double number) "this" тоже лишний, также как и "this" в return.

А так вот: Ключевые черты ООП:

Первая — инкапсуляция — это определение классов — пользовательских типов данных, объединяющих своё содержимое в единый тип и реализующих некоторые операции или методы над ним. Классы обычно являются основой модульности, инкапсуляции и абстракции данных в языках ООП.

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

Третья черта, известная как полиморфизм, позволяет единообразно ссылаться на объекты различных классов (обычно внутри некоторой иерархии). Это делает классы ещё удобнее и облегчает расширение и поддержку программ, основанных на них.

READ ALSO
Как программно установить background из @mipmap/nameless (Java)

Как программно установить background из @mipmap/nameless (Java)

Я использовал это для однообразного фона

112
Как сделать , чтобы тест на javascript работал?

Как сделать , чтобы тест на javascript работал?

Нужно, чтобы при нажатии на кнопку Answer проверялся тест, и поле вопроса окрашивалось в зелёный цвет (если правильно) в красный (если не правильно)!

114
Как сделать кнопку на сайте изначально (при загрузке страницы) активной, включённой?

Как сделать кнопку на сайте изначально (при загрузке страницы) активной, включённой?

(1) В шапке сайта есть две кнопки отвечающие за смену языков

113