2010-11-18 8 views
5

Voy a crear la tabla de comparación de herramientas de refactorización de C++ automatizadas existentes, así como a explorar la capacidad de creación de dicha herramienta, gratuita y de código abierto.¿Qué refactorizaciones de C++ usas en la práctica?

Mi pregunta es: ¿qué refactorizaciones realmente usa en su trabajo diario? Hay cosas obvias como cambiar el nombre de variable/clase/método, pero ¿hay algo específico para C++, como tratar con plantillas, STL, constructores de copia, inicializadores, etc., etc.?

Estoy interesado en crear una imagen realista de todos los pequeños problemas que el desarrollador de C++ enfrenta cada día en su codificación y que podrían automatizarse al menos en teoría. Estoy hablando con mis colegas, pero eso probablemente no sea suficiente.

Gracias de antemano.

+3

Buena suerte en la creación de un analizador C++ decente para hacer que una herramienta así funcione. –

+0

Cuando estaba desarrollando en C++, no usé mucho soporte de refactorización del IDE. Simplemente no hubo ninguno que encontré realmente útil. Mi consejo sería aprender sus patrones de diseño, leer Meyer's Effective C++, luego 101 Coding Standards. Aprende a hacerlo más o menos desde el principio. –

+0

@Daniel: Refactorización es la herramienta principal de un desarrollador, sea cual sea el programa. Siguiendo el principio de KISS, no te sumerges en los patrones solo por el mero hecho de hacerlo, sino que los usas por partes para lo que necesitas en este momento ... porque no eres un oráculo. –

Respuesta

1

como usted ha dicho que hay cosas obvias:

  • cambio de nombre es una
  • alterar una firma de la función es otra (especialmente desde que una función es casi necesariamente duplica: declaración en la cabecera y la aplicación de la fuente)
  • renombrar/mover un archivo (actualización de incluir directivas)

Tenga en cuenta que aunque es básico, rara vez es así tratado. Mi principal queja es que los comentarios generalmente no están actualizados (no estoy hablando del desorden inútil generado automáticamente por doxygen). Entonces, si estaba describiendo el uso de la clase dentro de un encabezado, o la justificación de usar esta clase en otro archivo fuente, el comentario ahora está obsoleto porque al renombrar la clase nadie sabrá ahora a qué se refiere ...

casos sin embargo mucho más interesantes ahí:

  • al cambiar una firma de función, es necesario actualizar todos los sitios de llamadas, el desarrollador necesitará ayuda para la localización de los
  • con la herencia, la capacidad de actuar en todas las clases de una jerarquía: cambiar una firma de función (una vez más) o agregar/eliminar una anulación virtual.
  • Con plantilla: la propuesta del concepto ha sido eliminada, sería bueno si pudieras sintetizar los requisitos sobre el tipo pasado (métodos/tipos internos necesarios) para que cuando se modifiquen esos requisitos (modificando la definición de la plantilla) se reciba una notificación de la lista de clases que está utilizando esta plantilla y que ya no se ajusta a ella (y se actualizará). Tenga en cuenta que, en caso de que sea simplemente cambiar el nombre del tipo/método, es posible que desee propagar automáticamente el cambio, siempre que no rompa nada más.

Buena suerte ...

+0

Solo renombrar es difícil. Imagine el cambio de nombre de I a J ... donde hay una J en un alcance entre la declaración de I y el uso de I ("sombreado"). Esto incluye ámbitos interpuestos con herencia múltiple; Es posible que J ni siquiera aparezca explícitamente en la declaración del alcance real intermedio. Disfrutar. –

1

Aquí hay un patrón de diseño C++ que surgió ayer: Herencia de zanjas a favor de las políticas.

+1

La primera vez que leí que se me ocurrió * herencia de Ditch a favor de ** política **. * –

+0

¿Alexandrescu no se le ocurrió antes o simplemente se dio cuenta? ¿Qué tan buenas políticas fueron? –

+2

Las políticas usan herencia. – StackedCrooked

1

Una refactorización que deseo fue apoyada en realidad es inyectar método. Más o menos lo contrario de extraer el método.

Porque quizás veo que puedo reorganizar el código resultante para una mayor claridad o efecto; pero no estoy al tanto de que haya soporte de herramientas para esto en este momento.

2

Es bastante claro por las respuestas que pocos programadores de C++ alguna vez han visto una verdadera herramienta de refactorización. Sí, son bastante raros y altamente específicos para el IDE que usa. Eso es inevitable, de lo contrario no hay una buena manera de descubrir qué archivos de código fuente contribuyen con el código al ejecutable final. El preprocesador lo vuelve un desafío adicional, necesita conocer los valores de macro. Se requiere un analizador de código fuente pero no es suficiente.

La asistencia visual para VS es una que yo sepa.

Cuestiones relacionadas