Projetar software orientado a objetos é difícil, e projetar software reutilizável orientado a objetos é ainda mais difícil.
Você deve encontrar objetos pertinentes, classificá-los em classes com a granularidade correta, definir interfaces de classe e hierarquias de herança e estabelecer relações-chave entre eles. Seu projeto deve ser específico para o problema em questão, mas também geral o suficiente para resolver futuros problemas e exigências. Você também quer evitar o redesenho, ou pelo menos minimizá-lo.
Experientes designers orientados a objetos irão dizer-lhe que um design reutilizável e flexível é difícil, senão impossível de obter "certo" na primeira vez. Antes de um projeto terminar, eles geralmente tentam reutilizá-lo várias vezes, modificando-o cada vez.
No entanto, os designers experientes orientados a objetos fazem bons projetos. Enquanto isso, os novos designers estão sobrecarregados com as opções disponíveis e tendem a recorrer a técnicas não orientadas a objetos que já usaram antes.
Os novatos precisam de muito tempo para aprender o que é o bom design orientado a objetos.
Os designers experientes evidentemente sabem que algo inexperiente não. O que é isso?
Uma coisa designers especialistas não sabem fazer é resolver todos os problemas de primeiros princípios. Em vez disso, eles reutilizam soluções que funcionaram para eles no passado.
Quando encontrar uma boa solução, eles irão usá-la novamente e novamente.
Essa experiência é parte do que os torna especialistas. Consequentemente, você encontrará padrões recorrentes de classes e objetos de comunicação em muitos sistemas orientados a objetos.
Esses padrões resolvem problemas de design específicos e tornam os projetos orientados a objetos mais flexíveis, elegantes e, finalmente, reutilizáveis. Eles ajudam os designers a reutilizar projetos bem-sucedidos, baseando novos projetos em experiências anteriores. Um designer familiarizado com esses padrões pode aplicá-los imediatamente a problemas de design sem ter que redescobri-los.
Uma analogia ajudará a ilustrar o ponto. Novelistas e dramaturgos raramente desenham suas tramas a partir do zero. Em vez disso, eles seguem padrões pré estabelecidos como Macbeth, Hamlet etc ou "The Romantic Novel" (incontáveis romances).
Da mesma forma, os designers orientados a objetos seguem padrões como "representam estados com objetos" e "decoram objetos para que você possa facilmente adicionar / remover recursos". Uma vez que você conhece o padrão, muitas decisões de design seguem automaticamente.
Todos nós sabemos o valor da experiência de design. Quantas vezes você já teve o déja-vu do projeto - essa sensação que você resolveu um problema antes mas não saber exatamente onde ou como?
Se você pudesse lembrar os detalhes do problema anterior e como você resolveu, então você poderia reutilizar a experiência em vez de redescobri-la.
No entanto, não fazemos um bom trabalho de gravação de experiência em design de software para outros usarem.
Padrões de design tornam mais fácil reutilizar designs e arquiteturas.
Expressar técnicas comprovadas como padrões de design torna-os mais acessíveis aos desenvolvedores de novos sistemas.
Os padrões de design ajudam você a escolher alternativas de design que tornam um sistema reutilizável e evitam alternativas que comprometem a reutilização. Os padrões de design podem até mesmo melhorar a documentação e a manutenção dos sistemas existentes fornecendo uma especificação explícita das interações de classe e objeto e sua intenção subjacente.
Simplificando, os padrões de design ajudam um designer a obter um design "certo" mais rapidamente.
Alguns patterns que conheço ou que seria interessante colocar nesse artigo:
- Criacional Patterns (É a existência (criação) de todas as coisas!)
- Abstract Factory
- Builder
- Factory Method
- Prototype
- Singleton
Structural Patterns (Patters Estruturais):
- Adapter
- Bridge
- Composite
- Decorator
- Façade
- Flyweight
Behavioral Patterns (Padrões Comportamentais):
- Iterator
- Observer
- Strategy
- Template Method
Em geral resumindo, como em outras linguagens (não cuspindo no prato) o PHP não é muito discutido isso ou não é se dado a devida importância para tal ou ainda não comporta essa tal necessidade onde em linguagens mais complexas você ter Patterns ajuda você ter um melhor sistema e mais organiza e estruturado.