Qual é a diferença entre idioma e padrão de design? Parece que essas terminologias se sobrepõem em algum lugar; onde exatamente, eu não sei. Eles são intercambiáveis? Quando devo usar o que?
Aqui está uma lista dos idiomas C ++. Posso chamá-los de padrões de design?
Wikipedia define,
Idiom de programação como um padrão de design de baixo nível
O que isso significa? O que significa "nível baixo" aqui?
Esta pergunta foi inspirada em outra pergunta: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent
Respostas:
Um idioma é uma idéia para contornar as peculiaridades de um idioma. Alguns exemplos que vêm à mente são os idiomas C ++ que você vinculou na pergunta original. Eles resolvem um problema comum nesse idioma de maneira enlatada.
Um padrão de design é semelhante, na medida em que resolve um problema comum. Mas o padrão de design ideal é baseado em recursos comuns da linguagem e, portanto, é independente da linguagem.
Há um continuum entre expressões idiomáticas e padrões de design, assim como ocorre com linguagens de baixo e alto nível.
O padrão Visitor é um bom exemplo; se houvesse apenas um idioma que suportasse apenas um despacho dinâmico único, poderíamos considerar o padrão Visitor um idioma desse idioma. Mas existem hordas inteiras de idiomas que não suportam diretamente o envio múltiplo. Assim, o padrão Visitor nasceu.
O padrão Observer também vem à mente - o C # o suporta diretamente, portanto não precisa da forma comum de solução alternativa do padrão.
Um exemplo indo na outra direção são os recursos de OO (herança, polimorfismo, etc.). C não os suporta diretamente. Se mais idiomas fossem como C, poderíamos desenvolver padrões de design para implementar tabelas v, segurança de tipo etc. Como muitas línguas suportam esse recurso, chamaríamos qualquer solução comum em C de idioma, em vez de chamar o generalizado solução de um padrão de design.
fonte
Os padrões de design geralmente não são específicos do idioma. Os idiomas de idioma tendem a depender de características particulares de um idioma (ou classe de idiomas) ou solucionar uma deficiência específica no (s) idioma (s) mencionado (s).
fonte
Eu não colocaria muita moeda na definição da Wikipedia.
No mínimo, um idioma é específico da linguagem, enquanto um padrão de design se esforça, ou deve se esforçar, para ser independente da linguagem. Indo além, os idiomas geralmente são convenções para melhorar a legibilidade ou são a alternativa superior (por algum mérito técnico) quando há mais de uma maneira de fazer alguma coisa. Todas essas coisas estão relacionadas à maneira como as idéias são expressas (clareza, verbosidade, concisão), mas não às próprias idéias.
Por outro lado, os padrões de design são a essência de uma idéia recorrente, uma idéia que a priori pode ser expressa em qualquer idioma que se presta a ela. O Visitor é uma implementação de despacho duplo com base no despacho único e na sobrecarga e isso pode ser usado em qualquer idioma que possua despacho único e sobrecarga. Saber sobre o padrão não ajuda a escrever um código mais expressivo ou mais legível, mas ajuda a resolver o problema relacionado. Não há nada idiomático nisso, porque, por exemplo, não existe uma forma canônica do Visitor em, por exemplo, C ++.
fonte
virtual
em alguns lugares, enquanto o ponteiro escrito à mão para os truques da tabela de membros parecerá bobo.do_something() or die "...";
(roubado de outro comentário aqui). É baseado em recursos de idioma específicos, mas é uma maneira comum de usar esses recursos. Não é uma linguagem cruzada e provavelmente não será.A definição normal do idioma inglês para o idioma. É uma frase cujo significado aceito não está contido nas palavras usadas. Exemplos seriam "Chovendo gatos e cachorros" ou "Onde está a carne?"
Nas linguagens de programação, geralmente se refere a um atalho sintático que faz algo não imediatamente óbvio no próprio código, mas que é usado com frequência suficiente para que outros programadores reconheçam o significado instantaneamente.
Perl é talvez a linguagem mais rica em expressões idiomáticas. Com construções como:
Cujo significado é óbvio para um programador perl experiente, mas um mistério para qualquer outra pessoa
fonte
do_something() or die "arrrrgh!";
Os idiomas são específicos do idioma. Por exemplo,
while (*dest++=*src++);
é um idioma C / C ++. É completamente impossível escrever algo remotamente semelhante em Pascal ou Java. Use a palavra "idioma" como em inglês. "Como vai?" como uma saudação é um idioma. Alguns idiomas como alemão e frensh têm o mesmo idioma. Mas muitos outros idiomas não "pediam" algo como isso como uma saudação. Um padrão (orientado a objetos), por outro lado, geralmente pode ser adaptado para qualquer idioma que suporte herança e delegação. Um idioma pode ser tão simples quanto uma linha de código. Um padrão de design sempre envolve várias classes.fonte
A idiom might be as simple as one line of code. A design pattern always involves several classes.
Eu encontrei este post pesquisando expressões comuns em C ++, pois tenho me aprofundado bastante recentemente e gostaria que meu código não parecesse tão amador quanto eu sinto ... :-P
Depois de passar um bom tempo com Perl, achei expressões idiomáticas nesse idioma muito parecidas com as encontradas em idiomas naturais, como inglês ou espanhol (apenas duas que conheço bem o suficiente para conhecer algumas expressões idiomáticas).
Eu discordo que um idioma é como um "pequeno padrão de design". Eu ainda discordo, ainda que menos, de que um idioma é uma maneira de solucionar uma deficiência em um idioma.
Talvez a resposta de Luc Danton chegue mais perto, mas deixe-me explicar. Eu acho que um idioma é, bem, idiomático daqueles que usam a linguagem. Geralmente, uma expressão comum ou sequência de expressões que, embora talvez não sejam óbvias, executam uma operação ou expressam intenção de uma maneira que faça sentido para aqueles que são fluentes o suficiente para tê-lo visto antes.
De volta a Perl, talvez o idioma mais conhecido seja a " Schwartzian Transform ", uma expressão que executa uma classificação de dados de maneira compacta e eficiente. Não é a maneira mais óbvia de realizar tal operação, mas é sucinta e quem já a viu antes sabe instantaneamente o que está fazendo.
Outro exemplo notável é " The Orcish Maneuver ", que tira proveito das noções de perl de verdadeiro / falso, operadores ricos e precedência de operadores.
Um que eu pessoalmente gosto bastante está relacionado à Manobra Orc, mas não sei o nome dele:
Na verdade, isso não é ofuscação, mas uma expressão clara e compacta de algo que, de outra forma, levaria várias linhas para fazer. Se a chave estiver presente no hash e tiver um valor verdadeiro, des-referencie-a como uma matriz e pressione $ some_value nessa matriz. Se o elemento hash não estiver presente ou tiver um valor falso, atribua a ele uma matriz vazia, desreferencie essa matriz e faça o push.
Também vale a pena notar que, a partir do Perl 5.14, parte desse idioma é obsoleta - o push agora pode operar diretamente na referência da matriz, sem @ {} necessário! Além disso, a partir do Perl 5.10, pode-se usar // = em vez de || =, que verifica não a verdade, mas a definição.
fonte
some_dict.setdefault(key, []).append(some_value)
.o objetivo de um idioma é ser uma idéia ou conceito que abranja as linguagens de programação, é uma maneira de fazer as coisas e um processo que funciona sem muita reestruturação conceitual quando você o tira de um e o cola em outro, como o tipo de bolha humilde . Os padrões de design são implementações específicas de um idioma, ou extensões da idéia para caber em um idioma; portanto, você tem o padrão de design javascript do idioma do ouvinte de eventos, etc.
fonte
Design patterns are specific implementations of an idiom
? Como exatamente? Você viu os idiomas C ++, no link da minha pergunta?Não tenho 100% de certeza, mas expressões idiomáticas são simplesmente termos pertencentes a um determinado campo. Quando você diz "padrões de design", pensa em "Padrão do observador" "Cadeia de responsabilidade" "Padrão de visitante" "fábrica". Esses são padrões comuns usados para resolver problemas comuns na programação. Procure aqui uma lista abrangente: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns
fonte
Entendo que isso não é uma maneira abstrata e de alto nível de modelar seu aplicativo ou componentes do seu aplicativo, mas um uso inteligente ou comum da semântica da linguagem.
por exemplo, definindo uma variável se for avaliada como false (normalmente usada para definir variáveis nulas condicionalmente):
fonte
Aqui está um exemplo de um idioma (em C #) para manipular um evento. Você não pode disparar um evento se ele não tiver nenhum manipulador anexado; portanto, o idioma é sempre verificar isso primeiro.
Portanto, o idioma geral para manipular eventos se torna:
Esse idioma é específico (embora não exclusivo) para o idioma C #.
De maneira mais geral, no entanto, o mecanismo de eventos do C # é um exemplo do padrão de design do observador que pode ser implementado em qualquer idioma.
fonte