Назначение программы – управление проектными задачами (работами/целями).
Основные функции программы:
Хранение и обновление информации о работе.
Поиск данных, хранимых в базе данных и представление их в виде, удобном для пользователя.
Системные требования: разделение основной логики программы и управления доступом к данным, что позволит использовать в качестве репозитория для хранения данных - коллекцию, файл и БД.
Нефункциональные требования:
1) установка/изменение статуса работы;
2) поиск и сортировка работ по критериям - исполнитель/дата заверешения/прочие.
Определите класс для хранения данных о задачах, например,
public class Task {
private int id;
private String name;
private int time;
private String status;
public Task(int id, String name, int time, String status) {
this.id = id;
this.name = name;
this.time = time;
this.status = status;
}
// getters and setters
}
2. Спроектируйте графический интерфейс для работы со множеством задач, включая таблицу, поля редактирования и кнопки управления
3. Создайте класс - списка задач, с заполнением случайными значениями
class ListTask {
private List<Task> tasks;
public ListTask(int size) {
tasks = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < size; i++) {
Task task = new Task(
i + 1,
"Task " + (i + 1),
randomTime(random),
"Context for task " + (i + 1),
random.nextInt(2) );
tasks.add(task);
}
}
private String randomTime(Random random) {
int hours = random.nextInt(24);
int minutes = random.nextInt(60);
return String.format("%02d:%02d", hours, minutes);
}
}
4. Реализуйте контроллер для отображения списка задач
Паттерн DAO необходим для изменения базового механизма персистентности, т.е. изменения вносятся в уровень DAO, а не в нужные места кода на бизнес-уровне. Также очень важно, чтобы никакие детали базового механизма, связанного с БД, не просачивались из уровня DAO в логику самого приложения .
Business Object – модель данных (задача)
Transfer Object – представление данных для пользователя (модель хранения ObseverList для отображения данных в компоненте TableView)
DataAccessObject абстрагирует базовую реализацию доступа к данным для Business Object, чтобы обеспечить прозрачный доступ к источнику данных.
DataSource: представляет реализацию источника данных. Источником данных может быть база данных, такая как СУБД, OODBMS, репозиторий XML, плоский файл
Рис. 1 - Диаграмма классов DAO паттрена
Создайте модель данных (class Task, class ListTask).
Объявите интерфейс доступа к данным interface DAO должен поддерживать как минимум четыре метода:
public interface TaskDAO {
List<Task> getAllTasks();
Task getTaskById(int id);
void addTask(Task task);
void updateTask(Task task);
void deleteTask(int id);
}
Реализуете DAO-интерфейс для конкретного источника данных, например списка с генерацией
class ListTaskDAO implements TaskDAO {
private List<Task> tasks;
public ListTaskDAO(int size) {
tasks = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < size; i++) {
Task task = new Task(
i + 1,
"Task " + (i + 1),
randomTime(random),
"Context for task " + (i + 1),
random.nextInt(2)
);
tasks.add(task);
}
}
public List<Task> getAllTasks() {
return tasks; }
public Task getTaskById(int id) {
for (Task task : tasks) {
if (task.getId() == id) {
return task;
}
}
return null; }
public void addTask(Task task) {
tasks.add(task); }
public void updateTask(Task task) {
for (int i = 0; i < tasks.size(); i++) {
if (tasks.get(i).getId() == task.getId()) {
tasks.set(i, task);
return;
}
}
}
public void deleteTask(int id) {
for (int i = 0; i < tasks.size(); i++) {
if (tasks.get(i).getId() == id) {
tasks.remove(i);
return;
}
}
}
4. Чтобы было возможно работать с произвольным источником создайте фабрику
public class TaskFabrica {
public static String BD="база данных";
public static String FILE="файл";
public static String RAM="временно";
public static TaskDAO createTaskDAO(String type) {
if (type.equalsIgnoreCase(BD)) {
return new DbDAO();
} else if (type.equalsIgnoreCase(FILE)) {
return new FileTaskDAO("tasks.txt");//имя файла
} else if (type.equalsIgnoreCase(RAM)) {
return new ListTask(10);//генератор на 10 задач
} else {
throw new IllegalArgumentException("Invalid datasource type!");
}
5. Реализуйте соединение с БД (см.JDBC)
6. Реализуйте источник данных в виде текстового файла