Principles

Last Updated: 3/15/2024

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");
	}
}