Stack Overflow на русском Asked by h8d on December 11, 2021
Немного начал изучать программирование, выбрал Java, поскольку применяется на работе.
Нашёл сайт с задачками по программированию для обучения. Суть в том, что есть пул заданий по номерам. Сайт даёт какие-то входные данные в несколько строк, а с этими входными данными нужно что-то сделать и выдать строчку результата.
Мне показалось скучным просто решать эти задачки (по классу на каждое) и решил себя немного попробовать в проектировании приложений.
Прошу оценить выбранный подход к проектированию. Насколько он хороший, может что-то лучше переделать, какие недостатки видно? Что наоборот хорошо придумано? Проект небольшой – только учусь. Если интересно – есть рабочий исходник.
Задумка следующая:
Собственно, что у меня получилось:
Далее описание самих классов:
1. abstract public class Solution
int taskId - ID задания
String taskName, taskDesc - наименование и описание задания
String firstLineRegExp, regExp - регулярные выражения на основание которых проверяется корректность ввода первой строки и остальных
String answer - генерируемый ответ
boolean firstLineUni - указатель на то, первая строка уникальная или такая же, как все остальные
ArrayList<String> inArray - входные данные
У класса есть 2 конструктора:
а) один принимает и устанавливает taskId, taskName, taskDesc, regExp
б) другой принимает и устанавливает taskId, taskName, taskDesc, regExp, firstLineRegExp
В зависимости от конструктора, в нём автоматически задаётся значение firstLineUni (false, true).
Методы:
setInArray() - задаём входной массив с которым будем оперировать
getTaskId(), getTaskName(), getTaskDesc(), getTaskDesc(), getInArray(), getAnswer() - считываем переменные из объекта
checkArray() throws Exception - в зависимости от firstLineUni проверяем входные данные. Если некорректны по регулярному выражению - возвращаем Exception с сообщением.
abstract makeSolution() - реализуется только у наследников, оперируя с inArray в конце выставляем значение answer.
Наследники:
а) Реализуют каждый свой конструктор (в зависимости от того, уникальная ли первая строка входных данных), но всегда вызывается конструктор super();
б) Если нужно, переопределяют checkArray(), выполняют super.checkArray(), а потом дописываются свои проверки под конкретное задание.
в) Реализуют makeSolution()
2. public class Task
Имеет только один метод
public Solution newTask(int id) throws Exception
Он создаёт ссылку с типом Solution.
В зависимости от принятого id он этой ссылке присваивает новый создаваемый объект нужного класса (который наследник Solution), а в конструктор передаёт id, название, описание заданий. Метод возвращает ссылку на новый объект.
Может быть Exception, что введённого id несуществует.
3. public class Interface
Осуществляет вывод сообщений в консоль и запрос данных для задания. Поскольку в консоль ввод только построчный, то запрос данных я реализовал через задний проход – создаю файл, жду пока его сохранят (прошу нажать Enter), а затем построчно читаю этот файл.
Методы:
generateFile() throws Exception - создаем файл
openFile() throws Exception - открываем файл
checkFile() throws Exception - проверяем файл, что не пустой
ArrayList<String> parseFile() throws Exception - считываем строки файла в массив с удалением начальных/конечных пробелов и дублированием пробелов между данными
start() - запуск всего
Логика start():
а) Открываем цикл (чтобы выполнение задания повторялось)
б) Открываем try
в) Просим ввести id задания и передаем его в Task, который вернёт нам ссылку на задание с заполненными id, name и т.д.
г) Печатаем собственно задание на экран
д) Создаём и открываем файл, просим нажать Enter когда сохранят файл
е) Затем файл проверяем и парсим в массив, который передаём по ссылке в объект класса Solution
ё) Выводим на экран то что ввели, но отформатированное
ж) Проверяем массив методом из Solution
з) Обращаемся к Solution, чтобы он посчитал все данные
и) Забираем ответ и печатаем его
й) Закрываем try, в catch мы выводим на экран сообщение из Exception
к) Спрашиваем, повторить ли выполнение программы
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP