मैं हाल ही में 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वर्ग को सत्यापन नहीं करना चाहिए ? एसआरपी या नहीं, मैं यह नहीं देखता किuserउदाहरण को यह नहीं पता होना चाहिए कि यह कब वैध है या नहीं और इसके लिए यह निर्धारित करने के लिए किसी और चीज़ पर निर्भर रहना चाहिए। कक्षा के पास और क्या जिम्मेदारियाँ हैं? प्लस जबuserपरिवर्तन बदलता है तो संभवतः परिवर्तन होगा, इसलिए आउटसोर्सिंग को एक अलग वर्ग में केवल एक कसकर युग्मित वर्ग बनाया जाएगा।