एसआरपी का पालन करते समय, मुझे संस्थाओं को मान्य करने और बचाने से कैसे निपटना चाहिए?


10

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

जवाबों:


4

मुझे नहीं लगता कि आप अपने दूसरे उदाहरण में सिंगल-रिस्पॉन्सिबिलिटी-प्रिंसिपल का उल्लंघन कर रहे हैं।

  • UserServiceवर्ग बदलने के लिए केवल एक ही कारण है: अगर वहाँ जिस तरह से आप एक उपयोगकर्ता को बचाने को बदलने के लिए एक की जरूरत है।

  • ICreateUserValidatorअगर वहाँ जिस तरह से आप एक उपयोगकर्ता को मान्य बदलने के लिए एक की जरूरत है: वर्ग केवल एक ही कारण बदलने के लिए है।

मुझे यह स्वीकार करना चाहिए कि आपका पहला कार्यान्वयन अधिक सहज है। हालांकि, सत्यापन उपयोगकर्ता को बनाने वाली संस्था द्वारा किया जाना चाहिए। सत्यापन के लिए स्वयं निर्माता को जिम्मेदार नहीं होना चाहिए; इसके बजाय जिम्मेदारी को एक वैध वर्ग (आपके दूसरे कार्यान्वयन के अनुसार) को सौंपना चाहिए। इसलिए, मुझे नहीं लगता कि दूसरे डिज़ाइन में SRP की कमी है।


1
एकल दायित्व-पैटर्न? सिद्धांत, शायद?
यानिस

हाँ, निश्चित रूप से :) इसे सही किया!
Guven

0

यह मुझे लगता है कि पहला उदाहरण सच एसआरपी के लिए "करीब" है; यह आपके मामले में कंट्रोलर की जिम्मेदारी है कि वह यह जान सके कि चीजों को कैसे वायर किया जाए और व्यूमॉडल के साथ कैसे गुजारा जाए।

क्या यह अधिक समझ में नहीं आता है कि पूरे IsValid / ValidationMessages में ViewModel का ही हिस्सा होना चाहिए? मैं MVVM के साथ डब नहीं किया गया है, लेकिन यह पुराने मॉडल-व्यू-प्रस्तोता पैटर्न की तरह लगता है, जहां प्रस्तुतकर्ता के लिए इस तरह की चीजों को संभालना ठीक था क्योंकि यह सीधे प्रस्तुति से संबंधित था। यदि आपका ViewModel वैधता के लिए जाँच कर सकता है, तो UserService की विधि बनाने के लिए अमान्य को पास करने का कोई मौका नहीं है।


मैंने हमेशा सोचा कि ViewModels सरल DTO होना चाहिए, उनमें बहुत अधिक तर्क के बिना। मुझे यकीन नहीं है कि अगर मुझे किसी व्यूमाडेल में डेटाबेस की जाँच करने जैसा कुछ करना चाहिए ...
क्रिस्टोफ़ क्लेस

मुझे लगता है कि यह इस बात पर निर्भर करेगा कि आपकी मान्यता क्या है; यदि ViewModel सिर्फ IsValidबूलियन और ValidationMessagesसरणी को उजागर करता है , तो यह अभी भी एक Validator वर्ग में कॉल कर सकता है और इस बारे में चिंता करने की ज़रूरत नहीं है कि सत्यापन कैसे लागू किया जा रहा है। नियंत्रक जाँच कर सकता है कि पहले उदाहरण if (userViewModel.IsValid) { userService.Create(userViewModel); }के तौर पर ViewModel को पता होना चाहिए कि क्या यह वैध है, लेकिन यह नहीं जानता कि यह कैसे मान्य है।
वेन मोलिना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.