Scrivere tipi, interfacce e classi / metodi multipiattaforma in C ++

1

Sto cercando la migliore soluzione per scrivere software multipiattaforma, ovvero il codice che scrivo e che devo interfacciare ogni volta con diverse librerie e piattaforme.

Quello che considero la parte più semplice, correggermi se ho torto, è la definizione di nuovi tipi, tutto quello che devo fare è scrivere un file hpp con un elenco di typedefs , posso mantenere gli stessi nomi per ogni nuovo tipo attraverso le diverse piattaforme in modo che il mio codebase possa essere condiviso senza problemi. typedefs mi aiuta anche a ridefinire un ambito migliore per i miei tipi nel mio codice.

Probabilmente finirò per avere qualcosa di simile a questo:

include
|-windows
| |-types.hpp
|-linux
| |-types.hpp
|-mac
  |-types.hpp

Per le interfacce penso alla stessa soluzione utilizzata per i tipi, una serie di file hpp, probabilmente scriverò tutte le interfacce solo una volta poiché si basano sui tipi e tutta la "portabilità cross-platform" è garantita dal lavoro svolto sui tipi.

include
|
|-interfaces.hpp
|
|-windows
| |-types.hpp
|-linux
| |-types.hpp
|-mac
| |-types.hpp

Per classi e metodi non ho una risposta reale, vorrei evitare 2 cose:

  • l'uso esplicito di puntatori
  • l'uso dei modelli

Voglio evitare l'uso dei puntatori perché possono rendere il codice meno leggibile per qualcuno e voglio evitare i template solo perché se li scrivo, non riesco a separare l'interfaccia dalla definizione.

Qual è l'opzione migliore per nascondere l'uso dei puntatori?

Vorrei anche qualche parola sulle macro e su come implementare alcune chiamate e definizioni specifiche del sistema operativo.

    
posta user827992 29.06.2012 - 22:20
fonte

3 risposte

1

Il modo più semplice per pensare alla programmazione multipiattaforma è che hai bisogno di una strategia per affrontare i cambiamenti nel comportamento dell'ambiente del programma, nello spazio (ie diverse architetture hardware e sistemi operativi) e nel tempo (cioè diverse versioni di un sistema operativo con nuove funzionalità e diversi bug). Esiste già un schema per l'implementazione delle strategie .

Puoi immaginare di definire un tipo polimorfico con funzioni membro che definiscono la "logica" di ciò che stai cercando di fare. Queste funzioni membro chiamano funzioni membro astratte che sono responsabili per intrattenere le esigenze della piattaforma sottostante. I client chiamano un metodo factory per ottenere un'istanza della classe: il metodo factory sceglie quale implementazione concreta restituire in base ai dettagli della piattaforma.

Questo approccio si traduce in un'interfaccia pubblica senza modelli e (con le informazioni che conosco del problema) nessun uso esplicito del puntatore. I client chiamano semplicemente un metodo factory e quindi usano l'interfaccia pubblica sulla tua classe base virtuale. Inoltre nasconde completamente tutta la complessità che vuoi introdurre riguardo alle intestazioni e alle loro posizioni: i tuoi clienti includono solo le intestazioni per i tuoi tipi virtuali.

    
risposta data 15.07.2012 - 18:11
fonte
0

Il miglior esempio di codifica per piattaforme multiple che conosco è " Apache Portable Runtime "

Questa è un'eccellente libreria C che è stata inizialmente scritta per spostare tutto il codice dipendente dalla piattaforma OS fuori se il fork principale del codice del server web Apache.

Potrebbe essere o non essere adatto per il tuo uso (a causa delle restrizioni di licenza o se hai davvero bisogno del codice C ++). In entrambi i casi è un eccellente esempio di come isolare le dipendenze della piattaforma del modulo di codice e, ci sono alcuni ottimi esempi su come gestire la stranezza della piattaforma.

    
risposta data 16.07.2012 - 11:03
fonte
-3

Da quanto tempo stai programmando e quale dimensione delle applicazioni?

Questa domanda è non la "chi credi di essere?" gentile, ma indica il problema fondamentale di tutti i quadri. Sia che si tratti di un semplice modulo parser stream, di un gestore della GUI o di "frame globale indipendente dalla piattaforma", devono limitare la codifica diretta e, in sostituzione, fornire un servizio equivalente o migliore per "qualsiasi" attività che potrebbe apparire. Devi aver visto molti problemi prima di iniziare qualsiasi framework .

Ho trascorso 20 anni in programmazione, ho cercato continuamente i concetti chiave di questo "quadro definitivo" e mi sono reso conto che ho sempre guidato "nella direzione sbagliata su un'autostrada". Penso di avere alcune risposte da considerare , quelle che si applicano qui sono:

  • la domanda è sbagliata. Indipendenza dalla piattaforma significa indipendenza linguistica : esistono piattaforme in cui C ++ non è disponibile o non la migliore risposta;
  • quindi non perdere tempo nell'implementare trucchi linguistici per C ++, in qualche modo limitano i servizi di tutte le piattaforme. Abituati all'idea che genererai quei file di intestazione da una dichiarazione di tipo esterna (quindi veramente indipendente dalla piattaforma, come JSON); -)

Dopo i commenti e i downvotes, ho deciso di aggiungere quanto segue:

  • Quando ho menzionato gli anni, volevo esprimere l'importanza dell'apprendimento dagli errori. Potresti pensare che le tue prime idee siano perfette e che i codici siano privi di errori. I miei codici hanno sempre bug, anche se faccio del mio meglio per evitarli - e i miei concetti si sono formati durante la creazione di diversi framework sotto le applicazioni "IRL". Erano abbastanza deboli per le prime volte, e ho dovuto lanciare diverse versioni e imparare molto da quelle esperienze. Questo è solo un avvertimento e una ragione per cui i miei risultati dovrebbero essere considerati (e non accettati solo per quello).
  • Non volevo fare alcun "auto marketing" qui, ho pensato che chiunque fosse interessato a giudicare le mie parole avrebbe controllato anche il mio profilo. In caso contrario: qui puoi vedere ciò che chiamo programmazione indipendente dalla piattaforma, e per gli impazienti, un breve riassunto potrebbe spiegare perché ho trascorso quasi 20 anni.

Cheerio!

    
risposta data 16.07.2012 - 08:56
fonte

Leggi altre domande sui tag