Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Active Record

Na aula seis foi comentado sobre a responsabilidade única. Nele foi comentado sobre o Active Record e eu uso em meus projetos com a seguinte estrutura. 1) Eu tenho uma classe de conexão com o banco 2) eu tenho uma trait com o CRUD 3) Eu tenho uma classe abstrata que eu chamo de Model que assina o contrato com a Trait.

*No construtor eu preciso passar três paramêtros (a entidade, um array com os campos obrigatórios da minha entidade, e o paramêtro opcional primaryKey que vai setado por id ( porque uso como padrão)

No model eu tenho um query builder (alguns métodos que me permitem construir/ consumir as queryes.

E tenho um método chamado save. O Metodo save, chama um método required ( que verifica se os campos do array passado no construtor) estão preenchidos, caso não lança uma exception, caso contrário ele valida se existe a primaryKey e atualiza caso contrário ele faz um insert no banco. como mostra o código abaixo

public function save(): bool
    {
        $primary = $this->primary;
        $id = null;

        try {
            if (!$this->required()) {
                throw new Exception("Preencha os campos necessários");
            }

            /** Update */
            if (!empty($this->data->$primary)) {
                $id = $this->data->$primary;
                $this->update($this->safe(), $this->primary . " = :id", "id={$id}");
            }

            /** Create */
            if (empty($this->data->$primary)) {
                $id = $this->create($this->safe());
            }

            if (!$id) {
                return false;
            }

            $this->data = $this->findById($id)->data();
            return true;
        } catch (Exception $exception) {
            $this->fail = $exception;
            return false;
        }
    }

Você acredita que mesmo assim as classes que vão herdar o model terão mais de uma responsabilidade? se sim, tem alguma dica de como desacoplar mais esse código.

3 respostas

Fala, Vinicius.

No seu caso, acho que existe um problema maior do que só multiplas responsabilidades.

Você está utilizando classes de modelo como meras sacolas de dados, ou apenas DTOs para o banco.

Classes de modelo devem ser classes com suas regras de negócio e devem ser independentes de banco de dados.

Vou te dar um exemplo de um sistema que eu alterei ontem: Tenho uma classe Code e uma classe Sale. Toda venda (Sale) precisa ter um Code gerado para ela.

Minha classe Sale é uma classe de modelo do domínio. Ela não pode saber se as vendas são armazenadas em banco, arquivo ou qualquer outro lugar. A última feature que eu implementei foi tratar uma conta de e-mails como repositório de vendas, ou seja, precisava ler e-mails de uma conta, e a a partir desses e-mails, identificar as vendas.

Se minha classe fosse acoplada ao banco de dados, isso seria impossível.

Minha recomendação: Estude sobre DDD. Transforme suas classes que você chama de Model em entidades, e crie repositórios para elas. Os repositórios devem ser responsáveis por tratar da persistência. ;-)

No curso de PDO que está pra sair, trato um pouquinho sobre esses 2 padrões (entidades e repositórios). No curso de Doctrine eles já são aplicados.

solução

Fala, Xará. Você conseguiu entender a explicação?

Opa Vinicius entendi sim e faz bem mais sentido realmente. Eu estava vendo o curso de DDD e o curso de clean code e fez ainda mais sentido sua explicação. Estou desenvolvimento uma aplicação para estudo, e estou tentando aplicar os conceitos ndesses dois últimos cursos. E confesso que até fica.mais fácil programar, fica mais claro o que cada camada ten que fazer. Vlw pela ajuda