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

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

11 голосов
/ 15 декабря 2009

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

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

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

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

Модель

  • Человек

View

  • EditPersonDetails

Контроллер

  • PersonController

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

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

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

кости

Ответы [ 4 ]

10 голосов
/ 15 декабря 2009

определить абстрактную, но простую программу 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

...
8 голосов
/ 15 декабря 2009

Действительно ли необходимо применять здесь трехбуквенное сокращение? если вы должны:

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

psuedocode:

Person // model
   update();

View
   modelUpdated()
       println(Person.name); ...

Controller
     main()
         while( input = getInput() )
             person.update(...);
             view.modelUpdated();
1 голос
/ 10 апреля 2014

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

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

Тем не менее, мне нравится ответ dfa с одной оговоркой: пользовательский ввод должен быть размещен в контроллере, а не в представлении. Его ответ более точно соответствует шаблону Dolphin 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);
}

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

1 голос
/ 15 декабря 2009

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

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

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

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

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

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

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