सिंगल रिस्पांसिबिलिटी प्रिंसिपल आपके कोड के बारे में केवल 1 काम कर रहा है और आप सभी कार्यक्षमता को कई वर्गों में विभाजित कर सकते हैं जो सभी 1 विशिष्ट कार्य करने के लिए हैं। एक उदाहरण सत्यापन के लिए एक विशिष्ट वर्ग है, कुछ व्यावसायिक तर्क करना, एक मॉडल को समृद्ध करना, डेटा को पुनः प्राप्त करना, डेटा को अपडेट करना, नेविगेशन, आदि।
चिंता का पृथक्करण आपके कोड के बारे में कुछ अन्य वर्गों / प्रणालियों को कसकर नहीं किया जा रहा है। अपने कोड में इंटरफेस का उपयोग करने से आपको बहुत मदद मिलती है, इस तरह से आप कुछ वर्गों / प्रणालियों को आपके कोड में शिथिल कर सकते हैं। इस पर एक पक्ष यह है कि आपके कोड को यूनिट-टेस्ट करना भी आसान है। बहुत सारे (IoC) ढांचे हैं जो आपको इसे हासिल करने में मदद कर सकते हैं, लेकिन आप इस तरह की चीज को खुद भी लागू कर सकते हैं।
कुछ SoC का उदाहरण है, लेकिन SRP नहीं है
public class Foo
{
private readonly IValidator _validator;
private readonly IDataRetriever _dataRetriever;
public Foo(IValidator validator, IDataRetriever dataRetriever)
{
_validator = validator;
_dataRetriever = dataRetriever;
}
public NavigationObject GetDataAndNavigateSomewhereIfValid()
{
var data = _dataRetriever.GetAllData();
if(_validator.IsAllDataValid(data))
{
object b = null;
foreach (var item in data.Items)
{
b = DoSomeFancyCalculations(item);
}
if(_validator.IsBusinessDataValid(b))
{
return ValidBusinessLogic();
}
}
return InvalidItems();
}
private object DoSomeFancyCalculations(object item)
{
return new object();
}
private NavigationObject ValidBusinessLogic()
{
return new NavigationObject();
}
private NavigationObject InvalidItems()
{
return new NavigationObject();
}
}
जैसा कि आप देख सकते हैं, यह कोड कक्षाओं या अन्य प्रणालियों के लिए कसकर युग्मित नहीं है, क्योंकि यह केवल सामान करने के लिए कुछ इंटरफेस का उपयोग करता है। यह एक SoC दृष्टिकोण से अच्छा है।
जैसा कि आप देख सकते हैं कि इस वर्ग में 3 निजी विधियां शामिल हैं जो कुछ फैंसी चीजें करती हैं। एसआरपी के दृष्टिकोण से, उन विधियों को संभवतः अपने स्वयं के कुछ वर्गों के भीतर रखा जाना चाहिए। उनमें से 2 नेविगेशन के साथ कुछ करते हैं, जो कुछ इंविवेशन क्लास में फिट होगा। एक आइटम पर अन्य कुछ फैंसी गणना करता है, इसे संभवत: IBusinessLogic वर्ग में रखा जा सकता है।
इस तरह से कुछ होने के बाद, आपके पास जगह में SoC और SRP दोनों हैं:
public class Foo
{
private readonly IValidator _validator;
private readonly IDataRetriever _dataRetriever;
private readonly IBusinessLogic _businessLogic;
private readonly INavigation _navigation;
public Foo(IValidator validator, IDataRetriever dataRetriever, IBusinessLogic businessLogic, INavigation navigation)
{
_validator = validator;
_dataRetriever = dataRetriever;
_businessLogic = businessLogic;
_navigation = navigation;
}
public NavigationObject GetDataAndNavigateSomewhereIfValid()
{
var data = _dataRetriever.GetAllData();
if(_validator.IsAllDataValid(data))
{
object b = null;
foreach (var item in data.Items)
{
b = _businessLogic.DoSomeFancyCalculations(item);
}
if(_validator.IsBusinessDataValid(b))
{
return _navigation.ValidBusinessLogic();
}
}
return _navigation.InvalidItems();
}
}
बेशक आप बहस कर सकते हैं कि क्या इस सारे तर्क को GetDataAndNavigateSomewhereIfValid
विधि में रखा जाना चाहिए । यह कुछ ऐसा है जिसे आपको अपने लिए तय करना चाहिए। मेरे लिए ऐसा लग रहा है कि यह तरीका बहुत ज्यादा सामान कर रहा है।