Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


6.3. Proyectos a partir de varios fuentes

En un proyecto grande, es recomendable que cada clase esté en su propio fichero fuente, de forma que se puedan localizar con rapidez (en los que hemos hecho en el curso hasta ahora, no era necesario, porque eran muy simples).

Es recomendable (aunque no obligatorio) que cada clase esté en un fichero que tenga el mismo nombre: que la clase Puerta se encuentre en el fichero "Puerta.cs".

Para compilar un programa formado por varios fuentes, basta con indicar los nombres de todos ellos. Por ejemplo, con Mono sería

mcs fuente1.cs fuente2.cs fuente3.cs

En ese caso, el ejecutable obtenido tendía el nombre del primero de los fuentes (fuente1.exe). Podemos cambiar el nombre del ejecutable con la opción "-out" de Mono:

mcs fuente1.cs fuente2.cs fuente3.cs -out:ejemplo.exe

En general, esto no lo podremos hacer de forma sencilla desde editores como Notepad++ y Geany: Notepad++ tiene un menú "Ejecutar", que nos permite teclear una orden como la anterior, pero no supone ninguna gran ganancia; Geany permite crear "proyectos" formados por varios fuentes, pero no resulta una tarea especialmente cómoda. Por eso, veremos un primer ejemplo de cómo compilar desde "línea de comandos" y luego lo haremos con un entorno mucho más avanzado y que usaremos con frecuencia a partir de ahora: Visual Studio.

Vamos a dividir en dos fuentes el último ejemplo y a ver cómo se compilaría. La primera clase podría ser ésta:

// Puerta.cs
// Clases, get y set
// Introducción a C#, por Nacho Cabanes

using System;

public class Puerta
{

    int ancho;     // Ancho en centimetros
    int alto;      // Alto en centimetros
    int color;     // Color en formato RGB
    bool abierta;  // Abierta o cerrada

    public void Abrir() 
    {
        abierta = true;
    }

    public void Cerrar() 
    {
        abierta = false;
    }
    
    public int GetAncho() 
    {
        return ancho;
    }
  
    public void SetAncho(int nuevoValor) 
    {
        ancho = nuevoValor;
    }

    public void MostrarEstado() 
    {
        Console.WriteLine("Ancho: {0}", ancho);
        Console.WriteLine("Alto: {0}", alto);
        Console.WriteLine("Color: {0}", color);
        Console.WriteLine("Abierta: {0}", abierta);
    }

} // Final de la clase Puerta   

Y la segunda clase podría ser:

// Ejemplo_06_03a.cs
// Usa la clase Puerta
// Introducción a C#, por Nacho Cabanes

using System;

public class Ejemplo_06_03a
{

    public static void Main()
    {
        Puerta p = new Puerta();

        Console.WriteLine("Valores iniciales...");
        p.MostrarEstado();

        Console.WriteLine();
        
        Console.WriteLine("Vamos a abrir...");
        p.Abrir();
        p.SetAncho(80);
        p.MostrarEstado();
    }
  
}

Y lo compilaríamos con:

mcs ejemplo06_03a.cs puerta.cs -out:ejemploPuerta.exe

Aun así, para estos proyectos formados por varias clases, lo ideal es usar algún entorno más avanzado, como SharpDevelop (que además es gratuito) o VisualStudio (del que existe una versión gratuita, conocida como Express), que nos permitan crear todas las clases con comodidad, saltar de una clase a clase otra rápidamente, que marquen dentro del propio editor la línea en la que están los errores...

El entorno de desarrollo más conocido para crear programas de una cierta complejidad es Visual Studio, de Microsoft, que en su versión Express incluye todo lo que un programador novel como nosotros puede necesitar. Aun así, como puede requerir un equipo relativamente potente, vamos a comenzar por ver una alternativa muy similar, pero algo más sencilla, llamada SharpDevelop, disponible para Windows.

Comenzamos por descargar el fichero de instalación del entorno, desde su página oficial (http://www.icsharpcode.net/OpenSource/SD/Download/). La versión 4.4, para las versiones 2.0 a 4.5.1 de la plataforma .Net, ocupa unos 15 Mb. En el momento de escribir este texto también existe una versión 5.0, pero todavía está en "fase beta" (pruebas previas a la versión definitiva, así que puede contener algún error).

La instalación comenzará al hacer doble clic en el fichero descargado. Deberíamos ver una ventana parecida a ésta:

SharpDevelop, comienzo de instalación

Como es habitual, el siguiente paso será aceptar el contrato de licencia, después deberemos decir en qué carpeta queremos instalarlo, comenzará a copiar archivos y al cabo de un instante, tendremos un nuevo icono en nuestro escritorio:

SharpDevelop, icono

La instalación debería ser muy sencilla en Windows Vista y superiores, pero en Windows XP quizá necesite que instalemos una versión reciente de la plataforma .Net (se puede descargar gratuitamente desde la web de Microsoft).

Cuando hagamos doble clic en nuestro nuevo icono, veremos la pantalla principal de SharpDevelop, que nos muestra la lista de los últimos proyectos ("soluciones") que hemos realizado, y nos permite crear uno nuevo:

SharpDevelop, pantalla principal

En nuestro caso, comenzaremos por crear una "Nueva solución", desde el menú "File", en la opción "New Solution":

SharpDevelop, nueva solución

Se nos mostrará los tipos de proyectos para los que se nos podría crear un esqueleto vacío que después iríamos rellenando:

SharpDevelop, tipos de soluciones

De estos tipos, el único que conocemos es una "Aplicación de Consola" (Console Application) en C#. Deberemos escribir también el nombre, y aparecerá un esqueleto de aplicación que nosotros sólo tendríamos que completar:

SharpDevelop, esqueleto de aplicación

Podemos cambiar el idioma del interfaz, para que todos los menús y opciones aparezcan en español. Lo haremos desde "Options" (opciones), al final del menú "Tools" (herramientas):

SharpDevelop, idioma

Cuando hayamos terminado de realizar nuestros cambios, podemos compilar el programa con el botón "Generar":

SharpDevelop, generar

Si hubiera algún error, se nos avisaría en la parte inferior de la pantalla, y se subrayarían en rojo las líneas correspondientes de nuestro programa; si todo ha ido bien, podremos ejecutar nuestro programa para verlo funcionando:

SharpDevelop, ejecutar

(Si la ventana de nuestro programa se cierra tan rápido que no tenemos tiempo de leerla, nos puede interesar añadir provisionalmente una línea ReadLine() al final del fuente, para que éste se detenga hasta que pulsemos la tecla Intro).

Así prepararíamos y lanzaríamos un programa formado por un solo fuente. Si se trata de varios fuentes, basta con ir añadiendo nuevas clases al proyecto. Lo conseguimos pulsando el botón derecho sobre el nombre del proyecto (en la ventana izquierda, "Proyectos") y escogiendo las opciones Agregar / Agregar Elemento:

SharpDevelop, varias clases

Normalmente, el tipo de elemento que nos interesará será una clase, cuyo nombre deberemos indicar:

SharpDevelop, agregar clase

y obtendríamos un nuevo esqueleto vacío (esta vez sin "Main"), que deberíamos completar.

Nuestro programa, que ahora estaría formado por dos clases, se compilaría y se ejecutaría de la misma forma que cuando estaba integrado por una única clase.


Si nuestro equipo es moderno, posiblemente nos permitirá usar Visual Studio con una cierta fluidez. Instalar y emplear este entorno es muy similar a lo que hemos visto. La versión Express, que es gratuita para uso personal, se puede descargar de:

www.visualstudio.com/es-es/products/visual-studio-express-vs

(En nuestro caso, se trataría de la versión Express para escritorio de Windows -Windows Desktop-)

La instalación es muy similar a la de SharpDevelop: poco más que descargar el fichero, hacer doble clic para comenzar (si descargamos y esperar un momento a que se complete el proceso (puede ser necesario tener que reiniciar el ordenador en algún punto intermedio, si nuestra versión de la plataforma "punto net" no es lo suficientemente moderna).

Si escogemos el instalador basado en Web, descargaremos un pequeño fichero al principio, y necesitaremos estar conectados a Internet durante la instalación para que se reciban los ficheros necesarios. Si, por el contrario, descargamos la "imagen ISO de DVD", deberemos grabarla en un DVD o extraerla con 7-zip o WinRar para acceder a los ficheros de instalación.

Si eres estudiante y tu centro de estudios está adscrito a programas como la "Academic Alliance" de Microsoft (MSDNAA), posiblemente tendrás acceso gratuito también a otras versiones más potentes de Visual Studio, como Professional y Ultimate, con más características adicionales (que no necesitarás siendo un principiante, como las pruebas de rendimiento o automatización de tests para interfaces de usuario).

La pantalla principal, una vez completada la instalación, debería ser similar a ésta (para Visual Studio 2013; puede ser ligeramente distinta en otras versiones o si escogemos otras paletas de colores):

VisualStudio 2013, pantalla principal

En ella tenemos la opción de crear un "Nuevo proyecto". De entre los tipos de proyectos existentes, escogeríamos crear una "Aplicación de consola":

VisualStudio 2013, tipos de proyectos

En la parte inferior escribiremos el nombre de nuestro proyecto, y pulsaremos el botón "Aceptar", con lo que debería aparecer un esqueleto de programa vacío:

VisualStudio 2013, proyecto vacío

Si nuestro programa va a estar formado por varios fuentes, podríamos añadir más clases usando la ventana de la derecha ("Explorador de soluciones") o la opción "Agregar clase…" del menú "Proyecto":

VisualStudio 2013, agregar clase

Que, al igual que en el caso de SharpDevelop, nos mostraría el esqueleto de un fuente, que en este caso no contiene "Main". Cuando el programa esté listo, podemos lanzarlo haciendo clic en el botón "Iniciar":

VisualStudio 2013, pantalla principal

Hay alguna diferencia más en el manejo normal de Visual Studio Express, comparado con el de SharpDevelop, que conviene tener en cuenta:

Quien trabaja con Linux o con Mac, no podrá emplear SharpDevelop ni VisualStudio, pero tiene una alternativa muy similar, desarrollada por el mismo equipo que ha creado Mono. Se trata de MonoDevelop, que se debería poder instalar apenas en un par de clics con el gestor de paquetes del sistema (por ejemplo, Synaptic en el caso de Ubuntu y de Linux Mint).

Ejercicios propuestos:

Ejercicio propuesto 6.3.1: Crea un proyecto con las clases Puerta y Ejemplo_06_03a. Comprueba que todo funciona correctamente.
Ejercicio propuesto 6.3.2: Modifica el fuente del ejercicio 6.2.1 (clase Persona), para dividirlo en dos ficheros: Crea una clase llamada Persona, en el fichero "persona.cs". Esta clase deberá tener un atributo "nombre", de tipo string. También deberá tener un método "SetNombre", de tipo void y con un parámetro string, que permita cambiar el valor del nombre. Finalmente, también tendrá un método "Saludar", que escribirá en pantalla "Hola, soy " seguido de su nombre. Crea también una clase llamada PruebaPersona, en el fichero "pruebaPersona.cs". Esta clase deberá contener sólo la función Main, que creará dos objetos de tipo Persona, les asignará un nombre y les pedirá que saluden.
Ejercicio propuesto 6.3.3: Crea un proyecto a partir de la clase Libro (ejercicio 6.2.3). El "Main" pasará a una segunda clase llamada "PruebaDeLibro" y desaparecerá de la clase Libro.
Ejercicio propuesto 6.3.4: Amplía el esqueleto del ConsoleInvaders (ejercicio 6.2.2): crea un proyecto para Visual Studio o SharpDevelop. Además de la clase "Juego", crea una clase "Bienvenida" y una clase "Partida". El método "Lanzar" de la clase Juego, ya no escribirá nada en pantalla, sino que creará un objeto de la clase "Bienvenida" y lo lanzará y luego un objeto de la clase "Partida" y lo lanzará. El método Lanzar de la clase Bienvenida escribirá en pantalla "Bienvenido a Console Invaders. Pulse Intro para jugar". El método Lanzar de la clase Partida escribirá en pantalla "Ésta sería la pantalla de juego. Pulse Intro para salir" y se parará hasta que el usuario pulse Intro.
Ejercicio propuesto 6.3.5: Amplía el esqueleto del ConsoleInvaders (ejercicio 6.3.4): El método Lanzar de la clase Bienvenida escribirá en pantalla "Bienvenido a Console Invaders. Pulse Intro para jugar o ESC para salir". Puedes comprobar si se pulsa ESC con "ConsoleKeyInfo tecla = Console.ReadKey(); if (tecla.Key == ConsoleKey.Escape) salir = true;". El código de la tecla Intro es " ConsoleKey.Enter". También puedes usar "Console.Clear();" si quieres borrar la pantalla. Añade un método "GetSalir" a la clase Bienvenida, que devuelva "true" si el usuario ha escogido Salir o "false" si ha elegido Jugar. El método Lanzar de la clase Juego repetirá la secuencia Bienvenida-Partida hasta que el usuario escoja Salir.
Ejercicio propuesto 6.3.6: Amplía el esqueleto del ConsoleInvaders (ejercicio 6.3.5): Crea una clase Nave, con atributos "x" e "y" (números enteros, "x" de 0 a 1023 e "y" entre 0 y 767, pensando en una pantalla de 1024x768), e imagen (un string formado por dos caracteres, como "/\"). También tendrá un método MoverA(nuevaX, nuevaY) que lo mueva a una nueva posición, y un método Dibujar, que muestre esa imagen en pantalla (como esta versión es para consola, la X tendrá que rebajarse para que tenga un valor entre 0 y 79, y la Y entre 0 y 24). Puedes usar Console.SetCursorPosition(x,y) para situarte en unas coordenadas de pantalla. Crea también clase Enemigo, con los mismos atributos. Su imagen podría ser "][". El método Lanzar de la clase Partida creará una nave en las coordenadas (500, 600) y la dibujará, creará un enemigo en las coordenadas (100, 80) y lo dibujará, y finalmente esperará a que el usuario pulse Intro para terminar la falsa sesión de juego.
Ejercicio propuesto 6.3.7: Crea un proyecto a partir de la clase Coche (ejercicio 6.2.4): además de la clase Coche, existirá una clase PruebaDeCoche, que contendrá la función "Main", que creará un objeto de tipo coche, pedirá al usuario su marca, modelo, cilindrada y potencia, y luego mostrará en pantalla el valor de esos datos.