Differenza tra Idiom e Design Pattern?

39

Qual è la differenza tra l'idioma e il modello di progettazione? Sembra che queste terminologie si sovrappongano da qualche parte; dove esattamente, non lo so. Sono intercambiabili? Quando dovrei usare cosa?

Qui è una lista di Idiomi C ++. Posso chiamarli modelli di design?

Wikipedia definisce,

Programming Idiom as a low-level Design Pattern

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

Questa domanda è ispirata da un'altra domanda: link

    
posta Nawaz 08.09.2011 - 08:20
fonte

10 risposte

30

Un idioma è un'idea per aggirare i capricci di una lingua. Alcuni esempi che ti vengono in mente sono gli idiomi C ++ che hai collegato nella domanda originale. Risolvono un problema comune in quella lingua in un modo inscatolato.

Un modello di design è simile, in quanto risolve un problema comune. Ma il modello di progettazione ideale si basa su caratteristiche linguistiche comuni e quindi è indipendente dal linguaggio.

Esiste un continuum tra idiomi e schemi di progettazione, tuttavia, proprio come avviene nei linguaggi di basso livello ad alto livello.

Il pattern Visitor è un buon esempio; se esistesse solo una lingua che supportava solo la trasmissione dinamica singola, allora potremmo considerare il modello Visitatore un idioma di quella lingua. Ma ci sono orde di lingue intere che non supportano direttamente la distribuzione multipla. Quindi, è nato il pattern Visitor.

Viene in mente anche il pattern Observer - C # lo supporta direttamente, quindi non ha bisogno della comune forma di aggiramento del pattern.

Un esempio che va nella direzione opposta sono le caratteristiche OO (ereditarietà, polimorfismo, ecc.). C non li supporta direttamente. Se più lingue fossero come C, potremmo sviluppare modelli di progettazione per implementare v-tables, type-safety, ecc. Dal momento che molte lingue supportano queste funzionalità, chiameremmo qualsiasi soluzione comune in C un idioma, piuttosto che chiamare il generalizzato soluzione un modello di design.

    
risposta data 08.09.2011 - 09:39
fonte
37

Gli schemi di progettazione non sono in genere specifici della lingua. Gli idiomi linguistici tendono a dipendere da una particolare caratteristica di una lingua (o classe di lingue) o aggirare un difetto specifico in detta lingua (s).

    
risposta data 08.09.2011 - 08:33
fonte
12

Non metterei troppa valuta nella definizione di Wikipedia.

Per lo meno un idioma è specifico della lingua mentre uno schema di progettazione si sforza, o dovrebbe sforzarsi, di essere indipendente dalla lingua. Andando oltre, gli idiomi sono di solito delle convenzioni per migliorare la leggibilità, o sono l'alternativa superiore (su alcuni meriti tecnici) quando c'è più di un modo per fare qualcosa. Tutte queste cose sono collegate a come le idee sono espresse (chiarezza, verbosità, concisione), ma non alle idee stesse.

D'altro canto, gli schemi di progettazione sono l'essenza di un'idea ricorrente, un'idea che a priori può essere espressa in qualsiasi lingua che si presti ad essa. The Visitor è un'implementazione di doppia spedizione basata su single-dispatch e overloading e può essere utilizzata in qualsiasi linguaggio che disponga di un singolo invio e di un sovraccarico. Conoscere il modello non aiuta a scrivere un codice più espressivo o più leggibile, aiuta a risolvere il problema correlato. Non c'è nulla di idiomatico al riguardo, perché ad esempio non esiste alcuna forma canonica del visitatore in es. C ++.

    
risposta data 08.09.2011 - 08:38
fonte
6

La normale definizione della lingua inglese di Idiom. È una frase il cui significato accettato non è contenuto nelle parole usate. Esempi potrebbero essere "Piove di gatti e cani" o "Dov'è il manzo?"

Nei linguaggi di programmazione di solito si riferisce a una scorciatoia sintattica che fa qualcosa che non è immediatamente evidente dal codice stesso, ma che è usata abbastanza spesso da altri programmatori che riconoscono immediatamente il significato.

Perl è forse il linguaggio più idioma. Con costrutti come:

while (<IN>) {
    print $_
}

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

    
risposta data 08.09.2011 - 08:41
fonte
2

Gli idiomi sono specifici della lingua. Per esempio. while (*dest++=*src++); è un idioma C / C ++. È assolutamente impossibile scrivere qualcosa di remotamente simile in Pascal o Java. Usa la parola "idioma" mentre la usi in inglese. "Come va?" come un saluto è un idioma. Alcune lingue come tedesco e frensh hanno lo stesso idioma. Ma molte altre lingue non "chiedono" qualcosa come questo come un saluto. Un modello (orientato agli oggetti) d'altra parte può essere adattato di solito in qualsiasi linguaggio che supporti l'ereditarietà e la delega. Un idioma potrebbe essere semplice come una riga di codice. Un modello di progettazione comprende sempre diverse classi.

    
risposta data 26.09.2011 - 14:27
fonte
2

Ho trovato questo post alla ricerca di idiomi C ++ comuni, dato che recentemente ho iniziato ad approfondire abbastanza e vorrei che il mio codice non sembrasse dilettantesco come penso che sia ... :-P

Avendo trascorso un po 'di tempo con Perl, ho trovato idiomi in quella lingua per essere molto simili a quelli trovati in lingue naturali, come l'inglese o lo spagnolo (solo due ne conosco abbastanza bene per conoscerne alcuni idiomi).

Non sono d'accordo sul fatto che un idioma sia come un "piccolo disegno". Non sono ancora d'accordo, anche se meno, che un idioma è un modo per aggirare un deficit di una lingua.

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

Tornando a Perl, forse l'idioma più noto è " Schwartzian Transform ", un'espressione che esegue un ordinamento sui dati in modo compatto ed efficiente. Non è il modo più ovvio per eseguire un'operazione del genere, ma è concisa e chi l'ha già visto sa immediatamente cosa sta facendo.

Un altro esempio degno di nota è " La manovra degli orchi ", che sfrutta le nozioni di Perl di vero / falso, operatori ricchi e precedenza degli operatori.

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

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

Questo non è certo offuscamento, ma piuttosto un'espressione chiara e compatta di qualcosa che altrimenti richiederebbe diverse linee. Se la chiave è presente nell'hash e ha un valore vero, de-referenzia una matrice e spinga $ some_value su quella matrice. Se l'elemento hash non è presente o ha un valore falso, assegnagli un array vuoto, quindi deniferenzia l'array e fai il push.

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

    
risposta data 17.10.2011 - 17:25
fonte
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 si prende da uno e lo si inserisce in un altro, come il bolla vagamente ordinata. I modelli di progettazione sono implementazioni specifiche di un idioma o estensioni dell'idea che si adattano a un linguaggio, pertanto si ha il modello di progettazione javascript dell'idioma dell'ascoltatore di eventi, ecc.

    
risposta data 08.09.2011 - 08:31
fonte
0

Non sono sicuro al 100%, ma gli idiomi sono semplicemente termini relativi a un determinato campo. Quando dici "schemi 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. Guarda qui per un elenco completo: link

    
risposta data 08.09.2011 - 08:31
fonte
0

What does it mean? What does "low-level" mean here?

Suppongo che non sia un modo astratto e di alto livello per modellare la tua applicazione oi componenti della tua applicazione, ma piuttosto un uso intelligente o comune della semantica del linguaggio.

per esempio, impostando una variabile se valuta su false (comunemente usato per impostare le variabili nil in modo condizionale):

var ||= some_default_value
    
risposta data 08.09.2011 - 08:32
fonte
0

Ecco un esempio di un idioma (in C #) per la gestione di un evento. Non sei autorizzato a lanciare un evento se non è stato collegato alcun gestore, quindi l'idioma è sempre quello di controllarlo prima.

Quindi l'idioma generale per la gestione degli eventi diventa:

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

Questo idioma è specifico (anche se non esclusivo) al linguaggio C #.

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

    
risposta data 08.09.2011 - 08:49
fonte

Leggi altre domande sui tag