Gần đây tôi đã đọc Clean Code và nhiều bài báo trực tuyến khác về RẮN, và càng đọc về nó, tôi càng cảm thấy mình không biết gì.
Giả sử tôi đang xây dựng một ứng dụng web bằng ASP.NET MVC 3. Giả sử tôi có UsersController
một Create
hành động như thế này:
public class UsersController : Controller
{
public ActionResult Create(CreateUserViewModel viewModel)
{
}
}
Trong phương thức hành động đó tôi muốn lưu người dùng vào cơ sở dữ liệu nếu dữ liệu được nhập là hợp lệ.
Bây giờ, theo Nguyên tắc Trách nhiệm Đơn lẻ, một đối tượng nên có một trách nhiệm duy nhất và trách nhiệm đó phải được gói gọn trong lớp. Tất cả các dịch vụ của nó nên được liên kết hẹp với trách nhiệm đó. Vì xác thực và lưu vào cơ sở dữ liệu là hai trách nhiệm riêng biệt, tôi đoán tôi nên tạo để tách lớp để xử lý chúng như thế này:
public class UsersController : Controller
{
private ICreateUserValidator validator;
private IUserService service;
public UsersController(ICreateUserValidator validator, IUserService service)
{
this.validator = validator;
this.service= service;
}
public ActionResult Create(CreateUserViewModel viewModel)
{
ValidationResult result = validator.IsValid(viewModel);
if (result.IsValid)
{
service.CreateUser(viewModel);
return RedirectToAction("Index");
}
else
{
foreach (var errorMessage in result.ErrorMessages)
{
ModelState.AddModelError(String.Empty, errorMessage);
}
return View(viewModel);
}
}
}
Điều đó làm cho một số ý nghĩa với tôi, nhưng tôi không hoàn toàn chắc chắn rằng đây là cách đúng đắn để xử lý những thứ như thế này. Ví dụ, hoàn toàn có thể truyền một thể hiện không hợp lệ CreateUserViewModel
cho IUserService
lớp. Tôi biết tôi có thể sử dụng DataAnnotations tích hợp, nhưng khi chúng không đủ thì sao? Hình ảnh mà tôi ICreateUserValidator
kiểm tra cơ sở dữ liệu để xem đã có người dùng khác có cùng tên chưa ...
Một lựa chọn khác là để cho việc IUserService
chăm sóc xác nhận như thế này:
public class UserService : IUserService
{
private ICreateUserValidator validator;
public UserService(ICreateUserValidator validator)
{
this.validator = validator;
}
public ValidationResult CreateUser(CreateUserViewModel viewModel)
{
var result = validator.IsValid(viewModel);
if (result.IsValid)
{
// Save the user
}
return result;
}
}
Nhưng tôi cảm thấy mình đang vi phạm Nguyên tắc Trách nhiệm duy nhất ở đây.
Làm thế nào tôi nên đối phó với một cái gì đó như thế này?
user
Lớp học có nên xử lý việc xác nhận không? SRP hay không, tôi không hiểu tại saouser
cá thể không nên biết khi nào nó hợp lệ hay không và dựa vào cái gì khác để xác định điều đó cho nó. Lớp học có trách nhiệm gì khác? Thêm vào đó, khiuser
thay đổi xác nhận có thể sẽ thay đổi, do đó, việc thuê ngoài đó sang một lớp khác sẽ chỉ tạo ra một lớp kết hợp chặt chẽ.