Stack Overflow em Português Asked by Valdinei on September 27, 2021
As classes Helper/Utility com métodos genéricos, que são usados para vários fins, ferem o Princípio da Responsabilidade Única (SRP)?
Segue exemplo de alguns métodos da classe:
function get_qtd_dia_mes(pDT_BASE date) return number;
function get_numero_aleatorio return number;
function get_nr_matricula_fake(pNR_MATRICULA_ORIGINAL number) return number;
Se bem feito não, pelo contrário, é uma forma de separar uma responsabilidade que não deveria estar em uma classe normal e mais ainda, se usado da forma correta, pode se tornar mais DRY que pra mim é o princípio mais importante a seguir.
Algumas pessoas são contra porque fere isso ou aquilo, mas o que não ferir algo ajuda de fato no software? Tem algoritmos que você deve aplicar em objetos diversos ou um específico mas não deve fazer parte da classe justamente por ser utilitário, e para aquilo que você está fazendo não importa o estado. A pergunta deixa claro que é algo usado para vários fins, como colocar isso em um só objeto? Está errado.
Inclusive classes utilitárias podem ajudar na modularização deixando separado o que deve ser separado mesmo.
A questão toda é saber o que colocar lá e o que não colocar. Isso depende de experiência.
Os métodos postados depois em edição não ajudam entender, porque o que define se tem responsabilidade única é o requisito e isso não está na pergunta. Definir o certo em programação sempre está vinculado ao domínio, não existe uma forma universal de fazer, se existisse não precisaria mais ter programadores, or precisaria de bem poucos porque todos problemas estariam resolvidos.
A resposta é sobre ferir o SRP, se é inadequado para o caso específico não tem como responder sem conhecer o problema profundamente.
Correct answer by Maniero on September 27, 2021
Em orientação a objetos, que estou supondo ser o caso, a implementação de um método pode depender de dados (campos) de um determinado objeto. Pode depender também de outros objetos, o que aí envolve colaborações, mas aí fica um pouco mais complicado. Vamos ver os casos mais simples.
Por exemplo, um método getNomeCompleto()
pode depender dos campos primeiroNome
e sobrenome
de um objeto Pessoa
(sua implementação pode ser, por exemplo return primeiroNome + " " + sobrenome;
). É só um exemplo, não necessariamente bom mas ilustrativo, de implementação de método que depende de campos de um objeto. E os campos primeiroNome
e sobrenome
pertencem a quem? A uma Pessoa
.
Dessa forma, convém que o método seja colocado na classe que possui os dados dos quais ele precisa para funcionar.
Se isso não for possível, aí pode-se colocar em uma classe utilitária, mas em vez de criar uma classe utilitária que "agrega" métodos utilitários diversos e desconexos entre si, pode-se criar classe utilitárias centradas nos tipos de dados que aquela classe representa.
Vamos ver cada um dos exemplos citados.
function get_qtd_dia_mes(pDT_BASE date) return number;
Depende de uma data. Idealmente deveria pertencer a um tipo Mês
. Pelo exemplo deveria pertencer ao tipo DT_BASE
(ou seja, meuDtBase.getQtdDiasNoMes()
), se não for possível então deveria pertencer a uma classe DateUtil
/DateHelper
(por exemplo).
function get_numero_aleatorio return number;
Depende de um RNG (gerador de números aleatórios). Deveria pertencer a um tipo Random
(ou seja, Random.getNextNumber()
), se não for possível então deveria pertencer a uma classe RandomUtil
/RandomHelper
.
function get_nr_matricula_fake(pNR_MATRICULA_ORIGINAL number) return number;
Depende de NR_MATRICULA_ORIGINAL
que pode ser um tipo específico ou pertencer a um tipo "matriculável" (Estudante
por exemplo). Se não for possível pertencer a um desses tipos então deveria pertence ao Util
/Helper
correspondente.
O princípio da Responsabilidade Única tem a ver com coesão, e é nesse espírito que deixo as sugestões acima.
Answered by Piovezan on September 27, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP