Pergunta

Eu tenho lido em vários frameworks PHP, especialmente o Zend Framework, mas eu estou ficando confuso sobre a maneira correta de ir para a frente.

Zend Framework não usa ActiveRecords mas em vez disso usa o padrão Tabela gateway de dados e Row Data Gateway, e usa um DataMapper para mapear o conteúdo do Row Data Gateway com o modelo, porque breaks ActiveRecord para baixo quando seus modelos não têm um mapeamento 1: 1 a suas tabelas de banco de dados. Há um exemplo disso na Zend Quickstart guia.

Para mim, o seu exemplo parece muito inchado com uma tonelada de getters e setters em todo o lugar. Me deparei com vários posts sobre Domain Driven Design argumentando que o uso de tantos getters e setters é uma prática ruim porque expõe todos os dados do modelo interno para o exterior, por isso não tem vantagem sobre os atributos públicos. Aqui está um exemplo .

A minha pergunta: Se você remover os getters e setters, como é que você tornar a sua opinião? Em algum momento, os dados tem que bater o ponto de vista que você possa realmente mostrar algo para o usuário. Seguindo o conselho DDD parece quebrar a separação entre H e V no MVC. Seguindo o exemplo MVC e Zend parece quebrar DDD e folhas me digitando-se um lote inteiro de getters, setters e DataMappers para todos os meus modelos. Além de ser um monte de trabalho também parece violar DRY.

Eu realmente aprecio alguns (links para) bons exemplos ou obter mais informações sobre como tudo se encaixa. Eu estou tentando melhorar minhas achitecture e habilidades de design aqui.

Foi útil?

Solução

Usando objetos de valor, você pode eliminar alguns desses métodos setter públicos. Aqui está uma descrição do a diferença entre Entidade e Valor objetos . Valor Objetos são imutáveis ??e muitas vezes ligada a uma entidade. Se você passar todos os valores com o construtor, você não precisará definir essas propriedades a partir do código externo.

acréscimo algo, não diretamente relacionado com uma resposta, mas mais focado em DDD:

(Disclaimer:. A única coisa que eu sei sobre o Zend Framework é o que eu li no artigo ligado) O Zend Framework está usando DataMappers em vez de repositórios. Isso é realmente DDD-ish? Bem, a interpretação do Fowler de um Repository pode dizer não. No entanto, Eric Evans afirma que um repositório de DDD pode ser muito simples. Na sua forma mais simples, um repositório de é a (livro See DDD) DataMapper. Para algo mais complexo e ainda DDD, consulte o artigo Fowler. DDD tem um repositório conceitual que pode diferir da definição padrão.

Exorto-vos a continuar a ler sobre Domain-Driven Design. Eu acho que há uma falha no pressuposto de que getters e setters violar DDD. DDD é sobre incidindo sobre o modelo de domínio e as melhores práticas para conseguir isso. Acessores são apenas um detalhe menor.

Outras dicas

Você não precisa implementar todas as getters / setters, você pode use__get () e __set (). Qual é o problema então?

De minha leitura do post, a questão é mais filosófica do que práticas.

Eu não tenho o tempo para escrever em profundidade, mas aqui é meus dois centavos. Embora concorde que pretende limitar o número de obter e definir solicitações porque uma classe deve esconder seus internos, você também precisa levar em conta o Java e PHP são ferramentas diferentes e têm finalidades diferentes. No ambiente web suas aulas estão sendo construídos e levados para baixo com cada pedido e, portanto, o código que você escreve não deve depender de aulas enormes. No artigo que você apontou o autor sugere colocar a lógica de exibição na classe. Isto provavelmente não faz sentido na web desde que eu provavelmente vai querer apresentar o ponto de vista em vários formatos (rss, html, etc ...). Usando métodos de acesso (GET e SET), portanto, é um mal necessário. Você ainda quer usá-los cuidadosamente para que você não atirar no próprio pé. A chave é tentar ter suas aulas de fazer o trabalho para você em vez de tentar forçá-los a fazer o trabalho externamente. Ao acessar suas propriedades com um método em vez de diretamente você esconde os internos que é o que você quer.

Mais uma vez, este post poderia usar alguns exemplos, mas eu não tenho tempo agora.

Pode alguém fornecer alguns exemplos de por que métodos de acesso não são maus?

Existem duas abordagens aqui: O que eu chamo de "dizer não pergunte abordagem", ea outra é a abordagem ViewModel / DTO. Essencial, as questões gira em torno o que é o "modelo" na sua opinião. Diga não pergunte exige que a única maneira de um objeto pode ser exteriorizada, é do próprio objeto. Em outras palavras, para tornar um objeto, você teria um método render, mas que método render precisaria falar com uma interface. Algo parecido com isto:

class DomainObject {
   ....
   public function render(DomainObjectRenderer $renderer) {
        return $renderer->renderDomainObject(array $thegorydetails);
   }
}

No contexto da Zend Framework, você pode subclasse Zend_View e ter sua subclasse implementar essa interface.

Eu tenho feito isso antes, mas é um pouco pesado.

A segunda opção é converter seu modelo de domínio para um objeto ViewModel, que é como um simplificada, achatada, "cordas out" vista de seus dados, personalizado para cada visão específica (com um ViewModel per view), e em o caminho de volta, converter os dados POST para um EditModel.

Este é um padrão muito popular no mundo ASP.NET MVC, mas também a sua similar à classe "DTO" padrão usado para transferir dados entre "camadas" em um aplicativo. Você precisaria criar mapeadores para fazer o trabalho sujo para você (não ao contrário de um DataMapper, na verdade). No PHP 5.3, você pode usar o reflexo para alterar as propriedades privadas, assim que seu DomainObject nem precisa se expor tanto!

getters e setters de execução tem duas vantagens, nos meus olhos:

  1. Você pode escolher quais propriedades para tornar público, para que você não têm necessariamente de expor todas as partes internas do modelo
  2. Se você usar um IDE com autocomplete, todas as propriedades disponíveis será um TAB afastado quando você começar a digitar "get" ou "set" -isto é motivo suficiente para mim.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top