migrazione del codice C ++ da strutture a classi
-
03-10-2019 - |
Domanda
sto migrando qualche codice C ++ dalle strutture alle classi.
Stavo usando strutture principalmente per ottimizzazioni bit-field, che non ho bisogno di più (io sono più preoccupato per la velocità di risparmio di spazio ora).
- Quali sono le linee guida generali per fare questa migrazione? Sono ancora in fase di progettazione in quanto questo è un grande passo che colpisce una parte importante del codice. Voglio pianificare tutto prima di farlo. Che cosa sono tutte le cose essenziali che dovrei tenere a mente?
Soluzione
Non riesco a nome tutti le cose essenziali, ma posso citarne uno:. incapsulamento
L'unica differenza tecnica in C ++ tra struct e di classe è l'accesso predefinito. In una struttura, tutto è pubblico per default; in una classe, tutto è privato. Sto assumendo che si sta parlando di POD struct qui, dove tutto è pubblico.
Quello che vorrei fare è questo:
- Cambia la parola chiave per
struct
class
e vedere dove chiamando pause di codice. Che possa dare un indizio su ciò che sono utilizzati parti del tipo dove. - Da questo, determinare quali elementi del tipo devono essere pubblici, che dovrebbe essere privata.
- funzioni di scrittura di accesso per le parti pubbliche, e il cambiamento chiamando il codice di usarli.
- Spostare il codice che ha bisogno di accedere a parti private nella classe stessa.
Altri suggerimenti
Quando si aggiorna una base di codice legacy da C a C ++, la mia esperienza è che c'è molto poco valore e del tutto troppo sforzo coinvolti nella realtà riprogettare l'applicazione per le strutture convertire in oggetti tradizionali C ++. Perché non fare errore, questo è è quello che si finisce per fare. Non sembrerà in un primo momento, ma alla fine vi renderete conto che stai ridisegnando l'applicazione.
Non c'è dire abbastanza su che cosa i vostri obiettivi sono, così forse questo è il vostro obiettivo, ma se si sta solo cercando di convertire in C ++ in modo nuovo codice nella vostra applicazione può essere C ++, basta rinominare i file, aggiungere un mucchio di calchi in cui le conversioni implicite da * vuoto si verificavano prima, e andare avanti con la tua vita.
Non v'è alcuna differenza significativa tra strutture e classi C ++ (differiscono solo per visibilità predefinita). Non mi preoccuperei di migrare le strutture per le classi a meno che non si sta per aggiungere comportamenti significativi pure.
prima , mi unirò agli altri e dire che spostando tutto il codice da strutture di classi non può essere la mossa migliore. Se si dovesse fare bene (cioè, più di un semplice cambiamento struct X {
con class X { public:
) che significa ridisegnare l'applicazione (più o meno una completa riscrittura).
Si tratta di introdurre nuovi bug, nuovi cicli di sviluppo, test in più, cambiando la documentazione e così via.
Secondo , considerando che si può avere validi motivi per fare questo (per me "just for fun" e "per vedere se riesco a farlo" può essere validi motivi, in alcune situazioni: D) qui sono le mie risposte alle tue domande:
1. What are the general guidelines for doing this migration?
2. What are all the essential things I should keep in mind?
Linee guida e cose da tenere a mente:
-
lavoro in piccolissime iterazioni , e assicurarsi che l'applicazione è funzionale tra iterazioni. Se si dispone di unità di test definiti, è possibile lavorare il vostro senso attraverso di loro (scegliere una sola unità, ridisegnare a seguito di una serie di passaggi (vedi sotto), quindi adattarsi ed eseguire le prove.
-
scegliere una zona del codice e finirlo .
-
cercare di seguire questi passaggi per ogni cambio:
- analizzare la funzionalità e ridisegnare
- creare la nuova implementazione in parallelo con il vecchio
- interruttore nella nuova implementazione in tutto il mondo quello vecchio viene utilizzato
- prova che l'applicazione funziona ancora
- rimuovere il vecchio codice
- prova che l'applicazione funziona ancora
-
Se non stai facendo in questo momento, iniziare a utilizzare un software di controllo del codice sorgente ramificazione . Niente di meno piuttosto lo taglia. Mi raccomando Mercurial, ma capisco GIT ha circa le stesse caratteristiche. Mi ringrazierai più tardi:. O)
-
Esegui modifiche transazionale (iniziare con una zona e finire, senza l'aggiunta di modifiche provenienti da altre zone, mentre le modifiche per il primo sono a metà). Se si utilizza una ramificazione sorgente di controllo e più sviluppatori si può avere un cambio / zona per sviluppatore alla volta, poi centralizzare le modifiche.
I vantaggi di una metodologia di refactoring:
-
i soggiorni applicazione funzionale se si decide a metà che lo sforzo non vale la pena (o se la gestione decide lo sforzo non vale la pena)
-
la stabilità dell'applicazione rimane gestibile attraverso i cambiamenti
Se si stabilisce alcune pietre miliari questo dovrebbe essere abbastanza gestibile.
Buona fortuna!