Recentemente, conversei com um colega que mencionou que sua empresa estava trabalhando para adicionar o padrão de design MVC como uma extensão PHP.
Ele explicou que eles escreveram o código C para adicionar Controllers, Models and Views
às construções de linguagem para aumentar o desempenho.
Agora eu sei que o MVC é um padrão de design de arquitetura amplamente usado em aplicativos da Web, mas ainda preciso encontrar idiomas que tenham uma construção de idioma para os Controladores, por exemplo.
A integração de padrões de design em uma linguagem IMHO pode enfatizar a importância de um bom design de OO.
Então, por que os padrões de design mais usados (MVC, Factory, Strategy, ... etc.) São adicionados às construções de linguagem?
Se a pergunta parecer muito ampla, você poderá limitar a pergunta apenas ao PHP.
Editar:
Não estou sugerindo que é preciso usar um padrão de design ao desenvolver um projeto. Na verdade, eu promovo a metodologia para mantê-lo simples, desde que funcione.
Respostas:
Os padrões de design são adicionados às construções de linguagem o tempo todo. Já ouviu falar do padrão de design de chamadas sub - rotineiras ? Não? Nem eu. Isso porque as chamadas de sub-rotina, que eram um padrão de design no início dos anos 50, foram adicionadas aos idiomas praticamente instantaneamente. Atualmente, eles estão presentes nos conjuntos de instruções de código de máquina das CPUs.
E o Padrão de Design do Loop For ? O Padrão de Design do Loop While ? O padrão de design do switch ? O padrão de design de objetos ? O padrão de design de classe ? Todos estes foram adicionados a alguns idiomas.
fonte
Wheeler jump
ouModified Wheeler jump
.TI-83 Plus
linguagem básica levou a um padrão de volta semelhante quando eu estava aprendendo a programa em torno de 2001.Alguns deles são. Por exemplo, iteradores são recursos de idiomas em muitos idiomas e em suas bibliotecas padrão (oi, foreach e yield return). O Observer também está frequentemente presente na forma de eventos (não no PHP - você mesmo precisa gerenciar a assinatura de retorno de chamada). O comando é o principal recurso do WPF.
Muitos dos outros não se beneficiariam realmente do suporte ao idioma (e tornariam o idioma mais complicado) - como você simplificaria os Controladores se pudesse projetar um recurso de idioma para eles? Como classes, eles se beneficiam de toda a infraestrutura já presente para dar suporte às classes - você pode instancia-las, distribuí-las e, por exemplo, testá-las como qualquer outro objeto.
O único componente do MVC que a IMO poderia se beneficiar de algum tipo de suporte a idiomas é o View (com algum mecanismo oficial de modelagem) - e no PHP já é suportado - você é capaz de criar e carregar dinamicamente scripts PHP (que geralmente são algum tipo de pré-processamento usado como modelo).
O mesmo se aplica ao método de fábrica - como você simplificaria isso, se pudesse ter qualquer tipo de recurso de idioma que desejasse? Um recurso que falta a algumas linguagens (como C ++) é a capacidade de construir objetos a partir desse nome de tipo, mas a maioria das linguagens de nível superior pode fazer isso (e nem é necessário criar métodos úteis de fábrica). Fora isso, tudo o que você precisa é ser capaz de criar um método que instancia, devolve e objeta.
fonte
Alguns padrões de design são realmente adicionados como construções de linguagem - eles simplesmente não são identificados como tal porque as pessoas começam a considerá-los como "sintaxe" uma vez incorporadas. O tratamento de exceções em Java é um bom exemplo - muitas pessoas codificariam algo semelhante explicitamente como padrão de design, se não fizesse parte da sintaxe principal.
Mas, para focar na pergunta - há muitas razões pelas quais você não deseja adicionar muitos padrões de design a um idioma:
Além disso, se você usar uma linguagem suficientemente poderosa com recursos de metaprogramação (por exemplo, um Lisp), torna-se relativamente simples estender a linguagem você mesmo para implementar qualquer padrão de design. Você não precisa de nenhum padrão no idioma principal se for fácil adicionar o seu próprio com uma macro de 5 linhas.
fonte
A maioria desses padrões pode ser implementada na maioria das linguagens de programação sem suporte linguístico específico. Tomemos, por exemplo, o MVC em Java:
Dadas todas essas opções, há pouco valor em estender diretamente o idioma. E há uma série de "desvantagens":
fonte
Eles são.
As funções eram um padrão de design no código de montagem antes de se tornarem uma construção de linguagem em C.
As funções virtuais eram um padrão de design em C antes de se tornarem uma construção de idioma no C ++.
No entanto, há uma troca. Se o padrão envolver a produção de código padrão (mesmo algumas palavras-chave), isso é uma indicação de que seria um recurso útil da linguagem. Mas se o padrão é simples e claro, por exemplo. C "para (int i = 0; i <10; i ++)", ainda é útil para todos escreverem da mesma maneira, mas não é significativamente maior que "para i = 0 a 10" e tem a vantagem significativa de que é óbvio como alterá-lo para criar um loop um pouco diferente.
fonte
Leia o livro da gangue dos quatro e ficará claro que:
fonte
Como os padrões de design são implementados perfeitamente bem com o código do usuário. O exemplo dele só aconteceu porque é PHP - mas se você realmente precisasse de desempenho, apenas trabalharia em outra linguagem ou obteria o HipHop ou algo assim.
Os recursos de linguagem são complicados, tanto para especificar quanto para implementar, e não é justificável criar um com o único objetivo de "Os idiomas atuais são X". Você quase não salvaria nenhum código de usuário significativo e por nada.
fonte
Eh, pergunta obsoleta, mas eu discordo de muitas respostas, dependendo de onde você define "Design Patterns" no mostrador semântico, incluindo o aceito.
No sentido de livro do GoF Design Patterns, eu diria que depende. O MVC, por exemplo (não é realmente um padrão GoF, mas se encaixa nesse modelo), é totalmente inapropriado para expressar como construções de linguagem para consumo em massa (embora possa fazer sentido para um projeto PHP específico). Como padrão arquitetural, há variações constantes sobre o tema e uma ampla variedade de interpretações perfeitamente legítimas para diferentes circunstâncias (embora muitos se afastem tão longe do MVC, eles provavelmente não deveriam mais chamá-lo de MVC). Por exemplo, na Web, a barreira do http torna um ajuste um tanto estranho, dependendo se você está tentando incluir o lado do cliente (sem dúvida dolorosa) na equação e o que está considerando "a visualização" de uma maneira mais adequadamente estritamente do lado do servidor.
O iterador, por outro lado, é um conceito altamente geral que pode ser aplicado de várias maneiras a uma ampla variedade de construções.
Onde se deve definir se algo pertence a um design de linguagem principal, mesmo em uma linguagem específica da Web do servidor, IMO, é o ponto em que algo ultrapassa a linha, facilitando a execução de um número incalculável de coisas mais facilmente do que fazer uma coisa excessivamente específica, mas amplamente implementada, como um padrão de arquitetura para você.
fonte