Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá a todos,
Tentei pesquisar na internet e aqui no fórum sobre esta dúvida, mas acredito não ter encontrado o termo certo para a busca, pois não encontrei nada que pudesse me ajudar.
Seguinte:
Tenho uma classe para representar uma entidade, que possui muitas propriedades. O resultado disso alguns já devem ter percebido: Vários Getters e Setters.
A classe em questão tem 12 propriedades, logo, fiz 24 métodos de getters e setters. Ficou horrível rs.
Pensei então em jogar as propriedades no método construtor da classe, elimando assim 12 métodos para os Setters, mas doeu a vista ver o construtor entupido.
A outra solução em que pensei, foi dividir a entidade em duas classes, separando as propriedados por assunto. Mas achei que ficou estranho ter que instanciar duas classes na minha model pra poder
persistir os dados. Eu envio a(s) instância(s) via injeção de dependência.
Não sei se me fiz ser compreendido, mas a pergunta é:
Qual seria uma boa saída para isto?
Agradeço qualquer ajuda!
Obrigado.
Primeira pergunta:
-> Essa entidade foi bem modelada ?
-> Essa entidade foi bem modelada ?
Pela simplicidade da entidade acredito que sim, não vejo outra forma de modelar.
@Gabriel Heming,
Acho que vou manter os getters e setters, acho que jogar tudo no construtor vai ficar igual ou pior... O que não entendi na sua resposta foi:
O problema do construtor, entupido de variáveis, é o "tipo de overload" que o PHP permite, que não é lá bem um overload.
Onde posso encontrar algo a respeito?
Obrigado pelas respostas.
No construtor vai o indispensável.
Exemplo: numa classe User é indispensável estabelecer as propriedades "username" e a "password". Não faz sentido um objeto User existir sem esses dados então eles vão ser estabelecidos através do construtor da classe, propriedades que são opcionais podem ficar com métodos sets.
Imagine uma classe "Profile" que tem dados do endereço (rua, numero, bairro, cep, etc.), dados de contato (telefones, emails, sites, etc.) além das informações básicas (nome, idade, gênero, etc.) se formos estabelecer tudo na classe ela ira ficar absurdamente gigante. Podemos neste caso transformar os dados de endereço numa unica propriedade que recebe um objeto endereço, e fazer o mesmo para outras propriedades separando-as por categoria. Com isso economizamos muitos sets e gets na classe.
Veja o link abaixo, esta em inglês mas é realmente muito pertinente a este tópico:
Depende. Se, ao longo do uso do objeto, precisar alterar alguma propriedade, o set é importante. Caso contrário, ele é desnecessário. As validações podem ser feitas no construtor. O problema do construtor, entupido de variáveis, é o "tipo de overload" que o PHP permite, que não é lá bem um overload.
Em outras linguagens, como Java, C#, e por ai vai, o overload pode ser melhor empregado.
Vide resposta um.
O correto é sempre ter as classes dentro do seu contexto, utilizando sempre associações (simples, agregação, composição). Facilita na manutenção, reutilização, alta coesão, baixo acoplamento e ortogonalidade.
Esse assunto é polêmico, cada um vai lhe dar uma opnião diferente. Eu vejo __set e __get, no contexto de objetos/entidades, como preguiça de programador, pois em um "contexto bruto" (não refinado) é o mesmo que possuir variáveis públicas. Existem contextos que, métodos mágicos (nesse caso __set e __get), se aplicam muito bem, mas eu não os vejo bem em representações de entidades.
Se você precisar validar uma variável, lançar uma exception quando um valor não existir, os métodos mágicos mais irão atrapalhar do que ajudar.
Entretanto, métodos sem necessidade, como é bem comum encontrar sets somente usados na criação da instância de uma classe, também são desnecessários, pois foram apenas usados para construir o objeto. Algo que o construtor é responsável.