Курс по Проектированию ПО. Весенний семестр 2024.
- Разработка велась на языке Java-21
- Для сборки необходимо выполнить команду
./gradlew build
- После этого исполняемый файл, находящийся в дирректории
./build/lib
необходимо запустить, например, с помощьюjava -jar ./build/lib/itmo-se.jar
-
Console -- точка входа и выхода.
- Ответственна за считывание пользовательского ввода
- Держит в себе состояние системы (консоли)
- Использует интерпретатор для выполнения пользовательского скрипта
- Результат выполнения очередного скрипта -- CommandData
- При получении кода от команды
exit
завершает свое выполнение и возвращает статус выполнения последней до неё команды или цепочки команд
-
State -- состояние
- Хранит пользовательское окружение. Предоставляет доступ на его чтение и изменение
- Хранит текущую дирректорию
-
Parser -- парсинг входных данных
- Разбивает пользовательский ввод на участки конвейера
- Разбивает строку на аргументы
- Выполняет подстановку, full and weak quoting
-
Interpreter -- интерпретатор пользовательского ввода
- Принимает пользовательский ввод и создает команды, используя фабрику. Настраивает их
- Порядок парсинга и подстановок в интрерпретаторе
- Пользовательский ввод разбивается на участки конвейера
- Участок конвейера разбивается на аргументы (массив строк)
- Выполняется подстановка, а также full и weak quoting
- Выполняется перенаправление ввода вывода
- Вызывается выполнение команды на оставшихся аргументах (перенаправление потоков не относится к аргументам команды)
- В результате этого
- Аргументы команды фиксируются после подстановки
- Команда не ответственна за перенаправление ввода-вывода и не принимает эту часть аргументов
-
CommandFactory -- объект-фабрика
- Ответственна за вызов необходимых конструкторов при инициализации команд
- Поиск и регистрация команд по (@обдумывается@ регулярным выражениям).
- Порядок регистрации совпадает с порядком проверок
- Создается и заполняется доступными командами при создании объекта-консоли
-
BaseCommand -- базовая команда (абстрактный класс)
- От неё наследуются конкретные команды
- У всех наследников есть конструктор с одинаковыми аргументами (массив строк)
- Общие поля для всех команд (дескрипторы, )
- Хранит ссылку на некоторое состояние системы (может быть локальное)
-
AnyCommand
- Вызывается для команды, не зарегистрированной в консоли
- При вызове перенаправляет ввод-вывод в свои дескрипторы (например, временные файлы)
- Делает это в случае, если они не установлены явно
-
CommandData -- структура
- Хранит информацию о потоках ввода-вывода
- Хранит статус выполнения команды (Exit, ErrorCode, Ok, etc...)
-
IDescriptor -- поток ввода-вывода. Интерфейс
- Может быть стандратным потоком
- Может быть перенаправлен в файл
echo "Some String to Pring" | wc
a=text.txt
echo $a | wc
-- вызовwc
для файлаtext.txt
wc < $a
,wc < $a > res.txt
,catawg 2> | echo $a