Attention: этот файл написан в полуформальном стиле.
Согласно требованиям условия:
- Поскольку в описаниях классов присутствует «простор» для принятия решений, то каждое такое решение должно быть описано в комментариях к коду программы. Например, если выбран тип исключения, то должно быть письменно обоснованно, почему вы считаете его наиболее подходящим в рамках данной задачи.
- исходный код должен содержать комментарии, объясняющие неочевидные фрагменты и решения, резюме кода, описание целей кода (см. материалы лекции 1, модуль 1);
Считаю, что было бы некорректным делать огромные блоки текста, обосновывающие те либо иные пути решения проблемы, поэтому краткое описание будет в этом README файле.
Целью являлось создание легко расширяющегося меню, чтобы после добавления любой новой функции не основную логику программы.
На схеме
Таким образом, получаем абстрактный класс MenuPage от которого будут наследоваться все остальные классы-страницы меню. Объекты этого класса хранят текущий выбранный пункт и имеют методы для отрисовки меню и запуска выбранной функции. Статический класс AppMenu используется для хранения данных из JSON файла, а также текущий пункт меню, то есть AppMenu является неким "интерфейсом общения" между меню со всеми функциями и данными. Также этот класс имеет статический метод ShowMenu, который рендерит текущую страницу меню, хранящуюся в CurrentPage свойстве.
По заданию определены только классы Course и JSONParser, однако было принято решение о создание двух дополнительных классов (+1 класс исключения, бросаемого при неудачной обработке JSON файла) в библиотеке.
Статический класс содержит методы для обработки объектов типа Course, а именно сортировка и выборка, про которые будет написано позже.
Также содержит необходимые поля, используемые при обработке (например, словарь, который определяет типы конкретного JSON поля по названию)
Статический класс содержит методы по вводу/выводу данных потока Console (возможно перенаправленного).
Методы этого класса формируют из строк потокового ввода одну строку, которая впоследствии будет проверяться с помощью регулярных выражений, и выводят форматированные строки в поток вывода.
Статический класс содержит методы, которые связывают получение данных для последующей обработки с библиотекой классов, а также преобразовывает данные в другие типы (например в массив массивов для табличного вывода)
Реализована "умная" сортировка по нескольким полям. С помощью выбора различных полей в списке (press Enter) формируется упорядоченный список полей. Сначала объекты сортируются по первому полю: при равенстве этих полей используется сортировка по второму выбранному полю, и т.д.
Для каждого поля можно выбрать порядок сортировки (по возрастанию или по убыванию)
ВАЖНО: Сортировка по полю students происходит по количеству элементов в списке (то есть количеству студентов)
Тут так же можно делать использовать несколько полей. Отмечаются (press Enter) поля, по которым будет происходить фильтрация. Затем запрашиваются значения конкретных полей.
ВАЖНО: Значение, введенное для поиска для поля students, ищется как элемент списка students всех объектов. То есть происходи поиск по конкретному студенту.
Всего есть два основных способа:
ВАЖНО: Необходимо в конце ввода файла нажать Ctrl+Z (или Command+D на macOS), чтобы обозначить конец ввода.
Реализован простейший File Manager для получения файла. Предлагается перейти в корневые папки (диски), родительскую папку для текущей и список JSON файлов (с соответствующим расширением) в текущей папке.
Количество вариантов для сохранения точно удовлетворит потребность пользователя). Можно сохранить в текущую папку, в папку, запомненную программой как последнюю, из которой считывался файл, на рабочий стол. Можно просто вывести данные в формате JSON или не сохранять в текущий момент, а сделать обработанный файл обрабатываемым для последующей обработки)))))))
С остальными решениями можно ознакомится в коде программы с XML и обычными комментариями.