Принципы в C# - часть 2. Принцип единой ответственности

  • Михаил
  • 12 мин. на прочтение
  • 103
  • 19 Dec 2018
  • 19 Dec 2018

Принцип единой ответственности (или сокращенно SRP) гласит, что:

У класса должна быть одна и только одна причина для изменения, а это означает, что у класса должна быть только одна работа.

Это не означает, что класс должен содержать только один метод или одно свойство, но его члены должны относиться к его ответственности.

В этом примере мы собираемся создать UserService, в его обязанности входит управление данными пользователя в системе.
 

public class UserService
{
  public void CreateUser(string email, string password)
  {
    if(string.isNullOrEmpty(email)
     throw new NullArgumentException("E-mail cannot be null or empty.");

    if(string.IsNullOrEmpty(password)
     throw new NullArgumentException("Password cannot be null or empty.");

    User user = new User(email, password);

    var smtpClient = new SmtpClient("smtp.gmail.com")
    {
        Port = 587,
        Credentials = new NetworkCredential("email", "password"),
        EnableSsl = true,
    };

    smtpClient.Send("our.app@gmail.com", email, "Welcome!", "Welcome to our system!");
  }
}

 

Приведенный выше пример нарушает принцип SRP, потому что CreateUserметод отвечает за две вещи: создание пользователя и отправку электронного письма.

Давайте изменим его, чтобы он соблюдал принцип SRP.
 

public class UserService
{
  private readonly IEmailService _emailService;

  public UserService(IEmailService emailService)
  {
    _emailService = emailService;
  }

  public void CreateUser(string email, string password)
  {
    if(string.isNullOrEmpty(email)
     throw new NullArgumentException("E-mail cannot be null or empty.");

    if(string.IsNullOrEmpty(password)
     throw new NullArgumentException("Password cannot be null or empty.");

    User user = new User(email, password);

    _emailService.SendEmail(email, "Welcome!", "welcome to our system!");
  }
}

 

Теперь UserServiceон отвечает только за создание пользователя и делегирует электронную почту другому классу.