Interfacce di stile Go / Obj-C con possibilità di estendere oggetti compilati dopo il rilascio iniziale

0

Ho un modello concettuale per un sistema di oggetti che implica la combinazione di interfacce / protocolli Go / Obj-C con la possibilità di aggiungere metodi virtuali da qualsiasi unità, non solo quella che definisce una classe. L'idea è di consentire le classi aperte di Ruby-ish in modo da poter adottare un approccio minimalista allo sviluppo delle librerie e collegare alle piccole parti di funzionalità effettivamente necessarie all'intero programma.

L'implementazione di questo implica una tabella di metodi contrassegnati come virtuali in una tabella RTTI, a cui è consentito aggiungere funzioni di sistema durante l'inizializzazione del modulo. Dopo aver convertito un oggetto in un'interfaccia, viene eseguita una ricerca Go-style per creare un vtable per quella particolare mappatura e passarlo in modo da poter avere prestazioni paragonabili a C / C ++. In questo caso, i metodi possono essere aggiunti / in seguito / che non erano precedentemente noti e questi nuovi metodi consentono di soddisfare le nuove interfacce; mentre mi piace questa idea perché sembra che sarebbe molto flessibile (ignorando il potenziale per il codice spaghetti, che può accadere con qualsiasi modello che si utilizza a prescindere).

Racchiudendo le chiamate di sistema per i metodi di binding in un insieme di chiamate C-compatibili pulite, si sarebbe anche in grado di integrare il codice con le librerie condivise e mantenere una buona quantità di prestazioni (Go non fa collegamenti condivisi e Obiettivo -C esegue una ricerca dinamica su ciascuna chiamata.)

Esiste un caso d'uso valido per questo modello che ne valga la pena? Per quanto questa estensibilità in stile Dylan sia piacevole a cui accedere, non riesco a portare a un caso d'uso che giustifichi il sovraccarico oltre a "potrebbe rendere alcuni tipi di codice più estendibili negli scenari futuri."

    
posta Skrylar 17.06.2012 - 06:42
fonte

1 risposta

1

Il caso d'uso più importante che posso pensare è quello di far lavorare due librerie / moduli indipendenti con una colla minima.

Questo è abbastanza comune nel mondo Haskell (Haskell consente di creare un tipo (approssimativamente equivalente a una classe in OOP tradizionale) un membro di una classe di caratteri (approssimativamente equivalente a un'interfaccia) indipendente dalla definizione sia del tipo che della classe di caratteri : puoi prendere un tipo T dal modulo A, una classe C dal modulo B e dichiarare T come un'istanza di C nel modulo X. Ad esempio, supponiamo tu abbia una libreria che implementa un tipo di modello di documento DocumentNode , e un'altra libreria che fornisce funzioni per attraversare alberi ed espone un typeclass TreeTraversable per definire quali oggetti può consumare. Nessuna delle due conosce l'altra, ma è possibile fornire una dichiarazione di istanza che associa metodi dalla classe di caratteri (ad esempio isLeaf , childNodes ) alle funzioni del tipo. Come risultato, le librerie non hanno bisogno di dipendere l'una dall'altra: solo il modulo che le unisce dipende da entrambe. Questo meccanismo è molto utile per mantenere le dipendenze tra i moduli e le librerie basse e lo rende fantastico estensibilità a livello di modulo. Il meccanismo non è nemmeno limitato ai tipi di utente: puoi creare qualsiasi tipo di carattere predefinito (ad es. Int ) un membro di qualsiasi classe di caratteri che desideri, e puoi fare in modo che qualsiasi tipo implementi una classe di tipi incorporata (come Ord , che rende un tipo ordinabile).

Un altro esempio potrebbe essere il mix-in, che consente al programmatore di iniettare in modo dinamico i metodi negli oggetti; questo è abbastanza comune in molti linguaggi dinamici, inclusi Python e Javascript. Diversamente dall'esempio di Haskell, questi linguaggi non forniscono alcuna sicurezza di tipo - una classe è fondamentalmente solo un sacchetto di proprietà, e un metodo è solo una proprietà che sembra essere una funzione. Il vantaggio è che questo è relativamente facile da implementare e offre al programmatore una flessibilità totale (qualsiasi metodo può essere incollato su qualsiasi oggetto), ma ovviamente, non si otterranno i vantaggi di un sistema di tipo statico (ma poi, se si ' usando un linguaggio dinamico, hai già deciso di rilasciare il controllo di tipo statico).

    
risposta data 17.06.2012 - 13:34
fonte

Leggi altre domande sui tag