एक क्लास के पास बदलने का केवल एक कारण होना चाहिए।
परिभाषा: इस संदर्भ में, जिम्मेदारी को बदलने के एक कारण के रूप में माना जाता है।
यह सिद्धांत बताता है कि यदि हमारे पास एक क्लास के लिए बदलने के 2 कारण हैं, तो हमें कार्यक्षमता को दो क्लासेस में विभाजित करना होगा। प्रत्येक क्लास केवल एक जिम्मेदारी संभालेगी और यदि भविष्य में हमें एक बदलाव करने की आवश्यकता है तो हम उसे उस क्लास में करेंगे जो उसे संभालती है। जब हमें एक से अधिक जिम्मेदारियों वाली क्लास में बदलाव करने की आवश्यकता होती है तो वह बदलाव उस क्लास के अन्य कार्यों को प्रभावित कर सकता है जो दूसरी जिम्मेदारी से संबंधित हैं।
सिंगल रिस्पॉन्सिबिलिटी सिद्धांत लागू करने से पहले
using System;
using System.Net.Mail;
namespace SolidPrinciples.Single.Responsibility.Principle.Before
{
class Program
{
public static void SendInvite(string email, string firstName, string lastname)
{
// जिम्मेदारी 1: नाम सत्यापन
if (String.IsNullOrWhiteSpace(firstName) || String.IsNullOrWhiteSpace(lastname))
{
throw new Exception("Name is not valid");
}
// जिम्मेदारी 2: ईमेल सत्यापन
if (!email.Contains("@") || !email.Contains("."))
{
throw new Exception("Email is not Valid!");
}
// जिम्मेदारी 3: ईमेल भेजना
SmtpClient client = new SmtpClient();
client.Send(new MailMessage("Test@gmail.com", email) { Subject = "Please Join the Party!" });
}
}
}
सिंगल रिस्पॉन्सिबिलिटी सिद्धांत लागू करने के बाद
using System;
using System.Net.Mail;
namespace SolidPrinciples.Single.Responsibility.Principle.After
{
internal class Program
{
public static void SendInvite(string email, string firstName, string lastname)
{
// प्रत्येक जिम्मेदारी अलग क्लास में
UserNameService.Validate(firstName, lastname);
EmailService.Validate(email);
SmtpClient client = new SmtpClient();
client.Send(new MailMessage("Test@gmail.com", email) { Subject = "Please Join the Party!" });
}
}
// जिम्मेदारी 1: उपयोगकर्ता नाम सत्यापन
public static class UserNameService
{
public static void Validate(string firstname, string lastName)
{
if (string.IsNullOrWhiteSpace(firstname) || string.IsNullOrWhiteSpace(lastName))
{
throw new Exception("Name is not valid");
}
}
}
// जिम्मेदारी 2: ईमेल सत्यापन
public static class EmailService
{
public static void Validate(string email)
{
if (!email.Contains("@") || !email.Contains("."))
{
throw new Exception("Email is not Valid!");
}
}
}
}
SRP के लाभ
- कम कपलिंग: प्रत्येक क्लास का एक स्पष्ट उद्देश्य होता है
- बेहतर टेस्टेबिलिटी: प्रत्येक जिम्मेदारी को स्वतंत्र रूप से टेस्ट करें
- आसान मेंटेनेंस: एक क्षेत्र में बदलाव दूसरों को प्रभावित नहीं करते
- पुन: उपयोगिता: सत्यापन सेवाओं का अन्य जगहों पर पुन: उपयोग किया जा सकता है
- पठनीयता: कोड आत्म-दस्तावेजी बन जाता है
SRP उल्लंघन के संकेत
- क्लास में कई असंबंधित मेथड्स हैं
- क्लास का नाम "Manager", "Helper", "Utility", "Service" जैसे सामान्य शब्दों में है
- एक बदलाव के लिए कई असंबंधित फाइलों को छूने की आवश्यकता होती है
- क्लास को समझाना कठिन है "यह X करता है और Y भी करता है"