# Chia việc đồ án Design Pattern (Validation Project) ## A. THÔNG TIN ### 1. Đề bài - https://courses.fit.hcmus.edu.vn/mod/resource/view.php?id=96377 ### 2. Mã nguồn - **MỚI: [phuongnam195/validation-framework](https://github.com/phuongnam195/validation-framework)** - CŨ: [hoangng26/Validation-Framework](https://github.com/hoangng26/Validation-Framework) ### 3. Môi trường lập trình - C# - .NET 7.0 - Visual Studio 2022 17.4.3 ### 4. Tham khảo - [hoanganhgo/Validation-Project](https://github.com/hoanganhgo/Validation-Project) - [bgalek/validation-framework](https://github.com/bgalek/validation-framework) ## B1. DANH SÁCH CÔNG VIỆC (MỚI) **[MÃ NGUỒN MỚI](https://github.com/phuongnam195/validation-framework)** **DEADLINE: 23:00 ngày 23/12 (thứ 6)** ### 1. Vẽ sơ đồ lớp dựa trên mã nguồn (Tín) - Các lớp: - Validator, DefaultValidator - ValidatorBuilder, DefaultValidatorBuilder - ValidatorFactory - ValidationResult, PositiveValidationResult, NegativeValidationResult - FailureInfo - Constraint, ConcreteConstraint (đại diện cho EmailAddressConstraint, MaxLengthConstraint,...) - ValidationAttribute, ConcreteValidationAttribute - ValidationException, ConcreteValidationException - RegexUtils - Các đường relationship ### 2. Bổ sung mã nguồn (Hoàng) - Bổ sung 2 hoặc 3 constraint cho Constraint/DateTime và Constraint/Number - Tham khảo các lớp trong Constraint/Text - Không cần viết test, miễn là build ValidationFramework thành công - Viết API cho framework mới - Tạo project Server (ngang hàng Test, ValidationFramework) - Giữ lại code FE ### 3. Viết báo cáo dựa trên mã nguồn (A. Nguyện) - Xem code để viết báo cáo - Mô tả các lớp được đề cập trong [B1.1](#1-V%E1%BA%BD-s%C6%A1-%C4%91%E1%BB%93-l%E1%BB%9Bp-d%E1%BB%B1a-tr%C3%AAn-m%C3%A3-ngu%E1%BB%93n-T%C3%ADn) ## B2. DANH SÁCH CÔNG VIỆC (CŨ) ### 1. Vẽ sơ đồ lớp [A. Nguyện + Tín] - Đủ 6 yêu cầu chức năng **cơ bản**: - Nghiên cứu chức năng 1, 3, 5 (Tín) - Nghiên cứu chức năng 2, 4, 6 (A. Nguyện) - Thoả mãn yêu cầu chức năng **mở rộng** - Mô tả chức năng của mỗi class - Deadline: **23:00, 10/12/2022** ### 2. Code framework dựa trên sơ đồ lớp [Hoàng] - Deadline: **23:00, 15/12/2022** ### 3. Làm báo cáo [Nam] - Cả 2 phần - Gom bài và nộp bài - Deadline: **24/12/2022** ## C. Giải thích đề bài ### 1. Validation framework của bạn cần hỗ trợ các thao tác cơ bản: #### a) 1. Cơ chế thông báo khi data không valid - Tổng hợp các thông báo - Có các cách khác nhau để thể hiện thông báo trên giao diện - Trả về string (if not valid) hoặc null/empty (if valid) - Log lỗi ra console - Binding với text field - Trả về bằng REST API #### b) 2. Thao tác thiết lập valid bằng code - Tự kiểm tra với code thêm vào - Truyền callback với return type là boolean ```java= Validator<MovieCharacter> characterValidator = Validator.of(MovieCharacter.class) .validation(movieStar -> movieStar.value.length() > 0, "Name needs to has to be at least 1 character long") .ensure(); ``` #### c) 3. Thao tác thiết lập valid tự động thông qua khai báo ràng buộc dữ liệu - Ví dụ sử dụng attributes trong .NET - [Cách tạo Attributes trong C#](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/creating-custom-attributes) - Tham khảo mã nguồn C#: - B1: Tạo project C# (console/GUI) - B2: Copy paste class sau ```csharp= using System.ComponentModel.DataAnnotations; public class RegisterEmailAddressViewModel { [Required] public int UserId { get; set; } [DataType(DataType.EmailAddress)] public string Email { get; set; } [Compare("Email", ErrorMessage = "Verify email is invalid")] public string EmailVerify { get; set; } } ``` - B3: Truy cập `Required`, `DataType`, `Compare` để xem mã nguồn #### d) 4. Có thể kết hợp các validation với nhau cho cùng kiểu dữ liệu - Ví dụ: vừa thiết lập kiểm tra chuỗi rỗng, chuỗi chỉ toàn ký tự,… - Chuỗi liên tiếp ```java= Validator<MovieCharacter> characterValidator = Validator.of(MovieCharacter.class) .validation(movieStar -> movieStar.value.length() > 0, "Name needs to has to be at least 1 character long") .validation(movieStar -> Character.isUpperCase(movieStar.value.charAt(0)), "Name needs to start with uppercase letter") .validation(movieStar -> movieStar.value.length() < 50, "Name needs to has to be shorter than 50 characters") .ensure(); ``` #### e) 5. Hỗ trợ kết hợp regular expression - Đầu vào là lớp Regex của `System.Text.RegularExpressions` - hoặc Đầu vào là string #### f) 6. Cho phép tạo custom validation - Kế thừa và override các method, attribute phục vụ cho validate ### 2. Validation framework được xây dựng dựa trên các lớp đối tượng với các phương thức phù hợp: #### a) Có thể sử dụng reflection hoặc attribute (C#) hoặc annotation (Java) để đọc các thông tin mô tả ràng buộc các trường dữ liệu. - [Mục C.1.c](#c-3.-Thao-tác-thiết-lập-valid-tự-động-thông-qua-khai-báo-ràng-buộc-dữ-liệu) #### b) Xây dựng các lớp cơ bản hỗ trợ validation cho các kiểu dữ liệu cơ bản - string, int, double, char #### c) Xây dựng các lớp xử lý để thực hiện validation ### 3. Framework phải được xây dựng sao cho đảm bảo tính kế thừa và mở rộng để thêm các validation dễ dàng.