Принцип единой ответственности для классов Дао
Это пример кода, который не следовал принципу единой ответственности,
public class EmailSender
{
public void SendEmail(string customerID,
string emailNotificationType)
{
//STEP1: load customer details
//STEP2: get email content
//STEP3: send email (using SmtpClient class)
}
public string GetEmailContent(Customer customer,
string emailNotificationType)
{
// Build the email notification content
}
}
Я согласен, это создаст проблему в случае, если мне нужно сделать следующее,
-> Changes in the way, you are loading customer details.
-> Changes to the email content because of requirement enhancements / changes.
-> If there any change in the way you are sending the email instead of using SmtpClient class or something like that.
поэтому мы должны применять принцип единой ответственности для разделения классов. Я полностью согласен с этим принципом. Скажем, мне нужно создать три класса, как
EmailSender - который фокусируется только на отправке электронной почты CustomerRepository - который фокусируется только на получении данных клиента EmailContentBuilder - который анализирует содержимое электронной почты
Но скажем, если у меня есть Dao, подобный CustomerDao, на данный момент все операции CRUD, связанные с CustomerDao, относятся к одному и тому же классу, как показано ниже
Класс CustomerDao
- Добавлять()
- обновить ()
- получить ()
- получить все()
- Обновить()
Нужно ли применять Single Responsibility Principle здесь? Если да, то как подать заявку на класс CustomerDao?
Спасибо,
Гарри
1 ответ
Вы не хотите обращаться в DAO, потому что это только одна вещь.
Шаблоны и принципы - великие вещи, но при неправильном использовании они могут сделать простую проблему такой же сложной, как и их отсутствие.
SRP не следует понимать строго. Один объект должен иметь очень мало обязанностей, а не "один". Здесь CustomerDao отвечает только за постоянство клиента, поэтому он несет только одну ответственность.
Несмотря на свое название, SRP выражается как " У класса должна быть только одна причина для изменения". DAO изменяется по единственной причине: при сопоставлении таблицы базы данных и бизнес-объекта изменяется так, что DAO не нарушает SRP.
Подумайте о примере: бизнес-логика меняется так, что нам нужно добавить еще несколько данных к нашему объекту: мы добавляем поля в наш бизнес-объект, столбцы в таблицу базы данных и, конечно, нам нужно изменить отображение. Тогда мы, вероятно, изменим методы получения / добавления / обновления нашего единственного класса DAO.
Для ясного понимания принципа я бы порекомендовал прочитать первоисточник принципов SOLID: книгу Роберта Матина " Гибкая разработка программного обеспечения, принципы, шаблоны и практики".