В прошлом задании вы наладили структуру приложения и познакомились с linux и git. Теперь пришло время начать приводить в порядок ваши java файлы. Вы уже знаете, что правильно определять один класс в одном файле. В большинстве случаев так и надо делать. Собственно здесь расскажу про создание java проекта и использование множества классов.
- Читаем что это за зверь. Будет много незнакомых слов, их тоже полезно разобрать
- Смотрим гайд о создании проекта.
В гайде по созданию проекта тоже много всего, в следующих занятиях разберёмся подробнее. Gradle вообще очень мощный инструмент, но пока он нам нужен для создания проекта и его запуска.
Я создал проект example, в который добавил два класса Foo
и Bar
. Далее в классе
App
создал объекты указанных классов и вызывал у обоих метод sayHello
. Никаких импортов
для этого делать не нужно, так как все три класса находятся в одном пакете example
.
Теперь создайте ещё один пакет с названием equation
в папке main
. Добавьте в него класс LinearEquationSolver
,
в котором реализован один метод - solve(double a, double b)
. Вот справка по линейным уравнениям.
Вас интересуют уравнения вида ax = -b
. Собственно их метод и должен решать.
После вы можете смело добавить импорт в класс App:
import example.equation.LinearEquationSolver;
Теперь вы можете использовать недавно созданный класс:
LinearEquationSolver solver = new LinearEquationSolver();
solver.solve(2, -4);
Здесь может возникнуть вполне резонный вопрос: "Почему бы не сделать метод solve
статическим ?".
Да, мы не используем состояние и статический метод здесь вполне может быть уместен.
Но из-за него мы отходим от ООП стиля, что в будущем может принести некоторые проблемы.
Хотя есть модули, которые полностью состоят из статических методов, например, Math
.
Это особых проблем не приносит. В любом случае java не предназначена для работы с матешей, поэтому смело
можете переделать метод в статический и сократить вызов до одной строки.
Здесь всё не так просто, ведь при отрицательном дискриминанте уравнение не имеет решений в вещественных числах.
Есть множество подходов:
- Вернуть
Dobule.POSITIVE_INFINITY
, но это некорректно - Кинуть ошибку, где сообщить о проблеме
- Вернуть комплексное число
Последний вариант звучит наиболее логично, но в java нет представления для комплексных чисел :(
Давайте его добавим.
Для начала определимся, как мы будем представлять комплексное число. Для этого нам нужны вещественная и мнимая части. Кроме этого мы хотим печатать эти числа в командную строку. В будущем нам придётся производить над ними арифметические действия, для чего тоже понадобятся методы.
С задачей определились, теперь начинаем кодить. Создаём новый пакет в папке main
, называем его
model
. Далее создаём запись
ComplexNumber
.
public record ComplexNumber(double r, double i) {}
Отлично, теперь у нас в любом случае есть решения уравнения, но есть ещё одна проблема - решений может быть два. Как с этим будем поступать?
- Можно вернуть массив, но с ним неудобно работать. Придётся делать проверки на длину, обращаться по индексу и бла-бла
- Можно вернуть объект, который и содержит оба решения
Добавляем в пакет model
запись QuadraticEquationResponse
:
public record QuadraticEquationResponse(ComplexNumber first, ComplexNumber second) {}
Предлагаю усложнить задачу. Теперь необходимо создать класс QuadraticEquationSolver
,
который содержит метод:
public static QuadraticEquationResponse solve(double a, double b, double c) {}
Реализуем метод, вызываем в классе App
и радуемся завершению очередной таски)