Правильное проектирование классов или как гуру это делают?!06.10.2013, 21:49. Показов 9637. Ответов 50
Метки нет (Все метки)
Здравствуйте форумчане, есть вопрос на который ввиду моей квалификации пока ответить не могу:
![]() Есть вот такое задание Кликните здесь для просмотра всего текста
Планировщик задач Краткое описание Написать программу, которая выполняет основные функции планировщика задач. Взаи-модействие с пользователем осуществляется через консоль. Детальное описание Планировщик задач состоит из журнала задач, пользовательского интерфейса для добав-ления и удаления задачи, а также системы оповещения пользователя о каком-то событии, т.е. в назаначенное в планировщике время должно происходить нечто, говорящее пользо-вателю о том, что у него запланирована некоторая задача (см. ниже). Журнал задач должен храниться на диске и загружаться при запуске программы, а также сохраняться при выходе. Формат файла может быть произвольный, по желанию можно использовать XML. В качестве пользовательского интерфейса выступает консоль. Определенными команда-ми пользователь может удалять запланированные задачи, добавлять новые с указанием необходимых параметров (см. пункт ниже). Параметры планируемой задачи: - название - описание - время (дата) оповещения - контакты Реализация планировщика должна быть выполнена по следующим принципам. Функцио-нал, реализующий работу с журналом задач, пользовательским интерфейсом и системой оповещения а также сам журнал задач, должен находиться в различных классах. Т.е. поль-зовательский интерфейс в отдельном классе, работа с журналом задач в отдельном, сам журнал тоже в отдельном и система оповещения в отдельном. Эти классы могут общаться между собой через интерфейсы, но при этом ни один из них не должен реализовывать ло-гику другого. Требования (* помечены обязательные требования) 1. Реализация Планировщика задач должна соответствовать указанным выше принци-пам.* 2. Интуитивно понятный интерфейс работы с пользователем.* 3. Наличие функций добавления и удаления задач с сохранением их в общий журнал за-дач на диск.* (+ доп баллы за использование формата XML) 4. Система оповещения пользователя.* (+ доп баллы за использование Swing, + доп бал-лы за доп. функциональность с «завершить» или «отложить» задачу) 5. Программный код должен удовлетворять Code Conventions и снабжен JavaDoc. Модификации задания 1. Использование различных систем оповещения (базовая, звуковой сигнал + вывод в консоль, запуск другой программы, написанной на Java). 2. Формат хранения журнала задач на диске: текстовый файл, сериализованные объекты, XML, сжатый текстовый файл (zip). Вопросов у меня достаточно, хотелось бы разобраться во всех вопросах Просьба админам не банить , я понимаю, что один вопрос - одна тема, но все же это все разделять на подвопросы было бы глупо.Вопрос номер 1: Какие классы должны быть реализованы, и что в них должно храниться? Вот мои соображения Класс TaskManager +main() void; +serialize(Journal, File) void; +deserialize(File) Journal; -make(Operaion) void; Класс Journal implements Serializable +getTasks() List<Task>; +getCountTask() int; +addTask(Task) void; +deleteTask(Task) void; +loadTasksFromXML(File) void; +saveTasksToXML(file) void; Класс UserInterface +showMessage(String message) void; +showMenu() void; +getOperations(Scanner) Operation; +loadFromXmlFile(Journal, String path) void; - просто вызывается функция loadTasksFromXML у journal'a +showAllTasks(List<Task>) void; +deleteTask(List<Task>, Scanner) void; +deleteAllTasks(List<Task) void; +saveJournalToXML(Journal, String path) void; +addTask(Journal, Scanner) -getTask(Scanner) Task; - этот метод нужен для того, чтобы сформировать готовый Таск от введенных пользователем данных Класс Task +getName() String; +getContacts() String; +getDate() Date; +getDescription() String; +setName(String) void; +setContacts(String) void ; +setDate(Date) void ; +setDescription(String) void ; +Override toString() String; Enum Operations +convertFromInt(int i) Operations;
Почему при сериализации в записываемый файл записывается намного больше информации чем фактически хранится в памяти? Вопрос номер 3 Почему десериализация не работает, выкидывается ошибка "writing aborted. NotSerializableException". Сериализуемый класс же у меня имплементит интерфейс Serializable? Вопрос номер 4 - холиварный Как и где можно мой код улучшить (оптимизировать, подкорректировать, переписать) Спасибо Собственно мой код: Если кто хочет покритиковать мой код - буду только рад(хотелось бы еще рекомендации как можно это дело переписать) TaskManager Кликните здесь для просмотра всего текста
Journal (xml - парсер не полностью реализован!) Кликните здесь для просмотра всего текста
Class UserInterface Кликните здесь для просмотра всего текста
Enum Operations Кликните здесь для просмотра всего текста
Class Task Кликните здесь для просмотра всего текста
Добавлено через 31 минуту Вопрос номер 2 - снят В результирующий файл записывается не только поля самого объекта(кроме полей transient - которые в сериализации не участвуют), плюс к этому записывается алгоритм сериализации\десериализации. Из-за этого если объект класса содержит всего 2 интовских поля - это не значит, что размер выходного файла будет 8 бит, размер этого файла может быть и все 80, или все 800 бит.
0
|
|||||||||||||||||||||||||||||||
| 06.10.2013, 21:49 | |
|
Ответы с готовыми решениями:
50
Есть ли справочник, где можно понять, что делают методы или свойства классов? Как они это делают? |
| 07.10.2013, 15:24 [ТС] | ||||||
|
Вопрос номер 1 - решен
0
|
||||||
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
|
| 07.10.2013, 15:33 | |
|
1
|
|
| 07.10.2013, 15:47 [ТС] | ||
|
0
|
||
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
||
| 07.10.2013, 17:11 | ||
|
Добавлено через 4 минуты Та и вообще , я бы сделал модел по патерну Синглтон, в нём сделал некую очередь команд которую система будет получать от контроллера и последовательно их выполнять. Благодаря этому вам не нужно будет заморачиватся с синхронизацией. Добавлено через 42 секунды Вас наверно от слова Паттерн уже колбасить начинает
1
|
||
| 08.10.2013, 01:07 [ТС] | |||||||||||||||||||||
|
Все таки я думаю надо поступать здесь следующим образом:
В контролере создать метод start(),который запускает еще один поток, а этот поток через каждые пол минуты обращается к методу модели, который возвращает таск который нужно сейчас выполнить или null - если таковых не имеется. Ну соответственно, если результат не null - то этот результат передаем view'у для отображения, Как вам идея такая? Вот такая вот реализация Таск менеджер - с точкой входу в программу Кликните здесь для просмотра всего текста
Здесь функции, добавленные в модел Кликните здесь для просмотра всего текста
Метод старт в контролере [SPOILER]
Какие есть замечания? Вопрос номер 1
0
|
|||||||||||||||||||||
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
|||
| 08.10.2013, 10:22 | |||
|
Контроллер, контролирует только валидность данных и всё. В чём фишка MVC? в том что вы можете спокойно создать несколько вьюшек и они будут выполнять различные функции (один - отображать пользователю на экран, второй распечатывать на принтер, третий отправлять куда-то в сеть и тд... Но при этом уведомление о наступлении таски может быть необходимо только одном, если реализациия будет в контроллере , то это затронет все вью. ), так же можно реализовать нескоклько контроллеров и моделей. (Поэтому в мвц обязательно наличие интерфейсов ) th - это ваш класс потоков который вы реализуете в без имянном классе. Вопрос , как Ваш поток завершится???
1
|
|||
| 08.10.2013, 10:41 [ТС] | ||||||||||
|
Добавлено через 9 минут Создается объект класса Thread, в конструктор которого передается объект, грубо говоря, у которого есть метод run(). Далее у созданного объекта Thread вызвается метод start(), который в свою очередь вызывает метод run у объекта, переданного в конструктор. - Я правильно понимаю?
0
|
||||||||||
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
|||
| 08.10.2013, 11:31 | |||
|
Что бы Thread съел объект класса, нужно что бы : 1) ИЛИ класс был наследником Thread ! ИЛИ 2) класс имлементировал интерфейс Runnable. (это относится к старым версиям java, в новых версиях жавы (кажись с 1.6 или 1.5), работа с потоками и синхронизацией немного по другому организована) Добавлено через 3 минуты Добавлено через 1 минуту У меня такое чувство что вы досих пор не поняли зачем нужны интерфейсы
1
|
|||
| 08.10.2013, 11:58 [ТС] | |
|
0
|
|
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
|
| 08.10.2013, 12:09 | |
|
в данном случае конечно можно и без них. Но если это первая лабораторка, то дальше будет вторая в которой нада будет всё на бины переделать... И тогда вам прийдётся переписывать большую часть кода, а с использованием интерфейсов вам особо препеисывать не нада будет, просто реализовать другой тип модели через существующие интерфейсы.
Не по теме: Ну эт моя точка зрения которая может быть далека от реальности , так как я не знаю как мыслит тот кто ваше задание будет проверять :)
1
|
|
| 08.10.2013, 12:26 [ТС] | |
|
Ну если с интерфейсами, то как я вижу это можно сделать:
Вся суть интерфейсов будет заключаться в том, что, к примеру, метод контролера - будет получать не сам объект View, а какой-то интерфейс Viewable, в свою очередь View имплементит этот Viewable. Тоже самое с модел, и контрол. Не по теме:
0
|
|
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
||
| 08.10.2013, 12:53 | ||
Станеш великим девом ) Быстро схватываеш.Называют обычно так : IView или View - интерфейс ViewImpl, ViewByConsoleImpl, ViewByGuiImpl, - класc реализация Добавлено через 10 минут Вообще именование особой тут роли не играет, Главное что бы было понятно, что это интерфейс - а это его класс реализация.
1
|
||
| 08.10.2013, 13:40 [ТС] | |
|
0
|
|
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
|
| 08.10.2013, 14:00 | |
|
1
|
|
| 08.10.2013, 16:07 [ТС] | ||||||||||||||||
|
Вот у меня что в итоге получилось
Вот такая иерархия Ну соответственно интерфейсы IController Кликните здесь для просмотра всего текста
IView Кликните здесь для просмотра всего текста
Ну и IModel - просьба не переводить ![]() Кликните здесь для просмотра всего текста
В реализациях методов всех классов - ничего не изменилось, изменились только входные параметры. Теперь методы получают не сами объекты, а просто их интерфейсы.
0
|
||||||||||||||||
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
|
| 08.10.2013, 16:28 | |
|
Как то так) хоть контроллер я бы переделал. Но как для первого раза - пойдёт )))
1
|
|
| 09.10.2013, 10:54 [ТС] | ||||||
|
Какие замечания я в итоге получил от своего куратора, большинство из этих замечаний легко исправляются - буду исправлять.
Скриншоты от скайпа Первый обзац - здесь надо либо с кодировкой разбираться либо еще чем-то. Просто я писал это дело в Eclipse, а мой куратор смотрел это в IntelliJIDEA - да, действительно в этом IDEA - вместо русских символов отображаются ромбики. Второй обзац - fixed - глупо было так писать)) Третий обзац - наверное имеется ввиду вот этот участок кода в таскменеджере
0
|
||||||
| 09.10.2013, 10:58 [ТС] | |
|
"и вообще было бы круто, если бы настройки программы лежали в каком-то конфиге, а не зашиты в программу private String default_path = "E:\\journal.xml";" - это еще один файлик формата, скажем, xml - с которого будет считываться начальные настройки программы?
0
|
|
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
||
| 09.10.2013, 11:45 | ||
|
ну а про интерфейсы и свои иксепшины я вам уже давно говорил
1
|
||
|
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
|
|
| 09.10.2013, 11:50 | |
|
1
|
|
| 09.10.2013, 11:50 | |
|
Уважаемые гуру! Объясните плиз как это работает?
Захват содержимого экрана. Как они это делают? Запрос к веб странице, так как это делают браузеры Как реализовать правильное наследование классов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|