programmazione generica, con che frequenza viene utilizzata nell'industria


11

Attualmente sto programmando in un ambiente accademico, quindi posso usare quello che voglio. Sto usando la libreria di grafici boost per alcune cose e mi chiedo se valga la pena investire gli sforzi nella comprensione più approfondita del GP.

Sono curioso: la programmazione generica (GP) è molto usata nell'industria? La mia ipotesi è che la maggior parte dei programmatori sia molto più a suo agio con OOP o utilizzi linguaggi che non enfatizzano o supportano GP, quindi al di fuori della chiamata alle strutture / funzioni di dati STL in C ++, la mia impressione è che GP non sia usato così frequentemente in pratica. Ma, essendo al di fuori del settore al momento, sarebbe bello sentire i praticanti su questo.

(mentre scrivo, vedo che la programmazione generica non è nemmeno un tag valido!)


La distribuzione dei tag su StackOverflow è probabilmente molto più utile come prova statistica di quella qui. Vedi stackoverflow.com/questions/tagged/generic-programming , stackoverflow.com/questions/tagged/generics
Péter Török

Risposte:


7

Sono curioso: la programmazione generica (GP) è molto usata nell'industria?

Dipende molto dal contesto del team e dal progetto.

Ad esempio, nei videogiochi, spesso il codice è il "più semplice" possibile (e talvolta anche troppo semplice) ma in architetture di grandi dimensioni. Questo perché gli sviluppatori di giochi hanno molti problemi da risolvere e non vogliono preoccuparsi della meta-programmazione (che è un linguaggio separato molto astratto e difficile da comprendere all'interno del C ++).

Allo stesso tempo, l'uso di base dei modelli è comune anche in quei negozi e puoi vedere alcune ottimizzazioni basate su modelli in alcune funzioni molto specifiche di alcuni motori.

Ma negli sviluppatori di giochi, la maggior parte delle persone eviterà qualsiasi metaprogrammazione.

Ora, dall'altro lato estremo, alcune applicazioni di elaborazione molto complesse o pesanti, che non sono comuni, richiedono una sorta di metaprogrammazione pesante a causa di requisiti di prestazioni e flessibilità (al momento della compilazione) che non sono comuni. Sto lavorando in uno adesso.

Non è comune ma esiste e alcuni domini di nicchia (in alcuni contesti integrati scientifici o che scricchiolano i numeri) richiedono che le persone sappiano molto sulla metaprogrammazione o che desiderino imparare.

Nel mezzo, la maggior parte delle persone utilizzerà il meta-proggramming come "client", non come "designer". La maggior parte del codice di meta-programmazione sono raggruppati in librerie perché le librerie sono strumenti per il codice e cosa c'è di meglio di una libreria in grado di adattarsi ai tipi personalizzati con cui hai lavorato fino ad ora?

Boost (http://boost.org) è un insieme di librerie, alcune fatte di pesante metaprogrammazione della magia nera, e sono usate in molti negozi C ++ come "STL ++", un'estensione dell'STL (e lo è). Non tutti i negozi lo usano per diversi motivi, come la compatibilità del compilatore (alcune librerie di boost possono far perdonare il compilatore ogni volta che ha ferito il tuo sentimento ...) e più spesso perché ad alcuni sviluppatori non piace non essere in grado di capire come funziona uno strumento all'interno (prova a capire Boost.Spirit ...)

Qualunque sia la società per la quale lavorerai, alcuni useranno questo paradigma, altri meno o per niente o addirittura li proibiranno.

Non c'è consenso perché nessuno ha gli stessi bisogni, contesto o squadra.

Ma ovviamente, è usato. Forse chiedi a chi usa boost sulla loro mailing list per avere più esempi del mondo reale?


1
+1 per cliente vs. designer. Nella mia esperienza, pochi sviluppatori abbastanza comprendono la loro implementazione che non ha senso creare un nuovo codice generico in un'applicazione a meno che non apporti un grande miglioramento nella manutenibilità. Le librerie progettate per un ampio riutilizzo rientrano in tale condizione molto più frequentemente rispetto alle singole applicazioni.
Karl Bielefeldt,

Grazie per la risposta dettagliata Sono un fan di Boost me stesso e considerare se scavare in BGL, che richiede una conoscenza dei GP sostanzialmente maggiore rispetto alle altre librerie Boost, è ciò che mi ha portato a chiedere questo. Il tuo commento sul mondo dello sviluppo del gioco è piuttosto intrigante. Sono stupito dalle imprese di sviluppo dei giochi moderni ed è interessante sapere che probabilmente sono isolate dalle nuove metodologie di programmazione piuttosto che in prima linea.
bd1,

Bene, gli sviluppatori di giochi stanno gestendo un alto ordine di complessità semplicemente progettando concetti di architettura. L'aggiunta di meta istruzioni complessa semplicemente tutto, quindi deve essere davvero ben giustificato. L'altra cosa è che molti sviluppatori di giochi funzionano su console che sono hardware molto specifico con compilatori molto specifici che non consentono tutto ciò che boost tenta di fare (ad esempio, nessuna eccezione o nessuna eredità multipla o non funziona correttamente dal documento di il compilatore (storia vera)). Quindi, ci sono buone ragioni.
Klaim,

5

Sono curioso: la programmazione generica (GP) è molto usata nell'industria?

La programmazione generica, chiamata accademicamente polimorfismo parametrico , è molto spesso usata nei campi. Nella mia azienda, lo usiamo principalmente per creare editor di tipo indipendenti per i dati, indipendentemente dal loro tipo. Semplicemente non ne hai bisogno tanto spesso quanto le altre funzionalità, ma è sicuramente una funzionalità che non vorrei perdere. Lo usi quando un comportamento si adatta a un gran numero di tipi. È un chiaro segno che hai bisogno di generici quando ti ritrovi a scrivere lo stesso codice più volte per tipi diversi.

La mia ipotesi è che la maggior parte dei programmatori sia molto più a suo agio con OOP o utilizzi linguaggi che non enfatizzano o supportano GP, quindi al di fuori della chiamata alle strutture / funzioni di dati STL in C ++, la mia impressione è che GP non sia usato così frequentemente in pratica.

Almeno dalla mia esperienza, il tuo punto di vista è sbagliato. OOP e programmazione generica non si escludono a vicenda. In effetti, dovresti usare gli effetti sinergici della loro combinazione. Come ho detto prima, il motivo per cui non lo vedi apparire così frequentemente come altre tecniche è perché non ne hai bisogno così spesso. Ma è una funzionalità forte da avere e ti aiuta notevolmente a mantenere il tuo codice DRY . Quali lingue non enfatizzano davvero il supporto del GP nella programmazione di alto livello? 3 di 5 lingue dei 5 principali generici / modelli di supporto di Tiobe . E PHP è digitato in modo dinamico, quindi non ne ha davvero bisogno. E allora?


punto preso, non intendevo implicare che OOP e GP siano una o / o una scelta. Tuttavia, molti dei progetti che ho visto sembrano essere rigorosamente OOP in Java. Penso che le versioni più recenti di Java supportino GP, ma quale frazione di programmatori Java utilizza davvero questa funzionalità? Come ho detto, non sto lavorando nell'industria e la mia prospettiva potrebbe essere distorta, motivo per cui ho posto la domanda.
bd1

@ bd1: le applicazioni precedenti che erano state scritte prima che Java supportasse i generici o prima che un determinato set di strumenti supportasse quella versione di Java non avranno generici e gli sviluppatori potrebbero continuare a evitare i generici su quel particolare progetto, per mantenere coerente il codice. L'ho visto e varia a seconda del progetto e degli sviluppatori. Tutti i progetti che ho visto avviati dopo che il supporto per i generici Java era diffuso tendono ad usarli spesso, quando appropriato.
FrustratedWithFormsDesigner il

@FrustratedWithFormsDesigner: i generici in Java sono completamente diversi dai modelli C ++. I generici Java sono zuccheri sintattici puri al 100% e non supportano la meta-programmazione.
Kevin Cline,

"OOP e programmazione generica non si escludono a vicenda". In effetti, entrambe sono forme di polimorfismo, rispettivamente polimorfismo ad hoc e parametrico. Quindi sono due strumenti diversi per diversi tipi di polimorfismo.
Giorgio,

4

I modelli C ++ sono ampiamente utilizzati per cose diverse dai container - almeno nel mio dominio problematico (finanza quantitativa). Mi permetto persino di dire che a volte viene usato troppo spesso, per scopi in cui le semplici vecchie funzioni virtuali sarebbero sufficienti (e non aumenterebbero così tanto i tempi di compilazione).

Le persone lo usano per evitare la duplicazione del codice e per ottenere un polimorfismo in fase di compilazione (senza invio virtuale).

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.