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?
È stato utile?

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:

  1. 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.
  2. Da questo, determinare quali elementi del tipo devono essere pubblici, che dovrebbe essere privata.
  3. funzioni di scrittura di accesso per le parti pubbliche, e il cambiamento chiamando il codice di usarli.
  4. 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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top