Diferença entre o idioma e o padrão de design?


39

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


Em termos práticos, a distinção pode ser difícil de determinar (e pode haver algum continuum entre um idioma e um padrão de design). Mas provavelmente deriva do termo "idioma" na linguagem natural: en.wikipedia.org/wiki/Idiom (que realmente não se encaixa no uso).
Merlyn Morgan-Graham

2
Provavelmente, isso é mais adequado para os programadores SE.
Oliver Charlesworth

3
@Nawaz: um "padrão de design" é uma construção relativamente "de alto nível" em torno de um defeito de linguagem. Um "idioma" é uma construção relativamente "de baixo nível" em torno de um defeito de idioma; )
Tristan St.,

@ Nawaz- +1 por humor.
Jennifer S

Veja também Idioma x padrão .
MS Dousti

Respostas:


30

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.


2
Outro exemplo interessante: APIs de sintaxe fluente. Eles compensam o fato de você não ter suporte DSL direto no seu idioma e ultrapassa os limites do idioma. Não estou certo de que se formou a um status "Design Pattern" ainda, e ele toca como uma linguagem sintática ...
Merlyn Morgan-Graham

O fato de que C # diretamente suporta o padrão Observer parece indicar que ele faz tem uma enorme necessidade do padrão, tanto assim que ele mudou a implementação longe de desenvolvedores e na própria linguagem.
jaco0646

@ jaco0646 Eu reformulei essa linha, pode ficar mais claro agora #
Merlyn Morgan-Graham

37

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).


+1 para fazer uma distinção com poucas palavras e poucas imprecisões.
Merlyn Morgan-Graham

1
Merlin Morgan-Graham: Você comentou quase todas as respostas, incluindo a pergunta. Então, por que você não publica uma resposta detalhada sem nenhuma imprecisão ? Eu gostaria de saber seus pensamentos.
Nawaz

1
@Nawaz: O comentário foi sobre as outras respostas. Este já é quase perfeito. Idealmente, gostaria de amostras em uma resposta, mas parece que ninguém as está acertando. Eu provavelmente poderia não quer, caso contrário eu iria felizmente oblige :)
Merlyn Morgan-Graham

@Nawaz: Ok, eu dei-lhe um tiro de qualquer maneira :)
Merlyn Morgan-Graham

12

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 ++.


1
+1; Boa resposta. Tho, estou inclinado a acreditar em tudo aqui, exceto na última parte. Existem idiomas que têm suporte direto para despacho múltiplo, portanto o padrão Visitor não precisaria existir lá. Da perspectiva deles, o "padrão" pode ser mais um idioma. A partir da linguagem de alto nível final, todos os padrões podem se tornar expressões ...
Merlyn Morgan-Graham

@ Merlyn O que é idiomático sobre a reimplementação de um recurso de idioma de primeira classe? Quem faz isso?
Luc Danton

Essa é a questão. Usuários de que a linguagem seria considerar o "padrão de design" um idioma, porque sua linguagem é mais frio :)
Merlyn Morgan-Graham

@ Merlyn Isso não se encaixa nos meus usos de 'idioma'. Um idioma de uma língua é algo que você espera que um usuário aleatório e competente da língua reconheça; reimplementar um recurso de primeira classe parecerá estranho e fora de lugar. Não há idioma C ++ para despacho único, apenas é usado virtualem alguns lugares, enquanto o ponteiro escrito à mão para os truques da tabela de membros parecerá bobo.
Luc Danton

1
Gosto de onde você está indo com a definição de idioma diferente de um "padrão de design do homem pobre", que é como o meu modelo o trata (veja minha resposta). É menos "aqui está como implementar isso" e mais "aqui é o caminho certo para implementar isso". Por exemplo, não consigo imaginar "Três Grandes" evoluindo para um padrão de design. E também há o componente sintático, por exemplo 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á.
Merlyn Morgan-Graham

6

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:

while (<IN>) {
    print $_
}

Cujo significado é óbvio para um programador perl experiente, mas um mistério para qualquer outra pessoa


Eu acho que "onde está a carne" é mais um meme do que um idioma. Pode haver outro continuum por aí;) Pode haver mais em um idioma do que simplesmente a implementação na linguagem, pois as coisas podem ser implementações parciais ou com falha desse idioma - os "Três Grandes" do C ++, por exemplo. Nesse caso, o idioma é o nome e a descrição de "Big Three".
Merlyn Morgan-Graham

2
Perl tem as melhores expressões idiomáticas -do_something() or die "arrrrgh!";
cxfx

2

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.


+1. Bom ponto:A idiom might be as simple as one line of code. A design pattern always involves several classes.
Nawaz

2

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:

push @{ $some_hash{$key} ||= [] }, $some_value;

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.


em python: some_dict.setdefault(key, []).append(some_value).
Jonas Kölker

0

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.


O ouvinte de eventos é um recurso de idioma que implementa sinal / slots (padrão?) ou o padrão Observador. Há também coisas em C ++ chamadas expressões idiomáticas que simplesmente não importam ou não se encaixam em outras línguas (tanto quanto eu sei) - por exemplo, a expressão copiar e trocar.
Merlyn Morgan-Graham

Design patterns are specific implementations of an idiom? Como exatamente? Você viu os idiomas C ++, no link da minha pergunta?
Nawaz

0

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


0

O que isso significa? O que significa "nível baixo" aqui?

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):

var ||= some_default_value

0

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:

EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.