Вы находитесь на странице: 1из 5

Лабораторная работа №4

Создание модульного приложения в Java


на основе объектно-ориентированного подхода

Цель работы: изучение принципов разработки сложных систем, получение


навыков создания программ на языке Java с применением принципов ООП и
возможностей Java (использование интерфейсов и модулей).

Теоретическая часть
Рассмотрим простое приложение по сложению двух чисел и выводу результата.
Все приложение можно написать при помощи лишь одного класса Calculate.

public class Calculate {

public Calculate() {
}

public static void main(String[] args) {


Calculate calc = new Calculate();
calc.execute(args);
}

private void showResult(String result) {


System.out.println(result);
}

private long operate(long op1, long op2) {


return op1 + op2;
}

private String getOpsName() {


return " plus ";
}

public void execute(String [] args) {


long op1 = Long.parseLong(args[0]);
long op2 = Long.parseLong(args[1]);
showResult("The result of " + op1 +
getOpsName() + op2 + " is " + operate(op1, op2) + "!");
}
}

Что делать, если необходимо изменить сложение в методе operate на умножение


или выводить результат в методе showResult не на экран, а в файл. В этих случаях код
программы нужно постоянно менять.
Можно разделить логику приложения на математические операции и на
сохранение результатов при помощи интерфейсов. Т. е. помимо основной части
программы, которая содержит точку входа, создадим два модуля для каждой подзадачи.
Первый интерфейс с названием Operation создадим в первом модуле в файле реализации
(*.java):

1
package com.operation;

public interface Operation {


long operate(long op1, long op2);
String getOpsName();
}
В нем мы объявим два метода operate(long op1, long op2) и getOpsName(). После
этого, если мы захотим сделать сложение, то мы просто будем реализовывать этот
интерфейс. Для других математических действий все делаем также. Поместим интерфейс
в пакет com.operation, чтобы использовать его в других модулях.
Сделаем этот интерфейс (точнее пакет с интерфейсом) видимым для других
модулей. Для этого в файле module-info.java первого модуля добавим:
module <название первого модуля> {
exports com.operation;
}
Реализацию математических операций поместим также в файл реализации первого
модуля (*.java):

//сложение
public class OpAdd implements Operation {
public OpAdd() {
}

public String getOpsName() {


return " plus ";
}

public long operate(long op1, long op2) {


return op1 + op2;
}
}

//умножение
public class OpMultiply implements Operation {
public OpMultiply() {
}

public String getOpsName() {


return " times ";
}

public long operate(long op1, long op2) {


return op1 * op2;
}
}
Отметим, что классы математических операций также будут включены в пакет
com.operation. Это необходимо для того, чтобы эти операции были доступны для
использования в других модулях.
Второй интерфейс (во втором модуле) будет создан для представления результатов
вычислений, например, вывод на экран консоли. Поэтому сделаем в нем один метод для
объявления операции отображения результатов:
Объявление интерфейса создадим во втором модуле в файле реализации (*.java):
2
package com.resultWriter;

public interface ResultWriter {


void showResult(String s);
}
Реализация метода в виде команд вывода на экран содержится в классе
ScreenWriter также в файле реализации второго модуля (*.java):

public class ScreenWriter implements ResultWriter {


public ScreenWriter() {
}

public void showResult (String s) {


System.out.printf(s);
}
}
Сделаем интерфейс и класс с методом вывода на экран видимым для других
модулей. Для этого в файле module-info.java второго модуля добавим:
module <название второго модуля> {
exports com.resultWriter;
}
Ядро программы, содержащее точку входа, выполним также в виде модуля –
главного модуля, и добавим в него главный класс и операторы импорта интерфейсных
классов:

import com.operation.*;
import com.resultWriter.*;

// главный класс приложения


public class CalculateScreen {

private Operation ops = new OpAdd();


private ResultWriter wtr = new ScreenWriter();

public static void main(String[] args) {


CalculateScreen calc = new CalculateScreen();
calc.execute(args);
}

public void execute(String [] args) {


long op1 = Long.parseLong(args[0]);
long op2 = Long.parseLong(args[1]);
wtr.showResult("The result of " + op1 + ops.getOpsName() + op2 + " is " +
ops.operate(op1, op2) + "!");
}
}
Для импорта и использования интерфейсных классов других модулей в файле
module-info.java главного модуля добавим описание:
module <Название главного модуля>{
requires <имя первого модуля>, <имя второго модуля>.;
}

3
Итак монолитное приложение было разъединено на компоненты. Теперь мы имеем
OpAdd, OpMultiply и основной класс CalculateScreen. В главном классе мы определяем
один из Operation классов и используем его.
Если мы хотим изменить действия, то нужно просто поменять названия классов.
Все остальное поменяется автоматически (вывод информации).
Практическая часть (общая постановка и технология решения задачи работы)
Разработать модульное приложение, позволяющее вести учет ключевых объектов,
имеющих некоторый вид связи (агрегация или композиция) с двумя другими объектами,
находящимися друг с другом в такой же взаимосвязи, согласно своему варианту задания.
Реализовать в программе возможность вывода на экран следующей информации:
a) список ключевых объектов, связанных с одним из представителей первого
объекта;
b) список ключевых объектов, связанных со каждым представителем второго
объекта;
с) список ключевых объектов, связанных с одним из представителей второго
объекта.

Разберем для пример первый вариант задачи. Исходя их тематики варианта, можно
сформулировать следующее задание: разработать модульное приложение, позволяющее
вести учет студентов, обучающихся в университете, согласно следующей информации о
студентах: код студента, фамилия, имя, отчество, дата рождения, адрес, телефон,
факультет, группа.
Реализовать в программе возможность вывода на экран следующей информации:
a) список студентов заданного факультета;
b) списки студентов для каждого факультета и курса;
с) список учебной группы.
В качестве одного из вариантов реализации можно выполнить следующее
разделение на модули:
1) Классы носители информации: университет (University), группа (Group), студент
(Student).
2) Классы для обработки: добавление студентов, групп и факультетов (University),
формирование списка/списков (MakeLists), вывод на экран списка/списков (ShowLists).
3) Для запуска приложения класс Runner.
Создать для примера массив объектов с информацией о студентах.

Варианты задания
1. Информация о студентах группы.
2. Информация о владельцах автотранспорта.
3. Информация о легковых автомобилях.
4. Информация о географическом расположении городов.
5. Информация о товарах на складе.
6. Информация о выдаче литературы в библиотеке.
7. Информация об абонентах телефонной сети.
8. Информация о предприятиях.
9. Информация о магазинах.
10. Информация о программных продуктах.
11. Информация об ЭВМ.
12. Информация о факультетах ВУЗа.
13. Информация о пациентах поликлиники.
14. Информация об изделиях легкой промышленности.
15. Информация об учащихся школы.
16. Информация о книгах в библиотеке.

4
17. Информация о поставщиках товаров.
18. Информация о доходах жителей.
19. Информация о дисплеях.
20. Информация о магнитных носителях информации.
21. Информация о сотрудниках кафедры.
22. Информация о телефонах, установленных в ВУЗе.
23. Информация об аудиториях ВУЗа.
24. Информация о жителях города.
25. Информация о экзаменах в ВУЗе.
26. Информация о вступительных испытаниях в ВУЗ.
27. Информация о географическом расположении морей.

Вам также может понравиться