2009-07-14 35 views
13

Tôi đang trong quá trình viết một số mã xác nhận dựa trên những giả định:các mẫu thiết kế OO sử dụng để xác nhận

  • đang Validation phải nằm trong một lớp bên ngoài
    • tức là không có lớp dữ liệu chứa nó xác nhận của riêng
  • Các đối tượng tương tự có thể được xác nhận theo những cách khác nhau
    • ví dụ: chỉ xác thực cú pháp; xác thực đối với các lần tra cứu DB; xác thực đối với các bản sao; vv
  • đầu ra Validation có thể khác nhau tùy thuộc vào những gì cần nó
    • ví dụ xuất một thông báo lỗi đơn; xuất danh sách tất cả các lỗi xác nhận; tương tự nhưng ở định dạng JSON và bao gồm các mã lỗi; vv

Sự kết hợp của các mẫu thiết kế OO nào là tốt nhất để giải quyết vấn đề này? Một nhà máy có thể là một cách tốt để có được một trình xác nhận cụ thể, nhưng cách tiếp cận của họ có tốt hơn không?

Trả lời

8

Một kích thước không phù hợp với tất cả! Làm cho nó đơn giản!

Cung cấp trình xác thực với các phương thức/giao diện phổ biến cho dữ liệu đầu ra, phân loại cảnh báo, cảnh báo lọc/quy trình được nâng lên nhiều lần. Không tạo ra bất kỳ cách xác thực tinh vi nào, ít nhất không phải trước khi viết một số cuộc sống thực trình xác thực hợp lệ.

Move ra khỏi con đường và để cho các xác nhận làm những gì họ có nghĩa vụ phải làm:

 
for validator in all_validators: 
    validator.validate(model)

2

Tôi nghĩ rằng tôi đang làm điều tương tự ngay bây giờ.
Mẫu áp dụng ở đây là mẫu Bộ lọc và Chuỗi bộ lọc.

Mỗi bộ lọc xác thực dựa trên một "cách" (như bạn gọi cho chúng).
Đầu tiên cho cú pháp, thứ hai để tìm kiếm Db vv (từ dấu đầu dòng thứ hai của bạn).

0

Tôi đã gặp vấn đề tương tự này và tôi thấy mẫu khách truy cập thực sự hiệu quả trong việc tách logic xác thực khỏi đối tượng dữ liệu. Bạn sẽ cần phải thiết lập phân cấp lớp dữ liệu của bạn với các phương thức chấp nhận (khách truy cập), nhưng nếu bạn đang xây dựng mọi thứ đủ đơn giản. Ngay cả khi bạn đang sử dụng hệ thống phân cấp của bên thứ ba mà không có sự hỗ trợ của khách truy cập, bạn có thể tạo trình bao bọc cung cấp cây duyệt tra duyệt và khá gần với phương thức bên trong lớp.

Để thực hiện xác thực khác, bạn triển khai một lớp trình xác thực khác và chuyển nó tới phương thức chấp nhận trên đối tượng gốc. Tôi cũng có thể tạo các khách truy cập tiện ích khác xung quanh mô hình cho phép tôi tạo khách truy cập máy phát điện được điền vào tất cả các trường có dữ liệu mẫu/ngẫu nhiên. Tôi đã đi một chút khách truy cập điên vào nó bởi vì tôi đã rất vui mừng. Bạn có lẽ có thể nói rằng tôi vẫn còn vui mừng về nó, đặc biệt là có sự thay đổi để nói với người khác về nó.

+4

Sự phấn khích ** thực ** đang cố gắng che giấu nhà phát triển bảo trì trong khi anh ấy đuổi theo bạn xung quanh thị trấn bằng súng trường :) Và phần thực sự "thú vị" là khi bạn là người bảo trì và không có ai đuổi theo nhưng bản thân ... chờ đợi, đó không phải là thực sự thú vị ... (được ở đó, làm điều đó). –

0

Nếu bạn đang thực hiện bất kỳ loại công việc GUI nào, bạn nên xem xét Xác thực JGoodies: http://www.jgoodies.com/downloads/libraries.html (cũng có một số bài viết tại đây: www.jgoodies.com/articles/).

Tôi sẽ tạo trình xác thực cho bất kỳ lớp nào cần xác thực. Bạn thực sự có thể tạo nhiều trình xác thực nếu bạn cần các cách xác thực khác nhau, ví dụ: nghiêm ngặt hay không. Bạn có thể nhóm các chức năng và phương thức phổ biến thành các lớp như AbstractValidator và ValidationResult (có thể có danh sách lỗi, mức độ nghiêm trọng, v.v.).

Hãy cảnh giác với thiết kế quá mức. Hãy thử bắt đầu với một cái gì đó đơn giản như:

new UserValidator().validate(user) 

hoặc để xác nhận một cái nhìn:

new UserPanelValidator().validate(userPanel) 

Nó phụ thuộc vào kiến ​​trúc của bạn mặc dù. Ví dụ: nếu bạn tự động truyền đầu vào từ chế độ xem sang miền thì bạn không cần thực hiện xác thực nhiều ở cấp chế độ xem.

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