На примере нахождения факториала хочется узнать насколько я правильно понимаю ООП. Представим факториал как самостоятельную сущность:
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 не нужен.. что-то я совсем запутался во всём этом. Подскажите как правильно?
но стоит ли тогда городить класс или есть смысл сделать метод calc в том классе, в котором нужно производить вычисление..
Классы, конечно же, должны соответствовать концепциям ООП, однако не совсем верно говорить о корректности класса, отрываясь от контекста его использования.
Возьмём этот же пример с факториалом и рассмотрим два случая:
Студенту нужно выполнить лабораторную работу (написать программу, выполняющую какие-то вычисления с факториалами из комбинаторики, например, перестановки или сочетания).
Работнику фирмы нужно разработать калькулятор, который "следит" за пользователем, ведёт лог его действий, поддерживает историю операций и их отмену.
В первом случае, как сказал Prahvessor в комментариях, проще и логичнее создать общий класс (аля Math
) и наполнить его нужными, возможно статичными, методами.
Во втором случае имеет смысл применить паттерн Команда и сделать отдельный класс факториала и других операций. Будет куча классов, где каждый класс реализует свою операцию и сохраняет свое предыдущее состояние. Программа станет ощутимо более сложная, зато это облегчит реализацию логирования/отмены операций и сделает программу более устойчивой к изменениям. Но эта сложность была бы совершенно избыточна в первом случае.
В итоге, если пример с факториалом выдуман либо взят из какой-то простой программы, то скорее всего отдельный класс факториала избыточен. Если же программа достаточно большая и есть определенные требования предметной области, то возможно есть смысл задуматься о внедрении такого класса.
У вас есть одна нелогичность в цикле. В данном случае нужно итерацию начинать не с 1 а с 2. так как 1*1 не рационально хотя бы с точки зрения скорости выполнения программы. И в методе calcFactorial(double number) "this" тоже лишний, также как и "this" в return.
А так вот: Ключевые черты ООП:
Первая — инкапсуляция — это определение классов — пользовательских типов данных, объединяющих своё содержимое в единый тип и реализующих некоторые операции или методы над ним. Классы обычно являются основой модульности, инкапсуляции и абстракции данных в языках ООП.
Вторая ключевая черта, — наследование — способ определения нового типа, когда новый тип наследует элементы (свойства и методы) существующего, модифицируя или расширяя их. Это способствует выражению специализации и генерализации.
Третья черта, известная как полиморфизм, позволяет единообразно ссылаться на объекты различных классов (обычно внутри некоторой иерархии). Это делает классы ещё удобнее и облегчает расширение и поддержку программ, основанных на них.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Я использовал это для однообразного фона
Нужно, чтобы при нажатии на кнопку Answer проверялся тест, и поле вопроса окрашивалось в зелёный цвет (если правильно) в красный (если не правильно)!
(1) В шапке сайта есть две кнопки отвечающие за смену языков