Thứ Năm, 17 tháng 4, 2014

Nói thêm về MVC

Trong lập trình mô hình MVC được áp dụng phổ biến hiện nay. Ta đều đã nghe nói đến nó,  làm thử với nó. nhưng mà mỗi người lại có một cách tổ chức không giống nhau dẫn đến không phát huy hết sức mạnh của MVC.
Đành rằng MVC là Model-View-Controller. nhưng mà cụ thể trong một project phức tạp thì việc phân chia các module cho khoa học là cả một quá trình tích lũy kinh nghiệm cũng như khả năng tư duy và logic của lập trình viên. mình sẽ nói qua một vài điều cơ bản về cách tổ chức mô hình MVC trong web application (theo ý kiến cá nhân thôi)

Controller:

Controller là module có nhiệm vụ nhận các request từ client, check permission, sau đó lấy dữ liệu từ model, và quyết định view format nào để hiển thị (html, xml, json..).
Các controller thông thường xử lý các action cở bản sau: index, list, show, create, save, edit, update, và delete
Với nhiệm vụ của controller như vậy, thì nên viết controller càng ít code, rõ ràng càng tốt. Không nên thực hiện bất cứ logic, queries hoặc validate nào trong controller.
Đối với các controller đại diện cho một Entity, nên đặt tên theo cú pháp: <Entity>Controller: StudentController, CustomerController

View:

View có chức năng hiển thị dữ liệu khi server trả về kết quả cho request của client. Vì thế view có thể là HTML, XML, JSON... , thường là các markup language nên view càng đơn giản, rõ ràng càng tốt. không nên viết lẫn các mã script trong view, ví dụ như <%%>, <??> , javascript nên tách  ra thành các file references, css không nên viết trong selector mà xây dựng thành các class.
Nên xây dựng thành các layout cho các chức năng khác nhau như admin, user...
 Ngoài ra có những phần chung cho nhiều view thì nên xây dựng thành package taglib riêng. ví dụ pagging, sorting, errors, messages...

Model:

Model là module xử lý logic nghiệp vụ, cũng như tương tác với Database, vì thế việc thiết kế và xây dựng Model khoa học là rất quan trọng
Entity: Trước tiên Model phải có 1 package chứa các Entity mapping với các Table trong Database, nên xây dựng một BaseEntity class để cho các Entity kế thừa.
public class BaseEntity implements Serializable {
 private static final long serialVersionUID = 654960331737867949L;
 @Id
 @Column(name = "id")
 protected Long id;

 @Column(name = "version")
 @Version
 private Long version;

 @Override
 public int hashCode() {

 }

 @Override
 public boolean equals(Object object) {
 }

 @Override
 public String toString() {

 }
}
Logic/Service: xử lý các logic nghiệp vụ
Repository: Thực thi các truy vấn, tương tác với database.
Dto: Các class dto chứa các fields như entity, nhưng được tùy biến để có thể sử dụng trong các trường hợp cần thêm bớt trường nào. (không được sửa entity. bắt buộc giống với Table)
Validation: các class chứa các method dùng để validate dữ liệu từ người dùng. hầu hết các framework đều hỗ trợ validate nên các class này có thể extend hoặc implement từ framework.

General:

Ngoài ra trong ứng dụng còn có các phần common sử dụng chung
Exception: Các class này rất quan trọng, dùng để xử lý exception, đặc biệt là RuntimeException.
Logging: xử lý để ghi log cho ứng dụng
Util: Chứa các lớp xử lý cho các common chung của ứng dụng như DateUtil, StringUtil, upload/ download..

Demo:

Thanks & Regards!!!