2009-04-29 27 views
11

Recientemente he estado trabajando a través de una gran base de código, refactorizando y en general mejorando el diseño para aumentar la cobertura. Además, en bastantes archivos eliminé declaraciones de uso excesivo, moví métodos para que una funcionalidad similar esté muy cerca, haya agregado regiones, etc. pero en realidad no haya cambiado la funcionalidad del código en el archivo.¿Existen herramientas de combinación para el control de código fuente que entienden el código?

Mientras tanto, en otras partes del equipo, otros desarrolladores están corrigiendo errores y cambiando líneas de código aquí y allá. Obviamente, cuando se trata de fusionar esto puede ser un problema ya que los números de línea ya no coinciden y es posible que los métodos se hayan movido.

Ahora, entiendo la regla general de que en un entorno controlado por fuente puede ser peligroso mover los métodos, y decidimos que el beneficio superaba el costo. Sin embargo, lo que no entiendo es por qué debería ser así.

decir que mi archivo inicial era una calculadora sencilla:

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

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

Y decidí que quería que los métodos sean alfabético:

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

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

Mientras que otro desarrollador arregló el fallo en el método de resta

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

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

Una herramienta de fusión estándar probablemente requeriría que combine manualmente la Se dos archivos, pero uno que entiende la funcionalidad del código fácilmente podría conciliar estos dos cambios. Lo mismo aplica para eliminar o agregar otros métodos, comentarios, regiones o usar declaraciones.

Entonces, para (¡finalmente!) Llegar a la pregunta: ¿Existen herramientas de fusión que tengan una comprensión inteligente de la funcionalidad del código y podrían fusionar los dos archivos anteriores sin ninguna intervención humana? ¿Si no, porque no? ¿Hay alguna complicación que haga de este un problema irresoluble (por supuesto, entiendo que no es tan simple como estoy implicando, pero es imposible por alguna razón que no puedo ver?)

Yo uso C# en mi código fuente y me encantaría algo que funcionó con eso, pero estoy interesado en si esta existe en cualquier parte del mundo de la programación ...


ya estoy realmente preocupado por la longitud de esta cuestión, pero corregido para agregar cómo esperaría que el sistema de fuente inteligente funcione:

Cuando el archivo inicial de la calculadora se verificó en el sistema, p culo el archivo y crear una jerarquía de la clase:

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

(Con líneas adicionales en ese país para los frenos, etc ...)

Cuando compruebo en mi código (haciendo que los métodos alfabéticos) que actualiza la jerarquía arriba para que Restar se convierta en Método [1] y Agregar se convierte en Método [0].

El segundo desarrollador verifica su código (que obviamente el sistema de control de origen sabe que estaba basado en el original) y nota el cambio a la primera línea en restar. Ahora, en lugar de encontrar ese número de línea por línea en el archivo general, sabe que puede encontrarlo como Calculator.cs/Calculator/Resta/0 y el hecho de que el método haya cambiado de ubicación no importa, aún puede hacer que el fusionar el trabajo.

+0

¿Cuál debería ser el resultado de la conciliación "automática"? El problema no es tanto entender el idioma como entender la intención de los programadores, ¡y eso requeriría telepatía! –

+0

Hubiera pensado que un sistema que entendía la funcionalidad del código y podía separarlo del diseño vería que el primer cambio era puramente de diseño, así que aplique eso al diseño del archivo y el segundo cambio era puramente función, así que aplique ese cambio al método en el que tuvo lugar el cambio funcional, dondequiera que ese método pueda ser ahora. –

+0

Mi sospecha es que tal bestia no existe, pero me gustaría ver algunas otras respuestas. Tengo la sensación de que un sistema de este tipo estaría bordeando la IA y conduciría a SkyNET VCS. ;) –

Respuesta

3

Creo que Source Code in Database es una posible respuesta a su pregunta. La idea general es que no tienes archivos de versión, sino bloques de código de versión. El sistema de control de versiones conoce el código DOM y le permite realizar consultas sobre el código DOM para ver funciones, clases, lo que usted tiene, para editar, compilar, etc.

Dado que el orden de los métodos no No necesariamente importa, no están almacenados en la base de datos con ningún orden en mente. Cuando revisa la clase, puede especificar el orden que más le guste (alfabético, público/protegido/privado, etc.). Los únicos cambios que importan son los que cambian + a -. No tendrás un conflicto debido a la reordenación de los métodos.

Desafortunadamente, SCID todavía es MUY joven y no hay muchas herramientas para eso. Sin embargo, es una evolución bastante interesante en la forma en que uno ve y edita el código.

Editar:Here's another reference for SCID

+0

Gracias por los enlaces, parece la idea correcta y, curiosamente, cuando escribía "Con líneas adicionales para llaves, etc ..." en mi edición anterior pensé: "Atornille las llaves, deje que el sistema de control de fuente las agregue" y finaliza las guerras de tab/space "pero no quería nublar el problema. Es bueno ver que nos dirigimos de esa manera, incluso si todavía no estamos allí. –

4

Nuestro enfoque con Plastic SCM está todavía lejos de ser "completa", pero ya está liberado y puede ayudar en este tipo de situaciones. Eche un vistazo al Xmerge. Por supuesto, los comentarios serán más que bienvenidos y otorgará algunas licencias gratuitas ;-)

+2

Se ve bien, aunque obviamente no es el 100% de la funcionalidad que esperaba (todavía). ¿La herramienta de fusión está disponible por separado? Lamentablemente, no tengo el poder de organizar un cambio completo del sistema SCM donde trabajo, pero una versión de escritorio de esa funcionalidad XMerge podría ser muy útil. –

+0

Normalmente no, pero escríbanos un correo electrónico de soporte (soporte en codicesoftware.com) y hablaremos al respecto – pablo

+0

Y también verifique esto: http://codicesoftware.blogspot.com/2010/07/xmerge-to -merge-refactored-code.html, es nuestro nuevo Xmerge con un soporte de refactor aún mejor. ¡Espero que te guste! – pablo

Cuestiones relacionadas