Single Responsibility Principle
- Each software module should have one and only one reason to change.
- A class should have only one responsibility and therefore it should have only one reason to change its code. If a class has more than one responsibility, then there will be more than one reason to change the class.
Problem
public class Order
{
public void CreateOrder(Order order)
{
Console.WriteLine("CreateOrder start");
//Save Order
context.Orders.Add(order);
context.SaveChanges();
//Send Email
SmtpClient smtpClient = new SmtpClient("mail.MyWebsiteDomainName.com", 25);
smtpClient.Credentials = new System.Net.NetworkCredential("info@MyWebsiteDomainName.com", "myIDPassword");
MailMessage mail = new MailMessage();
mail.From = new MailAddress("info@MyWebsiteDomainName", "MyWeb Site");
mail.To.Add(new MailAddress(order.Customer));
mail.Subject = "New Order";
mail.Body = "Thank you for your order";
smtpClient.Send(mail);
Console.WriteLine("CreateOrder end");
}
}
- Order class has the implementation detail of
- how to send email.
- how to log.
- If logging or send email changes, the order class should be updated.
Solution
Logger
class is responsible for logging activity
OrderRepository
is responsible for saving order
EmailManager
is responsible for sending email
public class Order
{
public void CreateOrder(Order order)
{
logger.Write("CreateOrder start");
//Save Order
orderRepo.CreateOrder(order);
//Send Email
emailManager.Send(order.Customer, "New Order", "Thank you for your order")
logger.Write("CreateOrder end");
}
}