TransWikia.com

Оценить учебный проект для решения задачек

Stack Overflow на русском Asked by h8d on December 11, 2021

Немного начал изучать программирование, выбрал Java, поскольку применяется на работе.

Нашёл сайт с задачками по программированию для обучения. Суть в том, что есть пул заданий по номерам. Сайт даёт какие-то входные данные в несколько строк, а с этими входными данными нужно что-то сделать и выдать строчку результата.

Мне показалось скучным просто решать эти задачки (по классу на каждое) и решил себя немного попробовать в проектировании приложений.

Прошу оценить выбранный подход к проектированию. Насколько он хороший, может что-то лучше переделать, какие недостатки видно? Что наоборот хорошо придумано? Проект небольшой – только учусь. Если интересно – есть рабочий исходник.

Задумка следующая:

  1. Вас спрашивают id задания с сайта;
  2. Предлагают ввести (скопировать с сайта) строчки с входными данными;
  3. Решается задачка, выводится ответ.

Собственно, что у меня получилось:

  1. В отдельном пакете есть абстрактный класс Solution и у него есть наследники (сами решения задания).
  2. Есть отдельный класс Task, который в зависимости от того, какой id задания введён создаёт объект нужного класса и отдаёт ссылку типа Solution.
  3. Есть отдельный класс Interface, который обеспечивает вывод в консоль и парсинг входных данных в массив, который нужен классу Solution, чтобы с ним оперировать. Класс временный, пока не добрался до изучения GUI.

Далее описание самих классов:

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

к) Спрашиваем, повторить ли выполнение программы

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP