Escritura de código fuente

Debido a que KDevelop entiende el código fuente de sus proyectos, le puede ayudar al escribir más código fuente. Lo siguiente ilustra algunas de las formas en las que hace esto.

Terminación automática

Probablemente, una de las características más útiles cuando se escribe código es la terminación automática. Considere, por ejemplo, el siguiente código:

class Car {
  // ...
  public:
    std::string get_color () const;
};
void foo()
{
  Car my_ride;
  // ... hacer algo en esta variable...
  std::string color = my_ride.ge

En la última línea, KDevelop recordará que la variable my_ride es de tipo Car, y ofrecerá completar de forma automática el nombre de la función miembro ge como get_color. De hecho, todo lo que tiene que hacer es seguir tecleando hasta que la función de terminación automática haya reducido el número de coincidencias a una, y luego pulsar la tecla Intro:

Tenga en cuenta que puede hacer clic sobre la ayuda emergente para obtener más información sobre la función, además de su tipo de valor devuelto y de si es pública o no:

La terminación automática puede ahorrarle bastantes pulsaciones de teclas si su proyecto usa nombres largos para funciones y variables; además, evita que escriba mal estos nombres (y los consiguientes errores del compilador) y hace que sea más fácil recordar los nombres exactos de las funciones; por ejemplo, si todos sus «getters» comienzan por get_, la función de terminación automática solo le mostrará la lista de los posibles «getters» en cuanto haya tecleado las cuatro primeras letras, probablemente recordándole durante el proceso cuál de las funciones es la correcta. Tenga en cuenta que para que funcione la terminación automática, no hace falta que la declaración de la clase Car ni la variable my_ride estén en el mismo archivo donde esté escribiendo código. KDevelop tiene que saber que dichas clases y variables están conectadas; es decir, los archivos en los que se realizan estas conexiones tienen que ser parte del proyecto en el que esté trabajando.

Nota

KDevelop no siempre sabe cuándo debe ayudarle a completar código. Si la ayuda emergente de terminación automática no se muestra, pulse Ctrl+Espacio para abrir de forma manual la lista de terminaciones. En general, para que funcione la terminación automática, KDevelop necesita analizar sus archivos de código fuente. Esto se realiza en segundo plano con todos los archivos que forman parte de los proyectos de la sesión actual en cuanto inicia KDevelop, así como cuando deja de teclear durante una fracción de segundo (esta pausa se puede configurar).

Nota

KDevelop analiza únicamente los archivos que considera de código fuente, según se determina por el tipo MIME del archivo. Este tipo no se fija antes de la primera vez que se guarda un archivo; por lo tanto, cuando cree un nuevo archivo y comience a escribir código en él, no se activará el análisis para la terminación automática hasta que lo haya guardado por primera vez.

Nota

Al igual que en la nota anterior, para que funcione la terminación automática, KDevelop debe ser capaz de encontrar declaraciones en los archivos de cabecera. Para ello, busca en cierto número de rutas por omisión. Si no encuentra automáticamente un archivo de cabecera, subrayará en rojo su nombre; en este caso, pulse con el botón derecho del ratón sobre él para indicarle a KDevelop de forma explícita dónde puede encontrar dicho archivo y qué información proporciona.

Nota

La configuración de la terminación automática se describe en esta sección de este manual.

Añadir nuevas clases e implementar funciones miembro

KDevelop tiene un asistente para añadir nuevas clases. El procedimiento se describe en Creación de una nueva clase. Se puede crear una clase sencilla de C++ escogiendo la plantilla de C++ básico en la categoría Clase. En el asistente podemos escoger algunas funciones miembro predefinidas, como, por ejemplo: un constructor vacío, un constructor de copia o un destructor.

Tras completar el asistente, se crean los nuevos archivos y se abren en el editor. El archivo de cabecera ya contiene salvaguardas de inclusión y la nueva clase posee todas las funciones miembro que hayamos seleccionado. Los dos siguientes pasos deberían ser documentar la clase y sus funciones miembro, y luego implementarlas. Más adelante hablaremos sobre cómo documentar clases y funciones. Para implementar las funciones especiales que ya hemos añadido, iremos la pestaña bus.cpp, donde ya se ha proporcionado un esqueleto para las funciones.

Para añadir nuevas funciones miembro, vuelva a la pestaña bus.h y añada el nombre de una función. Por ejemplo, añadamos esta:

Tenga en cuenta cómo hemos empezado ya con la implementación. No obstante, en muchos estilos de programación, la función no se debe implementar en el archivo de cabecera sino en el correspondiente archivo .cpp. Para ello, sitúe el cursor sobre el nombre de la función y seleccione CódigoMover al código fuente o pulse Ctrl+Alt+S. Esto eliminará del archivo de cabecera el código que hay entre las llaves (sustituyéndolo por un punto y coma como es debido para terminar la declaración de la función) y lo moverá al archivo de código fuente:

Tenga en cuenta cómo hemos comenzado a escribir y que queremos insinuar que la variable students debe ser probablemente miembro de la clase Bus, aunque aún no la hemos añadido. Note también cómo la subraya KDevelop para dejar claro que no sabe nada sobre la variable. Pero este problema se puede resolver: si pulsa sobre el nombre de la variable se muestra la siguiente ayuda emergente:

(Se puede conseguir lo mismo haciendo clic sobre ella con el botón derecho y seleccionando Resolver: Declarar como). Seleccionemos 3 - private unsigned int (con el ratón o pulsando Alt+3) y veamos cómo se muestra en el archivo de cabecera:

Vale la pena tener en cuenta que KDevelop extrae el tipo de la variable a declarar de la expresión usada para inicializarla. Por ejemplo, si hemos escrito la adición del siguiente modo ambiguo, habría sugerido declarar la variable de tipo double:

Como observación final, el método que usa CódigoMover al código fuente no siempre inserta la nueva función miembro donde usted desearía. Por ejemplo, es posible que quisiera marcarla como inline y situarla al final del archivo de cabecera. En este caso, escriba la declaración al principio escribiendo la definición de la función como sigue:

KDevelop ofrece de forma automática todas las posibles terminaciones de lo que debe aparecer aquí. Si selecciona una de las dos entradas add_students, se muestra el siguiente código que ya rellena la lista de argumentos completa:

Nota

En el ejemplo, si se acepta una de las opciones, la herramienta de terminación automática ofrece la firma correcta; pero, por desgracia, borra el marcador inline que ya estaba escrito. Se ha informado de este problema como Bug 274245 de KDevelop.

Documentar declaraciones

El buen código está bien documentado, tanto a nivel de la implementación de algoritmos dentro de las funciones como a nivel de la interfaz — es decir, las clases, las funciones (miembro y globales) y las variables (miembro y globales) deben estar documentadas para explicar su propósito, los posibles valores de los argumentos, las condiciones previas y posteriores, etc. Por lo que a la documentación de la interfaz se refiere, doxygen se ha convertido en el estándar de facto para formatear comentarios que luego se pueden extraer y mostrar en páginas web en las que se pueden realizar búsquedas.

KDevelop permite usar este estilo de comentarios mediante un acceso rápido de teclado para generar la infraestructura de los comentarios que documentan una clase o una función miembro. Por ejemplo, suponiendo que ya ha escrito el siguiente código:

class Car {
  public:
    std::string get_color () const;
};

Ahora desea añadir documentación tanto a la clase como a la función miembro. Para ello, mueva el cursor a la primera línea y seleccione CódigoDocumentar declaración o pulse Alt+Mayúsculas+D. KDevelop le responderá con lo siguiente:

El cursor ya está en el área de color gris para que pueda rellenar la descripción corta (tras la palabra clave de doxygen @brief) de esta clase. Después puede continuar añadiendo documentación a este comentario que dé una descripción más detallada de lo que hace la clase:

Mientras el editor esté dentro del comentario, el texto comentado se resalta en verde (y volverá a su color normal en cuanto mueva el cursor fuera del comentario). Cuando llegue al final de una línea, pulse Intro para que KDevelop cree de forma automática una nueva línea que comience con un asterisco y sitúe el cursor dos caracteres más a la derecha.

Ahora vamos a comentar la función miembro, situando de nuevo el cursor sobre la línea de la declaración y seleccionando CódigoDocumentar declaración o pulsando Alt+Mayúsculas+D:

De nuevo, KDevelop genera automáticamente el esqueleto del comentario, incluyendo la documentación para la función, así como el tipo de dato que devuelve. En el caso actual, el nombre de la función es bastante autoexplicativo, pero a veces los argumentos de la función pueden no estar presentes y se deben comentar de forma individual. Para ilustrar este punto, consideremos una función un poco más interesante y el comentario que KDevelop genera de forma automática:

Aquí, el comentario sugerido ya contiene todos los campos de Doxygen para los distintos parámetros, por ejemplo.

Cambiar el nombre de variables, funciones y clases

A veces es necesario cambiar el nombre de una función, clase o variable. Por ejemplo, supongamos que ya tenemos esto:

Entonces caemos en la cuenta de que no nos gusta el nombre remove_students y que hubiera sido mejor llamarla, por ejemplo, throw_out_students. Podríamos realizar una búsqueda con sustitución del nombre, pero eso conllevaría un par de problemas:

  • La función se puede usar en más de un archivo.

  • Lo único que realmente queremos hacer es cambiar el nombre de esta función y no tocar otras funciones que pudieran tener el mismo nombre y que estuvieran declaradas en otras clases o espacios de nombres.

Ambos problemas se pueden solucionar situando el cursor sobre cualquiera de las apariciones del nombre de la función y seleccionando CódigoCambiar nombre de la declaración (o pulsando con el botón derecho del ratón sobre su nombre y seleccionando la opción Cambiar nombre de Bus::remove_students). Esto mostrará un diálogo donde podrá introducir el nuevo nombre de la función y donde también podrá ver todos los lugares donde se está usando realmente la función:

Fragmentos de código

La mayoría de los proyectos contienen trozos de código que es necesario escribir frecuentemente en el código fuente. Algunos ejemplos son: para los escritores de compiladores, un bucle para todas las instrucciones; para los escritores de interfaces de usuario, comprobaciones de que la entrada del usuario es válida y, en caso contrario, mostrar un mensaje de error; en el proyecto del autor de estas líneas, sería código del tipo

for (typename Triangulation::active_cell_iterator
       cell = triangulation.begin_active();
     cell != triangulation.end(); ++cell)
  ... hacer algo con la celda...

En lugar de teclear este tipo de texto una y otra vez (con los errores tipográficos repetitivos que se suelen cometer), la herramienta de Fragmentos de código de KDevelop puede serle de ayuda. Para ello, abra el visor de la herramienta (consulte Herramientas y visores si el botón correspondiente aún no está presente en el borde de la ventana). A continuación, pulse el botón Añadir repositorio (un nombre poco apropiado, ya que le permite crear una colección identificada por su nombre que contiene fragmentos de código fuente para un propósito particular, como, por ejemplo, código fuente de C++) para crear un repositorio vacío. Pulse después para añadir un fragmento de código, con lo que se le mostrará un diálogo como el siguiente:

Nota

El nombre del fragmento no debe contener espacios ni otros caracteres especiales, pues debe parecerse a cualquier nombre de función o variable normal (por motivos que se aclararán en el siguiente párrafo)

Para usar un fragmento definido de este modo cuando esté editando código fuente, escriba el nombre de dicho fragmento como haría con cualquier otro nombre de función o de variable. Este nombre también estará disponible para la terminación automática de texto (lo que significa que no hay ningún peligro al usar un nombre largo y descriptivo para un fragmento, como el anterior), por lo que cuando acepte la sugerencia de la ayuda emergente de terminación automática (por ejemplo, pulsando la tecla Intro), la parte del nombre del fragmento ya introducida se sustituirá con todo el texto que contiene el fragmento de código, que se mostrará probablemente sangrado:

Tenga en cuenta que para que esto funcione el visor de la herramienta Fragmentos de código no debe estar abierto ni visible: solamente necesitará el visor de esta herramienta para definir nuevos fragmentos de código. Un modo alternativo, aunque menos conveniente, de expandir un fragmento de código consiste en pulsar sobre él en el visor de la herramienta.

Nota

Los fragmentos de código son mucho más potentes de lo que se ha explicado. Para una descripción completa de lo que se puede hacer con ellos, consulte la documentación detallada de la herramienta de fragmentos de código.