Conversation
There was a problem hiding this comment.
Напоминаю, что требовалось:
- архитектурное описание (диаграмма с классами и их взаимосвязями, немного текста, описывающего детали реализации)
- поддержать вызов внешних команд (например,
git branch -a) - ожидалось, что комментарии будут минимум у всех классов и публичных методов(сейчас комментариев не вижу совсем).
Из того, что не совсем корректно работает:
- Не получается выполнить такой код
x=ex
y=it
$x$y- cat не поддерживает считывание вывода предудещей команды в pipe:
echo aaaaaa | cat
SHELL >> File is not exist!
- При попытке написать что-то с двойными кавычками, выпадаем с исключением:
x=1
echo "123$x"
echo "1$x 23"
echo " ' $x' "И вообще при любой ошибке интерпретатор завершает работу с исключением. Чего быть, конечно, не должно. Думаю, пользователь будет не очень рад, если из-за каждой опечатки ему придется заново запускать интерпретатор.
Лучшая стратегия в данном случае -- вежливо сообщать, что что-то пошло не так, но продолжать работу.
И постарайтесь, пожалуйста, создавать pr таким образом, чтобы в нем были только те изменения, которые относятся к текущей домашке
| String name(); | ||
|
|
||
| String run(String arguments, String options); | ||
| String run(List<String> arguments); |
There was a problem hiding this comment.
В целом, выделение команд в отдельную иерархию/использование паттерна команда (надеюсь, осознанное) здесь весьма разумно.
Но стоит подумать о том, действительно ли мы хотим из команд возвращать String, потому что это накладывает сильное ограничение: нельзя вернуть из команды частичный результат. Как следствие мы не можем одновременно выполнять команды в пайпе, всем последующим командам необходимо ждать, пока предыдущая полностью завершит работу.
Мб, сейчас это не самая большая проблема, но, конечно, на файлах >1гб проблема становится более очевидной.
There was a problem hiding this comment.
Все-таки pipes немного иначе реализовал, а в команду передаю только аргументы
|
|
||
| commands.add( | ||
| CommandEntity.builder() | ||
| .name(lexems.get(0).getWord()) |
There was a problem hiding this comment.
Кажется, что в CommandEntity можно было класть не имя команды, а сразу саму команду. Так мы еще до начала выполнения, создания кучи объектов и т.д. можем узнать, что команды нет.
| import java.util.List; | ||
|
|
||
| public class CommandDefault implements Command { | ||
| private String name = ""; |
There was a problem hiding this comment.
Хорошо, что сделали поля с именами вместо литералов в командах.
Плохо, что в public String name() их не используете
There was a problem hiding this comment.
Решил совсем избавиться от них. Единственное, только сделал конструктор у CommandDefault в который передаю название команды.
| import java.util.Scanner; | ||
|
|
||
| public class Shell { | ||
| static Scanner scanner = new Scanner(System.in); |
There was a problem hiding this comment.
Не должно быт package-private полей
|
|
||
| public class Environment { | ||
|
|
||
| private static String currentPath = System.getProperty("user.dir"); |
There was a problem hiding this comment.
Советую быть крайне осторожным со всякого рода синглтонами. Их сложно поддерживать, они имеют тенденцию быстро разрастаться до god-object, их сложно тестировать.
И почти(вообще?) всегда от них можно избавиться
There was a problem hiding this comment.
Избавился от синглтона, использую DI
| return output; | ||
| } | ||
|
|
||
| List<Lexem> lexems = parser.parseLexem(input); |
There was a problem hiding this comment.
Вообще в данном методе код в значительной степени повторяется. Уверен, что можно обобщить
| import java.util.List; | ||
|
|
||
| public class Substitutor { | ||
| Environment environment = Environment.getInstance(); |
| continue; | ||
| } else if (in.charAt(idx) == ' ') { | ||
| if (word.length() > 0) { | ||
| lexems.add(Lexem.builder() |
There was a problem hiding this comment.
Здесь аналогично вижу частое дублирование + сам метод на два экрана
|
|
||
| public Command getCommand(String commandName) { | ||
| return commands.getOrDefault(commandName, new CommandDefault()); | ||
| // return commands.getOrDefault(commandName, new CommandDefault()); |
There was a problem hiding this comment.
Не должно быть закомментированного кода
There was a problem hiding this comment.
Вроде бы везде убрал комментирование
| // | ||
| // System.out.println(output); | ||
| ///////////////////////////// | ||
| System.out.print("SHELL >> "); |
There was a problem hiding this comment.
Мне, честно говоря, не нравится такой вывод. Обычно подобное SHELL >> используется как приглашение для ввода, но почему-то в Вашем случае печатается перед выводом :)
There was a problem hiding this comment.
Да, тут просто косяк был. Думал, что с буфером что-то не так...
Исправил!
|
Обновил описание в начале Что-то еще требуется по данному заданию? |
ottergottaott
left a comment
There was a problem hiding this comment.
- Все еще
catне поддерживает считывание вывода предудещей команды в pipe:
echo aaaaaa | cat
SHELL >> File is not exist!- Все еще не могу найти текстовое описание деталей реализации.
Код, в целом, стал лучше
| return CommandEntity.builder() | ||
| .command(environment.getCommand(stringBuilder.toString())) | ||
| .arguments(args) | ||
| .build(); |
There was a problem hiding this comment.
Вообще билдер стоит использовать, когда параметров много, тут можно было бы обычный конструктор звать, но ок
Да, забыл реализовать команду не для файла, исправил! |
|
Ок, засчитываю |
Upd: добавил диаграмму классов