2010-11-18 12 views
5

ho intenzione di creare la tabella di comparazione di strumenti di refactoring automatizzato esistenti C++, così come esplorare una capacità di creazione di tale strumento, gratuito e open-source.Quali sono i refactoring C++ utilizzati nella pratica?

La mia domanda è: che cosa refactoring si usa davvero nel vostro lavoro quotidiano? Ci sono cose ovvie come rinominare la variabile/classe/metodo, ma c'è qualcosa di specifico per C++, come trattare con modelli, STL, costruttori di copie, inizializzatori, ecc., Ecc.?

Mi interessa costruzione di un'immagine realistica di tutti che i piccoli problemi che C++ sviluppatore si trova ad affrontare ogni giorno nella sua codificazione e che potrebbe essere automatizzato, almeno in teoria. Sto parlando con i miei colleghi ma probabilmente non è abbastanza.

Grazie in anticipo.

+3

Buona fortuna nel creare un parser C++ decente per far funzionare un tale strumento. –

+0

Quando stavo sviluppando in C++ non ho usato molto supporto di refactoring dall'IDE. Semplicemente non c'era nessuno che trovassi veramente utile. Il mio consiglio sarebbe quello di apprendere i modelli di progettazione, leggere Meyer's Effective C++, quindi 101 standard di codifica. Impara a farlo più o meno fin dall'inizio. –

+0

@Daniel: Il refactoring è lo strumento principale di uno sviluppatore, qualunque sia il programma. In linea con il principio KISS, non ti immergerai nei modelli solo per il gusto di farlo, ma usali solo in modo frammentario proprio per quello di cui hai bisogno al momento ... perché non sei un oracolo. –

risposta

1

Come detto ci sono cose ovvie:

  • ridenominazione è uno
  • alterando una firma di funzione è un altro (tanto più che una funzione è quasi necessariamente duplicato: dichiarazione nell'intestazione e l'attuazione nel sorgente)
  • rinominare/spostare un file (aggiornamento includere direttive)

si noti che anche se è di base, è raramente ben affrontato. La mia lamentela principale è che i commenti non sono in genere aggiornati (non parlo quindi della confusione inutile generata da doxygen). Quindi, se io descrivevo l'utilizzo della classe all'interno di un colpo di testa, o la giustificazione di utilizzare questa classe in un altro file sorgente, il commento è ormai obsoleto perché rinominando la classe nessuno ora so a cosa si riferisce ...

ci sono tuttavia molto più interessanti casi:

  • Quando si modifica una firma funzione, è necessario aggiornare tutti i siti di chiamata, lo sviluppatore avrà bisogno di aiuto per la localizzazione di loro
  • Con l'ereditarietà, la capacità di agire su tutte le classi di una gerarchia: modifica di una firma di funzione (ancora una volta) o aggiunta/rimozione di una sovrascrittura virtuale.
  • Con modello: la proposta di Concetto di una caduta, sarebbe bene se si potesse sintetizzare i requisiti sul tipo passato (metodi/tipi di interni indispensabili) in modo che quando alterare tali requisiti (modificando la definizione del modello) si ha notificato dell'elenco di classi utilizzate da questo modello e non più conformi ad esso (e devono essere aggiornate). Si noti che nel caso in cui si sta solo rinominando il tipo/metodo, è possibile che si desideri propagare automaticamente la modifica, a condizione che non infranga qualcos'altro.

Buona fortuna ...

+0

La semplice rinomina è difficile. Immagina di rinominare I in J ... dove c'è una J in un ambito tra la dichiarazione di I e l'uso di I ("shadowing"). Ciò include ambiti di intervento con ereditarietà multipla; J potrebbe non apparire nemmeno esplicitamente nella dichiarazione dell'intervento intervenente. Godere. –

1

Ecco un modello di progettazione C++ che ho elaborato ieri: ereditarietà di Ditch a favore delle politiche.

+1

La prima volta che ho letto che mi è venuta in mente l'ereditarietà di * Ditch a favore di ** politics **. * –

+0

Alexandres non l'ha inventato prima di te o l'hai appena realizzato quanto buone politiche dove? –

+2

I criteri utilizzano l'ereditarietà. – StackedCrooked

1

Una refactoring che desidero è stata sostenuta in realtà è iniettare metodo. Più o meno il contrario del metodo estratto.

Perché forse vedo che posso quindi riorganizzare il codice risultante per migliorare la chiarezza o l'effetto; ma non sono a conoscenza del fatto che al momento vi sia un supporto per gli strumenti.

2

È abbastanza chiaro dalle risposte che pochi programmatori C++ hanno mai visto un vero strumento di refactoring. Sì, sono abbastanza rari e altamente specifici per l'IDE che utilizzi. Questo è inevitabile, altrimenti non esiste un buon modo per scoprire quali file del codice sorgente contribuiscono al codice dell'eseguibile finale. Il preprocessore lo rende particolarmente complicato, devi conoscere i valori della macro. È necessario un parser del codice sorgente ma non sufficiente.

Visual Assist per VS è uno che conosco.

Problemi correlati