Данный проект - это интерпретатор командной строки, поддерживающий следующие команды:
cat [FILE]
- вывести на экран содержимое файла;echo
- вывести на экран свой аргумент (или аргументы);wc [FILE]
- вывести количество строк, слов и байт в файле;pwd
- распечатать текущую директорию;exit
- выйти из интерпретатора.
Интерпретатор распознает строку при помощи парсера, который разделяет текст на
лексемы (Lexemes
),
которые поддерживают одинарные и двойные кавычки, а также оператор подстановки переменных окружения ($
).
Все остальные команды, которые не перечислены в задании ("внешние команды") вызываются из Shell системы.
У CLI
имеется свое окружение (Environment
),
которое хранит в себе все переменные окружения, а также доступные команды.
Окружение является единственным для всего проекта.
Было принято решение избавиться от шаблона одиночки (Singleton
)
для него, а использовать внедрение зависимостей (Dependency Injection
).
Для имплементации команд CLI было решено использовать паттерн "Команда" (Command
),
так как очень удобно задать единый интерфейс для функционала команды и реализовать метод для каждой команды.
Для создания команд отказался от использования шаблона "Фабрика" (Factory Method
),
так как в данном случае посчитал это излишнем, поскольку обращение в HashMap
будет намного быстрее и
по названию команды можно выдавать объект (в данном случае масштабируемость шаблона "Фабрика" никак не использовалась бы).