DAOs и принципы проектирования SOLID

#oop #dao #solid-principles

#ооп #dao #solid-принципы

Вопрос:

Я читал о принципах проектирования SOLID, в настоящее время рассматриваю «Принцип единой ответственности», но мне было любопытно, как использовать этот принцип. В компании, в которой я работаю, у нас есть DAO, у которых есть методы read , insert amp; update для управления записью в базе данных.

Может ли что-то подобное нарушить «Принцип единой ответственности»? Если да, нужны ли вам классы для каждой вставки, чтения и обновления?

Пример DAO:

 class UserDAO {
    public function read(where: object) {
        // read code
    }

    public function insert(user: User) {
        // insert code
    }

    public function update(user: User) {
        // update code
    }
}
  

Ответ №1:

Принцип единой ответственности гласит, что

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

Допустим, у нас есть UserDao с методами чтения, сохранения, удаления, обновления. Таким образом, этот класс будет изменен только тогда, когда произойдут изменения, связанные с пользователем. Таким образом, у него есть единственная причина для изменения, то есть Пользователь.

Итак, я думаю, что это не нарушает SRP (принцип единой ответственности), если реализовано правильно.

 void save(User user){
//user related logic
}

void save(User user){
// user related logic and address logic encapsulated inside address class
//eg: address.getAddress(user.getId);
}
  

В приведенном выше случае это не нарушает SRP, поскольку метод сохранения будет изменен только при изменении пользовательской логики. Логика адреса обрабатывается классом адреса как таковым.

Например: если метод сохранения выглядит так:

 void save(User user){
Address address = new Address();
 //Address logic
 Payment payment = new Payment();
 //Payment logic
}
  

В приведенном выше коде любые изменения в адресной или платежной логике также изменят этот метод сохранения DAO. Это нарушает SRP.

Итак, это действительно зависит от реализации.

Комментарии:

1. Ах, хорошо, да, это имеет большой смысл. Думаю, я думал об уровне метода, но думать об этом было бы довольно глупо иметь класс для каждого метода