Differenza tra idioma e design pattern?


39

Qual'è la differenza tra idiom e design-pattern? Sembra che queste terminologie si sovrappongano da qualche parte; dove esattamente, non lo so. Sono intercambiabili? Quando dovrei usare cosa?

Ecco un elenco di idiomi C ++. Posso chiamarli modelli di design?

Wikipedia definisce,

Programmazione del linguaggio come modello di progettazione di basso livello

Cosa significa? Che cosa significa "basso livello" qui?

Questa domanda è ispirata da un'altra domanda: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent


In termini pratici la distinzione può essere difficile da determinare (e potrebbe esserci un continuum tra un linguaggio e un modello di progettazione). Ma probabilmente deriva dal termine "idioma" in linguaggio naturale: en.wikipedia.org/wiki/Idiom (che non corrisponde proprio all'uso).
Merlyn Morgan-Graham,

2
Questo è probabilmente più adatto per i programmatori SE.
Oliver Charlesworth,

3
@Nawaz: un "Design Pattern" è un costrutto relativamente "di alto livello" attorno a un difetto del linguaggio. Un "idioma" è un costrutto relativamente "di basso livello" attorno a un difetto del linguaggio; )
Tristan St.

@ Nawaz- +1 per l'umorismo.
Jennifer S,

Risposte:


30

Un idioma è un'idea per aggirare le stranezze di una lingua. Alcuni esempi che vengono in mente sono alcuni dei modi di dire C ++ che hai collegato nella domanda originale. Risolvono un problema comune in quella lingua in modo fisso.

Un modello di progettazione è simile, in quanto risolve un problema comune. Ma il modello di progettazione ideale si basa sulle caratteristiche del linguaggio comune e quindi è agnostico.

Esiste tuttavia un continuum tra modi di dire e schemi di progettazione, proprio come accade dalle lingue di basso livello a quelle di alto livello.

Il modello Visitatore è un buon esempio; se esistesse solo una lingua che supportava un singolo invio dinamico, allora potremmo considerare il modello Visitatore un linguaggio di quella lingua. Ma ci sono intere orde di lingue che non supportano direttamente la spedizione multipla. Quindi, il modello Visitatore è nato.

Viene anche in mente il modello Observer: C # lo supporta direttamente, quindi non ha bisogno della forma comune di aggancio del modello.

Un esempio che va nella direzione opposta sono le caratteristiche OO (eredità, polimorfismo, ecc.). C non li supporta direttamente. Se più lingue fossero come la C, allora potremmo sviluppare modelli di progettazione per implementare le v-table, la sicurezza dei tipi, ecc. Dato che molte lingue supportano quelle funzionalità, chiameremmo qualsiasi soluzione comune in C un linguaggio, piuttosto che chiamare il generalizzato soluzione un modello di progettazione.


2
Un altro esempio interessante: API di sintassi fluenti. Compensano il fatto che non hai un supporto DSL diretto nella tua lingua e attraversa i confini della lingua. Non sono ancora sicuro che abbia raggiunto lo stato di "Design Pattern", e suona come un linguaggio sintattico ...
Merlyn Morgan-Graham,

Il fatto che C # supporta direttamente il pattern Observer sembrerebbe indicare che ha un enorme bisogno del modello, tanto che ha spostato l'attuazione lontano da sviluppatori e nel linguaggio stesso.
jaco0646,

@ jaco0646 Ho riformulato quella riga, potrebbe essere più chiaro ora
Merlyn Morgan-Graham,

37

I modelli di progettazione non sono in genere specifici della lingua. I linguaggi linguistici tendono a dipendere da particolari caratteristiche di una lingua (o classe di lingue) o aggirare una specifica carenza di tali lingue.


+1 per fare una distinzione con poche parole e poche imprecisioni.
Merlyn Morgan-Graham,

1
@Merlyn Morgan-Graham: hai commentato quasi tutte le risposte, compresa la domanda. Quindi perché non pubblicare una risposta dettagliata senza inesattezze ? Mi piacerebbe conoscere i tuoi pensieri.
Nawaz,

1
@Nawaz: il commento riguardava le altre risposte. Questo è già quasi perfetto. Preferirei i campioni in una risposta, ma sembra che nessuno li stia facendo bene. Probabilmente neanche io, altrimenti sarei felicemente obbligato :)
Merlyn Morgan-Graham,

@Nawaz: Okay ci ho provato comunque :)
Merlyn Morgan-Graham

12

Non metterei troppa valuta nella definizione di Wikipedia.

Per lo meno un linguaggio è specifico del linguaggio mentre un modello progettuale si sforza, o dovrebbe sforzarsi, di essere indipendente dal linguaggio. Andando oltre, gli idiomi sono di solito convenzioni per migliorare la leggibilità o sono l'alternativa superiore (su alcuni meriti tecnici) quando esiste più di un modo per fare qualcosa. Tutte queste cose sono correlate al modo in cui vengono espresse le idee (chiarezza, verbosità, concisione), ma non alle idee stesse.

D'altra parte, i modelli di design sono l'essenza di un'idea ricorrente, un'idea che a priori può essere espressa in qualsiasi lingua che si presta ad essa. Il Visitatore è un'implementazione di doppio invio che si basa su invio singolo e sovraccarico e può essere utilizzato in qualsiasi lingua con invio singolo e sovraccarico. Conoscere il modello non aiuta a scrivere codice più espressivo o più leggibile, aiuta a risolvere il problema relativo. Non c'è nulla di idiomatico al riguardo perché ad esempio non esiste una forma canonica del Visitatore, ad esempio in C ++.


1
+1; Buona risposta. Tuttavia, sono propenso a credere a tutto qui, tranne l'ultimo. Esistono lingue che supportano direttamente la spedizione multipla, quindi il modello di visitatore non dovrebbe esistere lì. Dal loro punto di vista, il "modello" potrebbe essere più un idioma. Dall'ultimo linguaggio di alto livello, tutti i modelli potrebbero diventare modi di dire ...
Merlyn Morgan-Graham,

@Merlyn Cosa c'è di idiomatico nel reimplementare una funzionalità linguistica di prima classe? Chi lo fa?
Luc Danton,

Questo è il punto. Gli utenti di quella lingua considererebbero il "modello di progettazione" un linguaggio, perché la loro lingua è più fredda :)
Merlyn Morgan-Graham

@Merlyn Questo non si adatta ai miei usi di 'idioma'. Un linguaggio di una lingua è qualcosa che ti aspetti che un utente casuale e competente della lingua riconosca; la reimplementazione di una funzionalità di prima classe sembrerà aliena e fuori posto. Non esiste un linguaggio C ++ per il singolo invio, uno lo usa solo virtualin alcuni punti, mentre il puntatore scritto a mano all'inganno della tabella dei membri sembrerà semplicemente sciocco.
Luc Danton,

1
Mi piace dove stai andando con la definizione di idioma diversa da un "modello di progettazione di un uomo povero", che è una specie di come il mio modello lo tratta (vedi la mia risposta). È meno "ecco come implementarlo" e di più "qui è il modo giusto di implementarlo". Ad esempio, non riesco a immaginare che "Big Three" si evolva in un modello di progettazione. E c'è anche la componente sintattica, ad esempio do_something() or die "...";(rubata da un altro commento qui). Si basa su funzionalità linguistiche specifiche, ma è un modo comune di utilizzare tali funzionalità. Non è cross-language e probabilmente non lo sarà.
Merlyn Morgan-Graham,

6

La normale definizione in inglese di Idiom. È una frase il cui significato accettato non è contenuto nelle parole utilizzate. Esempi potrebbero essere "Raining cat and Dogs" o "Where's the Beef?"

Nei linguaggi di programmazione di solito si riferisce a un collegamento sintattico che fa qualcosa non immediatamente evidente dal codice stesso ma che viene usato abbastanza spesso da consentire ad altri programmatori di riconoscerne immediatamente il significato.

Perl è forse la lingua più ricca di idiomi. Con costrutti come:

while (<IN>) {
    print $_
}

Il cui significato è ovvio per un programmatore perl esperto ma un mistero per chiunque altro


Penso che "dov'è il manzo" sia più un meme che un idioma. Potrebbe esserci un altro continuum lì;) Potrebbe esserci di più in un linguaggio che la semplice implementazione nel linguaggio, dal momento che le cose potrebbero essere implementazioni parziali o fallite di quel linguaggio - i "Big Three" di C ++, per esempio. In tal caso, il linguaggio è il nome e la descrizione di "Big Three".
Merlyn Morgan-Graham,

2
Perl ha i migliori idiomi -do_something() or die "arrrrgh!";
cxfx

2

I modi di dire sono specifici della lingua. Ad esempio while (*dest++=*src++);è un linguaggio C / C ++. È completamente impossibile scrivere qualcosa di simile in remoto in Pascal o Java. Usa la parola "linguaggio" mentre la usi in inglese. "Come va?" come saluto è un linguaggio. Alcune lingue come il tedesco e il frensh hanno lo stesso linguaggio. Ma molte altre lingue non "chiederebbero" qualcosa del genere come saluto. D'altra parte, un modello (orientato agli oggetti) di solito può essere adattato in qualsiasi linguaggio che supporti l'ereditarietà e la delega. Un linguaggio potrebbe essere semplice come una riga di codice. Un modello di progettazione coinvolge sempre diverse classi.


+1. Un buon punto:A idiom might be as simple as one line of code. A design pattern always involves several classes.
Nawaz,

2

Ho trovato questo post alla ricerca di espressioni idiomatiche comuni in C ++, dato che mi sono approfondito di recente e vorrei che il mio codice non sembrasse così amatoriale come lo sento ... :-P

Dopo aver trascorso un bel po 'di tempo con Perl, ho scoperto che i modi di dire in quella lingua erano molto simili a quelli che si trovano nelle lingue naturali, come l'inglese o lo spagnolo (solo due ne conosco abbastanza bene per conoscere alcuni modi di dire).

Non sono d'accordo sul fatto che un linguaggio sia come un "piccolo modello di progettazione". Sono ancora in disaccordo, sebbene meno, che un linguaggio sia un modo per aggirare una carenza di una lingua.

Forse la risposta di Luc Danton si avvicina di più, ma lasciami spiegare. Penso che un linguaggio sia, beh, idiomatico di coloro che usano la lingua. Di solito, un'espressione o una sequenza di espressioni comuni che, sebbene forse non ovvia, esegue un'operazione o esprime l'intento in un modo che ha senso per coloro che sono abbastanza fluenti da averlo visto prima.

Tornando a Perl, forse il linguaggio più noto è la " Trasformazione di Schwartzian ", un'espressione che esegue una sorta di ordinamento sui dati in modo compatto ed efficiente. Non è il modo più ovvio per eseguire un'operazione del genere, ma è succinta e coloro che l'hanno vista prima sanno immediatamente cosa sta facendo.

Un altro esempio notevole è " The Orcish Maneuver ", che sfrutta le nozioni di perl di operatori veri / falsi, ricchi e precedenza degli operatori.

Uno che personalmente mi piace un po 'è in qualche modo legato alla manovra degli Orchi, ma non conosco alcun nome per questo:

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

Non si tratta in realtà di offuscamento, ma piuttosto di un'espressione chiara e compatta di qualcosa che altrimenti richiederebbe diverse linee. Se la chiave è presente nell'hash e ha un valore vero, de-referenziarla come matrice e spingere $ some_value su quella matrice. Se l'elemento hash non è presente o ha un valore falso, assegnagli un array vuoto, quindi fai la dereference e fai il push.

Vale anche la pena notare che a partire da Perl 5.14, parte di questo idioma è obsoleto - push ora può operare direttamente sul riferimento dell'array, non è necessario @ {}! Inoltre, a partire da Perl 5.10, si può usare // = invece di || = che verifica non la verità ma la definizione.


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

0

il punto di un idioma è di essere un'idea o un concetto che abbraccia i linguaggi di programmazione, è un modo di fare le cose e un processo che funziona senza molta ristrutturazione concettuale quando lo prendi da uno e lo attacchi in un altro, come l'umile bolla . I modelli di progettazione sono implementazioni specifiche di un linguaggio, o estensioni dell'idea per adattarsi a un linguaggio, quindi hai il modello di progettazione javascript del linguaggio di ascoltatore di eventi, ecc.


listener di eventi è una funzione del linguaggio che implementa il segnale / slot (modello?) o il modello Observer. Ci sono anche cose in C ++ chiamate idiomi che semplicemente non contano o non si adattano in altre lingue (per quanto ne so), ad esempio l'idioma copia-e-scambia.
Merlyn Morgan-Graham,

Design patterns are specific implementations of an idiom? Come esattamente? Hai visto gli idiomi del C ++, nel link alla mia domanda?
Nawaz,

0

Non sono sicuro al 100%, ma gli idiomi sono semplicemente termini relativi a un determinato campo. Quando dici "modelli di progettazione", pensi a "Modello di osservatore" "Catena di responsabilità" "Modello di visitatore" "fabbrica". Questi sono schemi comuni usati per risolvere problemi comuni nella programmazione. Cerca qui un elenco completo: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


0

Cosa significa? Cosa significa "basso livello" qui?

Immagino che non sia un modo astratto e di alto livello per modellare l'applicazione o i componenti dell'applicazione, ma piuttosto un uso intelligente o comune della semantica del linguaggio.

ad esempio, impostando una variabile se viene valutata falsa (comunemente usata per impostare condizionalmente zero variabili):

var ||= some_default_value

0

Ecco un esempio di un linguaggio (in C #) per la gestione di un evento. Non ti è permesso di lanciare un evento se non ci sono gestori collegati, quindi il linguaggio è quello di controllare sempre prima.

Pertanto, il linguaggio generale per la gestione degli eventi diventa:

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

Questo linguaggio è specifico (sebbene non esclusivo) al linguaggio C #.

Più in generale, tuttavia, il meccanismo di eventi C # è un esempio del modello di progettazione dell'osservatore che potrebbe essere implementato in qualsiasi linguaggio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.