Ao seguir o SOLID, a leitura e gravação de arquivos são duas responsabilidades separadas?

13

Estou apenas começando a explorar o SOLID e não tenho certeza se a leitura de arquivos e a gravação em arquivos são da mesma responsabilidade.

O destino é o mesmo tipo de arquivo; Quero ler e escrever .pdf no meu aplicativo.

O aplicativo está em Python, se isso faz alguma diferença.

Kites
fonte

Respostas:

24

A implementação de leitura e escrita provavelmente tem uma alta probabilidade de ser altamente coesa. Se um mudaria, o outro mudaria. Coesão alta é uma forte indicação de uma responsabilidade única e o princípio de responsabilidade única nos diz que eles devem ser reunidos na mesma classe. Se essas operações tiverem baixa coesão, é provável que sua divisão melhore a capacidade de manutenção.

Se, no entanto, houver consumidores que apenas leem dados sem gravar, ou apenas escrevem sem ler, é uma indicação de que, de uma perspectiva da interface, você deve separar essas operações, conforme prescrito pelo Princípio de Segregação da Interface. Isso significa que os consumidores devem definir duas interfaces nas quais podem confiar, enquanto a Fileclasse implementará as duas interfaces.

Steven
fonte
8

Ao aplicar o princípio SOLID ao design de um objeto, você pode considerar a leitura e gravação de arquivos como UMA responsabilidade - trabalhe com dados persistentes

No entanto, você não deve colocar a leitura e gravação de arquivos no mesmo método ou função.

SergeyLebedev
fonte
5

A maioria das outras respostas parece ter esquecido que em sua pergunta falta uma informação crucial - você não nos disse se e como os documentos que você vai ler e escrever estão relacionados!

Seu aplicativo está com algo como um "objeto de documento" e o grava primeiro em um arquivo PDF e depois lê novamente o mesmo arquivo em um objeto de documento semelhante? Ou vice-versa, lê PDFs em um documento, faz algumas modificações e salva o mesmo documento em um novo PDF novamente? Então a leitura e a escrita devem ser vistas como uma responsabilidade. Pode ser o caso se o seu aplicativo for ou contiver algo como um componente "editor de PDF" ou um "kit de ferramentas de manipulação de PDF".

No entanto, se uma parte do seu aplicativo cria alguns arquivos PDF, por exemplo, em um componente de relatório, e outra parte não relacionada do seu aplicativo lê PDFs diferentes (por exemplo, um avaliador de anexo de email para um mecanismo de pesquisa) e a representação interna de Como esses últimos PDFs não têm nada em comum com o primeiro caso de uso, essas tarefas são responsabilidades diferentes.

Especialmente para PDF, esse segundo caso de uso é o caso que tenho visto com mais frequência em diferentes tipos de aplicativos. Existem muito mais bibliotecas / componentes por aí que apenas suportam a criação de PDF e apenas um número muito menor que também suporta a leitura de PDF. Se você usar uma biblioteca para gerar os arquivos PDF e uma biblioteca completamente diferente para ler os PDFs, deve ficar evidente que a leitura e gravação do PDF serão responsabilidades separadas.

Doc Brown
fonte
Isso é semelhante à resposta de Steven, mas fornece um exemplo concreto.
Davids
@ David: A resposta de Steven é apenas muito abstrata, mas como o OP pediu especificamente arquivos PDF, acho que faz sentido responder a isso de uma maneira mais concreta. E para PDF, eu discordo da primeira frase de Steven "a implementação de leitura e gravação tem uma alta probabilidade de ser altamente coesa" - na minha experiência, para casos de uso típicos de PDF, o oposto é verdadeiro (eu também dei um voto positivo).
Doc Brown
Exemplos concretos são excelentes. Eu estava apenas comparando para análise. Ótima resposta!
19716 DavidS
3

De acordo com ( Robert C. Martin ), uma responsabilidade é um conjunto de funções que serve a um ator em particular.

Um ator deve ser a única fonte de mudança de uma determinada responsabilidade (deve haver apenas um motivo para mudar).

No seu caso, você deve primeiro definir os atores como um primeiro passo e depois fazer as perguntas:. Existem atores interessados ​​apenas na leitura de arquivos e outros na escrita?

Se for o caso, a leitura e gravação de arquivos são duas responsabilidades separadas. Porque haverá várias fontes de mudanças (muitos atores podem pedir para alterar a lógica de leitura e a mesma coisa para escrever).

youness
fonte