내가 읽어 봤는데 클린 코드 최근 SOLID에 대한 다양한 온라인 기사를, 나는 아무것도 몰라처럼 더 나는 그것에 대해 읽고, 더 느낌.
나는이의 내가 ASP.NET MVC 3하자 말을 사용하여 웹 응용 프로그램을 짓고 있어요 가정 해 봅시다 UsersController
과 Create
같은 조치 :
public class UsersController : Controller
{
public ActionResult Create(CreateUserViewModel viewModel)
{
}
}
해당 조치 방법에서 입력 한 데이터가 유효한 경우 사용자를 데이터베이스에 저장하려고합니다.
이제 단일 책임 원칙에 따르면, 개체는 단일 책임을 가져야하며, 그 책임은 전적으로 클래스에 의해 캡슐화되어야합니다. 모든 서비스는 그 책임과 좁게 조정되어야합니다. 데이터베이스에 대한 유효성 검사 및 저장은 두 가지 별도의 책임이기 때문에 다음과 같이 처리하기 위해 클래스를 분리해야합니다.
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);
}
}
}
즉하게 어떤 나에게 의미하지만 문제는이 같은 핸들 물건에 대한 권리 방법이라고 모두 확인에 아니에요. 의 잘못된 인스턴스를 전달하기 위해, 예를 들어 전적으로 가능하다 CreateUserViewModel
받는 IUserService
클래스입니다. 내장 DataAnnotations를 사용할 수 있다는 것을 알고 있지만 충분하지 않은 경우는 무엇입니까? 내 ICreateUserValidator
이름이 동일한 다른 사용자가 있는지 데이터베이스를 확인한 이미지 ...
다른 옵션은 IUserService
다음과 같이 유효성 검사를 처리 하도록하는 것입니다.
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;
}
}
그러나 저는 여기서 단일 책임 원칙을 위반하고 있다고 생각합니다.
이런 식으로 어떻게 처리해야합니까?
user
클래스가 유효성 검사를 처리 하지 않아야 합니까? SRP 여부,user
인스턴스가 유효한지 여부를 알 수없는 이유를 알지 못하고 그것을 결정하기 위해 다른 것에 의존합니다. 반에는 어떤 다른 책임이 있습니까? 또한user
변경시 유효성 검사가 변경 될 수 있으므로 다른 클래스에 아웃소싱하면 밀접하게 연결된 클래스 만 생성됩니다.