2009-04-29 17 views
11

Recentemente ho lavorato a un codice numeroso di grandi dimensioni, refactoring e in generale migliorando il design per aumentare la copertura. Inoltre, in alcuni file ho rimosso le istruzioni di eccesso in eccesso, spostato i metodi in modo che funzionalità simili fossero vicine tra loro, aggiunte regioni ecc. Ma non effettivamente modificate la funzionalità del codice nel file.Esistono strumenti di unione per il controllo del codice sorgente che comprendono il codice?

Nel frattempo, altrove nel team altri sviluppatori stanno correggendo bug e cambiando righe di codice qua e là. Ovviamente quando si tratta di unire questo può essere un problema poiché i numeri di riga non corrispondono più e i metodi potrebbero essersi spostati.

Ora capisco la regola generale che in un ambiente controllato da sorgenti può essere una cosa pericolosa spostare i metodi e abbiamo deciso che il vantaggio ha superato il costo. Ciò che non capisco tuttavia è perché dovrebbe essere così.

dire che il mio file iniziale era una semplice calcolatrice:

public class Calculator 
{ 
    public int Subtract(int a, int b) 
    { 
     return a + b; 
    } 

    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

E ho deciso che volevo i metodi da alfabetico:

public class Calculator 
{ 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 

    public int Subtract(int a, int b) 
    { 
     return a + b; 
    }   
} 

Mentre un altro sviluppatore risolto il bug nel metodo di sottrazione

public class Calculator 
{ 
    public int Subtract(int a, int b) 
    { 
     return a - b; 
    } 

    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

Uno strumento di unione standard richiederebbe probabilmente di unire manualmente il Se due file, ma uno che comprendeva la funzionalità del codice sarebbe facilmente in grado di riconciliare queste due modifiche. Lo stesso vale per la rimozione o l'aggiunta di altri metodi, commenti, regioni o istruzioni.

Quindi, per (finalmente!) Arrivare alla domanda: ci sono strumenti di unione che hanno una comprensione intelligente della funzionalità del codice e potrebbero unire i due file sopra senza alcun intervento umano? Se no, perché no? Ci sono delle complicazioni che rendono questo problema irrisolvibile (ovviamente è comprensibile che non sia così semplice come sto insinuando - ma è impossibile per qualche motivo che non riesco a vedere?)

Io uso C# in il mio codice sorgente e mi piacerebbe qualcosa che ha funzionato con quello, ma io sono interessato a se questo esiste in qualsiasi parte del mondo della programmazione ...


io sono già molto preoccupato per la lunghezza di questa domanda, ma modificato per aggiungere come mi aspetto che il sistema di origine intelligente funzioni:

Quando il file della calcolatrice iniziale è stato controllato nel sistema ass il file e creare una gerarchia della classe:

File: Calculator.cs 
| 
|--Class[0]: Calculator 
    | 
    |--Method[0]: Subtract 
     | 
     |--Line[0]: return a + b; 
    | 
    |--Method[1]: Add 
     | 
     |--Line[0]: return a +b; 

(Con le linee in più in là per bretelle ecc ...)

Quando controllo nel mio codice (rendendo i metodi alfabetico) aggiorna la gerarchia superiore in modo tale che Sottrai diventa Metodo [1] e Aggiungi diventa Metodo [0].

Il secondo sviluppatore controlla il suo codice (che ovviamente il sistema di controllo del codice sorgente era basato sull'originale) e nota la modifica alla prima riga in sottrazione. Ora, invece di trovare quel numero linea per riga nel file generale, sa che può trovarlo Calculator.cs/Calculator/Subtract/0 e il fatto che il metodo abbia cambiato posizione non ha importanza, può comunque fare il unire il lavoro

+0

Quale dovrebbe essere il risultato della riconciliazione "automatica"? Il problema non è la comprensione della lingua tanto quanto la comprensione dell'intento dei programmatori - e questo richiederebbe la telepatia! –

+0

Avrei pensato che un sistema che comprendesse la funzionalità del codice e potesse separarlo dal layout vedrebbe che il primo cambiamento era puramente layout, quindi applicalo al layout del file e la seconda modifica era puramente funzionale, quindi applica quel cambiamento al metodo in cui è avvenuto il cambiamento funzionale, ovunque quel metodo possa essere ora. –

+0

Il mio sospetto è che una tale bestia non esista, ma mi piacerebbe vedere altre risposte. Ho la sensazione che un sistema del genere starebbe al limite con l'intelligenza artificiale e porterebbe a SkyNET VCS. ;) –

risposta

3

Penso che Source Code in Database sia una potenziale risposta alla tua domanda. L'idea generale è che non si eseguono i file di versione, i blocchi di versione del codice. Il sistema di controllo delle versioni conosce il codice DOM e consente di eseguire una query sul codice DOM al fine di controllare funzioni, classi, what-have-you, per la modifica, la compilazione, ecc.

Poiché l'ordine dei metodi non 'necessariamente importa, non sono memorizzati nel Database con qualsiasi ordine in mente. Quando controlli la lezione, puoi specificare l'ordine che ti piace di più (in ordine alfabetico, pubblico/protetto/privato, ecc.). Le uniche modifiche che contano sono quelle in cui si cambia lo + in un -. Non avrai un conflitto a causa del riordino dei metodi.

Sfortunatamente, SCID è ancora MOLTO giovane e non ci sono molti strumenti là fuori per questo. Tuttavia, è un'evoluzione abbastanza interessante nel modo in cui uno visualizza e modifica il codice.

Edit:Here's another reference for SCID

+0

Grazie per i collegamenti, sembra l'idea giusta e abbastanza divertente quando stavo scrivendo "Con le linee extra in là per parentesi graffe ecc ..." nella mia modifica sopra ho effettivamente pensato "Avvitare le parentesi, lasciare che il sistema di controllo del codice sorgente li aggiunga e terminare le guerre tab/space ", ma non volevo appannare il problema. È bello vedere che ci stiamo dirigendo in quel modo anche se non siamo ancora arrivati. –

4

Il nostro approccio con Plastic SCM è ancora lontano dall'essere "completo", ma è già stato rilasciato e può aiutare in questo tipo di situazioni. Dai uno sguardo allo Xmerge. Naturalmente, il feedback sarà più che benvenuto e concederà alcune licenze gratuite ;-)

+2

Sembra buono, anche se ovviamente non al 100% della funzionalità che speravo (ancora). Lo strumento di unione è disponibile separatamente? Sfortunatamente non ho il potere di organizzare un cambio completo del sistema SCM dove lavoro, ma una versione desktop di quella funzionalità XMerge potrebbe essere molto utile. –

+0

Normalmente no, ma mandaci una riga alla nostra email di supporto (supporto a codicesoftware.com) e ne parliamo – pablo

+0

E anche controllare questo: http://codicesoftware.blogspot.com/2010/07/xmerge-to -merge-refactored-code.html, è il nostro nuovo Xmerge con supporto refactoring ancora migliore. Spero ti piaccia! – pablo

Problemi correlati