Skip to content

HW01. CLI. Громов Павел#1

Open
PaGr0m wants to merge 11 commits into
masterfrom
dev
Open

HW01. CLI. Громов Павел#1
PaGr0m wants to merge 11 commits into
masterfrom
dev

Conversation

@PaGr0m

@PaGr0m PaGr0m commented Mar 3, 2020

Copy link
Copy Markdown
Owner

Upd: добавил диаграмму классов

@ottergottaott ottergottaott left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Напоминаю, что требовалось:

  • архитектурное описание (диаграмма с классами и их взаимосвязями, немного текста, описывающего детали реализации)
  • поддержать вызов внешних команд (например, 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);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В целом, выделение команд в отдельную иерархию/использование паттерна команда (надеюсь, осознанное) здесь весьма разумно.

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

Мб, сейчас это не самая большая проблема, но, конечно, на файлах >1гб проблема становится более очевидной.

@PaGr0m PaGr0m Jun 1, 2020

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Все-таки pipes немного иначе реализовал, а в команду передаю только аргументы


commands.add(
CommandEntity.builder()
.name(lexems.get(0).getWord())

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кажется, что в CommandEntity можно было класть не имя команды, а сразу саму команду. Так мы еще до начала выполнения, создания кучи объектов и т.д. можем узнать, что команды нет.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил!

import java.util.List;

public class CommandDefault implements Command {
private String name = "";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хорошо, что сделали поля с именами вместо литералов в командах.

Плохо, что в public String name() их не используете

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Решил совсем избавиться от них. Единственное, только сделал конструктор у CommandDefault в который передаю название команды.

Comment thread shell/src/main/java/service/Shell.java Outdated
import java.util.Scanner;

public class Shell {
static Scanner scanner = new Scanner(System.in);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не должно быт package-private полей

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ой, исправил!


public class Environment {

private static String currentPath = System.getProperty("user.dir");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Советую быть крайне осторожным со всякого рода синглтонами. Их сложно поддерживать, они имеют тенденцию быстро разрастаться до god-object, их сложно тестировать.

И почти(вообще?) всегда от них можно избавиться

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Избавился от синглтона, использую DI

return output;
}

List<Lexem> lexems = parser.parseLexem(input);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вообще в данном методе код в значительной степени повторяется. Уверен, что можно обобщить

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Разнес логику

import java.util.List;

public class Substitutor {
Environment environment = Environment.getInstance();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Опять package-private

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Избавился от таких полей)

Comment thread shell/src/main/java/parser/Parser.java Outdated
continue;
} else if (in.charAt(idx) == ' ') {
if (word.length() > 0) {
lexems.add(Lexem.builder()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь аналогично вижу частое дублирование + сам метод на два экрана

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправлено


public Command getCommand(String commandName) {
return commands.getOrDefault(commandName, new CommandDefault());
// return commands.getOrDefault(commandName, new CommandDefault());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не должно быть закомментированного кода

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вроде бы везде убрал комментирование

Comment thread shell/src/main/java/service/Shell.java Outdated
//
// System.out.println(output);
/////////////////////////////
System.out.print("SHELL >> ");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мне, честно говоря, не нравится такой вывод. Обычно подобное SHELL >> используется как приглашение для ввода, но почему-то в Вашем случае печатается перед выводом :)

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, тут просто косяк был. Думал, что с буфером что-то не так...

Исправил!

@PaGr0m

PaGr0m commented Jun 1, 2020

Copy link
Copy Markdown
Owner Author

Обновил описание в начале

Что-то еще требуется по данному заданию?

@ottergottaott ottergottaott left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Все еще cat не поддерживает считывание вывода предудещей команды в pipe:
echo aaaaaa | cat
SHELL >> File is not exist!
  • Все еще не могу найти текстовое описание деталей реализации.

Код, в целом, стал лучше

return CommandEntity.builder()
.command(environment.getCommand(stringBuilder.toString()))
.arguments(args)
.build();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вообще билдер стоит использовать, когда параметров много, тут можно было бы обычный конструктор звать, но ок

@PaGr0m

PaGr0m commented Jun 4, 2020

Copy link
Copy Markdown
Owner Author
  • Все еще cat не поддерживает считывание вывода предудещей команды в pipe:
echo aaaaaa | cat
SHELL >> File is not exist!
  • Все еще не могу найти текстовое описание деталей реализации.

Код, в целом, стал лучше

Да, забыл реализовать команду не для файла, исправил!

@ottergottaott

Copy link
Copy Markdown

Ок, засчитываю

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants