O que é um bom modelo de design para minha nova classe?

5

Eu sou um programador iniciante que, depois de tentar gerenciar mais de 2000 linhas de código php procedural, agora descobriu o valor de OOP. Eu li alguns livros para me atualizar sobre a teoria do começo, mas gostaria de alguns conselhos sobre aplicação prática.

Assim, por exemplo, digamos que há dois tipos de objetos de conteúdo: um anúncio e um evento de calendário. O que meu aplicativo faz é verificar sites diferentes (uma lista predefinida) e, quando encontra um anúncio ou um evento, extrai os dados e os salva em um banco de dados. Todos os meus objetos compartilharão um $ title e $ description. No entanto, o objeto Ad terá um preço $ e o objeto Event terá $ startDate. Eu deveria ter duas classes separadas, uma para cada objeto? Devo ter uma 'superclasse' com o $ title e $ description com duas outras classes de anúncios e eventos com suas próprias propriedades? Este último é pelo menos a direção em que estou agora.

Minha segunda pergunta sobre esse design é como lidar com a lógica que extrai os dados para $ title, $ description, $ price e $ date. Para cada site da minha lista predefinida, há uma regex específica que retorna o valor desejado para cada propriedade. Atualmente, tenho uma instrução switch extremamente grande no meu construtor que determina qual site eu possuo, define as variáveis de regex de acordo e continua. Não só isso, mas agora tenho que repetir a lógica para determinar em qual site estou no construtor de cada classe. Isso não parece certo. Devo criar outros Algoritmos de classe e armazenar a lógica lá para cada site? As funções de lidar com essa lógica devem estar nessa classe? ou específico para as classes cujas propriedades eles definem?

Eu quero levar em conta no meu design duas coisas: 1) Eu adicionarei diferentes objetos de conteúdo no futuro que compartilham $ title e $ description, mas terão suas próprias propriedades, então, eu quero ser capaz de facilmente crescer estes conforme necessário. 2) Vou adicionar mais sites constantemente (cada um com seus próprios algoritmos para extração de dados), então gostaria de planejar eficientemente gerenciar e trabalhar com eles agora. Pensei em estender a classe Ad ou Event com a classe 'websiteX' e armazenar suas funções lá. Mas, isso não parece certo, já que agora eu tenho que gerenciar centenas de pequenos arquivos de classe específicos para o site.

Note, eu não sabia se este era o site correto ou o stackoverflow era a melhor escolha. Se sim, me avise e postarei lá.

    
por user66662 02.10.2012 / 02:49
fonte

3 respostas

3

advertência : qualquer sugestão de design é baseada no que eu achei que você escreveu, e uma sacola de suposições infundadas. Codifique algo que funcione e refatize-o até que um modelo 'bom' apareça - você acabará fazendo isso independentemente de onde começar, então escolha algo que faça sentido no papel ou em sua mente, e comece com isso.

Deixando de lado, parece que você tem as seguintes classes:

  • Anúncio
  • Website
  • Evento
  • Scanner

O Scanner varre uma lista de sites da Web, procurando anúncios e eventos. A regex / lógica de extração é específica de um determinado site (eliminando assim sua instrução switch), mas se a extração for sempre uma regex, você poderá extrair isso de uma tabela de banco de dados para instanciar objetos de site conforme necessário (ou apenas extrair a regex de um banco de dados ou na memória).

em outras palavras, codifique o regexes do site se possível, assim você não precisa ter uma subclasse para cada site

não se preocupe com a eficiência até que ela funcione e você está satisfeito com o modelo subjacente, então use um profiler para ver onde a implementação precisa ser ajustada, se for possível

Eu suspeito que um modelo 'bom' também será naturalmente eficiente

boa sorte!

    
por 02.10.2012 / 03:29
fonte
1

Eu também levaria sua última abordagem para Anúncios e Eventos, onde ambas são classes separadas com uma superclasse que tem título e descrição. Em seguida, adicione subclasses adicionais conforme necessário.

Se eu entendi o resto do seu post, parece que você tem vários regexes para cada site que extraem as informações necessárias. Nesse caso, por mais doloroso que fosse, criaria uma classe individual para cada website responsável pela análise de cada site. Posso ver facilmente que você precisa modificar seu regex quando um site é alterado ou descobrir que um regex é inadequado e você precisa de uma lógica personalizada adicional para extrair as informações necessárias. Sempre que você tiver que fazer alterações em qualquer lógica de análise, saberá exatamente para qual arquivo ir, uma vez que se relaciona diretamente com esse site. No entanto, eu definiria uma interface que esses sites implementem que contenha propriedades / métodos comuns que você precisará, de modo que a parte do programa que usa esses sites possa lidar com um tipo "Website" genérico para obter os Anúncios e Eventos (e os objetos futuros) em vez de precisar conhecer cada tipo específico de site em seu aplicativo.

Quanto a criar o tipo específico de site que você precisa, é aqui que entra o padrão de fábrica. Insira um URL, receba um tipo "Website" genérico. Internamente, sua fábrica faz o trabalho de mapear uma URL para um tipo específico. Parece que isso é o que você está fazendo no seu construtor gigante, então eu mudaria isso e voltaria a colocá-lo em uma classe de fábrica.

Eu entendo que pode ser horrível manter centenas de arquivos de turma para sites individuais, mas se todos esses sites forem únicos, não sei o que dizer. De um jeito ou de outro, você terá que ter um código único para cada um. A menos que um monte de anúncios ou eventos compartilhem algo em comum, como se houvesse vários anúncios da DoubleClick e todos eles tivessem o mesmo código de análise, você pode reduzir o número de classes tirando vantagem disso.

    
por 02.10.2012 / 05:57
fonte
0

Resposta rápida: Use sua abordagem se isso fizer com que seu software funcione. No entanto, procure repetir blocos de código , pois você poderá movê-los para a classe comum (ou camada de negócios) mais tarde. Assim, você garantirá que esteja constantemente refatorando e refinando seu código.

Nesta situação, eu tento manter os princípios de KISS e YAGNI - significa "Mantenha-o simples e estúpido" e "Você não vai precisar".

KISS - refere-se a manter seu código com construções simples e fáceis de entender, mais simples seu código, mais fácil de manter é a longo prazo. YAGNI - refere-se ao princípio de manter seu código fora de engenharia com um pedaço desnecessário de códigos, que você acha que será usado em desenvolvimento futuro.

    
por 02.10.2012 / 03:47
fonte