6

A volte le persone fanno riferimento a modelli di progettazione come mancanti delle funzionalità del linguaggio di programmazione. Per evitare il dibattito su cosa sia un modello di design, diciamo che consideriamo solo i pattern GoF originali. Ad esempio, il modello singleton scompare in Scala che supporta oggetti singleton usando la parola chiave object.Design pattern come lingua mancante (mancante)

Ci sono poche risorse intorno a questo, in particolare Are Design Patterns Missing Language Features dal wiki C2 o Are design patterns really language weaknesses? da SO. Ma non sono riuscito a trovare una copertura non argomentata, obiettiva e completa di questa domanda.

Idealmente, vorrei una matrice con i modelli di progettazione GoF (riga) e alcuni linguaggi di programmazione mainstream (colonne), in cui ogni cella farebbe riferimento a una discussione sul modello nel linguaggio di programmazione specifico.

Per evitare il dibattito su ciò che PL da considerare, possiamo anche risolvere questo problema e scegliere: Java (come rappresentante OO tipizzato staticamente), Smalltalk (come rappresentante dinamicamente tipizzato), Haskell (come rappresentante funzionale), Scala (come rappresentante oo/funzionale ibrido), Lisp (come rappresentante di meta-programmazione), JavaScript (come rappresentante basato su prototipi). E lascia altri PL per appunti o commenti. So che possiamo discutere su questa scelta, ma sarebbe già interessante per queste lingue.

Questa sarà sempre una domanda aperta, ma mi sento come chiesta così com'è, questa è sufficientemente focalizzata per avere una risposta migliore.

Forse questa matrice esiste già da qualche parte? O qualcuno ha abbastanza conoscenze per realizzarlo? O qualcuno è abbastanza appassionato da iniziare e renderlo una risposta wiki in modo che altri possano continuare?

+0

Piuttosto che fare una domanda soggettiva aperta su SO, perché non scrivi semplicemente un post sul blog e lo sviluppi man mano che trovi nuove implementazioni di un pattern? – slugster

+0

Non c'è probabilmente una risposta migliore a questo. Voterò per wiki della comunità. –

+0

@slugster La mia idea è davvero quella di scrivere un post di questo tipo (o un mio amico lo farà), e la domanda riguarda la raccolta di riferimenti alle migliori discussioni sul modello specifico w.r.t in una determinata lingua. Quindi posso compilarlo in un post di blog. Nel frattempo, probabilmente risponderò anche alla mia domanda e abbozzerò una bozza della matrice. – ewernli

risposta

5

Gli schemi nei modelli di progettazione sono un sottoinsieme del sempre crescente insieme di modelli che le persone utilizzano quando programmano in lingue diverse. Gli autori sono molto chiari sul fatto che questi modelli si applicano solo ai linguaggi OOP, quindi molti di essi non avranno senso al di fuori di quel contesto.

Allo stesso tempo, ci sono molti modelli in altre lingue che non sono necessari in una lingua OOP. Considera che gli oggetti stessi sono uno schema quando implementati in C o Schema. In assembly, lo stack di chiamate è un pattern.

+0

+1, ho scritto codice OO C (e codice macchina C stato, che può essere davvero molto simile). Direi che su qualsiasi dispositivo con più di 100K di spazio di codice, uno stack di chiamate scritto in assembly è un grido di aiuto più che un modello. – detly

+0

A destra, alcuni pattern non si applicano in altri contesti. Mi sta anche bene saltare i pattern che non sono affatto rilevanti, o menzionare quando un pattern non ha alcun senso in un altro linguaggio/paradigma. Ma ritengo che i seguenti schemi meriterebbero una discussione al di fuori del contesto OO: Adattatore, Decoratore, Proxy, Comando, Interprete, Osservatore, Stato, Strategia, Visitatore. E sì, ci sono un sacco di schemi e linguaggio, quindi devo in qualche modo limitare la portata della domanda. – ewernli

1

Personalmente, dopo aver trascorso alcuni anni di utilizzo di OOP, ho scoperto che il problema con i modelli di progettazione è che evidenziano i problemi con OOP e quanto sia difficile vedere i modelli nei dati così correlati al dominio in che è stato modellato. A volte è molto difficile vedere il legno per gli alberi. Alcuni artefatti in OOP sono semplicemente lì per curare i problemi che esistono quando si pensa in quel particolare paradigma o si aggira lo stato e l'accesso incapsulati.

Penso che i modelli di progettazione siano grandi e li utilizzo, tuttavia sono stati considerati come la soluzione a un problema che potrebbe esistere nell'impossibilità di OOP di essere obiettivi sulle strutture e le funzioni dei dati, in modo che la formula provata e testata può essere applicato. Un semplice esempio potrebbe essere l'oggetto Singleton. Questo scompare quando si utilizzano i linguaggi funzionali e non è un problema.

Come un signore su SO ha detto quando ho chiesto informazioni su UML e se poteva essere usato per modellare le lingue funzionali, ha detto che il linguaggio di modellazione dei linguaggi di programmazione funzionale è matematica. Penso che questa sia la chiave per comprendere il motivo per cui i pattern non sono rilevanti per i linguaggi di programmazione funzionale, poiché la teoria dietro di essi è immersa nelle strutture della matematica.

Non posso aiutarti con un foglio di greppia, ma posso essere abbastanza certo che i pattern GOF non si applicano ai linguaggi di programmazione funzionale, poiché vanno direttamente ai modelli reali della matematica come la bellezza dei linguaggi funzionali è che mappano direttamente (nella maggior parte dei casi) a molti anni di risoluzione dei problemi in matematica. Forse una sfacciata affermazione è che i modelli di progettazione dei linguaggi funzionali sono teoremi matematici con una relazione uno a uno in cui OO ha una forma di astrazione artificiale che a volte interferisce.

Penso che ci siano alcuni principi di progettazione che attraversano tutti i linguaggi come MVC, architettura multilivello, ridimensionamento e scalabilità. Ma questi dovrei considerare come non modelli di progettazione, più di buone pratiche di progettazione del software.

+0

Quello che dici in realtà è che alcuni pattern spariscono quando si utilizza un altro linguaggio ed è in realtà ciò che vorrei indagare. Forse dovrei comunque iniziare prima estraendo il problema che risolve il pattern GoF e poi vedere come il problema viene risolto in un'altra lingua. Per esempio. il problema della unicità della struttura di oggetti o dati viene risolto con il singleton in OO e scompare in un linguaggio funzionale rigoroso. O esiste una sorta di relazione concettuale tra una classe di tipo Haskell e il modello composito? Certo, sto un po 'paragonando mele e arance, ma questo è ciò che è interessante. – ewernli

+0

Oppure il fatto che per interpretare un AST in OO si usa visitor mentre non ne ha bisogno in funzione a causa dell'overloading (vedi il problema dell'espressione). Oppure il modello dell'interprete che scompare è la meta-programmazione del supporto PL. O l'adattatore se hai qualcosa come impliciti ed estrattori di Scala, ecc. – ewernli

+0

Sì, mi interessa anche il confronto. I pattern GOF si riferiscono a Object Oriented Design, non penso che ciò che rappresentano sia qualcosa di nuovo, ma hanno reso i pattern/algoritmi accessibili al joe di tutti i giorni come me. In tutta ignoranza li ho semplicemente presi come linee guida, ma dopo aver esaminato a fondo lo stile funzionale in ritardo, sto iniziando a rendermi conto che c'è molto più profondità per loro. Il modello di visitatore è un classico esempio OO di ciò che in pratica è una funzione che converte una forma in un'altra. – WeNeedAnswers