2009-12-14 31 views
8

Tôi đang xem xét MVC từ quan điểm dòng lệnh (không phải web và không có khung công tác) .. đẹp và đơn giản. điều duy nhất gây nhầm lẫn cho tôi là phần Xem của điều này? (Cũng có thể không phải là duy nhất nhưng một trong những chính nó)MVC trên dòng lệnh

từ trang web của IBM quan điểm có định nghĩa sau đây

Quan điểm cung cấp trình bày của các mô hình. Đây là giao diện của của ứng dụng. Chế độ xem có thể truy cập vào getters mô hình, nhưng nó có không có kiến ​​thức về người định cư. Trong số bổ sung, nó không biết gì về bộ điều khiển . Chế độ xem phải là được thông báo khi có thay đổi đối với mô hình .

Vì vậy, nếu tôi có như sau:

Mẫu

  • Person

Xem

  • EditPersonDetails

khiển

  • PersonController

người điều khiển của tôi có thể vượt qua một đối tượng người xem EditPeronDetails, tuy nhiên như thế nào xem chỉnh sửa của tôi người đó nếu nó không thể truy cập setters của nó, làm thế nào tôi có thể chỉnh sửa người?

Ngoài ra, chế độ xem cũng chỉ làm một việc? tức là tôi có thể có một Person View, trong đó có phương pháp để Tạo, xem, xóa, chỉnh sửa người

cảm ơn nhiều

xương

Trả lời

6

Là nó thực sự cần thiết để áp dụng một từ viết tắt 3 bức thư ở đây? nếu bạn phải:

  1. dùng thấy màn hình giao diện điều khiển, trong đó cho thấy quan điểm (dòng văn bản)
  2. loại sử dụng một cái gì đó trên dòng lệnh, mà là một thậm chí từ xem
  3. Bộ điều khiển được sự kiện , tức là người dùng nhập
  4. bộ điều khiển sẽ thực hiện điều gì đó tương ứng và cập nhật mô hình (người)
  5. Bộ điều khiển
  6. cho chế độ xem xem để sơn lại, tức là in thêm một số dòng.

psuedocode:

Person // model 
    update(); 

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

Controller 
    main() 
     while(input = getInput()) 
      person.update(...); 
      view.modelUpdated(); 
1

Tôi không chắc chắn để có được cách bạn hoán khái niệm về quan điểm trên dòng lệnh nhưng tôi sẽ cố gắng trả lời.

Trình điều khiển người của tôi có thể chuyển đối tượng người đó đến chế độ xem EditPeronDetails, cách tôi có thể chỉnh sửa người đó?

Trình điều khiển không hoạt động. Chế độ xem chỉ "chụp" các giá trị và hành động mới và gửi chúng đến bộ điều khiển xử lý chúng và cập nhật mô hình.

Ngoài ra, chế độ xem chỉ làm một việc? tức là tôi có thể có Chế độ xem cá nhân, có phương pháp tạo, xem, xóa, chỉnh sửa người

Chế độ xem có thể thực hiện nhiều việc. Ví dụ, một hình thức tương tự có thể được sử dụng để tạo, đọc và cập nhật một đối tượng miền (bằng cách tạo và chỉnh sửa, ý tôi là ghi lại các giá trị và gửi chúng đến bộ điều khiển). Đây thực sự là một mô hình rất phổ biến. Nhưng như tôi đã nói, nó không phải là quan điểm thực hiện logic, nó là bộ điều khiển. Vì vậy, để trả lời câu hỏi của bạn, tôi đoán chúng ta có thể tưởng tượng có phương pháp chuyên dụng trên Person View để nắm bắt đầu vào của người dùng và xử lý giao tiếp với bộ điều khiển, nhưng không phải cho logic CRUD (tôi thực sự tự hỏi bạn như thế nào xử lý tương tác với người dùng trên dòng lệnh, nó có vẻ không thực sự tiện dụng cho ứng dụng CRUD).

8

xác định một chương trình MVC nhưng đơn giản trừu tượng như:

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); 
     } 
    } 
} 

sau đó sử dụng Observer pattern (built-in từ JDK 1.0, see here) để điền vào các lớp bê tông:

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); 
     } 
    } 
} 

Lớp chính, nghĩa là chỉ chịu trách nhiệm xây dựng và kết nối với nhau thành phần:

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(); 

ouput của chương trình này là:

 
mvc demo> 
=> person updated to David 

mvc demo> 
=> person updated to Damian 

... 
1

tôi đang làm việc trên tái kiến ​​trúc một chương trình CLI tầm thường và đã hỏi một câu hỏi tương tự như bản thân mình.

Trong nghiên cứu này, rõ ràng là MVC và các dẫn xuất của nó thường bị lạm dụng. Để làm phức tạp hơn nữa, các biến thể của MVC (Web MVC xuất hiện trong tâm trí) tồn tại mà không tuân theo việc triển khai Smalltalk-80 gần như nguyên bản và định nghĩa MVC.

Điều đó nói rằng, tôi thích dfa's answer với một báo trước: đầu vào của người dùng phải được đặt trong bộ điều khiển chứ không phải chế độ xem. Câu trả lời của ông gắn kết chặt chẽ hơn với Dolphin Smalltalk MVP pattern so với MVC.

"Controller là một thành phần mà đáp ứng cho người sử dụng đầu vào như nhập dữ liệu và lệnh ban hành từ một bàn phím hoặc chuột. Trách nhiệm của nó là để đóng vai trò như một cầu nối giữa con người và các ứng dụng, cho phép người dùng để tương tác với màn hình và dữ liệu. " - source

Như vậy, tôi sẽ loại bỏ:

return br.readLine(); 

từ quan điểm và chỉ cần có sự chờ đợi điều khiển cho đầu vào như sau:

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

Thành thật mà nói, tôi có một thời gian khó biện minh điều này là cần thiết tốt hơn, nhưng tôi nghĩ rằng tôi sẽ ném ra khỏi đó.

Các vấn đề liên quan