MVC в командной строке

Я смотрю в MVC с точки зрения командной строки (не веб и не фреймворк).. просто и мило. единственное, что меня смущает-это вид из окна? (ну, это может быть не единственный, но его главный)

на сайте IBM представление имеет следующее определение

представление дает презентация модели. Это посмотрите приложение. Вид может доступ к модели getters, но он имеет никаких знаний о сеттерах. В кроме того, он ничего не знает о контроллер. Вид должен быть уведомление об изменениях в модели происходить.

Итак, если у меня есть следующее:

модель

  • человек

посмотреть

  • EditPersonDetails

контроллер

  • классе personcontroller

мой контроллер person может передать объект person в представление EditPeronDetails, однако как мой взгляд редактирует человека, если он не может получить доступ к своим сеттерам, как я могу редактировать человека?

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

большое спасибо

кости

4 ответов


неужели надо применить 3 буквы аббревиатуры здесь? если нужно:

  1. пользователь видит экран консоли, на котором отображается посмотреть (строки из текста)
  2. пользователь вводит что-то в командной строке, которая является даже С посмотреть
  3. контроллер получает событие, т. е. пользовательский ввод
  4. контроллер делает что-то соответственно, и обновления модель (лица)

определите абстрактную, но простую программу MVC как:

interface Model {
    public void setName(String name);
}

interface View {
    public String prompt(String prompt);
}

class Controller {

    private final Model model;
    private final View view;

    public Controller(Model model, View view) {
        this.model = model;
        this.view = view;
    }

    public void run() {
        String name;

        while ((name = view.prompt("\nmvc demo> ")) != null) {
            model.setName(name);
        }
    }
}

затем использовать шаблон Observer (встроенный начиная с JDK 1.0,посмотреть здесь) для того, чтобы заполнить конкретными классами:

class Person extends Observable implements Model {

    private String name;

    public Person() {
    }

    public String getName() {
        return name;
    }

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

class TUI implements Observer, View { // textual UI

    private final BufferedReader br;

    public TUI(Reader reader) {
        this.br = new BufferedReader(reader);
    }

    public void update(Observable o, Object arg) {
        System.out.println("\n => person updated to " + arg);
    }

    public String prompt(String prompt) {
        try {
            System.out.print(prompt);
            return br.readLine();
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }
}

основной класс, то есть только ответственность строить и соединять компоненты:

TUI view = new TUI(new StringReader("David\nDamian\nBob\n"));
Person model = new Person();
model.addObserver(view);
Controller controller = new Controller(model, view);
controller.run();

выход этой программы:

mvc demo> 
 => person updated to David

mvc demo> 
 => person updated to Damian

...

Я не уверен, что понимаю, как Вы перенесли концепцию представления в командной строке, но я попытаюсь ответить.

мой контроллер person может передать объект person в EditPeronDetails view, однако как мой вид редактирует человека, если он не может получить доступ к своим сеттерам, как я могу редактировать человека?

это не так, контроллер делает. Представление только "захватывает" новые значения и действия и отправляет их контроллеру, который обрабатывает их и обновляет модель.

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

представление может делать несколько вещей. Например, та же форма может использоваться для создания, чтения и обновления объекта домена (под созданием и редактированием я имею в виду захват значений и отправку их контроллеру). На самом деле это очень распространенная модель. Но, как я уже сказал, это не представление, которое выполняет логику, это контроллер, который делает.

Итак, чтобы ответить на ваш вопрос, я думаю, мы можем представить, что выделенные методы в представлении Person захватывают пользовательский ввод и обрабатывают связь с контроллером, но не для логики CRUD (мне действительно интересно, как вы обрабатываете взаимодействия с пользователем в командной строке, это не кажется очень удобным для приложения CRUD).


Я работаю над перепроектированием тривиальной программы CLI и задал себе аналогичный вопрос.

исследуя это, очевидно, что MVC и его производные обычно используются неправильно. Чтобы еще больше усложнить ситуацию, существуют варианты MVC (Web MVC), которые не придерживаются почти оригинальной реализации Smalltalk-80 и определения MVC.

что сказал, мне нравится ответ dfa С одним предостережением: входной сигнал потребителя должен быть помещен внутри контроллер, а не вид. Его ответ совпадает с Дельфин Smalltalk MVP шаблон по сравнению с MVC.

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

как таковой, Я бы удалил:

return br.readLine();

из представления и просто дождитесь ввода контроллера следующим образом:

public void run() {
    view.prompt("\nmvc demo> ");
    String name = br.readLine(); // assume the BufferedReader object is now in the controller
    model.setName(name);
}

честно говоря, мне трудно оправдать это как обязательно лучше, но я думал, что выброшу там.