Différence entre idiome et modèle de conception?


39

Quelle est la différence entre idiome et design-pattern? Il semble que ces terminologies se chevauchent quelque part; où exactement, je ne sais pas. Sont-ils interchangeables? Quand devrais-je utiliser quoi?

Voici une liste des idiomes C ++. Puis-je les appeler des modèles de conception?

Wikipedia définit,

Idiome de programmation en tant que modèle de conception de bas niveau

Qu'est-ce que ça veut dire? Que veut dire "bas niveau" ici?

Cette question est inspirée d'une autre question: https://stackoverflow.com/questions/7343531/are-the-some-design-paterns-language-dependent


En pratique, la distinction peut être difficile à déterminer (et il peut exister un certain continuum entre un idiome et un modèle de conception). Mais il dérive probablement du terme "idiome" en langage naturel: en.wikipedia.org/wiki/Idiom (qui ne correspond pas vraiment à l'usage).
Merlyn Morgan-Graham le

2
Ceci est probablement mieux adapté aux programmeurs SE.
Oliver Charlesworth

3
@Nawaz: un "modèle de conception" est une construction relativement "de haut niveau" autour d'un défaut de langage. Un "idiome" est une construction relativement "de bas niveau" autour d'un défaut de langage; )
Tristan St.

@ Nawaz- +1 pour l'humour.
Jennifer S

Réponses:


30

Un idiome est une idée pour contourner les bizarreries d’une langue. Certains exemples qui me viennent à l’esprit sont les idiomes C ++ que vous avez liés dans la question initiale. Ils résolvent un problème commun dans cette langue de manière conservée.

Un modèle de conception est similaire, en ce sens qu'il résout un problème commun. Mais le modèle de conception idéal est basé sur des fonctionnalités de langage communes et est donc indépendant du langage.

Il existe cependant un continuum entre les idiomes et les modèles de conception, de la même manière qu’il existe des langages de bas niveau à des langages de haut niveau.

Le modèle de visiteur est un bon exemple; s'il n'y avait qu'une seule langue qui ne supportait qu'une seule distribution dynamique, nous pourrions considérer le motif Visitor comme un idiome de cette langue. Mais il existe des hordes de langues qui ne prennent pas directement en charge l'envoi multiple. Par conséquent, le modèle de visiteur était né.

Le motif Observer vient aussi à l'esprit - C # le supporte directement, il n'a donc pas besoin de la forme de contournement habituelle du motif.

Les fonctionnalités OO (héritage, polymorphisme, etc.) constituent un exemple. C ne les soutient pas directement. Si plus de langues ressemblaient à C, nous pourrions alors développer des modèles de conception pour implémenter v-tables, sécurité de type, etc. solution un modèle de conception.


2
Autre exemple intéressant: les API de syntaxe Fluent. Ils compensent le fait que vous ne bénéficiez pas d'une prise en charge directe de DSL dans votre langue et qu'elle dépasse les frontières linguistiques. Je ne suis pas sûr qu'il soit passé au statut de "modèle de conception" et cela sonne comme un idiome syntaxique ...
Merlyn Morgan-Graham Le

Le fait que C # prend directement en charge le modèle d'observateur semble indiquer qu'il n'ont un besoin énorme pour le modèle, si bien qu'il a déplacé la mise en œuvre loin des développeurs et dans la langue elle - même.
jaco0646

@ jaco0646 J'ai reformulé cette ligne, peut-être plus clairement maintenant
Merlyn Morgan-Graham

37

Les modèles de conception ne sont généralement pas spécifiques à la langue. Les idiomes linguistiques ont tendance à dépendre de caractéristiques particulières d'une langue (ou d'une classe de langues) ou à résoudre un problème spécifique de cette langue.


+1 pour faire une distinction avec peu de mots et peu d'inexactitudes.
Merlyn Morgan-Graham le

1
@ Merlyn Morgan-Graham: Vous avez commenté presque toutes les réponses, y compris la question. Alors, pourquoi ne postez-vous pas une réponse détaillée sans inexactitude ? J'aimerais connaître votre opinion.
Nawaz

1
@Nawaz: Le commentaire concernait les autres réponses. Celui-ci est déjà presque parfait. Idéalement, j'aimerais avoir des échantillons dans une réponse, mais il semble que personne ne les a bien compris. Je ne pourrais probablement pas non plus, sinon je serais heureux de vous obliger :)
Merlyn Morgan-Graham Le

@Nawaz: D'accord, j'ai quand même tenté le coup :)
Merlyn Morgan-Graham Le

12

Je ne mettrais pas trop de monnaie dans la définition de Wikipedia.

À tout le moins, un idiome est spécifique à une langue, tandis qu'un modèle de conception s'efforce ou devrait s'efforcer d'être agnostique. Pour aller plus loin, les idiomes sont généralement des conventions destinées à améliorer la lisibilité, ou constituent l'alternative supérieure (sur un certain mérite technique) lorsqu'il existe plus d'une façon de faire quelque chose. Toutes ces choses sont liées à la façon dont les idées sont exprimées (clarté, verbosité, concision), mais pas aux idées elles-mêmes.

D'autre part, les modèles de conception sont l'essence même d'une idée récurrente, une idée qui peut a priori être exprimée dans n'importe quelle langue qui s'y prête. Le visiteur est une implémentation de la double dépêche reposant sur la dépêche unique et la surcharge, qui peut être utilisée dans toutes les langues utilisant la dépêche unique et la surcharge. Connaître le modèle n'aide pas à écrire du code plus expressif ou plus lisible, cela aide à résoudre le problème associé. Il n'y a rien d'idiome à ce sujet car, par exemple, il n'y a pas de forme canonique du visiteur, par exemple en C ++.


1
+1; Bonne réponse. Tho je suis enclin à croire tout ici sauf le dernier bit. Certaines langues prennent directement en charge l'envoi multiple, de sorte que le modèle Visiteur n'existerait pas. De leur point de vue, le "modèle" pourrait être davantage un idiome. Du langage de haut niveau ultime, tous les schémas pourraient devenir des idiomes ...
Merlyn Morgan-Graham Le

@ Merlyn Pourquoi la réimplémentation d'une fonctionnalité de langage de premier ordre est-elle idiomatique? Qui fait ça?
Luc Danton le

C'est le but. Les utilisateurs de cette langue considèrent le "modèle de conception" comme un idiome, car leur langue est plus froide :)
Merlyn Morgan-Graham Le

@ Merlyn Cela ne correspond pas à mes utilisations de 'idiome'. Un idiome d’une langue est quelque chose que vous attendez d’un utilisateur aléatoire et compétent de la langue à reconnaître; réimplémenter une fonctionnalité de première classe aura l'air extra-terrestre et déplacé. Il n'y a pas d'idiome C ++ pour l'envoi unique, on l'utilise simplement virtualà certains endroits, alors que le pointeur écrit à la main sur la supercherie des tables des membres aura l'air tout simplement ridicule.
Luc Danton le

1
J'aime où vous allez avec la définition d'idiome différente du "modèle de conception d'un pauvre", qui est en quelque sorte la façon dont mon modèle le traite (voir ma réponse). C’est moins "voici comment l’appliquer" et plus "voici la bonne façon de l’appliquer". Par exemple, je ne peux pas imaginer que le "Big Three" évolue vers un modèle de conception. Et il y a aussi le composant syntaxique, par exemple do_something() or die "...";(volé d'un autre commentaire ici). Il est basé sur des fonctionnalités linguistiques spécifiques, mais constitue un moyen courant d’utiliser ces fonctionnalités. Ce n'est pas multilingue et ne le sera probablement pas.
Merlyn Morgan-Graham le

6

La définition anglaise normale de Idiom. Est une phrase dont la signification acceptée ne figure pas dans les mots utilisés. Les exemples seraient "Raining Chiens et Chats" ou "Où est le Boeuf?"

Dans les langages de programmation, il est généralement fait référence à un raccourci syntaxique faisant quelque chose qui n’est pas immédiatement évident à partir du code lui-même mais qui est utilisé assez souvent pour que les autres programmeurs reconnaissent instantanément le sens.

Perl est peut-être la langue la plus riche en idiomes. Avec des constructions comme:

while (<IN>) {
    print $_
}

Dont le sens est évident pour un programmeur Perl expérimenté mais mystère pour quiconque


Je pense que "où est le boeuf" est plus un meme qu'un idiome. Il pourrait y avoir un autre continuum ici;) Il pourrait y avoir plus dans un idiome que la simple implémentation dans le langage, puisque les implémentations pourraient être partielles ou échouées de cet idiome - le "Big Three" de Cidi, par exemple. Dans ce cas, l'idiome est le nom et la description de "Big Three".
Merlyn Morgan-Graham le

2
Perl a les meilleurs idiomes -do_something() or die "arrrrgh!";
cxfx le

2

Les idiomes sont spécifiques à la langue. Eg while (*dest++=*src++);est un idiome C / C ++. Il est totalement impossible d'écrire quelque chose de très similaire en Pascal ou en Java. Utilisez le mot "idiome" comme vous l'utilisez en anglais. "Comment allez-vous?" comme une salutation est un idiome. Certaines langues comme l'allemand et le français ont le même idiome. Mais beaucoup d'autres langues ne «demanderaient» pas quelque chose comme ça comme une salutation. En revanche, un modèle (orienté objet) peut généralement être adapté à n’importe quel langage prenant en charge l’héritage et la délégation. Un idiome peut être aussi simple qu'une ligne de code. Un modèle de conception implique toujours plusieurs classes.


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

2

J'ai trouvé cet article à la recherche d'idiomes communs au C ++, car je m'y suis intéressé assez récemment et j'aimerais que mon code ne paraisse pas aussi amateur que je le pense ... :-P

Après avoir passé pas mal de temps avec Perl, j’ai trouvé que les idiomes de cette langue ressemblaient beaucoup à ceux que l’on trouve dans les langues naturelles, comme l’anglais ou l’espagnol (seulement deux que je connais assez bien pour connaître certains idiomes).

Je ne suis pas d'accord pour dire qu'un idiome est comme un "petit motif de conception". Je ne suis toujours pas d'accord, bien que ce soit moins vrai, qu'un idiome est un moyen de contourner une déficience d'une langue.

Peut-être que la réponse de Luc Danton est la plus proche, mais laissez-moi vous expliquer. Je pense qu'un idiome est, bien, idiomatique de ceux qui utilisent la langue. Habituellement, une expression courante ou une séquence d'expressions qui, sans être peut-être évidentes, effectuent une opération ou expriment une intention d'une manière qui ait un sens pour ceux qui sont suffisamment fluides pour l'avoir vue auparavant.

De retour à Perl, l'idiome le plus connu est peut-être la " transformation de Schwartzian ", une expression qui effectue un tri des données de manière compacte et efficace. Ce n’est pas la façon la plus évidente de réaliser une telle opération, mais c’est succinct, et ceux qui l’ont vue auparavant savent immédiatement ce qu’elle fait.

Un autre exemple notable est " The Orcish Maneuver ", qui tire parti des notions de vrai / faux, d'opérateurs riches et de priorité des opérateurs de Perl.

Celui que j’ai personnellement beaucoup aimé est en quelque sorte lié à la manœuvre orque, mais je ne connais pas de nom pour cela:

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

Ce n’est en effet pas un obscurcissement, mais plutôt une expression claire et compacte de quelque chose qui, autrement, exigerait plusieurs lignes. Si la clé est présente dans le hachage et a une valeur true, annulez-la en tant que tableau et poussez $ some_value sur ce tableau. Si l'élément de hachage n'est pas présent ou a une valeur false, affectez-lui un tableau vide, déréférencerez ce tableau et effectuez le push.

Il est également intéressant de noter que depuis Perl 5.14, une partie de cet idiome est obsolète - push peut désormais fonctionner directement sur la référence du tableau, sans @ {} nécessaire! De plus, à partir de Perl 5.10, on peut utiliser // = au lieu de || = qui vérifie non pas la vérité, mais bien la définition.


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

0

l’idée d’un idiome est d’être une idée ou un concept qui englobe les langages de programmation, c’est une façon de faire les choses et un processus qui fonctionne sans beaucoup de restructuration conceptuelle lorsque vous le prenez et que vous le collez dans un autre, comme le genre de bulle humble . Les modèles de conception sont des implémentations spécifiques d'un idiome, ou des extensions de l'idée pour s'intégrer dans un langage, vous avez donc le modèle de conception javascript de l'idiome écouteur d'événements, etc.


écouteur d'événements est une fonctionnalité de langage qui implémente le signal / slots (modèle?) ou le modèle Observer. Il y a aussi des choses en C ++ appelées idiomes qui ne comptent tout simplement pas ou ne rentrent pas dans les autres langages (autant que je sache) - par exemple l'idiome copier-permuter.
Merlyn Morgan-Graham le

Design patterns are specific implementations of an idiom? De quelle façon précisément? Avez-vous vu les idiomes C ++, dans le lien dans ma question?
Nawaz

0

Je ne suis pas sûr à 100%, mais les idiomes sont simplement des termes se rapportant à un certain domaine. Lorsque vous parlez de "modèles de conception", vous pensez à "Modèle d'observateur" "Chaîne de responsabilité" "Modèle de visiteur" "usine". Ce sont des modèles courants utilisés pour résoudre des problèmes courants de programmation. Regardez ici pour une liste complète: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


0

Qu'est-ce que ça veut dire? Que veut dire "bas niveau" ici?

Je suppose que cela signifie qu’il ne s’agit pas d’une manière abstraite de haut niveau de modéliser votre application ou ses composants, mais plutôt d’une utilisation intelligente ou courante de la sémantique du langage.

Par exemple, définir une variable si sa valeur est false (généralement utilisé pour définir conditionnellement les variables nil):

var ||= some_default_value

0

Voici un exemple d'idiome (en C #) pour gérer un événement. Vous n'êtes pas autorisé à déclencher un événement s'il n'y a pas de gestionnaire attaché. L'idiome est de toujours vérifier cela en premier.

Par conséquent, le langage général utilisé pour gérer les événements devient:

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

Cet idiome est spécifique (bien que non exclusif) au langage C #.

Plus généralement cependant, le mécanisme d'événement C # est un exemple du modèle de conception d' observateur qui pourrait être mis en œuvre dans n'importe quel langage.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.