Sto cercando di capire come creare l'astrazione su diverse API, che hanno cose comuni. Ad esempio, prendiamo le piattaforme mobili che hai Android, Windows Phone e IOS. Diciamo che voglio creare e API o programma o linguaggio specifico del dominio, che mi consentirà di scrivere un programma e lavorare su tutte le piattaforme indicate. Ovviamente questo è solo un esempio e alla fine tutte le piattaforme hanno molto in comune che mi permettono di scrivere programmi e librerie senza pensare troppo all'astrazione, ad esempio tutti hanno un compilatore C. Un esempio migliore sono i sistemi ERP, diciamo che voglio scrivere lo stesso plug-in per 3 diversi sistemi ERP, come potrei creare astrazioni al di sopra delle loro API che mi permetteranno di scriverlo una volta e di compilarlo (compilarlo o qualunque cosa tu possa chiamare it), e usarlo su tutti i sistemi. Per semplicità diciamo che quei sistemi ERP stanno scrivendo tutti nello stesso linguaggio di programmazione, ma le loro API non hanno nulla o poco in comune in termini di nomi di funzioni ecc. Hanno solo funzionalità simili. Ho pensato di usare la metaprogrammazione, in modo tale che io dica al programma ciò che voglio, e l'utilizzo di una serie di regole diverse per ogni API produrrà programmi per ciascuna delle API. Un altro pensa a ciò che ho pensato è incapsulare tutte le caratteristiche comuni nelle classi, che manterrà il codice (dati) per ogni API, e lo produrrà quando richiederò la funzionalità per una determinata API. Darò un esempio. Diciamo che ho 3 API che hanno tutte classe per la stampa, e i nomi sono come segue:
- Stampante - PrintToLog (Dati)
- Outputer - OutputToLog (Data, lunghezza)
- IO - PrntLogData (Data, logPtr)
Per semplicità, tutte queste classi sono statiche. Potrei creare una classe come questa (pseudo-codice)
Class Printer{
api //holds for which API the code is requested
constructor(API){
this.api = API
}
func logData(Data){
switch API{
case API_1 //let's say the API are stored in ENUM or something similar
return "PrintToLog(" + Data + ")"
case API_2
return "OutputToLog(" + Data + "," + len(Data) + ")" // len returns the lenght of data
case API_3
return "PrntLogData(" + Data + ", /default/log/location)"
}
}
}
Tuttavia non sono sicuro di quanto siano pratici e affidabili quei metodi. Inoltre non ero in grado di trovare molte informazioni per questi tipi per creare astrazioni. Ci sono serie di schemi, metodologie o principi per tali astrazioni?