Hagamos una aplicación Windows para fortalecer la explicación de los modificadores de acceso : private y public. Lo que esperamos que efectúe dicha aplicación programa-, es la lectura y visualización del número de control para 2 alumnos. Ambos alumnos son objetos que pertenecen a la clase Alumno. Atributos
Métodos
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 5 de 44 objeto label1 label2 label3 label4 label5 label6 textBox1 textBox2 button1 button2 button3 button4 propiedad Text Text Text Text Text Text Text Text Text Text Text Text valor ALUMNO 1 ALUMNO 2 No. control No. control label5 label6
LEER ALUMNO 1 LEER ALUMNO 2 VISUA ALUMNO 1 VISUA ALUMNO 2 La interfase gráfica Form1.cs[design] deberá quedar según se muestra en la figura #6.1.1. Notemos que las etiquetas label5 y label6 tendrán la utilidad de visualizar los números de control leídos.
Agreguemos la clase Alumno usando la opción del menú Project | Add Class, tecleando en el diálogo el nombre de la clase Alumno.cs. Después añadimos el código donde se definen los atributos y métodos según se ha indicado al inicio de esta sección. La figura #6.1.2 muestra a la clase Alumno.cs.
Las clases por si mismas no sirven para efectos de programar en cambio, los objetos son los que reciben o envían mensajes que son los ingredientes principales en la programación orientada a objetos. Es simple abstraer que debemos trabajar con 2 objetos de entrada pertenecientes a la clase Alumno, ya que ellos son los que recibirán el mensaje de asignación y de visualización de su atributo _noControl. Llamemos a los objetos usando los identificadores oAlu1 y oAlu2. Podemos decir fácilmente que el diagrama de casos de uso que representa las tareas a efectuar en este programa es :
LEER EL NÚMERO DE CONTROL DE LOS 2 ALUMNOS
VISUALIZAR EL NÚMERO DE CONTROL DE LOS 2 ALUMNOS
El Diagrama de clases es simple ya que sólo tenemos una clase involucrada en la solución del problema : la clase Alumno.
ALUMNO
– _noControl : string – _nombre : string – _calif : int
+ AsignaNoControl(string) : void + RetNoControl() : string
En el diagrama de clases recordemos que el indica que el atributo o método es privado. El símbolo + indica que el atributo o método es publico. Observemos que el método AsignaNoControl() tiene un parámetro string.
Ahora sí vayamos al ambiente de desarrollo Visual Studio C#, creamos una nueva aplicación y en la ventana con la forma Form1.cs[Design] agregamos 6 componentes Label, 2 componentes TextBox y 4 componentes Button. Modificamos las propiedades según la tabla siguiente :
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 6 de 44 Fig. No. 6.1.1 Interfase gráfica de usuario Form1.cs[Design]. Fig. No. 6.1.2 Clase Alumno.
¿Dónde deben ser definidos dentro de nuestra aplicación?. Recordemos que el código deberá insertarse dentro del archivo Form1.cs. Los objetos y datos sean variables o sean constantes de un tipo predefinido, son declarados como atributos de la clase Form1 definida en dicho archivo Form1.cs. Agreguemos loa definición de los objetos oAlu1 y oAlu2 según se indica en la figura 6.1.3.
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 7 de 44 Fig. No. 6.1.3 Definición de los objetos oAlu1 y oAlu2 en la clase Form1.
Ejecutemos la aplicación sólo con el fin de conocer si no hemos cometido algún error de dedo, figura #6.1.4. Fig. No. 6.1.4 Nuestra aplicación en ejecución.
Seguimos con la implementación del caso de uso : LEER EL NÚMERO DE CONTROL DE LOS 2 ALUMNOS. La efectuaremos insertando código en los botones button1 y button2 con leyendas LEER ALUMNO 1 y LEER ALUMNO 2 respectivamente. Lo que deseamos es que cuando hagamos click en dichos botones, tomemos el número de control tecleado por el usuario en el textBox1 o en el textBox2 según corresponda, y por medio del mensaje AsignaNoControl() al objeto sea el oAlu1, sea el oAlu2, accedamos al atributo _noControl y le asignemos el valor de lo tecleado en el TextBox correspondiente. Recordemos que para acceder a lo tecleado en un TextBox deberemos acceder a la propiedad Text del componente. oAlu1.AsignaNoControl(textBox1.Text); // mensaje al objeto oAlu1
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 8 de 44 oAlu2.AsignaNoControl(textBox2.Text); // mensaje al objeto oAlu2
Notemos que cada mensaje termina con el caracter (;). En C# todas las sentencias -un mensaje es una sentencia- terminan con (;). Agreguemos estos mensajes en el evento Click de cada botón button1 y button2, figura #6.1.5. Observemos que los métodos Click de cada botón residen dentro de la clase Form1. Fig. No. 6.1.5 Inclusión de los mensajes para leer el número de control de un alumno.
Si ejecutamos la aplicación en este momento, si leemos lo tecleado en los componentes TextBox además de asignarlo a los atributos _noControl del alumno, pero no hay manera de visualizar debido a que no hemos añadido los mensajes para visualizar los números de control de los alumnos.
El segundo caso de uso : VISUALIZAR EL NÚMERO DE CONTROL DE LOS 2 ALUMNOS es el que deberemos codificar para poder realizar la visualización del número de control de los alumnos. ¿Qué es lo que debemos hacer?, pues acceder al atributo _noControl del alumno mediante el uso de un método, en este caso RetNoControl() que como vemos retorna con la sentencia return al atributo _noControl. Este valor lo debemos asignar a la propiedad Text del componente Label correspondiente sea label5 para el oAlu1, sea label6 para el oAlu2. Dicha asignación la realizamos mediante un mensaje al objeto correspondiente que involucre al método RetNoControl(). label5.Text = oAlu1.RetNoControl();
label6.Text = oAlu2.RetNoControl(); // visualización del número de control del alumno oAlu1
// visualización del número de control del alumno oAlu2 Estos mensajes debemos escribirlos en el evento Click de los botones button3 y button4 según la figura 6.1.6.
El ejercicio hecho de la forma en que lo hemos presentado, representa el ocultamiento típico de la programación orientada a objetos, donde los atributos son definidos privados y la única forma de accederlos es mediante un método de la clase llamado dentro de un mensaje al objeto.
Para comprobar que los atributos de los objetos oAlu1 y oAlu2 pertenecientes a la clase Alumno, no son visibles desde cualquier parte del programa sino sólo son visibles a los métodos de la clase, hagamos el intento de acceder al atributo _noControl con un mensaje involucrando al alumno oAlu1 :
oAlu1._noControl = textBox1.Text;
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 9 de 44 Fig. No. 6.1.6 Inclusión de los mensajes para visualizar el número de control de un alumno. Fig. No. 6.1.7 Ejecución de la aplicación vista después de hacer click en los botones de lectura y de visualización.
En el mensaje anterior tratamos de asignar al atributo _noControl del alumno oAlu1 el valor ingresado en el componente textBox1. Sustituyamos el mensaje oAlu1.AsignaNoControl() que se encuentra en el evento Click del botón button1, por el
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 10 de 44 mensaje donde accedemos al atributo _noControl de manera directa. La figura #6.1.8 muestra al mensaje previamente escrito como un comentario no es tomado en cuenta por la compilación-, y el nuevo mensaje que lo sustituye.
En el mensaje anterior tratamos de asignar al atributo _noControl del alumno oAlu1 el valor ingresado en el componente textBox1. Sustituyamos el mensaje oAlu1.AsignaNoControl() que se encuentra en el evento Click del botón button1, por el mensaje donde accedemos al atributo _noControl de manera directa. La figura #6.1.8 muestra al mensaje previamente escrito como un comentario no es tomado en cuenta por la compilación-, y el nuevo mensaje que lo sustituye. Fig. No. 6.1.8 Acceso directo al atributo _noControl del objeto oAlu1.
Si compilamos y tratamos de ejecutar la aplicación obtenemos el error de el atributo _noControl no es accesible debido a su nivel de protección especificado por el modificador de acceso private, figura #5.1.9 Fig. No. 6.1.9 ERROR al tratar de accesar al atributo _noControl del objeto oAlu1. Ejercicio propuesto : Cambia el modificador de acceso del método AsignaNoControl() o del método RetNoControl() de public a private de manera que observes lo que sucede. 6.2 Entrada y salida de datos. 6.3 Interacción de la aplicación y la clase. Tal y como hemos venido explicando en las aplicaciones construidas en la unidad 5 y en la sección 6.1 de esta unidad, la entrada de datos en una aplicación Windows C# la hacemos utilizando el componente TextBox. La salida de datos la implementamos mediante el uso del componente Label. Desde luego que estas maneras de implementar la entrada y salida de datos, no son únicas. Aquí se han propuesto sólo estos 2 componentes, de manera que el alumno se sitúe en el aprendizaje de los fundamentos de programación y no en los detalles de uso de los diferentes componentes que nos proporciona un ambiente tan completo como es el Visual C#. En cuanto a la interacción entre la clase y la aplicación C#, diremos que se efectúa de varias maneras :
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 11 de 44
Definiendo objetos en el archivo Form1.cs dentro de la clase class Form1, cuyo ámbito sea precisamente todos los métodos de dicha clase. Al definir estos objetos dentro de la clase, realmente estamos estableciendo que dichos objetos son atributos de la clase Form1. Recordemos que la clase Form1 representa a la aplicación Windows. En la figura #6.1.3 se muestra la definición de 2 objetos de la clase Alumno oAlu1 y oAlu2 dentro del cuerpo de la forma Form1. Otra forma de interacción es el pasaje de parámetros a los métodos de nuestras clases definidas. Estos parámetros son valores leídos en los componentes TextBox insertados en la aplicación Windows. Desde luego que los métodos son parte de mensajes a los objetos definidos previamente. Generalmente es usado un componente Button para efectuar una acción de lectura o de asignación. En las páginas 7 y 8 se muestran 2 mensajes donde se asignan los números de control de 2 alumnos oAlu1 y oAlu2 que son ingresados por el usuario de la aplicación, en los componentes textBox1 y textBox2. La propiedad Text de los componentes TextBox es la que contiene a los números de control ingresados. oAlu1.AsignaNoControl(textBox1.Text);
oAlu2.AsignaNoControl(textBox2.Text); // mensaje al objeto oAlu1
// mensaje al objeto oAlu2 Los objetos pueden también retornar valores que pueden ser asignados a las propiedades o por métodos- de los componentes que forman parte de la aplicación Windows. Los parámetros también pueden ser de entrada-salida tal y como lo vimos en la sección 5.3.3 de la unidad 5. En la página 8 de esta unidad 6 tenemos 2 asignaciones a la propiedad Text de 2 componentes Label, de los números de control de 2 alumnos oAlu1 y oAlu2 : label5.Text = oAlu1.RetNoControl();
label6.Text = oAlu2.RetNoControl(); // visualización del número de control del alumno oAlu1
// visualización del número de control del alumno oAlu2 Para más sobre entrada y salida de datos, además de la interacción entre clase y aplicación, efectúa un repaso de la unidad 5.
6.4 Estructuras selectivas.
En esta sección desarrollaremos las sentencias de selección : selectiva simple si de una rama- if. selectiva doble si de dos ramas- if-else. selectiva anidada if-else if-. selectiva múltiple switch-case-default-. selectiva intenta try-catch-. 6.4.1 Selectiva simple si de una rama-.
Esta sentencia se caracteriza por tener sólo una rama donde se efectúan instrucciones dado que la condición probada sea verdadera. Su diagrama de flujo es :
if de una rama true cond ?
false instr1;
instr2; …
instrn;
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 12 de 44 La implementación en C# se realiza usando la palabra reservada if. Si se desea ejecutar mas de una instrucción en la rama true del if, es necesario encerrar a dichas sentencias dentro de un bloque de código, es decir entre los caracteres { }. La condición siempre debe ser acotada por los paréntesis circulares (cond).
if (cond) instrucción;
if (cond) { instr1; instr2; … instrn; }
Ejercicio 6.4.1 Un niño requiere registrar la cantidad de canicas que recibe de parte de sus seres queridos. Las canicas pueden ser azules, rojas y verdes. Le interesa saber cuántas canicas tiene azules, cuantas rojas y cuantas verdes, además el total de las canicas que le han regalado.
Solución : Iniciamos por el diagrama de casos de uso el cual tiene 3 tareas : Leer el número de canicas recibidas y su color. Calcular el acumulado de canicas para el color leído. Visualizar el número de canicas por color y el total de ellas. if de una rama con una sola sentencia.
if de una rama con mas de una sentencia. NINO
– _noCanAzules : int – _noCanRojas : int – _noCanVerdes : int + + + + Leer(noCan:int,colorCan:string) : void RetNoCanAzules() : int RetNoCanRojas() : int RetNoCanVerdes() : int LEER EL NÚMERO DE CANICAS Y SU COLOR
CALCULAR EL ACUMULADO DE CANICAS POR COLOR
VISUALIZAR EL NÚMERO DE CANICAS POR COLOR Y EL TOTAL
El diagrama de clase tiene 3 atributos : el número de canicas azules _noCanAzules, el número de canicas rojas _noCanRojas y el número de canicas verdes _noCanVerdes. Los métodos los abstraemos de acuerdo a las tareas identificadas en el diagrama de casos de uso :
Leer(noDeCanicas, Color); RetNoCanAzules() RetNoCanRojas() RetNoCanVerdes(). El cálculo del acumulado de canicas lo vamos a realizar dentro del método Leer(). La visualización del total de canicas la efectuamos sumando el resultado de las llamadas a los 3 métodos :
RetCanAzules()+RetCanRojas()+RetCanVerdes().
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 13 de 44 Sigamos con la construcción de la interfase gráfica que permite lograr las tareas en el diagrama de casos de uso. La figura #6.4.1 contiene los componentes que integran la realización de todas las tareas abstraídas. Fig. No. 6.4.1 Interfase gráfica.
Las etiquetas label3 a label6 servirán para la visualización del total de canicas y del número de canicas por color que ha registrado el niño. Agreguemos a la clase Nino al proyecto. Sólo por ahora añadimos los atributos y el constructor que inicializa el número de canicas de cada color a 0, figura #6.4.2. Fig. No. 6.4.2 Clase Nino incluyendo su constructor.
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 14 de 44 Lo que sigue es agregar la definición del objeto oNino perteneciente a la clase Nino, en la clase Form1, según se muestra en la figura #6.4.3. Fig. No. 6.4.3 Definición del objeto oNino.
Veamos las siguientes consideraciones antes de iniciar con la codificación del evento Click del botón button1 con leyenda LEER :
El usuario puede teclear valores negativos en el componente textBox1 que sirve para ingresar el número de canicas a registrar. También puede teclear un 0 que significan 0 canicas a registrar. En ambos casos, no debemos mandar el mensaje Leer() al objeto oNino, ya que sólo registramos cantidades de canicas mayores que 0. Aquí debemos aplicar una validación del dato leído noDeCanicas. El usuario puede teclear de manera diferente el color de las canicas, es decir Azul, azules, rojas, rojo, verdes, berde, asul, etcétera. En este caso seguiremos el criterio de aceptar sólo las cadenas AZUL, ROJO y VERDE el color en mayúscula y en singular. También aquí debemos efectuar una validación del dato leído color, de manera que si no es igual a cualquiera de las 3 constantes cadenas anteriores, no debemos llamar al método Leer().
Teniendo en cuenta las anteriores consideraciones, procedemos a codificar el Click del button1, según se indica a continuación.
private void button1_Click(object sender, EventArgs e) { int noCanicas = Convert.ToInt32(textBox1.Text); string color = textBox2.Text; if (noCanicas>0 && (color=="AZUL" || color=="ROJO" || color=="VERDE")) oNino.Leer(noCanicas,color); } int noCanicas = Convert.ToInt32(textBox1.Text);
string color = textBox2.Text; noCanicas>0&&(color=="AZUL"||color=="ROJO"||color=="VERDE") oNino.Leer(noCanicas,color); true false Flujo de ejecución para el método button1_Click()
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 15 de 44 En el código anterior estamos empleando un if de una rama con el fin de realizar el mensaje oNino.Leer() sólo si se cumplen valores válidos para las variables locales noCanicas y color.
El método Leer() debemos añadirlo en la clase Nino y tiene la siguiente definición :
public void Leer(int noCanicas, string color) { if (color == "AZUL") _noCanAzules += noCanicas; if (color == "ROJO") _noCanRojas += noCanicas; if (color == "VERDE") _noCanVerdes += noCanicas; } color == "AZUL" _noCanAzules += noCanicas; color =="ROJO" _noCanRojas += noCanicas; color =="VERDE" _noCanVerdes += noCanicas; Flujo de ejecución para el método Leer() de la clase Nino. Notemos que en el método Leer() de la clase Nino, la evaluación de las 3 condiciones siempre es efectuada no importando que por ejemplo la variable color sea AZUL, la prueba de las condiciones a ROJO y a VERDE de la variable color es realizada. Ésto sucede ya que el control de flujo regresa a la secuencia de ejecución de cada condición. Esta cuestión puede corregirse usando ifs anidados que serán vistos en la sección 6.4.3. Lo lógico es que si ya se sabe que el color es AZUL entonces la ejecución del método debería terminar sin llegar a probar las condiciones ROJO y VERDE de la variable local color. Lo mismo podríamos decir para cuando color sea ROJO la prueba del VERDE debería no ejecutarse. Ejecutemos la aplicación Windows y observemos que ingresando valores válidos y no válidos el programa no retroalimenta al usuario ningún mensaje que le ayude a saber el estado de su ejecución. Modifiquemos el if en el método button1_Click de Form1 en la rama true, de manera que mostremos un mensaje al usuario que le indique que la operación de registro de las canicas de un determinado color, se ha realizado.
private void button1_Click(object sender, EventArgs e) { int noCanicas = Convert.ToInt32(textBox1.Text); string color = textBox2.Text; if (noCanicas > 0 && (color == "AZUL" || color == "ROJO" || color == "VERDE")) { oNino.Leer(noCanicas, color); MessageBox.Show("EL REGISTRO DE "+noCanicas.ToString()+" CANICAS COLOR "+color+" FUE REALIZADO"); } }
Observemos que se han agregado los caracteres { y } para acotar las 2 sentencias que se ejecutan cuando la condición en el if es true. También hemos usado la clase MessageBox y su método Show() para visualizar el mensaje al usuario. true true true false false false
Ing. Francisco Ríos Acosta Apuntes de Fundamentos de Programación UNIDAD 6. Instituto Tecnológico de la Laguna, a 12 de diciembre del 2008. pag. 16 de 44 Ejecutemos de nuevo la aplicación y demos valores válidos para observar la manera en que responde ahora nuestra aplicación. La figura #6.4.4 muestra la respuesta para el registro de 10 canicas color ROJO. Fig. No. 6.4.4 Comunicación de la aplicación con el usuario para datos leídos válidos.
Observemos que aún cuando los datos no sean válidos la aplicación NO responde con ningún mensaje al usuario, es decir el usuario no sabe que pasó con su operación de registro ¿se hizo? o ¿no se hizo?, la aplicación es la que tiene la respuesta. La aplicación podrá responder a las preguntas anteriores si el usuario hace click sobre el botón button2 con leyenda VISUALIZAR, de manera que el usuario que tenga una cierta memoria podrá hacer sus cálculos y tal vez establezca que su operación de registro se realizó. Realmente lo que debemos hacer es de inmediato retroalimentar al usuario si su registro se realizó o no se realizó. Ya hicimos lo primero, ahora debemos codificar la notificación cuando no se efectuó el registro. Aquí sería muy útil saber el uso del if de 2 ramas, pero como sólo hasta ahora sabemos el uso del if de una rama, éste es el que utilizaremos. Modifica el método button1_Click() de acuerdo al código siguiente :
private void button1_Click(object sender, EventArgs e) { int noCanicas = Convert.ToInt32(textBox1.Text); string color = textBox2.Text; if (noCanicas > 0 && (color == "AZUL" || color == "ROJO" || color == "VERDE")) { oNino.Leer(noCanicas, color); MessageBox.Show("EL REGISTRO DE "+noCanicas.ToString()+" CANICAS COLOR "+color+" FUE REALIZADO"); } if (noCanicas 0&&(color=="AZUL"||color=="ROJO"||color=="VERDE") true Flujo de ejecución para el método button1_Click() con la inclusión de mensajes de retroalimentación al usuario. oNino.Leer(noCanicas,color);
MessageBox.Show("EL REGISTRO DE " + noCanicas.ToString()+ " CANICAS COLOR "+color+" FUE REALIZADO");
true
MessageBox.Show("ERROR … EL NUMERO DE CANICAS DEBE SER MAYOR QUE 0"); false
noCanicas
Página anterior | Volver al principio del trabajo | Página siguiente |