Ben okuyordum Temiz Kodunu son zamanlarda KATI hakkında ve çeşitli çevrimiçi makaleler ve ben hiçbir şey bilmiyorum gibi ne kadar fazla okumak, daha hissediyorum.
Diyelim ki ASP.NET MVC 3 kullanarak bir web uygulaması inşa ediyorum. Diyelim ki böyle UsersController
bir Create
eylem ile bir var :
public class UsersController : Controller
{
public ActionResult Create(CreateUserViewModel viewModel)
{
}
}
Bu eylem yönteminde, girilen veriler geçerliyse kullanıcıyı veritabanına kaydetmek istiyorum.
Şimdi, Tek Sorumluluk İlkesine göre, bir nesnenin tek bir sorumluluğu olmalı ve bu sorumluluk tamamen sınıf tarafından kapsüllenmelidir. Tüm hizmetleri bu sorumlulukla dar bir şekilde uyumlu olmalıdır. Doğrulama ve veritabanına kaydetme iki ayrı sorumluluk olduğundan, sanırım bunları böyle ele almak için ayrı bir sınıf oluşturmak gerekir:
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);
}
}
}
Yani kılan bazı bana mantıklı, ama bu böyle sap şeyler doğru yol olduğuna tüm emin değilim. Örneğin CreateUserViewModel
, IUserService
sınıfa geçersiz bir örnek iletmek tamamen mümkündür . Yerleşik DataAnnotations'ı kullanabileceğimi biliyorum, ama yeterli olmadığında ne olacak? ICreateUserValidator
Aynı ada sahip başka bir kullanıcı olup olmadığını görmek için veritabanımı kontrol eden resim ...
Başka bir seçenek, IUserService
böyle bir doğrulamaya dikkat etmektir:
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;
}
}
Ama burada Tek Sorumluluk İlkesini ihlal ettiğimi hissediyorum.
Böyle bir şeyle nasıl başa çıkmalıyım?
user
Sınıf doğrulamayı yapmamalı mı? SRP ya da değil,user
örneğin neden geçerli olup olmadığını bilmemeli ve bunu belirlemek için başka bir şeye güvenmemeliyim. Sınıfın başka sorumlulukları nelerdir? Ayrıca,user
değişiklikler değiştiğinde muhtemelen değişecektir, bu nedenle farklı bir sınıfa dış kaynak kullanımı yalnızca sıkıca bağlı bir sınıf yaratacaktır.