Консольное Java-приложение, запущенное из командной строки - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь написать приложение с запуском из командной строки. Я хотел бы реализовать все функции ООП, в частности шаблон проектирования MVC. Честно говоря, я никогда раньше такого не делал (я создавал приложения в интерактивном режиме или с использованием JavaFX GUI). Я создал класс Person, используя потоковый API, проанализировал входную строку. Я создал интерфейс, содержащий метод, который должен иметь разные реализации. Но, как мне кажется, я не иду по правильному пути. Пожалуйста, помогите в дальнейшем развитии. Вот что я имею на сегодня:

Класс модели:

public class Person implements Serializable {
private static final long serialVersionUID = 9005793181629487010L;

private static AtomicInteger nextID = new AtomicInteger(0);

private int id;
private String name;
private String surname;
private String age;
private String address;

public Person(int id, String name, String surname, String age, String address) {
    this.id = id;
    this.name = name;
    this.surname = surname;
    this.age = age;
    this.address = address;
}

public Person(String name, String surname, String age, String address) {
    this(nextID.getAndIncrement(), name, surname, age, address);
}

public int getId() {
    return id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getSurname() {
    return surname;
}

public void setSurname(String surname) {
    this.surname = surname;
}

public String getAge() {
    return age;
}

public void setAge(String age) {
    this.age = age;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

@Override
public String toString() {
    return "\n\nID: " + getId() + "\nName: " + getName() + "\nSurname: " + getSurname() + "\nAge: " + getAge() + "\nAddress: " + getAddress();
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return Objects.equals(name, person.name) &&
            Objects.equals(surname, person.surname) &&
            Objects.equals(age, person.age) &&
            Objects.equals(address, person.address);
}

@Override
public int hashCode() {
    return Objects.hash(name, surname, age, address);
}}

Класс обработки файла, в котором сохраняется вся информация:

public class DataFile {
private File file;
private List<Person> people = new ArrayList<>();

public DataFile(String fileName) {
    this.file = new File(fileName);
}

public void save(Person person) {
    try(BufferedWriter writer = new BufferedWriter(new FileWriter(file, true))) {
        writer.write(person.getName()+ "\r\n" + person.getSurname() + "\r\n" + person.getAge() + "\r\n" + person.getAddress() + "\r\n\r\n");
    } catch(IOException e) {
        throw new RuntimeException(e);
    }
    loadAll();
    writeToJson();
}

private void loadAll() {
    try(BufferedReader reader = new BufferedReader(new FileReader(file))) {
        String name;
        while((name = reader.readLine()) != null) {
            Person person = new Person(name, reader.readLine(), reader.readLine(), reader.readLine());
            people.add(person);
            reader.readLine();
        }
    }
    catch (IOException e) {
        System.out.println(e + "\n\nA new file 'db.txt' will be created.\n");
    }
}

private void writeToJson(){
    try (BufferedWriter bw = new BufferedWriter(new FileWriter("data_file.json"))) {
        Gson gson = new Gson();
        bw.write(gson.toJson(people));
        bw.flush();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}}

Интерфейс, содержащий метод, который обрабатывает каждую команду:

public interface Command {
void execute(Map<String, String> options);}

Реализация команды "добавить в файл":

public class AddCommand implements Command {

@Override
public void execute(Map<String, String> params) {
    Person person = new Person(params.get("name"), params.get("surname"), params.get("age"), params.get("address"));
    System.out.println(person.toString() + "\n");
    params.forEach((k, v) -> System.out.printf("flag: %s - value: %s\n", k, v));
    DataFile file = new DataFile("db.txt");
    file.save(person);
}}

Ну, основной класс программы:

public class Main {

public static void main(String[] args) {
    //Arrays.stream(args).forEach(System.out::println);
    Map<String, String> params = new Main().parse(args);
    AddCommand add = new AddCommand();
    add.execute(params);
}

private Map<String, String> parse(String[] args) {
    Map<String, String> parameters = new LinkedHashMap<>();
    for (int i = 0; i < args.length; i += 2){
        if (i + 1 < args.length){
            parameters.put(args[i], args[i + 1]);
        }
    }
    return parameters;
}}

Все это работает, но я не могу понять, как реализовать поиск-замену, удаление и так далее. Может быть, я неправильно сортирую входную строку .. И я не понимаю, как мне нужно обрабатывать команды, такие как add, update, find, view и т. Д. Возможно, необходимо было проанализировать строку с «global» и «local». параметры, т. е. в интерфейсе, задайте аргументы метода для выполнения (Map globalOptions, Map localOptions) ... Где первая карта - это файл и его имя, а вторая карта - это имя, фамилия, возраст и т. д. Но, возможно, я ошибаюсь. Нужна помощь!

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