98-361 Fundamentos de Desarrollo de Software

199
ETC IBEROÁMERICA www.pdftron.com

Transcript of 98-361 Fundamentos de Desarrollo de Software

Page 1: 98-361 Fundamentos de Desarrollo de Software

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 2: 98-361 Fundamentos de Desarrollo de Software

Lección 1

Introducción a la programación

Matriz de dominio de objetivos

Habilidad tecnológica Descripción de dominio de objetivos Número de dominio de objetivos

Comprender la programación de computadoras Comprender el almacenamiento y los tipos de datos computacionales

1.1

Comprender las estructuras de decisión Comprender estructuras de decisión computacionales

1.2

Comprender las estructuras de repetición Identificar el método apropiado para el manejo de las repeticiones

1.3

Comprender el manejo de excepciones Comprender el manejo de errores 1.4

Términos clave• Algoritmo• Vector• Constante• Tabla de decisión• Ciclo do-while • Excepción

• Diagrama de fujo• Ciclo for • Ciclo foreach • If• If-else• Operador

• Programa• Recursión• Switch• Try-catch-fnally• Variable• Ciclo while

Como desarrollador de software para corporación Northwind, parte de su trabajo es desarrollar programas de computadora que resuelvan problemas de la compañía. Algunos de estos ejemplos son: analizar órdenes de clientes y determinar descuentos, así como actualizar la información del almacén sobre los miles de productos en el inventario y elaborar un reporte interactivo que permita al usuario ordenar y fltrar los datos.

Es de suma importancia asegurarse que sus programas se diseñen de acuerdo a las especifcaciones. También necesita asegurarse que todos los cálculos sean precisos y completos. Los programas que desarrolle deberán ser robustos y capaces de mostrar mensajes de error pero también de continuar con el procesamiento.

El lenguaje de programación que utilice le proporcionará una variedad de herramientas y técnicas que le permitirán llevar a cabo las tareas. Con base en la tarea, seleccione el tipo de datos y las estructuras de control que mejor se adecuen para solucionar el problema.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 3: 98-361 Fundamentos de Desarrollo de Software

2 Lección 1

� Comprender la programación de computadoras

È EN RESUMEN

Un programa de computadora es un conjunto de instrucciones precisas para llevar a cabo una tarea. En esta sección aprenderá a escribir algoritmos y programas de computadoras para solucionar un problema dado. Además de escribir su primer programa computacional utilizando el lenguaje de programación C#, también aprenderá la estructura básica de un programa, así como a compilarlo, ejecutarlo, ingresar datos y generar resultados de un programa.

Introducción a los AlgoritmosUn algoritmo es un conjunto de pasos ordenados y fnitos para resolver un problema dado.

El término algoritmo se refere a un método para solucionar problemas. Los algoritmos se pueden describir con palabras pero podrían suceder errores de comprensión relacionados con la complejidad y ambigüedad de un idioma natural.

De ahí que los algoritmos generalmente se escriban en formatos más simples y precisos como diagramas de fujo, árboles de decisión y tablas de decisión que representen un algoritmo como un diagrama, tabla o gráfco. Estas técnicas se utilizan generalmente antes de escribir los programas para contar con una mejor comprensión de la solución.

Estas herramientas para el desarrollo de algoritmos pueden ayudarlo a expresar la solución para un problema de manera fácil, pero no se pueden ingresar directamente en la computadora. Para que una computadora entienda su algoritmo, necesita escribir un programa de computadora de manera formal utilizando un lenguaje de programación como C# sobre el cual aprenderá en la siguiente sección.

Esta sección se enfoca en dos técnicas para algoritmos, los diagramas de fujo y las tablas de decisión que son más precisas que un idioma natural pero menos formales y más fáciles de utilizar que un lenguaje de programación.

Introducción a los diagramas de flujo

Un diagrama de fujo es una representación gráfca de un algoritmo. Un diagrama de fujo se realiza generalmente utilizando símbolos estandarizados para diagramas de fujo. Algunos de los símbolos comunes de diagramas de fujo aparecen en la tabla 1-1.

Símbolo del diagrama de flujo Descripción

Inicio o final de un algoritmo

Un proceso u operación computacional

Operación de entrada o salida

Operación de toma de decisión

Especifica el flujo de control

Tabla 1-1

Símbolos de diagramas de flujo comunes

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 4: 98-361 Fundamentos de Desarrollo de Software

3Introducción a la programación

Por ejemplo, la fgura 1-1 muestra un diagrama de fujo que ingresa dos números, los compara y produce como salida el número mayor.

Como puede ver, este diagrama de fujo muestra en el orden correcto todos los pasos necesarios para llevar a cabo la operación. El control inicia con el símbolo Inicio y termina con el símbolo Fin. El proceso y operaciones de entrada/salida siempre tienen una sola entrada pero varias salidas. Se puede evaluar un diagrama de fujo llevando a cabo una “dry run” (ejecución seca). En ella se traza de forma manual lo pasos en el diagrama de fujo para revisar si los datos siguen la ruta correcta.

Introducción a las tablas de decisión

Cuando se requiere de una gran cantidad de condiciones en un algoritmo, las tablas de decisión son un formato más compacto y legible para representarlo. La tabla 1-2 muestra una tabla de decisión para calcular un descuento. Esta tabla genera un porcentaje de descuento dependiendo de la cantidad de producto que se haya comprado. La línea en negrita en la tabla divide la tabla de decisión en cuatro cuadrantes. El primer cuadrante en la izquierda superior especifca las condiciones (Cantidad <10, etc.). El segundo cuadrante (superior derecha) especifca las reglas. Las reglas son las posibles combinaciones que resultan de cada condición. El tercer cuadrante (inferior izquierda) especifca la acción (en este caso el Descuento) y el último cuadrante especifca los elementos de la acción que corresponden a cada regla.

Cantidad < 10 S N N N

Cantidad < 50 S S N N

Cantidad < 100 S S S N

Descuento 5% 10% 15% 20%

****Note las líneas en negritas que dividen la tabla en cuadrantes*****

Para descubrir cual acción se debe aplicar, se evalúa cada condición para encontrar la regla coincidente y seleccionar la acción especifcada en la columna con la regla coincidente. Por ejemplo, si el valor de la cantidad es 75 entonces la primera regla evalúa un No, la segunda regla evalúa un No y la tercera evalúa un Sí. Por lo que debe seleccionar el elemento de la acción de la columna (N, N, S) que establece un descuento de 15%.

Figura 1-1

Un diagrama de flujo sencillo que compara dos números y da como resultado el mayor

Tabla 1-2

Una tabla de decisión que calcula descuentosE

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 5: 98-361 Fundamentos de Desarrollo de Software

4 Lección 1

Introducción a C#C# es un lenguaje de programación de alto nivel muy popular que le permite escribir programas de computadora en un formato legible para los humanos. C# es parte de .NET Framework y se benefcia del tiempo de ejecución y librerías de clase que se encuentran en .NET Framework.

Como se mencionó en la sección anterior, las computadoras necesitan de instrucciones precisas y completas para llevar a cabo una tarea. Este conjunto de instrucciones se conocen como programas de computadora o simplemente programas.

En un nivel muy básico, las computadoras utilizan el sistema binario para representar información y código. En el sistema binario, cada valor se representa utilizando únicamente dos símbolos, 0 y 1. A un programa de computadora escrito en código binario se le conoce como código binario.

Utilizar el código binario para programar una computadora es muy difícil para llevar a cabo cualquier tarea. Para simplifcar la programación, los científcos e ingenieros en computación desarrollaron varios niveles de abstracción entre la máquina y el humano. Estas abstracciones incluyen software, como los sistemas operativos, compiladores y varios sistemas en tiempo de ejecución, que asumen la responsabilidad de traducir un programa legible para los humanos en un programa legible para la máquina.

La mayoría de los programas modernos se encuentran escritos en un lenguaje de alto nivel como C#, Visual Basic y Java. Estos lenguajes le permiten escribir instrucciones precisas en un formato legible para los humanos. El compilador de lenguaje puede entonces traducir el lenguaje de alto nivel en un lenguaje de bajo nivel que pueda comprenderse en el sistema en tiempo de ejecución.

Cada lenguaje de programación cuenta con su propio conjunto de vocabulario y gramática (también conocido como sintaxis). En este curso, aprenderá a programar en C#, el cual es un lenguaje de programación en .NET Framework. .NET Framework cuenta con un ambiente en tiempo de ejecución para el programa C#. Framework también cuenta con librerías de clase que ofrecen una gran funcionalidad reutilizable que se puede utilizar directamente en su programa de C#.

El .NET Framework

El .NET Framework cuenta con tres componentes principales: un ambiente en tiempo de ejecución, un conjunto de librerías de clase que ofrece una gran funcionalidad reutilizable y compiladores de lenguaje para C#, Visual Basic y Managed C++. El .NET Framework soporta diferentes lenguajes de programación así como lenguajes adicionales al sistema. Aun cuando la sintaxis y vocabulario de cada lenguaje pueda ser diferente, cada uno utiliza las librerías de clase base con las que cuenta el Framework.

En este curso utilizará un ambiente de desarrollo integrado (IDE) para desarrollar su código. Utilizará Visual Studio o la edición gratuita de Visual Studio Express para escribir su código. Cualquiera de estas herramientas le ofrece un ambiente altamente productivo para desarrollar y evaluar sus programas.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 6: 98-361 Fundamentos de Desarrollo de Software

5Introducción a la programación

Æ Escriba un programa en C#

PREPÁRESE. Para escribir un programa en C#, realice lo siguiente:

1. Inicie Visual Studio. Seleccione Archivo y después Nuevo proyecto, Visual c#, Seleccione Aplicación de consola en Plantillas

2. Ingrese IntrodCS en el cuadro Nombre. Asegúrese que el cuadro de verificación Crear directorio para la solución se encuentre seleccionado e ingrese el nombre Lesson01 en el cuadro Nombre de la solución. Haga clic en Aceptar para crear el proyecto.

3. Después de crear el proyecto, notará que Visual Studio ha creado un archivo de nombre Program.cs y escrito una plantilla para usted.

4. Modifique la plantilla para que luzca como el siguiente código:

using System;

namespace Lesson01

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine(“¡hola, mundo!”);

}

}

}

5. Seleccione Depurar, Iniciar sin depurar, o presione Ctrl+F5.

6. Observará el resultado del programa en una ventana de comandos, como aparece en la Figura 1-2.

7. Presione una tecla para cerrar la ventana de línea de comandos.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Tome Nota

C# es un lenguaje de programación sensible a mayúsculas. Por ejemplo, si escribe Class en lugar de class, le resultará un error de sintaxis.

Figura 1-2

Resultado del programa en una ventana

Otra Manera

También puede ejecutar el programa si abre una ventana de línea de comandos (cmd.exe) y después navega a la carpeta de salida del proyecto, que de forma predeterminada es bin/debug bajo la ubicación del proyecto. Se puede iniciar el programa escribiendo el nombre del programa en la ventana de comandos y presionando Enter.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 7: 98-361 Fundamentos de Desarrollo de Software

6 Lección 1

El programa que acaba de crear es muy sencillo pero resulta de utilidad para comprender la estructura de un programa, su construcción y ejecución. Primero comentemos sobre la parte de la construcción y ejecución. A continuación se menciona lo que sucede cuando selecciona la opción Depurar y posteriormente Iniciar sin depurar en el paso 5 del ejercicio anterior:

1. Visual Studio invoca el compilador de C# para traducir el código en un lenguaje de bajo nivel, en código de Lenguaje Intermedio Común (CIL). Este código de bajo nivel se almacena en un archivo ejecutable de nombre Lesson01.exe. El nombre del archivo resultante se puede cambiar al modificar las propiedades del proyecto.

2. A continuación, Visual Studio toma el resultado del proyecto y solicita al sistema operativo que lo ejecute. Aquí es cuando ve que la ventana de línea de comandos muestra el resultado.

3. Cuando el programa termina, Visual Studio muestra el mensaje, “Presione una tecla para continuar…”. Observe que este mensaje sólo se genera cuando ejecuta el programa al utilizar la opción “Iniciar sin depurar”.

Si no utiliza un IDE como Visual Studio, puede compilar su programa de forma manual utilizando las herramientas en línea de comandos. Por supuesto, resulta mucho más fácil y rápido utilizar Visual Studio para evaluar sus programas.

Tome Nota

Cuando seleccione la opción Depurar, Iniciar sin depurar y Visual Studio muestra automáticamente el mensaje “Presione una tecla para continuar…”. La ventana de línea de comandos permanece abierta para que pueda ver el resultado. Si selecciona la opción Depurar y después Iniciar depuración, la ventana de comandos se cierra tan pronto como se termina la ejecución del programa. Es importante saber que la opción Depurar e Iniciar depuración cuenta con capacidades de depuración como lo es la habilidad de pausar un programa en ejecución en un punto dado y revisar el valor de varias variables en memoria.

Tome Nota

Antes de que se pueda ejecutar el código en Lenguaje Intermedio Común (CIL), primero se debe traducir para la arquitectura de la máquina donde se ejecutará el código. El sistema en tiempo de ejecución de .NET Framework se encarga de esta traducción tras bambalinas utilizando un proceso llamado compilación just-in-time.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 8: 98-361 Fundamentos de Desarrollo de Software

7Introducción a la programación

� Comprender la estructura de un programa en C#

En esta sección, aprenderá sobre los elementos fundamentales del programa en C# que creó en la sección anterior.

La Figura 1-3 enlista el programa en el ejercicio anterior con números. Esta sección utiliza los números de línea para referirse a cada estructura del programa.

Un programa en C# está formado por una o más clases y otros tipos. Una clase es un conjunto de datos y métodos. El código en la Figura 1-3 defne una clase de nombre Program de las líneas 5 a la 11. Una clase se defne utilizando la palabra clave class seguida del nombre de la clase. El contenido de la clase se defne entre una llave de apertura ({) y una de cierre (}).

La línea 3 defne un espacio de nombre, Lesson01. Los Espacios de nombres se utilizan para organizar clases e identifcarlas de forma única. El espacio de nombre y los nombres de las clases se combinan para crear un nombre de clase completamente calificado. Por ejemplo, el nombre de la clase completamente califcado para la clase Program es Lesson01.Program. C# requiere que el nombre de una clase completamente califcado sea único. Por lo tanto, no puede tener otro nombre de clase para Program con el nombre Lesson01, pero puede utilizar Program para otro nombre como Lesson02. La clase Program defnida en el nombre Lesson02 es identifcada de forma única utilizando su nombre de clase completamente califcado, Lesson02.Program.

El .NET Framework cuenta con una gran cantidad de clases organizadas en muchos espacios de nombres. El espacio de nombres System contiene algunas de las clases más comunes. Una de estas clases en el espacio de nombres System es Console. La clase Console ofrece funcionalidad de entrada y salida para la aplicación de consola. El código en la línea 9 se refere a la clase Console e invoca al método WriteLine. Para acceder al método WriteLine debe hacerlo de la siguiente manera:

System.Console.WriteLine(“¡hola, mundo!”);

Tome Nota

Para habilitar la vista de los números de línea en Visual Studio, seleccione Herramientas y después Opciones. A continuación, expanda el nodo Editor de texto y seleccione C#. Finalmente, en la sección Mostrar, seleccione la opción Números de línea (active la opción Mostrar todas las configuraciones).

Figura 1-3

Listado del programa con números de línea

Referencia cruzada

Puede encontrar más información y otros tipos en la Lección 2.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 9: 98-361 Fundamentos de Desarrollo de Software

8 Lección 1

Puesto que los nombres de las clases aparecen con frecuencia en el código, escribir el nombre de la clase completamente califcados puede ser tedioso y hacer que los programas contengan exceso de palabras. Este problema se puede solucionar utilizando la directiva de C# using (vea el código en la línea 1). La directiva using le permite utilizar las clases en un espacio de nombres sin la necesidad de califcar completamente el nombre de la clase.

La clase de Programa defne un solo método por el nombre Main (líneas 7 a la 10). Main es un método especial que también sirve como punto de entrada al programa. Cuando el tiempo de ejecución inicia un programa, siempre empieza en el método Main. Un programa puede tener muchas clases y cada clase puede tener muchos métodos, pero debería tener sólo un método Main. Un método puede a su vez llamar a otros métodos. En la línea 9, el método Main está llamando al método WriteLine de la clase System.Console para mostrar una cadena de caracteres en la ventana de línea de comandos. Esa es la forma en la cual aparece el mensaje.

Comprender las variablesLas variables proporcionan almacenamiento temporal durante la ejecución de un programa.

Las variables en C # son marcadores de posición utilizados para almacenar valores. Una variable tiene un nombre y un tipo de datos. El tipo de datos de la variable determina el valor que esta puede contener y el tipo de operaciones que se pueden desarrollar. Por ejemplo, la siguiente declaración crea una variable de nombre number del tipo de datos int y asigna un valor de 10 a la variable:

int number = 10;

Cuando se declara una variable, se crea una ubicación en la memoria de la computadora lo sufcientemente grande para contener el valor de este tipo de dato. Por ejemplo, en una máquina de 32-bit, una variable de un tipo de datos int necesitará dos bytes de memoria. El valor de una variable se puede modifcar por otra asignación, como por ejemplo:

number = 20;

Este código cambia el contenido de la ubicación en memoria identifcada por el nombre number.

Comprender las constantesLas constantes son los campos de datos o variables locales cuyos valores no se pueden modifcar.

Las constantes se declaran utilizando la palabra const. Una const se puede declarar de la siguiente forma:

const int i = 10;

Aquí se declara una constante i del tipo de datos int y almacena un valor de 10. Una vez declarado, el valor de una constante no puede cambiar.

Tome Nota

Todas las sentencias en C# deben terminar con un punto y coma (;).

Tome Nota

El método Main debe ser declarado como static. El método static es invocable en una clase aun cuando no se haya creado una instancia de la clase. Aprenderá más de este tema en la siguiente lección.

Tome Nota

El nombre de una variable debe empezar con una letra o un guión bajo y puede contener sólo letras, números y guiones bajos. El nombre de una variable no debe ser mayor a 255 caracteres. Una variable debe ser única dentro del ámbito en el cual se haya definido.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 10: 98-361 Fundamentos de Desarrollo de Software

9Introducción a la programación

Comprender los tipos de datosEl tipo de datos especifca el tipo de valor con el cual se trabajará en el programa. El tipo de datos defne el tamaño en memoria necesario para almacenar la información y el tipo de operaciones que se pueden realizar con los datos.

C# ofrece varios tipos de datos predefnidos que puede utilizar en sus programas. También puede defnir nuevos tipos al establecer una estructura de datos como una clase o un struct. Este capítulo se enfoca en algunos de los tipos de datos predefnidos más utilizados.

La tabla 1-3 contiene algunos de los tipos de datos predefnidos más utilizados en C#. El tamaño mencionado en la tabla se refere a una computadora con longitudes de palabra de 32 bits. Para longitudes más grandes, como de 64 bits, los tamaños serán diferentes.

Tipo de dato Tamaño Rango de valores

byte 1 byte 0 a 255

char 2 byte U+0000 a U+ffff (caracteres Unicode)

short 2 bytes -32,768 a 32,767

int 4 bytes -2,147,483,648 a 2,147,483,647

long 8 bytes -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807

float 4 bytes ±1.5e−45 a ±3.4e38

double 8 bytes ±5.0e−324 a ±1.7e308

bool 2 bytes Verdadero o falso

string - Cero o más caracteres Unicode

Todos los tipos de datos mencionados en la tabla 1-3 son tipos de valores con excepción de string, el cual es un tipo de referencia. Las variables que se encuentran basadas directamente en los tipos de valores contienen el valor en sí. En el caso del tipo de referencia, la variable contiene la dirección de la ubicación en memoria donde se encuentran almacenados los datos. Aprenderá más sobre las diferencias entre los tipos de valores y referencias en la Lección 2.

Comprender los ArreglosUn arreglo es un conjunto de elementos en donde cada uno de ellos se accede a través de un índice único.

Un arreglo en C# se utiliza comúnmente para representar un conjunto de elementos de tipo similar. A continuación se incluye un ejemplo de una declaración de un arreglo:

int[] numbers = { 1, 2, 3, 4, 5 };

Esta declaración crea un arreglo identifcado por el nombre numbers. Este arreglo puede almacenar un conjunto de cinco enteros. Esta declaración también inicializa cada uno de los elementos del arreglo del 1 al 5 respectivamente.

Cualquier elemento del arreglo se puede acceder de forma directa utilizando un índice. En .NET Framework los índices de arreglo empiezan desde cero. Esto signifca que para acceder al primer elemento de un arreglo, se utiliza el índice 0, para acceder al segundo elemento se utiliza el índice 1 y así sucesivamente.

Referencia cruzada

Puede obtener más información sobre la creación de sus propios tipos de datos en la Lección 2.

Tabla 1-3

Algunos tipos de datos predefinidos

Tome Nota

Las versiones sin signo de short, int y long son ushort, uint y ulong respectivamente. Los tipos sin signo tienen el mismo tamaño como las versiones con signo pero almacenan rangos mucho mayores sólo para valores positivos.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 11: 98-361 Fundamentos de Desarrollo de Software

10 Lección 1

Para acceder a un elemento individual de un arreglo, se utiliza el nombre del arreglo seguido del índice dentro de corchetes. Por ejemplo, numbers[0] devuelve el valor 1 del arreglo declarado anteriormente y numbers[4] devuelve el valor 5. Es ilegal acceder a un arreglo fuera de sus límites defnidos. Por ejemplo, obtendrá un error si intenta acceder al elemento del arreglo numbers[5].

Comprender los operadoresLos operadores son símbolos que especifcan la operación a llevar a cabo con los operandos y regresar un resultado.

Ejemplos de operadores incluyen +, -, *, /, etc., y los operandos pueden ser variables, constantes, literales, etc. Dependiendo de cuantos operandos se encuentren involucrados, hay varios tipos de operadores:

• Operadores unarios: Los operadores unarios trabajan sólo con un operando. Ejemplos incluyen ++x, x++, o isEven, donde x es de tipo de datos integer y isEven es un tipo de datos booleano.

• Operadores binarios: Los operadores binarios toman dos operandos. Por ejemplo, x + y o x > y.

• Operadores ternarios: Los operadores ternarios toman tres operandos. Sólo hay un operador ternario, ?:, en C#.

Frecuentemente las expresiones involucran más de un operador. En este caso, el compilador necesita determinar cuál operador toma precedencia sobre otro. La tabla 1-4 contiene los operadores en C# en orden de precedencia. Entre más arriba se encuentre el operador en la tabla, más alta es su precedencia. Los operadores con precedencia más alta son evaluados antes que los de baja. Los operadores que aparecen en la misma fla tienen la misma .

Categoría Operadores

Primario x.y f(x) a[x] x++ x-- new

typeof checked unchecked

Unario + - ! ~ ++x --x (T)x

Multiplicativo * / %

Aditivo + -

Desplazamiento << >>

Comprobación de tipos y relacionales < > <= >= is as

Igualdad == !=

AND lógico &

XOR lógico ^

Logical OR |

AND Condicional &&

OR Condicional ||

Condicional ?:

Asignación = *= /= %= += -= <<= >>= &= ^= |=

Tome Nota

El tema de los arreglos se cubre a mayor detalle en la Lección 3, Comprender el desarrollo de software en general.

Tabla 1-4

Precedencia de operadores

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 12: 98-361 Fundamentos de Desarrollo de Software

11Introducción a la programación

El operador de incremento unario (++) agrega 1 al valor de un identifcador. De igual manera los operadores de decremento (--) substraen 1 al valor de un identifcador. Los operadores de incremento y decremento unario se pueden utilizar ya sea como prefjos o sufjos. Por ejemplo:

int x = 10;

x++; //valor de x es ahora 11

++x; // valor de x es ahora 12

Sin embargo, la forma en la cual funcionan los operadores de incremento y decremento cuando se utilizan como parte de una asignación puede afectar los resultados. Cuando los operadores unarios de incremento y decremento se utilizan como prefjos, el valor actual del identifcador se regresa antes del incremento o decremento. Por el contrario, cuando se utilizan como sufjos, el valor del identifcador se regresa después del incremento o decremento. Para comprender lo anterior, considere el siguiente código:

int y = x++; // el valor de y es 12

int z = ++x; // el valor de z es 14

Aquí en la primera sentencia, el valor de x se regresa antes del incremento. Como resultado, después de que se ejecuta la sentencia, el valor de y es 12 y el valor de x es 13.

En la segunda sentencia, el valor de x se incrementa antes de regresar su valor para la asignación. Por lo tanto, después de ejecutar la sentencia, el valor tanto de x como de z es 14.

Comprender los métodosLos métodos sonbloques de código que contienen series de sentencias. Los métodos pueden recibir entradas vía argumentos y pueden regresar un valor a quien los invoca.

En la lista de código anterior, aprendió sobre el método Main. Los métodos se encuentran donde están las acciones en un programa. Un método es un conjunto de sentencias que se ejecutan cuando se invoca el método.

El método Main no regresa un valor, lo cual se indica utilizando la palabra void. Si un método fuera a regresar un valor, se colocaría un tipo de datos apropiado del valor retornado en lugar de void.

Los miembros de la clase pueden tener modifcadores como static, public y private. Estos modifcadores especifcan cómo y dónde se pueden acceder los miembros de la clase. Aprenderá más sobre estos modifcadores en la Lección 2.

; ¿Listo para la certificación?

¿Comprende los elementos básicos de la programación como las variables, tipos de datos, operadores y métodos? -1.1E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 13: 98-361 Fundamentos de Desarrollo de Software

12 Lección 1

� Comprender las estructura de decisión

È EN RESUMEN

Las estructuras de decisión introducen la habilidad de toma de decisiones al programa, también le permiten diversifcarse a diferentes secciones del código dependiendo del valor verdadero de una expresión booleana.

Las estructuras de decisión en C# son if, if-else y switch. En las siguientes secciones veremos cada una de estas sentencias a detalle.

La sentencia if La sentencia if ejecutará una secuencia de sentencias dada sólo si la expresión booleana correspondiente es verdadera.

A veces en su programa, querrá que una secuencia de sentencias se ejecute sólo si una condición es verdadera.

En C# puede realizarlo al utilizar la sentencia if. Considere los siguientes pasos para crear un programa que utilice la sentencia if.

Æ Uso de la sentencia if

PREPÁRESE. Para utilizar la sentencia if, realice lo siguiente:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre if_Statement) a la solución Lesson01.

2. Agregue el siguiente código al método Main de la clase Program.cs:

int number1 = 10;

int number2 = 20;

if (number2 > number1)

{

Console.WriteLine(“number2 es mayor que number1”);

}

3. Seleccione Depurar, Iniciar sin depurar, o presione Ctrl+F5.

4. Verá el resultado del programa en la ventana de línea de comandos.

5. Presione una tecla para cerrar la ventana de consola.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Este código es funcionalmente equivalente al diagrama de fujo de la Figura 1-4.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 14: 98-361 Fundamentos de Desarrollo de Software

13Introducción a la programación

Aquí la sentencia de salida sólo se ejecutará si la expresión booleana en el paréntesis es verdadera. Si la expresión es falsa, el control pasa a la siguiente sentencia que sigue de la sentencia if.

En C#, los paréntesis alrededor de la condición son obligatorios, no así las llaves, estas son opcionales si sólo hay una sentencia en el bloque de código. Por lo tanto, la sentencia if anterior equivale a:

if (number2 > number1)

Console.WriteLine(“number2 es mayor que number1”);

Por otro lado, observe este ejemplo:

if (number2 > number1)

Console.WriteLine(“number2 es mayor que number1”);

Console.WriteLine(number2);

Aquí, sólo la primera sentencia Console.WriteLine es parte de la sentencia if. La segunda sentencia Console.WriteLine siempre se ejecutará no importando el valor de la expresión booleana.

Para tener una mejor claridad, es mejor encerrar la sentencia que se vaya a ejecutar condicionalmente entre llaves.

Las sentencias if también se pueden anidar dentro de otras sentencias if, como se muestra en el siguiente ejemplo:

int number1 = 10;

Figura 1-4

El diagrama de flujo equivalente a la sentencia if

FIN

INICIO

n2 > n1?

Salida “n2

es > n1”

Si

No

n1 = 10

n2 = 20

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 15: 98-361 Fundamentos de Desarrollo de Software

14 Lección 1

if (number1 > 5)

{

Console.WriteLine(“number1 es mayor que 5”);

if (number1 < 20)

{

Console.WriteLine(“number1 es menor que 20”);

}

}

Puesto que las dos condiciones se evalúan como verdadero, se generará el siguiente resultado:

number1 es mayor que 5

number1 es menor que 20

Pero ¿qué sucedería si el valor de number1 fuera 25 en lugar de 10 antes de la ejecución de la sentencia exterior? En este caso, la primera expresión booleana se evaluaría como verdadera pero la segunda se evaluaría como falsa y se generaría el siguiente resultado:

number1 es mayor que 5

La sentencia if-else La sentencia if-else le permite a su programa llevar a cabo una acción si la expresión booleana se evalúa como verdadera y una acción diferente si la expresión se evalúa como falsa.

Considere los siguientes pasos para crear un programa que utiliza una sentencia if-else.

Æ Uso de la sentencia if-else

PREPÁRESE. Para utilizar una sentencia if-else, realice lo siguiente:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre ifelse_Statement) a la solución Lesson01.

2. Agregue el siguiente código al método Main de la clase Program.cs:

TestIfElse(10);

3. Agregue el siguiente método a la clase Program.cs:

public static void TestIfElse(int n)

{

if (n < 10)

{

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 16: 98-361 Fundamentos de Desarrollo de Software

15Introducción a la programación

Console.WriteLine(“n es menor que 10”);

}

else if (n < 20)

{

Console.WriteLine(“n es menor que 20”);

}

else if (n < 30)

{

Console.WriteLine(“n es menor que 30”);

}

else

{

Console.WriteLine(“n es mayor que o igual a 30”);

}

}

4. Seleccione Depurar, Iniciar sin depurar o presione Ctrl+F5.

5. Verá el resultado del programa en la ventana de comandos.

6. Presione una tecla para cerrar la ventana.

7. Modifique el código del método Main para invocar el método TestIfElse con valores diferentes. Observe cómo se ejecuta una bifurcación de la sentencia if-else como resultado de sus cambios.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

El código en el método TestIfElse combina varias sentencias if-else para evaluar varias condiciones. Si el valor de n es 25, entonces las primeras dos condiciones (n < 10 y n < 20) se evaluarán como falsas pero la tercera condición (n<30) se evaluará como verdadera. Por lo tanto, el método imprimirá el siguiente resultado: n es menor que 30

Este programa en C# equivale al diagrama de fujo en la Figura 1-5.

Figura 1-5

Diagrama de flujo equivalente a la sentencia if-else

FIN

INICIO

Salida “n

>= 30”

Si

No

n < 10?

n < 20?

n < 30?

No

No

Salida “n

< 10”

Si

Salida “n

< 20”

Si

Salida “n

< 30”

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 17: 98-361 Fundamentos de Desarrollo de Software

16 Lección 1

La sentencia switch La sentencia switch permite una bifurcación múltiple. En muchos casos, el uso de una sentencia switch puede simplifcar una combinación compleja de sentencias if-else.

La sentencia switch consiste de la palabra reservada switch, seguida de una expresión en paréntesis, seguida de un bloque para el mismo. El bloque del switch puede incluir una o más sentencias case o una sentencia default. Cuando se ejecuta la sentencia switch, dependiendo del valor de la expresión del switch, se transfere el control a una sentencia case coincidente. Si la expresión no coincide con ninguna sentencia case, el control se transfere a la sentencia default. La expresión del switch debe ir entre paréntesis.

Considere los siguientes pasos para crear un programa que utiliza una sentencia switch para evaluar expresiones simples.

Æ Uso de la sentencia switch

PREPÁRESE. Para utilizar la sentencia switch, realice lo siguiente:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre switch_Statement) a la solución Lesson01.

2. Agregue el siguiente código al método Main de la clase Program.cs:

TestSwitch(10, 20, ‘+’);

3. Agregue el siguiente método a la clase Program.cs:

public static void TestSwitch(int op1, int op2, char opr)

{

int result;

switch (opr)

{

case ‘+’:

result = op1 + op2;

break;

case ‘-’:

result = op1 - op2;

break;

case ‘*’:

Tome Nota

La expresión que sigue a la sentencia case debe ser una expresión constante y debe ser del mismo tipo de datos de la expresión del switch.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 18: 98-361 Fundamentos de Desarrollo de Software

17Introducción a la programación

result = op1 * op2;

break;

case ‘/’:

result = op1 / op2;

break;

default:

Console.WriteLine(“Operador desconocido”);

return;

}

Console.WriteLine(“Resultado: {0}”, result);

return;

}

4. Seleccione Depurar, Iniciar sin depurar, o presione Ctrl+F5.

5. Verá el resultado del programa en la ventana de comandos.

6. Presione una tecla para cerrar la ventana.

7. Modifique el código del método Main para llamar al método TestSwitch con valores diferentes. Observe cómo se ejecuta una bifurcación diferente de la sentencia switch como resultado de sus cambios.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Aquí, el método TestSwitch acepta dos operandos (op1 y op2) y un operador (opr) y evalúa la expresión resultante. El valor de la expresión switch se compara con las sentencias case en el bloque del switch. Si existe una coincidencia, se ejecutan las sentencias del case correspondiente. Si no hay coincidencias, el control se transfere a la bifurcación opcional default.

Hay una sentencia break después de cada case. La sentencia break termina la sentencia switch y transfere el control a la siguiente sentencia fuera del bloque del switch. Al utilizar un break se asegura que sólo se ejecute una bifurcación y evita errores de programación. De hecho, si coloca código después de la sentencia case, debe incluir un break (u otra sentencia de transferencia de control como el return) para asegurarse que el control no se transfera de un case a otro.

Por el contrario, si no hay código en la sentencia case, está bien si el control pasa a la sentencia case subsecuente. El siguiente código demuestra que tan útil puede ser esto:

public static void TestSwitchFallThrough()

{

Tome Nota

El método Console.Write puede utilizar cadenas de formato como “Resultados: {0}” para dar formato al resultado. Aquí la cadena {0} representa el primer argumento que sigue a la cadena de formato. En el método TestSwitch, la cadena de formato “{0}” se reemplaza con el valor del siguiente argumento, result.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 19: 98-361 Fundamentos de Desarrollo de Software

18 Lección 1

DateTime dt = DateTime.Today;

switch (dt.DayOfWeek)

{

case DayOfWeek.Monday:

case DayOfWeek.Tuesday:

case DayOfWeek.Wednesday:

case DayOfWeek.Thursday:

case DayOfWeek.Friday:

Console.WriteLine(«Hoy es un día laboral»);

break;

default:

Console.WriteLine(«Hoy es un día de fn de semana»);

break;

}

}

Aquí si el valor de la expresión dt.DayofWeek es DayOfWeek.Monday, entonces existe una coincidencia con el primer case, pero puesto que no hay código (o una sentencia de transferencia de control, la ejecución continúa a la siguiente sentencia, resultando en la aparición del mensaje “Hoy es un día laboral” en la ventana de consola.

� Comprender las estructuras de repetición

È EN RESUMEN

C# cuenta con cuatro estructuras de control diferentes que permite a los programas llevar a cabo tareas repetitivas: el ciclo while, el do-while, el for y el foreach.

Estas sentencias de control de repetición se pueden utilizar para ejecutar las sentencias dentro el cuerpo del ciclo una cantidad de veces dependiendo de los criterios de terminación del ciclo.

Un ciclo también puede interrumpirse utilizando una sentencia de transferencia de control que asigne el control fuera del ciclo. Estas sentencias son break, goto, return o throw. La sentencia continue se puede utilizar para pasar el control a la siguiente iteración del ciclo sin salir de este.

Tome Nota

Puede decidir entre utilizar sentencias if-else o una sentencia switch dependiendo de la naturaleza de comparación y legibilidad del código. Por ejemplo, el código del método TestIfElse toma decisiones con base en las condiciones que son más apropiadas de utilizar con las sentencias if-else. En el método TestSwitch, las decisiones se basan en valores constantes, por lo que el código es mucho más legible en una sentencia switch.

; ¿Listo para la certificación?

¿Comprende las estructuras de decisión computacionales como las bifurcaciones y la repetición? -1.2

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 20: 98-361 Fundamentos de Desarrollo de Software

19Introducción a la programación

Comprender el ciclo while El ciclo while ejecuta repetidamente un bloque de sentencias hasta que una expresión booleana se evalúe como falsa.

La forma general de un ciclo while es

while (boolean test)

sentencia

Aquí, se lleva a cabo una evaluación booleana al principio del ciclo. Si es verdadero, se ejecuta el cuerpo del ciclo y se realiza de nuevo la evaluación. Si la evaluación resulta en un valor falso, se termina el ciclo y el control se transfere a la siguiente sentencia después del ciclo.

Puesto que la evaluación booleana se lleva a cabo antes de la ejecución del ciclo, es posible que el cuerpo del while nunca se ejecute. Esto pasa si la evaluación resulta falsa desde la primera vez.

Considere los siguientes pasos para crear un programa que utiliza la sentencia while.

Æ Uso de la sentencia while

PREPÁRESE. Para utilizar la sentencia while, lleve a cabo las siguientes tareas:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre while_Statement) a la solución Lesson01.

2. Agregue el siguiente código al método Main de la clase Program.cs:

WhileTest();

3. Agregue el siguiente método a la clase Program.cs:

private static void WhileTest()

{

int i = 1;

while (i <= 5)

{

Console.WriteLine(“El valor de i = {0}”, i);

i++;

}

}

Tome Nota

La evaluación booleana debe colocarse entre paréntesis. Si se ejecuta más de una sentencia como parte del ciclo while, se deben colocar entre llaves.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 21: 98-361 Fundamentos de Desarrollo de Software

20 Lección 1

4. Seleccione Depurar después Iniciar sin depurar, o presione Ctrl+F5.

5. Verá el resultado del programa en la ventana de línea de comandos.

6. Presione una tecla para cerrar la ventana.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

En este ejercicio, a la variable i se le asigna el valor 1. A continuación, se evalúa la condición del ciclo while. Puesto que la condición es verdadera (1<=5), se ejecuta el código del bloque de sentencias while. El valor de i se escribe en la ventana de línea de comandos y el valor de i se incrementa en 1, por lo que ahora vale 3. El control pasa entonces de vuelta a la sentencia while y la condición se evalúa de nuevo. Puesto que la condición sigue siendo verdadera (2<=5), el bloque de sentencias se ejecuta de nuevo. El ciclo continua hasta que el valor de i sea 6 y la condición en el ciclo while sea falsa (6<=5). El método anterior, cuando se ejecuta, genera el siguiente resultado.

El valor de i = 1

El valor de i = 2

El valor de i = 3

El valor de i = 4

El valor de i = 5

El diagrama de fujo equivalente a este ciclo while se encuentra en la Figura 1-6.

Figura 1-6

Diagrama de flujo equivalente al ciclo while

FIN

INICIO

Imprimir i

i <= 5?

No

Si

i = 1

i = i + 1

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 22: 98-361 Fundamentos de Desarrollo de Software

21Introducción a la programación

La sentencia en el ciclo, el cual incrementa el valor de i, juega un papel crítico. Si omite esa sentencia, la conducción de terminación nunca se alcanzará y se tendrá un ciclo infnito.

En la mayoría de los casos, para tener un ciclo while bien diseñado, debe contar con tres partes:

1. Inicialización: El inicializador establece el contador del ciclo en un valor inicial correcto. En el ejemplo anterior, la variable i se establece en 1 antes de que inicie el ciclo.

2. Evaluación del ciclo: La evaluación del ciclo especifca la condición de terminación para el ciclo. En el ejemplo anterior, la expresión (i>=5) es la expresión de condición.

3. Expresión de terminación: La expresión de terminación cambia el valor del contador del ciclo de forma tal que se alcance la condición de terminación. En el ejemplo anterior, la expresión i++ es la expresión de terminación.

Comprender el ciclo do-while El ciclo do-while ejecuta repetidamente un bloque de sentencias hasta que una expresión booleana específca se evalúe como falsa. El ciclo do-while evalúa la condición al fnal del ciclo.

El ciclo do-while es similar al while, pero a diferencia de este, el cuerpo del ciclo do-while se ejecuta al menos una vez.

La forma general del ciclo do-while es

do

sentencia

while (evaluación booleana);

Considere los siguientes pasos para crear un programa que utilice la sentencia do-while.

Æ Uso de la sentencia do-while

PREPÁRESE. Para utilizar la sentencia do-while, realice lo siguiente:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre dowhile_Statement) a la solución Lesson01.

2. Agregue el siguiente código al método Main de la clase Program.cs:

DoWhileTest();

3. Agregue el siguiente método a la clase Program.cs:

private static void DoWhileTest()

{

int i = 1;

do

Tome Nota

Para evitar un ciclo infinito, debe asegurarse que este se haya diseñado de forma tal que lleve a una terminación.

Tome Nota

La evaluación booleana se debe colocar entre paréntesis. Si se necesita ejecutar más de una sentencia como parte del ciclo do-while, se deben colocar dentro de llaves.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 23: 98-361 Fundamentos de Desarrollo de Software

22 Lección 1

{

Console.WriteLine(“El valor de i = {0}”, i);

i++;

}

while (i <= 5);

}

4. Seleccione Depurar posteriormente Iniciar sin depurar, o presione Ctrl+F5.

5. Verá el resultado del programa en la ventana de línea de comandos.

6. Presione una tecla para cerrar la ventana.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

En este ejercicio, después de que la variable i se asigna en 1, el control entra directamente en el ciclo. Se ejecuta el código dentro de la sentencia do-while. El valor de i se escribe en la ventana de línea de comandos y se incrementa en 1 por lo que el valor sube a 2. A continuación, se evalúa la condición del ciclo do-while. Como la condición aun es verdadera (2<=5), el control regresa a la sentencia do-while y el bloque de sentencias se ejecuta de nuevo. El ciclo continua hasta que el valor de i llega a 6 y la condición del do-while resulta falsa (6<=5). El método anterior, cuando se ejecuta, genera el mismo resultado que el método WhileTest.

La elección entre un ciclo while y uno do-while depende de si se quiere o no que el ciclo se ejecute al menos una vez. Si quiere que el ciclo se ejecute cero o más veces, elija el ciclo while. Por el contrario, si desea que el ciclo se ejecute una o más veces, elija el ciclo do-while.

Comprender los ciclosEl ciclo for combina los tres elementos de iteración: la expresión de inicialización, la expresión de condición de terminación y la expresión de conteo, de forma más legible.

El ciclo for es similar al ciclo while; este permite que una o varias sentencias se ejecuten de forma repetida hasta que una expresión se evalúe como falsa. La forma general del ciclo for es:

for (init-expr; cond-expr; count-expr)

sentencia

Como puede ver, el ciclo for combina las tres expresiones de control esenciales de la iteración, lo cual resulta en código más legible. El ciclo for es particularmente útil para crear iteraciones que se deben ejecutar una cantidad especifcada de veces.

Considere los siguientes pasos para crear un programa que utilice la sentencia for.

Tome Nota

Las tres expresiones de control se deben colocar entre paréntesis. Si se necesita ejecutar más de una sentencia como parte del ciclo for, se deben colocar dentro de llaves.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 24: 98-361 Fundamentos de Desarrollo de Software

23Introducción a la programación

Æ Uso de la sentencia for

PREPÁRESE. Para utilizar la sentencia for, realice las siguientes tareas:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre for_Statement) a la solución Lesson01.

2. Agregue el siguiente código al método Main de la clase Program.cs:

ForTest();

3. Agregue el siguiente método a la clase Program.cs:

private static void ForTest()

{

for(int i = 1; i<= 5; i++)

{

Console.WriteLine(“El valor de i = {0}”, i);

}

}

4. Seleccione Depurar y después Iniciar sin depurar o presione Ctrl+F5.

5. Verá el resultado de su programa en la ventana de línea de comandos.

6. Presione una tecla para cerrar la ventana.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Cuando se ejecuta el método ForTest, se produce el mismo resultado que con el método WhileTest. Aquí, la variable i se crea dentro del ámbito del ciclo for y su valor se asigna en 1. El ciclo continúa mientras el valor de i sea menor o igual a 5. Después del cuerpo del ciclo, se evalúa count-expr y el control regresa a cond-expr,

Todos las expresiones de control de un ciclo for son opcionales. Por ejemplo, se pueden omitir todas las expresiones para crear un ciclo infnito como el siguiente:

for (; ;)

{

//no hace nada

}

Comprender los ciclos foreach El ciclo foreach es útil para la iteración a través de los elementos de un conjunto.

El ciclo foreach puede concebirse como una versión mejorada del ciclo for para la

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 25: 98-361 Fundamentos de Desarrollo de Software

24 Lección 1

iteración a través de colecciones como arreglos y listas. La forma general de la sentencia foreach es la siguiente:

foreach (TipoElemento elemento in colección)

sentencia

Las expresiones de control para la sentencia foreach se deben colocar dentro de paréntesis. Si se tiene que ejecutar más de una sentencia como parte del ciclo foreach, se deben colocar dentro de llaves. Considere los siguientes pasos para crear un programa que muestre la manera en la cual el ciclo foreach proporciona una forma sencilla de realizar iteraciones en una colección.

Æ Uso de la sentencia foreach

PREPÁRESE. Para utilizar la sentencia foreach, realice lo siguiente:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre foreach_Statement) a la solución Lesson01.

2. Agregue el siguiente código al método Main de la clase Program.cs:

ForEachTest();

3. Agregue el siguiente método a la clase Program.cs:

private static void ForEachTest()

{

int[] numbers = { 1, 2, 3, 4, 5 };

foreach (int i in numbers)

{

Console.WriteLine(“El valor de i = {0}”, i);

}

}

4. Seleccione Depurar y después Iniciar sin depurar o presione Ctrl+F5.

5. Verá el resultado de su programa en la ventana de línea de comandos.

6. Presione una tecla para cerrar la ventana.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

En este ejercicio, el ciclo itera de forma secuencial a través de cada elemento de la colección y muestra el resultado en la ventana de línea de comandos. Este método genera el mismo resultado que el método ForTest.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 26: 98-361 Fundamentos de Desarrollo de Software

25Introducción a la programación

Comprender la recursividad La recursividad es una técnica de programación que causa que un método se invoque a sí mismo para computar un resultado.

La recursividad y la iteración se encuentran relacionadas. Se puede escribir un método que produzca los mismos resultados ya sea utilizando recursividad o iteraciones. Generalmente, la naturaleza del problema en sí, le ayudará a seleccionar entre una solución recursiva o iterativa. Por ejemplo, una solución recursiva es más elegante cuando puede defnir la solución de un problema en términos de una versión más compacta para el mismo problema.

Para tener una mejor idea, tomemos el ejemplo de la operación factorial en matemáticas. La defnición recursiva general para el factorial de n (n!) es:

De acuerdo con esta defnición, si el número es 0, el factorial es uno. Si el número es mayor a cero, el factorial es el número multiplicado por el factorial del siguiente número más pequeño. Por ejemplo, se puede desglosar 3! de la siguiente manera: 3! = 3 * 2! à 3 * 2 * 1! à 3 * 2 * 1 * 0! à 3 * 2 * 1 * 1 à 6.

Considere los siguientes pasos para crear un programa que presente una solución recursiva para el problema factorial.

Æ Uso del método recursivo

PREPÁRESE. Para utilizar el método recursivo, realice lo siguiente:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre RecursiveFactorial) a la solución Lesson01.

2. Agregue el siguiente código al método Main de la clase Program.cs:

Factorial(5);

3. Agregue el siguiente método a la clase Program.cs:

public static int Factorial(int n)

{

if (n == 0)

{

return 1; //caso base

}

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 27: 98-361 Fundamentos de Desarrollo de Software

26 Lección 1

else

{

return n * Factorial(n - 1); // caso recursivo

}

}

4. Seleccione Depurar, Iniciar sin depurar, o presione Ctrl+F5.

5. Verá el resultado del programa en la ventana de línea de comandos. Presione una tecla para cerrar la ventana.

6. Modifique el método Main para pasar un valor diferente al método Factorial y observe los resultados.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Como se vio en el ejercicio anterior, una solución recursiva tiene dos partes principales:

• El caso base: La parte que especifca la condición de terminación que no llama nuevamente al método. El caso base en el método Factorial es n == 0. Si no tiene un caso base en su algoritmo recursivo, se crea una recursión infnita. Una recursión infnita hará que su computadora se quede sin memoria y arrojará una excepción System.StackOverfowException.

• El caso recursivo: La parte que mueve el algoritmo hacia la clase base. El caso recursivo en el método Factorial es la parte del else, donde se llama nuevamente el método pero con un valor menor para progresar hacia el caso base.

� Comprender el manejo de excepciones

È EN RESUMEN

El .NET Framework soporta el manejo de excepciones para errores en tiempo de ejecución. En esta sección aprenderá a utilizar las excepciones try, catch, y fnally.

Una excepción es una condición de error que ocurre durante la ejecución de un programa en C#. Cuando esto sucede, el tiempo de ejecución crea un objeto para representar el error y “lanzarlo”. A menos que “atrape” la excepción escribiendo el código correcto para manejar excepciones, la ejecución del programa terminará.

Por ejemplo, si intenta dividir un entero entre cero, se lanzará una excepción DivideByZeroException. En el .NET Framework, una excepción se representa utilizando un objeto de la clase System.Exception o una de sus clases derivadas. Existen clases de excepción predefnidas que representan las situaciones de error más comunes como DivideByZeroException. Si se encuentra diseñando una aplicación que necesite lanzar excepciones específcas de aplicación, deberá crear clases de excepción personalizadas que se deriven de la clase System.Exception.

; ¿Listo para la certificación?

¿Puede identificar apropiadamente los métodos para el manejo de las repeticiones? 1.3

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 28: 98-361 Fundamentos de Desarrollo de Software

27Introducción a la programación

Manejo de excepcionesPara manejar excepciones, coloque el código que las lance dentro de un bloque try y coloque el código que maneje las excepciones dentro de un bloque catch.

El siguiente ejercicio demuestra cómo utilizar un bloque try-catch para manejar una excepción. Este ejercicio utiliza el método File.OpenText para abrir un archivoarchioe en disco. Esta sentencia se ejecutará bien en un caso normal, pero si no se encuentra el archivo o permiso de lectura del mismo, se lanzará una excepción.

Æ Manejo de excepciones

PREPÁRESE. Para manejar excepciones, realice lo siguiente:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre HandlingExceptions) a la solución Lesson01.

2. Agregue el siguiente código al método Main de la clase Program.cs:

ExceptionTest();

3. Agregue el siguiente método a la clase Program.cs:

private static void ExceptionTest()

{

StreamReader sr = null;

try

{

sr = File.OpenText(@”c:\data.txt”);

Console.WriteLine(sr.ReadToEnd());

}

catch (FileNotFoundException fnfe)

{

Console.WriteLine(fnfe.Message);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

}

4. Cree un archivo (“data.txt”) utilizando el Bloc de notas o Visual Studio en la unidad c:. Se puede crear el archivo en otra ubicación pero si lo hace, recuerde modificar la ubicación del archivo en el programa. Escriba algo de texto en el archivo.

5. Seleccione Depurar y después Iniciar sin depurar o presione Ctrl+F5.

6. Verá que el contenido del archivo de texto aparece en la ventana de línea de comandos.

Tome Nota

La clase StreamReader es parte del espacio de nombres System.IO. Cuando este código se ejecuta, necesitará agregar una directiva using para el espacio de nombres System.IO.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 29: 98-361 Fundamentos de Desarrollo de Software

28 Lección 1

Presione una tecla para cerrar la ventana.

7. Elimine el archivo data.txt y ejecute nuevamente el programa. Esta vez aparecerá una excepción a FileNotFoundException y aparecerá un mensaje en la ventana.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Para manejar la excepción, se colocan la sentencias que pueden causar la excepción en un bloque try. Luego se agregan los bloques catch para manejar una o más excepciones. En este ejemplo, además de manejar la excepción FileNotFoundException, también utilizamos un bloque catch con más excepciones genéricas para obtener todas las otras excepciones. El nombre de la excepción para un bloque catch debe ir entre paréntesis. Las sentencias que se ejecutan cuando se obtiene una excepción deben ir entre llaves.

La ejecución del código se detiene cuando ocurre una excepción. El tiempo de ejecución busca una sentencia catch que corresponda al tipo de excepción. Si el primer bloque catch no atrapa la excepción arrojada, el control se mueve al siguiente bloque catch y así sucesivamente. Si la excepción no se maneja en el método, el tiempo de ejecución revisa la sentencia catch en el código y continúa para el resto de la pila de llamadas.

Uso de try-catch-finallyEl bloque fnally se utiliza con el bloque try. El bloque fnally siempre se ejecuta sin importar si ocurre o no la excepción. El bloque fnally se utiliza con frecuencia para escribir código de limpieza.

Cuando ocurre una excepción, con frecuencia signifca que algunas líneas de código no se ejecutaron luego de que ocurrió la excepción, lo cual puede dejar su programa en un estado inestable. Puede utilizar la sentencia fnally para garantizar que se ejecute código de limpieza. Esto puede involucrar el cerrar conexiones, liberar recursos o establecer variables a sus valores esperados. Observemos el código del siguiente ejercicio.

Æ Uso de try-catch-finally

PREPÁRESE. Para utilizar la sentencia try-catch-finally, realice lo siguiente:

1. Agregue un nuevo proyecto de aplicación de consola (de nombre trycatchfinally) a la solución Lesson01.

2. Agregue el siguiente código al método Main a la clase Program.cs:

TryCatchFinallyTest();

3. Agregue el siguiente método a la clase Program.cs:

private static void TryCatchFinallyTest()

{

StreamReader sr = null;

try

{

sr = File.OpenText(@”c:\data.txt”);

Tome Nota

En el método ExceptionTest, es incorrecto cambiar el orden de los dos bloques catch. Las excepciones más específicas necesitan enlistarse antes de las excepciones genéricas, de lo contrario ocurrirán errores de compilación.

Tome Nota

Un bloque try debe tener al menos un bloque catch o un bloque finally asociado.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 30: 98-361 Fundamentos de Desarrollo de Software

29Introducción a la programación

Console.WriteLine(sr.ReadToEnd());

}

catch (FileNotFoundException fnfe)

{

Console.WriteLine(fnfe.Message);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

fnally

{

if (sr != null)

{

sr.Close();

}

}

}

4. Cree un archivo de texto (“data.txt”) utilizando el Bloc de notas o Visual Studio en la unidad c:. Se puede crear el archivo en otra ubicación pero recuerde modificar la ubicación del archivo en el programa. Escriba texto en el archivo.

5. Seleccione Depurar, Iniciar sin depurar o presione Ctrl+F5.

6. Verá que el contenido del archivo de texto aparece en la ventana de línea de comandos. Presione una tecla para cerrar la ventana.

7. Elimine el archivo data.txt file y ejecute nuevamente el programa. Esta vez obtendrá un FileNotFoundException y aparecerá un mensaje en la ventana.

En este ejercicio, el programa se asegura que el objeto StreamReader se cierre y que se liberen los recursos cuando se complete la operación. El código en el bloque fnally se ejecuta sin importar si aparece una excepción o no.

; ¿Listo para la certificación?

¿Comprende cómo manejar errores en sus programas? -1.4

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 31: 98-361 Fundamentos de Desarrollo de Software

30 Lección 1

Matriz de resumen de habilidades

En esta lección aprendió:

• Un algoritmo es un conjunto de pasos ordenado y fnito para solucionar un problema dado. Puede encontrar de utilidad expresar un algoritmo a través de un diagrama de fujo o de una tabla de decisión antes de desarrollar un programa de manera formal.

• El lenguaje de programación C# es parte del .NET Framework y se benefcia tanto del soporte de tiempo de ejecución y las librerías de clase incluidas en .NET Framework.

• Main es un método especial que también sirve como punto de entrada al programa. Cuando el tiempo de ejecución corre un programa, siempre inicia en el método Main.

• Las variables en C# son marcadores de posición utilizadas para almacenar valores. Una variable tiene un nombre y un tipo de datos. El tipo de datos de la variable determina el valor que esta puede contener y el tipo de operaciones en las cuales se puede utilizar.

• El tipo de datos determina el tamaño de memoria necesario para almacenar los datos el tipo de operaciones que se pueden llevar a cabo con la información.

• Los operadores son símbolos como +, -, *, /, que especifcan cual operación llevar a cabo con los operandos y regresar un resultado.

• Las sentencias if-else le permiten a su programa llevar a cabo una acción si la expresión booleana se evalúa como verdadera o una acción diferente si la expresión resulta ser falsa.

• La sentencia switch le permite contar con varias ramifcaciones. En la mayoría de los casos, una sentencia switch puede simplifcar una combinación compleja de sentencias if-else.

• C# tiene cuatro estructuras de control diferentes que le permite a sus programas llevar a cabo tareas repetitivas: el ciclo while, el do-while, el for y el foreach.

• El while y el do-while ejecutan de forma repetida un bloque de sentencias hasta que una expresión booleana específca se evalúe como falsa. El ciclo do-while evalúa la condición al fnal del ciclo.

• El ciclo for combina los tres elementos de iteración: la sentencia de inicialización, la condición de terminación y la sentencia de incremento/decremento en un código más legible.

• El ciclo foreach es útil para iterar los elementos de una colección.

• La recursión es una técnica de programación que hace que un método se llame a sí mismo para computar un resultado.

• El .NET Framework soporta el manejo de excepciones estándar y maneja errores en tiempo de ejecución. Para manejar las excepciones, se coloca código que arroja excepciones dentro de un bloque try y se coloca código que maneja las excepciones en un bloque catch.

• El bloque fnally se utiliza con el bloque try. El bloque fnally siempre se ejecuta sin importar si se arroja o no una excepción. El bloque fnally se utiliza con frecuencia para escribir código de limpieza.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 32: 98-361 Fundamentos de Desarrollo de Software

31Comprender los conceptos básicos de bases de datos

» Evaluación de conocimiento

Complete los espacios en blanco

Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los

espacios en blanco proporcionados.

1. La sentencia ______ selecciona la ejecución de una lista de sentencias teniendo una etiqueta asociada que corresponda al valor de una expresión.

2. El ciclo ______ evalúa la condición al fnal en lugar de hacerlo al principio del ciclo.

3. El único operador que toma tres argumentos es el operador ______.

4. El ciclo ______ representa la forma más compacta para iterar los elementos de una colección.

5. En una computadora de 32-bit, una variable del tipo de datos int ocupa ______ bytes de memoria.

6. Par acceder al primer elemento de un arreglo, se utilice un índice de _____.

7. La ______ es una técnica de programación que causa que un método se llame a sí mismo para poder computar un resultado.

8. Las ______ son los campos de datos o variables locales cuyos valores no se modifcan.

9. Cuando un algoritmo involucra grandes cantidades de condiciones, una ______ es un formato compacto y más legible para presentar el algoritmo.

10. Un ______ es una representación gráfca de un algoritmo.

Opción múltiple

Encierre la letra que corresponda a la respuesta correcta.

1. Si escribe el siguiente código:

int n = 20;

int d = n++ + 5;

2. ¿Cuál será el valor de d después de ejecutar el código?

a. 25

b. 26

c. 27

d. 28

3. Si escribe el siguiente código:

private static void WhileTest()

{

int i = 1;

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 33: 98-361 Fundamentos de Desarrollo de Software

32 Lección 1

while (i < 5)

{

Console.WriteLine(“El valor de i = {0}”, i);

i++;

}

}

4. ¿Cuántas veces se ejecutará el ciclo while en este código?

a. 0

b. 1

c. 4

d. 5

5. Si escribe el siguiente código:

int number1 = 10;

int number2 = 20;

if (number2 > number1)

Console.WriteLine(“number1”);

Console.WriteLine(“number2”);

6. ¿Cuál resultado aparecerá después de ejecutar este código?

a. number1

b. number2

c. number1 number2

d. number2 number1

7. En una sentencia switch, si ninguno de las sentencias case coincide con la expresión del switch, ¿a cuál sentencia se transfere el control?

a. break

b. continue

c. default

d. return

8. Necesita escribir código que cierre una conexión a una base de datos. Necesita asegurarse que este código se ejecute siempre sin importar si ocurre o no una excepción. ¿Dónde debería escribir este código?

a. Dentro de un bloque try

b. Dentro de un bloque catch

c. Dentro de un bloque fnally

d. Dentro de un método Main

9. Necesita almacenar valores con un rango de 0 a 255. Necesita también asegurarse que el programa minimice el uso de memoria. ¿Cuál tipo de datos debería utilizar

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 34: 98-361 Fundamentos de Desarrollo de Software

33Comprender los conceptos básicos de bases de datos

para almacenar estos valores?

a. Byte

b. Char

c. Short

d. Int

10. Si no tiene una clase base en su algoritmo recursivo, crea una recursión infnita. Una recursión infnita causará que su programa arroje una excepción. ¿Cuál excepción será esta?

a. OutOfMemoryException

b. StackOverfowException

c. DivideByZeroException

d. InvalidOperationException

11. Se encuentra aprendiendo cómo desarrollar algoritmos repetitivos en C#: Escribe el siguiente método:

private static void ForTest()

{

for(int i = 1; i < 5;)

{

Console.WriteLine(“El valor de i = {0}”, i);

}

}

12. ¿Cuántas repeticiones llevará cabo este ciclo for?

a. 0

b. 4

c. 5

d. infnito

13. ¿Cuál de las siguientes características de C# utilizaría para organizar el código y crear tipos globalmente únicos?

a. Assemblies

b. Espacio de nombres

c. Clase

d. Tipo de datos

14. Al escribir el siguiente código:

int[] numbers = {1, 2, 3, 4};

int val = numbers[1];

15. También crea una variable del tipo RectangleHandler como se muestra a continuación:

RectangleHandler handler;

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 35: 98-361 Fundamentos de Desarrollo de Software

34 Lección 1

16. ¿Cuál es el valor de la variable val después de ejecutar el código?

a. 1

b. 2

c. 3

d. 4

» Evaluación de destreza

Escenario 1-1: Convierta una tabla de decisión en un Programa de C#

Se encuentra desarrollando una aplicación de facturación que calcula los porcentajes de descuento con base en la cantidad de productos adquiridos. La lógica para calcular descuentos se encuentra en la siguiente tabla de decisión. Necesita escribir un método en C# que utilice la misma lógica para calcular el descuento. ¿Cómo escribiría su programa?

Cantidad < 10 S N N N

Cantidad < 50 S S N N

Cantidad < 100 S S S N

Descuento 5% 10% 15% 20%

Escenario 1-2: Convierta un diagrama de flujo en un programa de C#

Se encuentra desarrollando una librería de funciones matemáticas. Antes desarrolló el siguiente diagrama de fujo para describir el algoritmo para calcular el factorial de un número. Necesita escribir un equivalente en C# para este diagrama de fujo. ¿Cómo escribiría el programa?

FIN

INICIO

Salida de

fact

n > 1?

No

Si

fact = 1

fact = fact * n

Ingresar n

n = n - 1

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 36: 98-361 Fundamentos de Desarrollo de Software

35Comprender los conceptos básicos de bases de datos

» Evaluación de aptitud

Proyecto 1-3: Maneje excepciones

Se encuentra escribiendo código para una librería aritmética simple. Decide crear un método de nombre Divide que toma dos argumentos, x y y, y regresa el valor de x/y. Necesita obtener cualquier excepción aritmética que pueda resultar de los errores en aritmética, casting o conversiones de tipos de datos. También necesita obtener cualquier otra excepción que pueda resultar del código. Necesita crear el código para manejar excepciones estructurándolo de forma correcta para cubrir este requerimiento. ¿Cómo escribiría un programa con estas características?

Proyecto 1-4: Cree un algoritmo recursivo

Se encuentra desarrollando una librería de funciones de utilidad para su aplicación. Necesita escribir un método que tome un entero y cuente la cantidad de dígitos signifcativos en el mismo. Necesita crear un programa recursivo para solucionar este problema. ¿Cómo escribiría un programa con estas características?

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 37: 98-361 Fundamentos de Desarrollo de Software

36 Lección 1

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 38: 98-361 Fundamentos de Desarrollo de Software

• Accessors• Clase abstracta• Constructor• Delegado• Encapsulamiento

• Evento• Herencia• Interfaz• Espacio de nombres• Polimorfsmo

• Propiedad• Tipo de referencia• Tipo de valor

Como desarrollador de software para la corporación Northwind, forma parte de un equipo de desarrollo de programas de computadora que resuelven problemas de la empresa. Cualquier programa que escriba debe ser fácil de entender y mantener por un largo periodo de tiempo. Necesita desarrollar programas utilizando técnicas que impulsen el reciclado de código, la extensibilidad y la colaboración.

En lugar de pensar en un programa como una lista de métodos, incorpore en sus programas conceptos de negocios del mundo real como clientes, productos, proveedores y las interacciones entre los mismos.

Lección 2

Introducción a la programación orientada a objetos

Matriz de dominio de objetivos

Habilidad tecnológica Descripción de dominio de objetivo Número del dominio del objetivo

Comprender los objetos Comprender los principios básicos de las clases

2.1

Comprender los valores y las referencias Comprender el almacenamiento y los tipos de datos

1.1

Comprender el encapsulamiento Comprender el encapsulamiento 2.4

Comprender la herencia Comprender la herencia 2.2

Comprender el polimorfismo Comprender el polimorfismo 2.3

Comprender las interfaces Comprender las interfaces 2.4

Términos clave

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 39: 98-361 Fundamentos de Desarrollo de Software

38 Lección 2

� Comprender objetos

È EN RESUMEN

La programación orientada a objetos es una técnica de programación que utiliza objetos. Los objetos son estructuras de datos auto contenidas que consisten de propiedades, métodos y eventos. Las propiedades especifcan los datos representados por el objeto, los métodos especifcan el comportamiento de un objeto y los eventos proporcionan la comunicación entre los objetos.

Pensar de forma orientada a objetosUn objeto de software es conceptualmente similar a un objeto en el mundo real.

Una buena manera de empezar a pensar de forma orientada a objetos es observando el mundo real por ejemplo, un coche, un teléfono, un reproductor de música, etc. Notará que todos tienen un estado y un comportamiento. Por ejemplo, los coches tienen un estado (nombre del modelo, color, velocidad, cantidad de gasolina) y un comportamiento (acelerar, frenar, cambiar velocidades). También notará que algunos objetos son más simples y otros más complejos. Algunos objetos complejos como los coches están hechos de objetos más pequeños que a su vez tienen su propio estado y comportamiento. También se dará cuenta que aunque un coche es un objeto complejo, sólo necesita saber algunas cuantas cosas para poder interactuar con uno. Cuando conduce un auto, simplemente invoca un comportamiento como acelerar o frenar y desconoce muchos miles de detalles internos sobre su funcionamiento.

Un objeto de software es conceptualmente similar a uno del mundo real. Un objeto almacena su estado en campos y expone su comportamiento a través de métodos. Cuando se invoca un método en el objeto, obtendrá una funcionalidad bien defnida sin la necesidad de preocuparse sobre la complejidad interna del objeto o del método en sí. Este concepto de ocultar complejidad se conoce como encapsulamiento y es una de las muchas características de la programación orientada a objetos que aprenderá en esta lección.

Comprender las clasesUna clase es una plantilla de la cual se crean los objetos individuales.

Los objetos en el mundo real necesitan de una plantilla que defna la forma en la que se construirán. Todos los objetos que se crean a partir de la misma plantilla se ven y comportan de forma similar. Por ejemplo, piense en un modelo específco de un coche. En el mundo del software, una clase es la plantilla de la cual se crean objetos individuales. A un objeto se le conoce también como instancia de una clase.

Æ Crear una clase

PREPÁRESE. Antes de realizar estos pasos, asegúrese de abrir Microsoft Visual Studio y abrir un nuevo proyecto de aplicación de consola de nombre Lesson02.

1. Agregue una nueva clase de Visual C# de nombre Rectangle al proyecto.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 40: 98-361 Fundamentos de Desarrollo de Software

39Introducción a la programación orientada a objetos

2. Reemplace el código de la clase Rectangle con el siguiente:

class Rectangle

{

private double length;

private double width;

public Rectangle(double l, double w)

{

length = l;

width = w;

}

public double GetArea()

{

return length * width;

}

}

• Genere el proyecto y asegúrese de que no tenga errores.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Acaba de crear una nueva clase de C de nombre Rectangle. Para defnir una nueva clase se utiliza la palabra reservada class. La clase Rectangle tiene dos campos de datos, length y width. Estos campos se defnen utilizando el modificador de acceso private. Un modifcador de acceso especifca a cual región de código tendrá acceso el campo. Por ejemplo, un modifcador de acceso public no limita el acceso pero el modifcador de acceso private limita el acceso dentro de la clase en la cual se defna el campo.

La clase también defne un método de nombre GetArea.

Tome Nota

Cada clase es una definición de un nuevo tipo de datos. Por lo tanto, una definición de una clase se le relaciona con un tipo.

Comprender los métodosUn método es un bloque de código contiene una serie de sentencias.

Un método defne las acciones y operaciones soportadas por una clase. Un método se defne al especifcar el nivel de acceso, el tipo de retorno, el tipo de método y una lista opcional de parámetros en paréntesis seguido de un bloque de código dentro de llaves. La clase Rectangle defne un solo método de nombre GetArea. Para GetArea, el nivel de acceso

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 41: 98-361 Fundamentos de Desarrollo de Software

40 Lección 2

es público, el tipo de retorno es double, el nombre del método es GetArea, la lista de parámetros está vacía y el bloque de código es una sentencia return sencilla.

Un método puede regresar un valor al código invocador. Si un método no regresa ningún valor, su tipo de retorno se especifca con la palabra reservada void. El método debe utilizar una sentencia return para poder regresar un valor. La sentencia return fnaliza la ejecución de un método y regresa el valor específco al código invocador. El tipo de dato del valor retornado de un método debe coincidir con el tipo de retorno especifcado en la línea de declaración de un método.

El tipo de retorno del método GetArea es double, lo que signifca que el método GetArea debe retornar un valor del tipo doble. El método GetArea satisface este requerimiento al retornar la expresión length * width, el cual es un valor double.

El siguiente código defne un método InitFields que toma dos parámetros de tipo doble y regresa un void:

public void InitFields(double l, double w)

{

length = l;

width = w;

}

El método InitFields toma dos parámetros y utiliza los valores de los mismos para asignar de forma respectiva lo campos de datos length y width. Cuando el tipo de retorno de un método es void, se puede utilizar una sentencia return sin valor. Si no se utiliza una sentencia return, como en el método InitFields, el método dejará de ejecutarse cuando llegue al fnal del bloque de código. El método InitFields se puede utilizar para inicializar de forma apropiada el valor de los campos de datos, pero como lo aprenderá en la siguiente sección, los constructores de hecho le dan una forma de inicializar una clase.

Comprender los constructoresLos constructores se utilizan para inicializar los miembros de datos del objeto.

Los constructores son métodos de clase especiales que se ejecutan cuando se crea una nueva instancia de la clase. Los constructores se utilizan para inicializar los miembros de datos del objeto. Los constructores deben tener exactamente el mismo nombre de la clase y no tienen un tipo de retorno. Se pueden defnir constructores múltiples, cada uno con una frma única, para una clase.

Un constructor que no toma argumentos se conoce como el constructor default. Si se defne una clase sin ningún constructor, se genera automáticamente un constructor default invisible que no hace nada.

Con frecuencia es útil tener constructores adicionales para contar con más formas con la cuales inicializar un objeto. La clase Rectangle, defnida con anterioridad, es sólo una forma de crear e inicializar su objeto: llamando al constructor que acepta dos parámetros, ambos del tipo de datos default.

Tome Nota

El nombre del método, su lista de

parámetros y el orden de los tipos de datos de los parámetros se reconocen en conjunto como la firma del método. Una firma de método debe ser única en la clase.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 42: 98-361 Fundamentos de Desarrollo de Software

41Introducción a la programación orientada a objetos

Crear objetosLos objetos se crean a partir de plantillas defnidas por clases.

Æ Crear un objeto

UTILICE el proyecto de consola de aplicación, Lesson02, que creó en el ejercicio anterior.

1. Modifique el código de la clase Program de la siguiente forma:

class Program

{

static void Main(string[] args)

{

Rectangle rect = new Rectangle(10.0, 20.0);

double area = rect.GetArea();

Console.WriteLine(“Área del Rectángulo: {0}”,

area);

}

}

2. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola mostrando el área del rectángulo.

3. GUARDE su proyecto.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

La clase Rectangle cuenta con solo una forma de construir una instancia de la clase: invocando un constructor con dos argumentos del tipo de datos double. Se crea un objeto utilizando la palabra reservada new seguida de la invocación al constructor de clase apropiado.

Cuando se ejecuta el código, un objeto de tipo Rectangle se crea en la memoria heap. Una referencia a esta memoria se almacena dentro de la variable rect. La variable rect se almacena en la pila. Posteriormente, en este bloque de código, puede utilizar rect para hacer referencia y manipular el objeto que se acaba de crear.

Utilizando la referencia del objeto, puede acceder a los miembros de la clase. Por ejemplo, el código llama al método GetArea en el objeto y el valor retornado por el método se almacena en la variable área. Los campos de datos, length y width, del objeto rect no están accesibles aquí debido a que están marcados como private en la defnición de la clase.

Comprender las propiedadesLas propiedades le permiten accede a los datos de una clase de una forma segura y fexible.

Las propiedades son miembros de la clase que se pueden acceder como los campos de

Tome Nota

Las clases y los objetos son diferentes. Una clase define la plantilla de un objeto pero no al objeto en sí. Por otro lado, un objeto es una instancia concreta de una clase pero no la clase en sí.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 43: 98-361 Fundamentos de Desarrollo de Software

42 Lección 2

datos pero que puede contener código como un método. Las propiedades se utilizan con frecuencia para exponer los campos de datos de una clase de una forma más controlada. Por ejemplo, un campo privado se puede exponer utilizando una propiedad pública, pero no es necesario utilizar las propiedades de esta manera.

Una propiedad tiene dos accessors, get y set. El accessor get se utiliza para retornar el valor de la propiedad y el accessor set se utiliza para asignar un nuevo valor a la propiedad. A una propiedad frecuentemente se le defne como public y siempre tiene un nombre que comienza con una letra mayúscula. Por el contrario. Al asignar nombres a los campos de datos privados se utiliza siempre al principio una letra minúscula.

Æ Crear propiedades

UTILICE el proyecto que guardó en el ejercicio anterior.

1. Modifique el código de la clase Rectangle como se muestra a continuación. En este código, el constructor se elimina y se insertan dos propiedades:

class Rectangle

{

private double length;

private double width;

public double Length

{

get

{

return length;

}

set

{

if ( value > 0.0)

length = value;

}

}

public double Width

{

get

{

return width;

}

set

Tome Nota

A las propiedades, generalmente se les conoce como campos “inteligentes” ya que pueden contener código para la verificación de consistencia o validez de datos.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 44: 98-361 Fundamentos de Desarrollo de Software

43Introducción a la programación orientada a objetos

{

if (value > 0.0 )

width = value;

}

}

public double GetArea()

{

return length * width;

}

}

2. Modifique el código de la clase Program como se muestra a continuación:

class Program

{

static void Main(string[] args)

{

Rectangle rect = new Rectangle();

rect.Length = 10.0;

rect.Width = 20.0;

double area = rect.GetArea();

Console.WriteLine(

“Área del rectángulo: {0}”, area);

}

}

3. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola mostrando el área del rectángulo.

4. GUARDE su proyecto.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

En este ejercicio, modifcó la clase Rectangle para ingresar dos propiedades, Length y Width. Las propiedades generalmente se defnen con un modifcador de acceso público. En el código para la propiedad Length, el accessor get simplemente retorna el valor del campo de datos length. Sin embargo, el accessor set revisa el valor signado (utilizando la palabra reservada value) a la propiedad y modifca el campo de datos length sólo si el valor es positivo. Los campos privados length y width también se conocen como campos de respaldo por las propiedades que los exponen.

Además, la clase Rectangle no declara ningún contructor explícito. En este caso, los usuarios de la clase (el método Main) necesita utilizar el constructor predefnido y confar en las propiedades para inicializar los datos de la clase.

El método Main utiliza las propiedades Length y Width para establecer los datos para el objeto rect. Se ignorará si se trata de establecer Length o Width como un valor negativo y en ese caso los campos de datos seguirán conservando su valor original de 60.

Tome Nota

El patrón de programación general es que todos los campos de datos de una clase deben declararse como private y que el acceso a estos campos privados debe ser vía propiedades públicas y revisar los valores de datos para su validación.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 45: 98-361 Fundamentos de Desarrollo de Software

44 Lección 2

Cuando se defnen propiedades se pueden excluir cualquiera de los accessors get o set. Si no incluye el accessor set, no proporciona una forma de establecer el valor de la propiedad y por lo tanto tendrá una propiedad de sólo lectura. Por otro lado, si no incluye el accessor get, no se proporciona una forma de obtener el valor de la propiedad y por lo tanto tendrá una propiedad de sólo escritura.

Comprender las propiedades auto-implementadasLas propiedades auto-implementadas simplifcan las declaraciones de las propiedades.

C# introdujo las propiedades auto-implementadas con la versión 3 para simplifcar la declaración de propiedades donde no hay lógica adicional especifcada en los accessors get y set. Por ejemplo, sin la revisión de validación, las propiedades Length y Width se defnen de la siguiente manera:

private double length;

private double width;

public double Length

{

get

{

return length;

}

set

{

length = value;

}

}

public double Width

{

get

{

return width;

}

set

{

width = value;

}

}

Con las propiedades auto-implementadas de C#, la sintaxis simplifcada para la declaración de la propiedad inicia de la siguiente forma:

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 46: 98-361 Fundamentos de Desarrollo de Software

45Introducción a la programación orientada a objetos

public double Length { get; set; }

public double Width { get; set; }

En este caso, los campos de respaldo para las propiedades se defnen tras bambalinas y no son accesibles de forma directa por el código.

Las propiedades auto-implementadas utilizadas con los constructores predefnidos también simplifcan la creación e inicialización de los objetos. Por ejemplo, ahora se puede crear e inicializar un objeto de la siguiente manera:

static void Main(string[] args)

{

Rectangle rect = new Rectangle

{ Length = 10.0, Width = 20.0 };

Console.WriteLine(

“Area of Rectangle: {0}”, rect.GetArea());

}

Uso de la palabra reservada this La palabra reservada this se puede utilizar para acceder a miembros desde dentro de los constructores, métodos de instancia y accessors de propiedades de instancia.

La palabra reservada this es una referencia a la instancia actual de la clase. Se puede utilizar la palabra this para referirse a cualquier miembro del objeto actual. Por ejemplo, anteriormente en este capítulo, la clase Rectangle se escribió como se indica a continuación:

class Rectangle

{

private double length;

private double width;

public Rectangle(double l, double w)

{

length = l;

width = w;

}

public double GetArea()

{

return length * width;

}

}

Pero se pudo haber escrito de la siguiente manera:

class Rectangle

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 47: 98-361 Fundamentos de Desarrollo de Software

46 Lección 2

{

private double length;

private double width;

public Rectangle(double l, double w)

{

this.length = l;

this.width = w;

}

public double GetArea()

{

return this.length * this.width;

}

}

Como puede ver, la palabra this se utilizó dentro del constructor y del método GetArea para referirlo a los campos de datos del objeto actual de la clase Rectangle. Aun cuando no era necesario utilizar la palabra this en este caso, utilizarla proporciona mayor fexibilidad al nombrar los parámetros del método. Por ejemplo, podría defnir el constructor como se muestra a continuación:

public Rectangle(double length, double width)

{

// los nombres de parámetro length y width

// opacan los miembros de clase length y

// width en este ámbito

this.length = length;

this.width = width;

}

Dentro del ámbito de la defnición del constructor Rectangle, los nombres length y width ahora se referirán al parámetro que se esté pasando. El nombre de los campos de datos se ha opacado y sólo se pueden acceder utilizando la palabra this.

Comprender los delegadosLos delegados son tipos especiales que se utilizan para encapsular un método dentro de una frma específca.

Los delegados son objetos especiales que pueden contener une referencia a un método con una frma específca. Un delegado se defne utilizando la palabra reservada delegate. Se puede defnir un delegado como se indica a continuación:

public delegate void RectangleHandler(Rectangle rect);

Le defnición delegate especifca la frma del método cuya referencia se pueda contener por un objeto delegate. Por ejemplo, en el código anterior se defne un delegado RectangleHandler que puede contener referencias a un método que regresa un void y acepta un solo parámetro del tipo Rectangle.

Tome Nota

En C#, los caracteres // se utilizan para agregar comentarios en una sola línea en el código. El texto después de los caracteres // se ignora por el compilador. Los comentarios en varias líneas comienzan con los caracteres/* y terminan con */.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 48: 98-361 Fundamentos de Desarrollo de Software

47Introducción a la programación orientada a objetos

Por lo tanto, si tiene un método con una frma similar, resulta un candidato ideal para la asignación a una instancia delegate. Por ejemplo:

public void DisplayArea(Rectangle rect)

{

Console.WriteLine(rect.GetArea());

}

El tipo delegate se puede utilizar para declarar una variable que se puede referir a cualquier método con la misma frma que el delegado. Por ejemplo, puede decir:

RectangleHandler handler;

Y puede asignar el método al delegado utilizando la siguiente sintaxis:

handler += new Rectanglehandler(DisplayArea);

Como alternativa, puede utilizar la siguiente sintaxis:

handler += DisplayArea;m

Note que la sintaxis utiliza la operación de adición. Esto signifca que puede asociar más de un método (de frma compatible), creando una lista de invocación de uno o más métodos.

Finalmente, se puede llamar a un delegado se puede realizar a través de una sintaxis de invocación de métodos como la siguiente:

Rectangle rect = new Rectangle (10, 20);

handler(rect);

Cuando se llama un delegado de esta forma, se invocan todos los métodos en esta lista de invocación. En este ejemplo, el objeto handler se refere sólo a un método DisplayArea por lo que el método DisplayArea se invocará con el objeto rect como un parámetro.

Entre otras muchas aplicaciones, los delegados forman la base para las declaraciones de eventos, como se comentará en la siguiente sección.

Comprender los eventosLos eventos son una forma por la cual una clase notifca a otras clases u objetos que sucedió algo de interés. La clase que envía la notifcación se conoce como editor. La clase que recibe la notifcación se conoce como suscriptor del evento.

Los eventos son fáciles de comprender en el contexto de una interfaz gráfca de usuario (GUI). Por ejemplo, cuando un usuario da clic en un botón, ocurre un evento Click. Los elementos en una interfaz de usuarios múltiples se pueden suscribir a este evento y cambiar su estado visual (por ejemplo, algunos controles se habilitan o deshabilitan). En este tipo de comunicación de eventos, los editores de eventos no necesitan saber cuáles objetos se suscriben a los eventos que se están llevando a cabo.

Los eventos no se limitan a la programación en GUI. De hecho, los eventos tienen un papel importante en las librerías de clase del .NET Framework para que los objetos hagan notar cualquier cambio en sus estados. Trabajará con eventos en prácticamente todos los programas.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 49: 98-361 Fundamentos de Desarrollo de Software

48 Lección 2

Al defnir los eventos, generalmente necesita dos tipos de información:

• Un delegado que conecta al evento con su controlador(es) de evento(s).

• Una clase que contiene los datos del evento. Esta clase generalmente se deriva de la clase EventArgs.

Para defnir un evento, puede utilizar un delegado personalizado. Sin embargo, en la mayoría de los casos si el evento no contiene información específca del mismo, no será sufciente con utilizar el delegado predefnido EventHandler. El delegado EventHanler se defne de la siguiente manera:

public delegate void EventHandler(Object sender, EventArgs e);

Aquí, el parámetro sender es una referencia al objeto que provoca el evento y el parámetro es una referencia a un objeto de datos del evento que no contiene datos del mismo.

La clase EventArgs se utiliza por los eventos que no pasan ninguna información relacionada con los mismos a un controlador de eventos cuando se ocasiona un evento. Si el controlador de eventos requiere de información relacionada a los mismos, la aplicación debe derivar una clase desde la clase EventArgs para recibir los datos relacionados con los eventos.

Æ Publicar y suscribirse a eventos

UTILICE el proyecto que guardó en el ejercicio anterior.

1. Modifique el código de la clase Rectangle de la siguiente forma:

class Rectangle

{

public event EventHandler Changed;

private double length;

public double Length

{

get

{

return length;

}

set

{

length = value;

Changed(this, EventArgs.Empty);

}

}

}

2. Modifique el código de la clase Program con lo siguiente:

class Program

Tome Nota

El campo EventArgs.Empty representa un evento sin datos. El campo equivale a tener una instancia de sólo lectura de la clase EventArgs.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 50: 98-361 Fundamentos de Desarrollo de Software

49Introducción a la programación orientada a objetos

{

static void Main(string[] args)

{

Rectangle r = new Rectangle();

r.Changed += new EventHandler(r_Changed);

r.Length = 10;

}

static void r_Changed(object sender, EventArgs e)

{

Rectangle r = (Rectangle)sender;

Console.WriteLine(

“Value Changed: Length = {0}”,

r.Length);

}

}

3. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola para mostrar que el valor de la propiedad Length cambió.

4. GUARDE su proyecto.

PAUSA. Deje su proyecto abierto para utilizarlo en el siguiente ejercicio.

Aquí la clase Rectangle defne un evento Changed que se invoca cuando la propiedad Length del objeto Rectangle cambia. El delegado del evento Changed es del tipo EventHandler. En la clase Rectangle, el evento Changed se invoca cuando se llama el accessor set de la propiedad Length.

Se puede suscribir al evento Changed dentro del método Main al adjuntar el método r_Changed como un controlador de evento para el evento utilizando el siguiente código:

r.Changed += new EventHandler(r_Changed);

La frma del método r_Changed coincide con los requerimientos del delegado EventHandler. El método r_Changed se invoca tan pronto se establece el valor de la propiedad Length en el método Main.

El código anterior utiliza el operador += en lugar del operador de asignación simple (=) para adjuntar el controlador de eventos. Al utilizar el operador +=, se asegura que este controlador de eventos se agregue a la lista de controladores que ya se encuentra adjunta al evento. Esta técnica le permite tener varios controladores de eventos que puedan responder a un evento. Si utiliza el operador de asignación (=) para asignar el nuevo controlador de evento, se anulará cualquier controlador de eventos existente que se encuentre adjunto al evento y el nuevo evento será el detonado cuando se invoque el evento.

Tome Nota

El código en el método r_Changed utiliza un operador cast para convertir un tipo de datos de objeto en el tipo de datos Rectangle. El casting se explicará más adelante en esta lección en la sección “Casting entre tipos”.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 51: 98-361 Fundamentos de Desarrollo de Software

50 Lección 2

Comprender los espacios de nombresUn espacio de nombres le permite organizar el código y crear nombres de clase únicos.

Un espacio de nombres es un elemento del lenguaje que le permite organizar código y crear nombres de clase globalmente únicas. Digamos que crea una clase del nombre Widget. Existe la posibilidad de que otro grupo adjunte código que también contenga una clase del mismo nombre. En ese caso, ¿cómo maneja la ambigüedad de nombres? La solución es organizar el código en un espacio de nombres. Una metodología común es utilizar el nombre de la compañía en el espacio de nombres. Por ejemplo, puede decir:

namespace CompanyA

{

public class Widget { … }

}

andnamespace CompanyB

{

public class Widget { … }

}

La clase del espacio de nombres CompanyA puede ser referida de forma única por su nombre de clase completamente califcada CompanyA.Widget, mientras que el otro Widget se puede identifcar como CompanyB.Widget.

El .NET Framework utiliza espacios de nombres para organizar todas sus clases. Por ejemplo, el espacio de nombres System agrupa todas las clases básicas. El espacio de nombres System.Data organiza las clases para el acceso a datos. El espacio de nombres System.Web se utiliza para clases relacionadas con la Web.

Con el uso de espacios de nombres puede terminar con nombres de clase completamente califcados muy largos que ocasionaría un exceso de texto y necesidad de teclear. C# soluciona este inconveniente a través de la directiva using. Puede utilizar la directiva using en la parte superior del archivo de la clase como se muestra a continuación.

using System.Text;

Una vez que haya incluido la directiva using para un espacio de nombres, no necesitará califcar de forma completa las clases de ese espacio de nombres en el archivo.

using System.Text;

Comprender los miembros estáticos Los miembros estáticos pertenecen a la clase en sí en lugar de a objetos individuales.

Los miembros de la clase como los campos de datos, métodos y propiedades que se han comentado hasta ahora en esta sección, todos operan sobre objetos individuales. Tales miembros se llaman como miembros de instancia porque se pueden utilizar sólo después de que una instancia de la clase es creada. En contraste, la palabra reservada static se utiliza para declarar miembros que no pertenecen a objetos individuales sino a la clase en sí. Tales miembros de clase se llaman como miembros estáticos. Un ejemplo común de un miembro estático es el método Main que sirve como punto de entrada en su programa.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 52: 98-361 Fundamentos de Desarrollo de Software

51Introducción a la programación orientada a objetos

Æ Crear miembros estáticos

UTILICE el proyecto que guardó en el ejercicio anterior.

1. Modifique el código de la clase Rectangle como se muestra a continuación:class Rectangle

{

public static string ShapeName

{

get { return “Rectángulo”; }

}

public double Length { get; set; }

public double Width { get; set; }

public double GetArea()

{

return this.Length * this.Width;

}

}

2. Modifique el código de la clase Program a lo siguiente:class Program

{

static void Main(string[] args)

{

Rectangle rect = new Rectangle

{ Length = 10.0, Width = 20.0 };

Console.WriteLine(“Nombre de la forma: {0}, Area: {1}”,

Rectangle.ShapeName,

rect.GetArea());

}

}

3. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola para mostrar el nombre y área de la forma.

4. GUARDE su proyecto.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Cuando se crea una instancia de una clase, se crea una copia separada para cada campo de instancia pero solo una copia del campo estático se comparte por todas las instancias.

Un miembro estático no se puede referenciar a través de un objeto de instancia. En su lugar, un miembro estático se referencia a través del nombre de la clase (como Rectangle. ShapeName en el ejercicio anterior). No se puede utilizar la palabra reservada this con un método estático o una propiedad debido a que sólo se puede utilizar para acceder a objetos de instancia.

; ¿Listo para la certificación?

¿Comprende los conceptos básicos de las clases? -2.1

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 53: 98-361 Fundamentos de Desarrollo de Software

52 Lección 2

� Comprender los valores y las referencias

È EN RESUMEN

Los tipos de valores almacenan directamente los valores mientras que los tipos de referencia sólo almacenan una referencia al valor real.

Un tipo de valor almacena directamente los datos en su memoria. Los tipos de referencia, por otro lado, sólo almacenan una referencia a la ubicación en memoria. Los datos se encuentran almacenados en la ubicación en memoria a la cual se hace referencia. La mayoría de los tipos de datos básicos como bool, int, char, double, etc., son tipos de valores. Los tipos de datos defnidos por el usuario, creados utilizando la palabra reservada struct también son tipos de valores. Los tipos de referencia incluyen los tipos creados utilizando las palabras reservadas object, string, interface, delegate, y class.

Comprender las estructurasLa palabra reservara struct se utiliza para crear tipos defnidos por el usuario que consisten en grupos pequeños de campos relacionados. Las estructuras son tipos de valores opuestos a las clases que son tipos de referencias.

Las estructuras se defnen utilizando la palabra reservada struct como se muestra a continuación:

public struct Point

{

public double X, Y;

}

Las estructuras pueden contener la mayoría de los elementos que puede contener una clase, como constructores, métodos, propiedades, etc. Sin embargo, como aprenderá en la siguiente sección, las estructuras son tipos de valores mientras que las clases son tipos de referencias. A diferencia de una clase, una estructura no puede heredar de otra clase o estructura.

Comprender la asignación de memoriaDespués de introducir un valor o texto en una celda, puede modifcarla de varias formas. Puede eliminar el contenido por completo, introducir un valor diferente para reemplazar el que estaba o alterar lo que ingresó.

Una buena forma de comprender cómo los valores se diferencian de los tipos de referencia es visualizar cómo se representa cada uno de ellos en memoria. La Figura 2-1 muestra cómo se crean los tipos de valor en memoria. Cuando crea una variable de tipo int, se crea una ubicación en memoria que puede utilizar para almacenar un valor del tipo int. Inicialmente, cuando no asigna un valor de forma explícita, el valor predeterminado del tipo de datos (para un int el valor predeterminado es 0) se almacena en la ubicación en memoria. Cuando se realiza una asignación, la dirección de memoria identifcada por el nombre de la variable se actualiza con el nuevo valor (10 en el caso de la asignación en la Figura 2-1).

Tome Nota

Las estructuras se utilizan generalmente para crear tipos simples. Si se encuentra creando una estructura muy compleja, considere mejor utilizar una clase.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 54: 98-361 Fundamentos de Desarrollo de Software

53Introducción a la programación orientada a objetos

La Figura 2-2 muestra un tipo de referencia, el tipo de datos string. Cuando crea una variable de tipo string, se crea una ubicación en memoria que se identifcará por este nombre. Sin embargo, esta ubicación en memoria no va a albergar el contenido del string. Esta variable almacenará la dirección en memoria (una referencia) de la ubicación donde de hecho se almacenará el string.

Inicialmente, cuando no se asigna un valor, la variable tendrá el valor de null (una referencia null, en otras palabras, esta variable no hace referencia a una dirección en memoria válida). En la siguiente sentencia, cuando dice:

name = “Northwind”;

la cadena “Northwind” se crea en una ubicación de memoria en particular (para simplifcar, digamos que la dirección en memoria es m100) y esa dirección de memoria se almacena en el nombre de la variable. Cuando es hora de recuperar el valor del nombre de la variable, el tiempo de ejecución sabrá que su contenido no se encuentra almacenado en la variable en si sino en la ubicación en memoria a la cual apunta la variable.

Æ Copiar valores y tipos de referencia

UTILICE el proyecto que guardó en el ejercicio anterior.

1. Agregue el siguiente código después de la definición de la clase Rectangle para crear una estructura Point:

struct Point

{

public double X, Y;

}

Figura 2-1

Visualización de un tipo de valor en memoria

Figura 2-2

Visualización de un tipo de referencia en memoria

int number;

number = 10;

10

número

0

número

Production note: This figure should be redrawn on a smaller scale. Please also make the arrows as straight lines when you redraw it.

string name;

name = "Northwind";

m100

nombre

null

nombre

m100 "Northwind"

dirección datos

Vista de Código

Vista de Memoria

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 55: 98-361 Fundamentos de Desarrollo de Software

54 Lección 2

2. Modifique el código del método Main como se muestra a continuación:

static void Main(string[] args)

{

Point p1 = new Point();

p1.X = 10;

p1.Y = 20;

Point p2 = p1;

p2.X = 100;

Console.WriteLine(“p1.X = {0}”, p1.X);

Rectangle rect1 = new Rectangle

{ Length = 10.0, Width = 20.0 };

Rectangle rect2 = rect1;

rect2.Length = 100.0;

Console.WriteLine(“rect1.Length = {0}”,

rect1.Length);

}

3. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola para mostrar los valores para p1.X y rect1.Length.

4. GUARDE su proyecto.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente eje

La primera parte del programa crea una copia del tipo de valor Point y la segunda mitad del programa crea una copia del tipo de referencia Rectangle. Analicemos como se realiza la copia del tipo de valor.

Cuando se ejecuta la siguiente sentencia, se crea una nueva variable p2 en memoria y su contenido se copia desde la variable p1:

Point p2 = p1;

Después de ejecutar esta sentencia, se crea la variable p2 y el contenido de la variable p1 se copia a la variable p2. Tanto p1 como p2 tienen su propio conjunto de valores disponibles en sus ubicaciones en memoria respectivas. Por lo que, cuando se ejecuta la siguiente sentencia:

p2.X = 100;

sólo se afecta el valor de X correspondiente a la ubicación en memoria de la variable p2. El valor de X para la variable p1 permanece sin cambios.

Tome Nota

Es posible crear un struct sin utilizar el operador new. Puede simplemente decir Point p1; para crear una variable del tipo struct.

Tome Nota

Cuando copia una variable de tipo de referencia a otra variable del mismo tipo, sólo se copian las referencias. Como resultado, después de la copia, las dos variables apuntan al mismo proyecto.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 56: 98-361 Fundamentos de Desarrollo de Software

55Introducción a la programación orientada a objetos

Ahora, analicemos cómo funciona la copia entre los tipos de referencia. Cuando se ejecuta la siguiente sentencia, se crea una nueva variable rect2, igual que antes, el contenido de rect1 se copia a la ubicación en memoria de rect2:

Rectangle rect2 = rect1;

Pero puesto que la clase Rectangle es un tipo de referencia, el contenido de la variable rect1 es de hecho una referencia a la ubicación en memoria que contiene un objeto de Rectangle. Así que, después de la inicialización anterior, tanto rect1 y rect2 apuntan a la misma ubicación en memoria y al mismo objeto de Rectangle. Sólo hay un objeto de rectangle en memoria y tanto rect1 como rect2 se referen a él. La siguiente sentencia modifca Length del objeto de rectangle:

rect2.Length = 100.0;

Esta sentencia hace referencia a la ubicación en memoria apuntada por rect2 (la cual resulta ser la misma ubicación en memoria apuntada por rect1) y modifca Length del objeto Rectangle. Ahora, si intenta hacer referencia a la misma ubicación en memoria vía el objeto rect1, obtendrá el objeto modifcado y aparecerá el siguiente código mostrando el valor “rect1.Length = 100”.

Console.WriteLine(“rect1.Length = {0}”,

rect1.Length);

Comprender la memoria heap y la pila call

Los objetos son siempre memoria asignada en el heap. El heap es la memoria disponible para el programa en tiempo de ejecución para la asignación dinámica de memoria. En contraste, algunos elementos de datos se pueden crear en la pila de ejecución o en la pila call. Los elementos creados en la pila son los parámetros de método y las variables locales declaradas dentro de un método. La memoria de pila se reclama cuando por ejemplo se retorna un método. La memoria asignada en el heap se reclama automáticamente por el recolector de basura cuando los objetos ya no se utilizan (ya no hay objetos que hacen referencia a ellos).

� Comprender el encapsulamiento

È EN RESUMEN

El encapsulamiento es un mecanismo para ocultar información que hace que el código sea fácil de mantener y entender.

El encapsulamiento es un mecanismo para restringir el acceso a una clase o miembros clase para ocultar decisiones en el diseño que pueden cambiar. El encapsulamiento les da a los diseñadores de las clases la fexibilidad para cambiar el código cuando sea necesario sin cambiar todo el código que hace uso de ese código. Además, cuando oculta información, también oculta la complejidad asociada a la misma. Como resultado, con la ayuda del encapsulamiento, puede escribir código que sea más fácil de comprender y mantener.

; ¿Listo para la certificación?

¿Comprende los tipos de datos y l asignación de memoria? -1.1

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 57: 98-361 Fundamentos de Desarrollo de Software

56 Lección 2

En los ejercicios anteriores, vio el encapsulamiento cuando:

• Declaró los miembros de datos como private y reforzó la inicialización de campos de datos vía un constructor. Como los miembros de datos se encuentran ocultos de los usuarios de la clase, el desarrollador de la clase Rectangle puede cambiar los nombres de los campos de datos sin la necesidad de cambiar el código invocador.

• Las propiedades ofrecen una excelente manera de encapsular los campos de datos junto con cualquier otro tipo de lógica.

• Los modifcadores de acceso como private y public le permiten controlar el nivel de acceso que quiera tener para un miembro de la clase o para la clase en sí.

• En esta sección aprenderá más sobre los modifcadores de acceso.

Comprender los modificadores de accesoLos modifcadores de acceso controlan dónde se puede utilizar un tipo o miembro de tipo.

Todos los tipos y miembros de tipo tienen un nivel de acceso que especifca donde esa clase o sus miembros se pueden utilizar en su código. El nivel de acceso se puede establecer utilizando uno de los modifcadores de acceso especifcados en la Tabla 2-1.

Modificador de acceso Descripción

public El acceso no se restringe.

private El acceso se restringe a la clase contenedora.

protected El acceso se restringe a la clase contenedora y a cualquier clase que se derive directa o indirectamente de la clase contenedora. Aprenderá más sobre las clases derivadas en la sección “Comprender la herencia” más adelante en esta lección.

internal El acceso se restringe al código en la misma asamblea.

protected internal Este modificador de acceso es una combinación de protected OR internal. Es decir, el acceso está restringido a cualquier código en la misma asamblea y sólo a las clases derivadas en otra asamblea.

Los modifcadores de acceso no están permitidos en las declaraciones de espacio de nombres pero se implica un acceso público para los espacios de nombre. Las clases de alto nivel (declaradas directamente bajo un espacio de nombres) sólo pueden ser public o internal. El modifcador de acceso internal es el predeterminado para una clase si no se especifca ningún modifcador de acceso. La clase Rectangle defnió en el ejercicio anterior elementos predeterminados para tener un acceso interno. La accesibilidad de una clase anidada puede no ser menos restrictiva que la accesibilidad de una clase contenedora.

Tome Nota

Debería utilizar el nivel de acceso más restrictivo que tenga sentido para un miembro de tipo.

; ¿Listo para la certificación?

¿Comprende el encapsulamiento? -2.4

Tabla 7-2

Las partes que conforman al elemento <authorization>

Tome Nota

Cuando el código en C# se compila, el código ejecutable de salida contenido dentro de un archivo .dll o .exe también se llama como una asamblea. Una asamblea es una unidad de código ejecutable que puede instalar de forma independiente.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 58: 98-361 Fundamentos de Desarrollo de Software

57Introducción a la programación orientada a objetos

� Comprender la herencia

È EN RESUMEN

Después de haber introducido un valor o texto en una celda, lo puede modifcar de varias maneras. Puede eliminar el contenido por completo, ingresar un valor diferente para reemplazar el que estaba o alterar lo que ingresó.

La herencia le permite crear clases nuevas que reutilizan, extienden y modifcan la funcionalidad defnida en las clases existentes. La clase que hereda la funcionalidad se conoce como clase derivada y la clase cuya funcionalidad es heredada se conoce como clase base. La clase derivada hereda toda la funcionalidad de la clase base y puede contener características adicionales que la hace diferente de la clase base.

Digamos que queremos crear un conjunto de clases que describa polígonos como rectángulos o triángulos. Estas clases tendrán algunas propiedades en común como anchura y longitud. Para este caso, se puede crear una clase base Polygon con las propiedades Width y Length, y las clases derivadas Rectangle y Triangle heredarán estas propiedades a la vez que cuentan con su propia funcionalidad. El siguiente ejercicio explica lo anterior de forma más detallada.

Æ Crear clases derivadas

UTILICE el proyecto que guardó en el ejercicio anterior.

1. Agregue una nueva clase Polygon como se muestra a continuación:

class Polygon

{

public double Length { get; protected set; }

public double Width { get; protected set; }

}

2. Modifique la clase Rectangle como se muestra a continuación:class Rectangle : Polygon

{

public Rectangle(double length, double width)

{

Length = length;

Width = width;

}

public double GetArea()

{

return Width * Length;

}

}

Tome Nota

A diferencia de las clases, las estructuras no soportan la herencia.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 59: 98-361 Fundamentos de Desarrollo de Software

58 Lección 2

3. Modifique el código del método Main como se muestra a continuación:

static void Main(string[] args)

{

Rectangle rect = new Rectangle(10, 20);

Console.WriteLine(

“Width={0}, Length={1}, Area = {2}”,

rect.Width, rect.Length, rect.GetArea());

}

4. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola para mostrar la anchura, longitud y área del rectángulo.

5. GUARDE su proyecto.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Para defnir una clase derivada, coloque dos puntos después del nombre de la clase derivada seguido del nombre de la clase base. Aquí la clase Polygon es la clase base para la clase Rectangle.

Las propiedades Length y Width en la clase Polygon se declaran como un modifcador de acceso protegido para el accessor set. Esto signifca que el acceso al accesor set está disponible sólo desde dentro de la clase Polygon y sus clases derivadas. Aun puede obtener el valor de las propiedades Length y Width en el método Main pero obtendrá un error si intenta asignar un valor a estas propiedades.

La clase Rectangle hereda todos los datos no privados y el comportamiento de la clase Polygon. Además, la clase Rectangle defne funcionalidad adicional (método GetArea) que no está disponible en la clase base.

Comprender las clases abstractas y selladas Las clases abstractas proporcionan una defnición común de la clase base que se pueden compartir por varias clases derivadas. Las clases selladas, por otro lado, cuentan con una funcionalidad completa pero no se pueden utilizar como clases bases.

En el ejercicio anterior defnió un método GetArea en la clase Rectangle. Suponga que quiere crear otra clase, Triangle, que es del tipo Polygon. Ahora, necesitará un método GetArea en la clase Triangle para calcular el área de un triángulo.

Con frecuencia, las clases base actúan como el repositorio de la funcionalidad común. En el caso de Polygon, el polígono en sí no sabrá cómo calcular el área sin contar con el conocimiento sobre el tipo de forma. Pero en general, podemos esperar que todas las clases del tipo Polygon sean capaces de calcular sus propias áreas. Tales expectativas pueden depender de la clase base con la ayuda de una palabra reservada abstract.

Æ Crear clases abstractas

UTILICE el proyecto que guardó en el ejercicio anterior.

1. Modifique la clase Polygon como se muestra a continuación:

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 60: 98-361 Fundamentos de Desarrollo de Software

59Introducción a la programación orientada a objetos

abstract class Polygon

{

public double Length { get; protected set; }

public double Width { get; protected set; }

abstract public double GetArea();

}

2. Modifique la clase Rectangle como se muestra a continuación:

class Rectangle : Polygon

{

public Rectangle(double length, double width)

{

Length = length;

Width = width;

}

public override double GetArea()

{

return Width * Length;

}

}

3. No se necesita realizar modificaciones al método Main. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola para mostrar el ancho, longitud y área del rectángulo.

4. GUARDE su proyecto.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Esta versión de la clase Polygon defne un método de nombre GetArea. La razón principal para incluir este método en la clase base es que ahora la clase base puede proporcionar una plantilla común de funcionalidad para las clases derivadas. Pero, como ya se comentó, la clase base Polygon no conoce lo sufciente para calcular el área de la forma. La situación se puede manejar haciendo el método abstracto. Un método abstracto cuenta con una defnición pero no proporciona ninguna implementación (cuerpo de método). Si ninguno de los miembros de la clase es abstracto, la clase en sí necesita marcarse como abstracta. No se puede instanciar una clase abstracta.

Las clases derivadas pueden proporcionar una implementación de la clase abstracta para crear una clase concreta (clase no abstracta). La clase derivada puede proporcionar una implementación de un método abstracto al sobrescribirlo en una clase derivada. Por ejemplo, la clase Rectangle sobrescribe el método abstracto GetArea de la clase base y proporciona una implementación completa. Como resultado, la clase Rectangle ya no es una clase abstracta y se puede instanciar de forma directa.

Tome Nota

No puede crear instancias de una clase abstracta.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 61: 98-361 Fundamentos de Desarrollo de Software

60 Lección 2

Las clases selladas, por otro lado, se defnen cuando su implementación está completa y no quiere que se herede una clase. Una clase sellada se puede crear utilizando la palabra reservada sealed como se muestra a continuación:

sealed class Rectangle : Polygon

{

// miembros de la clase aquí

}

Puesto que Rectangle es una clase sellada, no se puede utilizar como una clase base. También es posible marcar miembros de la clase seleccionados como sellados para evitar que se sobrescriban en una clase derivada. Por ejemplo, puede decir:

sealed public override double GetArea()

{

return Width * Length;

}

Esta declaración asegura que el método GetArea no se pueda sobrescribir en una clase derivada.

Herencia desde la clase Object La clase Object es la clase base más importante de todas las clases en el .NET Framework.

Todas las clases en el .NET Framework heredan de forma directa o indirecta de la clase Object. Por ejemplo, cuando declaró la siguiente clase anteriormente:

class Polygon

{

public double Length { get; protected set; }

public double Width { get; protected set; }

}

era funcionalmente equivalente a la siguiente declaración:

class Polygon : Object

{

public double Length { get; protected set; }

public double Width { get; protected set; }

}

Pero no tiene que declarar la clase Polygon de la segunda manera porque la herencia de la clase Object se asume de forma implícita. Como parte de esta herencia, una clase derivada sobrescribe los métodos de la clase Object. Dos de los métodos más comunes son:

• Equals: Soporta la comparación entre dos objetos. Retorna true si los dos objetos tienen el mismo valor.

Tome Nota

C# no soporta la herencia de más de una clase base, a lo cual se le conoce como herencia múltiple.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 62: 98-361 Fundamentos de Desarrollo de Software

61Introducción a la programación orientada a objetos

• ToString: Retorna una representación string de la clase. De manera predeterminada, retorna el nombre complete de la clase. Es con frecuencia útil para sobrescribir este método para que regrese una representación string del estado actual del objeto.

El siguiente ejemplo muestra como sobrescribir el método ToString en la clase Rectangle:

class Rectangle : Polygon

{

public Rectangle(double length, double width)

{

Length = length;

Width = width;

}

public override double GetArea()

{

return Width * Length;

}

public override string ToString()

{

return String.Format(

“Width = {0}, Length = {1}”,

Width, Length);

}

}

Casting entre tiposEl tiempo de ejecución le permite castear un objeto a cualquiera de sus tipos base.

Las clases derivadas tienen una relación “es un” con la clase base. Por ejemplo, podemos decir que el Rectángulo es un Polígono. Un objeto de la clase Rectangle tiene en este caso dos tipos de datos: el objeto es un Rectángulo y el objeto es también un Polígono.

El tiempo de ejecución le permite castear un objeto a su clase o a cualquiera de sus clases base. Por ejemplo, puede decir:

Polygon p = new Rectangle(10, 20);

Aquí, se crea un nuevo objeto Rectangle y se castea a su tipo base Polygon. C# no requiere de una sintaxis especial porque castear a un tipo base se considera una conversión segura.

También se puede castear de la siguiente manera:

Object o = new Rectangle(10, 20);

Rectangle r = (Rectangle) o;

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 63: 98-361 Fundamentos de Desarrollo de Software

62 Lección 2

Aquí, un objeto Rectangle se asigna primero a un Object (la clase base fundamental) y el objeto resultante se castea de vuelta como un Rectangle. Cuando sucede la última asignación, se requiere de un casteo explicito porque convertirá un objeto más general a un objeto menos general. El tiempo de ejecución revisa si el valor de la variable o es compatible con la clase Rectangle. Si en tiempo de ejecución el valor de o no es compatible con la clase Rectangle, el tiempo de ejecución arroja una System.InvalidCastException.

El operador is

Para evitar errores en tiempo de ejecución como InvalidCastException, se utiliza el operador is para revisar si se permite el casteo antes de llevarlo a cabo:

if (o is Rectangle)

{

Rectangle r = (Rectangle) o;

}

Aquí el tiempo de ejecución revisará el valor del objeto o. La sentencia cast sólo se ejecuta si o contiene un objeto Rectangle.

El operador as

Otro operador cast útil es el operador as. El operador as es similar a la operación cast pero, en el caso de as, si el tipo de conversión no es posible, se retorna null en lugar de arrojar una excepción. Por ejemplo, considere este código:

Rectangle r = o as Rectangle;

if (r != null)

{

// hacer algo

}

Si en tiempo de ejecución, no es posible castear el valor de la variable o a rectangle, se asigna un valor null a la variable r. No se arrojarán excepciones.

� Comprender el polimorfismo

È EN RESUMEN

El polimorfismo es la capacidad de las clases derivadas para compartir una funcionalidad en común con las clases base pero defniendo su propio comportamiento.

Digamos que se encuentra desarrollando una aplicación que permite a los usuarios trabajar con diferentes tipos de polígonos. Cuenta con una colección que contiene diferentes tipos de polígonos como un rectángulo, un triángulo y un cuadrado. Cada polígono le provee con su propia implementación del método Draw. Cuando trabaja con esta colección, no

Tome Nota

Si se encuentra utilizando un operador as para convertir un tipo, la revisión del operador is no es necesaria. Puede simplemente revisar el valor de retorno de as contra null.

; ¿Listo para la certificación?

¿Comprende la herencia? -2.2

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 64: 98-361 Fundamentos de Desarrollo de Software

63Introducción a la programación orientada a objetos

necesariamente debe saber exactamente con cual forma está trabajando sino que preferirá que se invoque el método Draw correcto en cada ocasión. El polimorfsmo le permite realizar esto.

El polimorfsmo permite a los objetos de la clase derivada que se les trate en tiempo de ejecución como el objeto de la clase base. Cuando se invoca un método en tiempo de ejecución, su tipo exacto se identifca y se invoca el método apropiado desde la clase derivada.

Æ Uso del polimorfismo

UTILICE el proyecto que guardó en el ejercicio anterior.

1. Modifique la clase Polygon como se muestra a continuación:

class Polygon

{

public virtual void Draw()

{

Console.WriteLine(“Dibujando: Polígono”);

}

}

2. Modifique la clase Rectangle como se muestra a continuación:

class Rectangle : Polygon

{

public override void Draw()

{

Console.WriteLine(“Dibujando: Rectángulo”);

}

}

3. Agregue una nueva clase, Triangle, como se muestra a continuación:

class Triangle : Polygon

{

public override void Draw()

{

Console.WriteLine(“Dibujando: Triángulo”);

}

}

4. Modifique el método Main como se muestra a continuación:

static void Main(string[] args)

{

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 65: 98-361 Fundamentos de Desarrollo de Software

64 Lección 2

List<Polygon> polygons = new List<Polygon>();

polygons.Add(new Polygon());

polygons.Add(new Rectangle());

polygons.Add(new Triangle());

foreach (Polygon p in polygons)

{

p.Draw();

}

}

5. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola para mostrar el mensaje sobre el dibujo de cada polígono.

6. GUARDE su proyecto.

PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

En este ejercicio, las defniciones de las clases Polygon y Rectangle se simplifcan para enfatizar el concepto de polimorfsmo. La clase base proporciona un solo método Draw. Lo importante aquí es notar la palabra reservada virtual. Esta palabra permite a las clases derivadas sobrescribir el método.

Tanto la clase Rectangle como Triangle sobrescriben el método Draw de la clase base con sus propias defniciones utilizando la palabra reservada override. Cuando se ejecuta el método Main se genera el siguiente resultado:

Dibujando: Polígono

Dibujando: Rectángulo

Dibujando: Triángulo

El tipo de datos List<Polygon> es capaz de almacenar una colección de objetos que son del tipo Polygon o tipos que derivan de Polygon. EL ciclo foreach se encuentra iterando en una colección de objetos Polygon. El tipo subyacente del primer objeto es Polygon, pero el segundo y tercer objeto en la colección son de hecho objetos Rectangle y Triangle que se acaban de castear como Polygons. El tiempo de ejecución verá en el tipo subyacente e invocará el método de sobrescritura desde la clase derivada. Esa es la razón por la cual la versión de la clase derivada del método Draw se llama tanto para los objetos Rectangle como Triangle.

Comprender las palabras reservadas override y new La palabra reservada override reemplaza un miembro de la clase base en una clase derivada. La palabra reservada new crea un nuevo miembro del mismo nombre en la clase derivada y oculta la implementación de la clase base.

Cuando una clase base defne un miembro virtual, la clase derivada tiene dos opciones para manejar esta situación: la clase derivada puede utilizar ya sea la palabra override o new. La palabra override toma la prioridad sobre la defnición de la clase base del miembro. El objeto de la clase derivada llamará el miembro sobrescrito en lugar del miembro de la clase base.

Tome Nota

Si el método en una clase derivada no se encuentra precedida por las palabras new u override, el compilador afrontará una advertencia y el método se comportará como si la palabra new estuviera presente.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 66: 98-361 Fundamentos de Desarrollo de Software

65Introducción a la programación orientada a objetos

Si se utiliza la palabra reservada new, se crea una nueva defnición del miembro y se oculta el miembro de la clase base. Sin embargo, si la clase derivada se castea a una instancia de la clase base, se pueden seguir llamando a los miembros ocultos de la clase.

Modifquemos el método Triangle del ejercicio anterior a lo siguiente:

class Triangle : Polygon

{

public new void Draw()

{

Console.WriteLine(“Dibujando: Triángulo”);

}

}

Ahora modifquemos el código en la clase Main de la siguiente manera:

Triangle t = new Triangle();

t.Draw();

Polygon p = t;

p.Draw();

El programa producirá el siguiente resultado:

Dibujando: Triángulo

Dibujando: Polígono

Cuando se invoca directamente el método Draw en el objeto de la clase derivada, se utiliza la nueva versión del método. Sin embargo, si se ejecuta el método cuando la clase derivada se castee como una clase base, se ejecuta la versión oculta de la clase base del método Draw.

� Comprender las interfaces

È EN RESUMEN

Las interfaces se utilizan para establecer contratos a través de los cuales los objetos pueden interactuar entre sí sin conocer los detalles de implementación.

Las interfaces se defnen utilizando la palabra reservada interface. Una defnición de interface consiste en un conjunto de frmas para métodos, propiedades, delegados, eventos o indexadores. Una defnición de interface no puede consistir de ningún campo de datos o detalles de implementación como cuerpos de métodos.

Una interface común defnida en el espacio de nombres System es el espacio IComparable.

Tome Nota

La clase System.Object proporciona un método ToString. Por estándar, debe utilizar este método para retornar la representación legible para el humano con respecto a una clase. Cuando cree sus tipos, es recomendable practicar la sobrescritura de este método para retornar información legible sobre los objetos.

; ¿Listo para la certificación?

¿Comprende el polimorfismo? -2.3

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 67: 98-361 Fundamentos de Desarrollo de Software

66 Lección 2

Esta interface se defne de la siguiente manera:

interface IComparable

{

int CompareTo(object obj);

}

La interface IComparable tiene un solo método (CompareTo) que acepta un objeto y retorna un int. El valor de retorno de este método indica el resultado de comparar un parámetro dado con el objeto actual. De acuerdo con la documentación del método CompareTo:

• Si la instancia es igual al parámetro, CompareTo retorna 0.

• Se retorna un valor positivo si el valor del parámetro es menor que la instancia o si el parámetro es null.

• Si el valor del parámetro es mayor que la instancia entonces se retorna un valor negativo.

• Si el parámetro no es de tipo compatible, entonces se arroja una ArgumentException.

¿Cómo es que IComparable decide cómo comparar dos objetos Rectangle o dos objetos Employee? No lo hace. Las clases que están interesadas en tales comparaciones deben implementar la interface IComparable al proporcionar un cuerpo de método para el método CompareTo. Cada clase que implementa IComparable es libre de proporcionar su propia comparación lógica dentro del método CompareTo.

Æ Uso de la interface IComparable

UTILICE el proyecto que guardó en el ejercicio anterior.

1. Modifique la clase Rectangle como se muestra a continuación:

class Rectangle : Polygon, IComparable

{

public double Length { get; set; }

public double Width { get; set; }

public override void Draw()

{

Console.WriteLine(“Dibujando: Rectángulo”);

}

public double GetArea()

{

return Length * Width;

}

Tome Nota

Por estándar, todas las interfaces definidas en el .NET Framework empiezan con la letra I mayúscula. Aun cuando puede asignar nombres a sus interfaces de la forma que quiera, es mejor utilizar el estándar de Framework.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 68: 98-361 Fundamentos de Desarrollo de Software

67Introducción a la programación orientada a objetos

public int CompareTo(object obj)

{

if (obj == null)

return 1;

if (!(obj is Rectangle))

throw new ArgumentException();

Rectangle target = (Rectangle)obj;

double diff = this.GetArea() - target.GetArea();

if (diff == 0)

return 0;

else if (diff > 0)

return 1;

else return -1;

}

}

2. Modifique el método Main como se muestra a continuación:

static void Main(string[] args)

{

Rectangle rect1 = new Rectangle

{ Length = 10, Width = 20 };

Rectangle rect2 = new Rectangle

{ Length = 100, Width = 200 };

Console.WriteLine(rect1.CompareTo(rect2));

}

3. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola al valor -1 puesto que el área de rect1 es menor que el área de rect2.

GUARDE su proyecto.

La clase Rectangle deriva se la clase Polygon e implementa la interface IComparable. Una clase que implementa una interface debe implementar todos los métodos declarados en la interface.

Una interface es similar a una clase abstracta pero hay diferencias notables. Una clase abstracta proporciona una implementación incompleta mientras que una interface no proporciona ninguna implementación. Una clase también puede implementar múltiples interfaces pero está limitada a heredar de una sola clase base.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 69: 98-361 Fundamentos de Desarrollo de Software

68 Lección 2

Por lo que, ¿cómo decide si utilizar una clase abstracta o una interface? Una forma de decidir es revisar si existe una relación “es un” entre los dos conceptos. Por ejemplo, si existe una relación de herencia entre SalariedEmployee y Employee, entonces puede utilizar una clase abstracta para estandarizar la funcionalidad común entre clases derivadas. Por otro lado, no hay una relación “es un” entre Employee y la IComparable. Por lo tanto, la funcionalidad de comparación es mejor si se implementa como una interface.

; ¿Listo para la certificación?

¿Comprende el encapsulamiento? -2.4

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 70: 98-361 Fundamentos de Desarrollo de Software

69Comprender los conceptos básicos de bases de datos

Resumen de la matriz de habilidades

En esta lección aprendió:

• La programación orientada a objetos es una técnica de programación que utiliza objetos. Los objetos son estructuras de datos auto contenidas que consisten de propiedades, métodos y eventos. Las propiedades especifcan los datos representados por el objeto; los métodos especifcan el comportamiento del objeto y los eventos proporcionan la comunicación entre los objetos.

• Una clase es la plantilla a partir de la cual se crean los objetos individuales.

• Los constructores se utilizan para inicializar los miembros de datos del objeto.

• La palabra reservada this se pueden utilizar para acceder a los miembros desde dentro de los constructores, métodos de instancia y accessors de propiedades de instancia.

• Los delegados son tipos especiales utilizados para encapsular un método dentro de una frma específca.

• Los eventos son una forma en la cual una clase notifca a otras clases u objetos cuando sucede algo de interés. La clase que envía la notifcación se conoce como editor del evento. La clase que recibe la notifcación se conoce como suscriptor del evento.

• Los espacios de nombre le permiten organizar código y crear nombres de clase únicos.

• La palabra reservada static se utiliza para declarar miembros que no pertenecen a objetos individuales sino a la clase en sí.

• Los tipos de valor almacenan directamente el valor mientras que los tipos de referencia almacenan solo la referencia al valor real.

• La palabra reservada struct se utiliza para crear tipos defnidos por el usuario que consisten de pequeños grupos de campos relacionados. Las estructuras son tipos de valor, las clases son tipos de referencias.

• El encapsulamiento es un mecanismo para restringir el acceso a una clase o miembros de la clase para ocultar las decisiones de diseño que pueden cambiar. El encapsulamiento proporciona a los diseñadores de la clase la fexibilidad para cambiar el código cuando sea necesario sin cambiar todo el código involucrado.

• Un modifcador de acceso especifca la región de código a la cual tendrá acceso un campo. Por ejemplo, un modifcador de acceso público no limita el acceso, pero un privado limita el acceso dentro de la clase en la cual se defna el campo.

• La herencia le permite crear clases nuevas que reutiliza, extienden y modifcan la funcionalidad defnida en clases existentes. La clase que hereda funcionalidad se conoce como clase derivada y la clase cuya funcionalidad se hereda se conoce como clase base.

• El polimorfsmo es la capacidad que tienen las clases derivadas para compartir funcionalidad con las clases base pero aun defniendo su propio comportamiento único.

• La palabra reservada override reemplaza un miembro de la clase base en una clase derivada. La palabra new crea un nuevo miembro con el mismo nombre en la clase derivada y oculta la implementación en la clase base.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 71: 98-361 Fundamentos de Desarrollo de Software

70 Lección 2

» Evaluación de conocimiento

Complete los espacios en blanco

Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los

espacios proporcionados.

1. Una __________ es una huella de un objeto.

2. Una clase que no proporciona una implementación complete se debe declarar con la palabra reservada __________.

3. Las clases que quieran soportar la comparación deben implementar la interface IComparable y luego proporcionar un cuerpo para el método __________.

4. Puede utilizar el operador __________ para verifcar si es legal castear un tipo a otro.

5. Las tres características principales de un lenguaje de programación orientada a objetos son el __________, __________, y __________.

6. Podemos utilizar __________ para agrupar clases relacionaras para reducir la colisión de nombres.

7. La palabra reservada __________ se refere a la instancia actual de la clase.

8. Un tipo__________ es uno que referencia a un método.

9. Una __________ es un tipo de valor, mientras que una __________ es un tipo de referencia.

10. Puede utilizar la palabra reservada __________ para declarar un miembro, el cual pertenece a la clase en sí en vez de a un objeto específco.

Opción múltiple

Encierre en un círculo la opción que contenga la respuesta correcta.

1. Desea restringir el acceso de un método a la clase contenedora o a una clase que se derive de la clase contenedora. ¿Cuál modifcador de acceso debería utilizar para utilizar este método?

a. Public

b. Private

c. Protected

d. Internal

2. En una clase defnió un método llamado Render. Este método proporciona funcionalidad a los archivos Render bitmap en pantalla. Le gustaría que las clases derivadas sustituyeran esta funcionalidad para soportar la renderización de formatos de imágenes adicionales. Desea que el método Render de la clase derivada se ejecute aun si la clase derivada esté casteada como la clase base. ¿Cuál palabra reservada utilizaría con la defnición del método Render en la clase base?

a. Abstract

b. Virtual

c. New

d. Overrides

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 72: 98-361 Fundamentos de Desarrollo de Software

71Comprender los conceptos básicos de bases de datos

3. Defnió una clase AdvMath que defne funcionalidad matemática avanzada. No desea que la funcionalidad de esta clase se herede a una clase derivada. ¿Cuál palabra reservada debe utilizar para defnir la clase AdvMath?

a. Sealed

b. Abstract

c. Private

d. Internal

4. Necesita proporcionar la funcionalidad de consulta a varias de sus clases. Cada algoritmo de clase para consulta será diferente. No todas las clases tienen una relación “es un” entre sí. ¿Cómo soportaría esta funcionalidad?

a. Agregar a la funcionalidad de consulta a la clase base con el modifcador de acceso público.

b. Hacer que todas las clases hereden de la clase abstracta y sobrescriban el método de la clase base para ofrecer su propia funcionalidad de consulta.

c. Hacer que todas las clases hereden de la clase base que proporcione la funcionalidad de consulta.

d. Crear una interfaz común que se implemente por todas las clases.

5. ¿Cuál de los siguientes elementos de clase debería utilizar para defnir el comportamiento de una clase?

a. Método

b. Propiedad

c. Evento

d. Delegado

6. Se encuentra escribiendo un código para una clase de nombre Product. Necesita asegurarse que los miembros de datos de las clases se inicialicen en sus valores correctos tan pronto como cree un objeto de la clase Product. El código de inicialización se debe ejecutar siempre. ¿Qué es lo que debería hacer?

a. Crear un método estático en la clase Product para inicializar los miembros de datos.

b. Crear un constructor en la clase Product para inicializar los miembros de datos.

c. Crear una propiedad estática en la clase Product para inicializar los miembros de datos.

d. Crear un evento en la clase Product para inicializar los miembros de datos.

7. Se encuentra creando una nueva clase de nombre Square que se deriva de la clase Polygon. La clase Polygon tiene el siguiente código:

a. class Polygon

b. {

c. public virtual void Draw()

d. {

e. // código adicional...

f. }

g. }

8. El método Draw en la clase Square debe proporcionar nuevas funcionalidades pero también oculta la implementación de la clase Polygon del método Draw. ¿Cuál segmento de código debería elegir?

a. class Square : Polygon

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 73: 98-361 Fundamentos de Desarrollo de Software

72 Lección 2

{

public override void Draw()

{

// código adicional...

}

}

b. class Square : Polygon

{

public new void Draw()

{

// código adicional...

}

}

c. class Square : Polygon

{

public virtual void Draw()

{

// código adicional...

}

}

d. class Square : Polygon

{

public static void Draw()

{

// código adicional...

}

}

9. Se encuentra creando una nueva clase de nombre Rectangle. Escribe el siguiente código:

class Rectangle : IComparable

{

public double Length { get; set; }

public double Width { get; set; }

public double GetArea()

{

return Length * Width;

}

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 74: 98-361 Fundamentos de Desarrollo de Software

73Comprender los conceptos básicos de bases de datos

public int CompareTo(object obj)

{

// a completarse

}

}

10. Necesita completar la defnición del método CompareTo para habilitar la comparación de los objetos de Rectangle. ¿Cuál de los siguientes códigos debería escribir?

a. public int CompareTo(object obj)

{

Rectangle target = (Rectangle)obj;

double diff = this.GetArea() - target.GetArea();

if (diff == 0)

return 0;

else if (diff > 0)

return 1;

else return -1;

}

b. public int CompareTo(object obj)

{

Rectangle target = (Rectangle)obj;

double diff = this.GetArea() - target.GetArea();

if (diff == 0)

return 1;

else if (diff > 0)

return -1;

else return 0;

}

c. public int CompareTo(object obj)

{

Rectangle target = (Rectangle)obj;

if (this == target)

return 0;

else if (this > target)

return 1;

else return -1;

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 75: 98-361 Fundamentos de Desarrollo de Software

74 Lección 2

}

d. public int CompareTo(object obj)

{

Rectangle target = (Rectangle)obj;

if (this == target)

return 1;

else if (this > target)

return -1;

else return 0;

}

11. Se encuentra escribiendo un código para un nuevo método de nombre Process:

a. void Process(object o)

b. {

c.

d. }

12. El código recibe un parámetro de tipo objeto. Necesita castear este objeto en el tipo Rectangle. En ocasiones, el valor de o enviado al método puede no ser un valor de Rectangle válido. Necesita asegurarse que el código no genere ningún error System.InvalidCastException al hacer las conversiones. ¿Cuál de las siguientes líneas de código debería utilizar dentro del método Process?

a. Rectangle r = (Rectangle) o;

b. Rectangle r = o as Rectangle;

c. Rectangle r = o is Rectangle;

d. Rectangle r = (o != null) ? o as rectangle:(Rectangle) o;

13. Se encuentra escribiendo el código para controlar los eventos en su programa. Defne un delegado de nombre RectangleHandler como el siguiente:

a. public delegate void RectangleHandler(Rectangle rect);

b. También crea una variable del tipo RectangleHandler como el siguiente:

c. RectangleHandler handler;

14. Más adelante en el programa, necesita agregar un método de nombre DisplayArea a la lista de invocación de métodos de la variable controladora. La frma del método DisplayArea corresponde al de la frma del método RectangleHandler. Cualquier código que escriba no debería afectar ningún código controlador de eventos existente. ¿Cuál de los siguientes códigos debería escribir?

a. Handler = new Rectanglehandler(DisplayArea);

b. Handler = DisplayArea;

c. Handler += DisplayArea;

d. Handler -= DisplayArea;

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 76: 98-361 Fundamentos de Desarrollo de Software

75Comprender los conceptos básicos de bases de datos

» Evaluación de destreza

Escenario 2-1: Creación de propiedades

Necesita crear una clase de nombre Product que represente un producto. La clase tiene una sola propiedad de nombre Name. Los usuarios de la clase Product deben ser capaces tanto de obtener como de establecer el valor de la propiedad Name. Sin embargo, cualquier intento por establecer el valor de Name a una cadena vacía o a un valor null debe arrojar una excepción. El usuario de la clase Product no debe ser capaz de acceder a cualquier otro miembro de datos de la clase Product. ¿Cómo creará esta clase?.

Escenario 2-2: Creación de un Struct

Se encuentra desarrollando un juego que necesita representar la ubicación de un objetivo en el espacio tridimensional. La ubicación se identifca por los tres valores enteros x, y y z. Creará miles de estas estructuras de datos en su programa. Necesita una forma efciente para almacenar estos datos en memoria. Es improbable que necesite heredar cualquier otro tipo desde este tipo de ubicación. ¿Cómo debería representar la ubicación en su programa?.

Evaluación de destreza

Proyecto 2-3: Sobrescribiendo el método ToString

Se encuentra escribiendo un código para una clase Product. La clase Product contiene el nombre y el precio de un producto. Necesita sobrescribir el método de la clase base (System.Object) ToString para proporcionar información sobre los objetos de la clase product al código invocador. ¿Cuál código necesita escribir para la clase Product para cumplir con este requisito?.

Proyecto 2-4: Creación y manejo de eventos

Se encuentra escribiendo un código para la creación y manejo de eventos en su programa. La clase SampleClass necesita implementar la siguiente interface:

public delegate void SampleDelegate();

public interface ISampleEvents

{

event SampleDelegate SampleEvent;

void Invoke();

}

Necesita escribir el código para SampleClass y para un método test que crea una instancia de SampleClass e invoca el evento. ¿Cuál código debería escribir?.

En una clase defnió un método llamado Render. Este método proporciona funcionalidad a los archivos Render bitmap en pantalla. Le gustaría que las clases

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 77: 98-361 Fundamentos de Desarrollo de Software

76 Lección 2

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 78: 98-361 Fundamentos de Desarrollo de Software

Lección 3

Desarrollo General de Software

Matriz de Dominio de Objetivos

Habilidad Tecnológica Descripción del Dominio de Objetivo Número del Dominio del Objetivo

Comprender la Administración del Ciclo de Vida de una Aplicación

Comprender la Administración del Ciclo de Vida de una Aplicación

3.1

Comprender las Pruebas Comprender la Administración del Ciclo de Vida de una Aplicación

3.1

Comprender las Estructuras de Datos Comprender los algoritmos y estructuras de datos

3.3

Comprender los Algoritmos de Clasificación

Comprender los algoritmos y estructuras de datos

3.3

Términos Clave• Arreglos o vectores• Pruebas de caja negra• Ordenamiento de burbuja• Listas enlazadas

• Ordenamiento rápido• Colas• Pruebas de regresión• Pilas

• Pruebas de unidad• Pruebas de caja blanca

Como desarrollador para la Corporación de Northwind, trabaja como parte de un equipo para desarrollar programas de computadora que resuelven problemas de negocios complejos. Como desarrollador, participa en el ciclo de vida de desarrollo de aplicaciones. Tiene que conocer las diferentes fases del ciclo de vida de aplicación y a menudo necesita interactuar con el equipo de pruebas de software y participar en las pruebas en persona. Necesita tener una comprensión general de las pruebas de software.

Cuando desarrolla software utiliza varios tipos de estructuras de datos y algoritmos. Necesita saber cuál estructura de datos utilizar para cada una de las áreas a desarrollar así como conocer las implicaciones de su elección. También debe tener una comprensión general de varios métodos de ordenación.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 79: 98-361 Fundamentos de Desarrollo de Software

78 Lección 3

� Comprender la Administración del Ciclo de Vida de

una Aplicación

È EN RESUMEN

La Administración del Ciclo de Vida de una Aplicación se refere a las distintas actividades que giran en torno a un nuevo producto de software desde su comienzo hasta que el producto de software madura y eventualmente se deshecha.

Desarrollar una aplicación de software es más que solo escribir el código. Se necesita desarrollar distintas actividades en el orden correcto para desarrollar una aplicación de software exitosamente. Administrar estas actividades es conocido colectivamente como una Administración del Ciclo de Vida de Aplicación (ALM). Algunas de las actividades que son parte del proceso de ALM como se muestra en la Figura 3-1 son: Requerimientos, Diseño, Desarrollo, Pruebas, Entrega y Administración de Liberación.

En esta sección aprenderá acerca de las distintas actividades y roles involucrados en cada una de las actividades en la administración del ciclo de vida de una aplicación.

El ciclo de vida de aplicación inicia cuando la necesidad por una nueva aplicación de software es identifcada. El administrador de un negocio generalmente es la persona que patrocina el proyecto. Él o ella analizan la necesidad, verifcan cómo el proyecto encaja con la estrategia global del negocio, organiza la fnanciación e inicializa el proceso de selección de equipo para el proyecto.

Un administrador del proyecto es probablemente la primera persona contratada por el administrador del negocio. Este administrador del proyecto es responsable de la ejecución global del proyecto. Las responsabilidades principales de un administrador de proyecto son el garantizar que el proyecto se ajuste al presupuesto y se termine en tiempo. El administrador de proyecto es responsable de la contratación de miembros del equipo y de facilitar la cooperación dentro del equipo.

Comprender el Análisis de RequerimientosEl análisis de requerimientos es el proceso de determinar los requerimientos del negocio detallados para un nuevo sistema de software.

Figura 3-1

Administración del Ciclo de Vida de Aplicación

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 80: 98-361 Fundamentos de Desarrollo de Software

79Desarrollo General de Software

El análisis de requerimientos es uno de los pasos más importantes en el ciclo de vida de aplicación. Requerimientos precisos, completos y bien documentados son críticos para el éxito del proyecto. Los requerimientos pueden ser funcionales o no funcionales. Los requerimientos funcionales especifcan exactamente lo que el sistema está diseñado para llevar a cabo. En contraste, los requerimientos no funcionales son requerimientos de calidad tales como la escalabilidad, seguridad, confabilidad, etc.

Un analista de negocios es responsable de analizar las necesidades del negocio y convertirlas en requerimientos que pueden ser ejecutados por el equipo de desarrollo.

Comprender el Proceso de DiseñoEl proceso de diseño es utilizado para crear planes, modelos y la arquitectura de cómo el software será implementado.

El proceso de diseño despliega especifcaciones técnicas detalladas que serán utilizadas por el desarrollo del sistema. La salida del proceso de diseño es un conjunto de modelos y especifcaciones técnicas que proporcionan la dirección a los desarrolladores y otros miembros del equipo durante la actividad de desarrollo de software. La salida del proceso de diseño es más abstracta que concreta. Por ejemplo, no existen sistemas reales con los cuales pueda interactuar.

Algunos de los participantes importantes en esta actividad son:

• Un arquitecto diseña el proyecto del sistema. Esto incluye identifcar los componentes y servicios, su comportamiento y cómo interactúan entre sí y con el mundo exterior.

• Un diseñador de experiencia del usuario crea la experiencia del usuario del sistema. Los elementos de experiencia del usuario incluyen el diseño de los elementos de la interfaz de usuario (UI), diseñar la navegación entre varios formularios, pantallas o páginas, etc.

Comprender el Desarrollo de SoftwareLa actividad de desarrollo de software involucra la implantación de diseño creando código de software, bases de datos y otro contenido relacionado.

Esta es la actividad donde los requerimientos son implementados en código funcional basado en el diseño que fue establecido en la actividad previa. Al fnal de esta actividad, se tiene una salida concreta en formato de un sistema de software con el cual el usuario puede interactuar.

Los participantes en el proceso de desarrollo son:

• Los desarrolladores escriben el código con base en los requerimientos reunidos por el analista de negocios, la arquitectura establecida por el arquitecto y la experiencia del usuario desarrollada por el diseñador de experiencia del usuario.

• Los administradores de bases de datos (DBAs) son responsables de la implementación y administración de la base de datos. Los DBAs también planean la integridad de datos, seguridad y velocidad.

• Los escritores técnicos desarrollan los manuales del sistema y archivos de ayuda que serán entregados junto con la aplicación.

• Los desarrolladores de contenido son expertos en la material quienes desarrollan el contenido del sistema. Por ejemplo, si la aplicación es un sitio web de reseña de

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 81: 98-361 Fundamentos de Desarrollo de Software

80 Lección 3

películas, no es sufciente sólo mostrar videos en el sitio, necesita asegurarse que hay sufciente contenido para reunir el interés del usuario.

Comprendiendo las Pruebas de SoftwareLa Prueba de Software verifca que la implementación coincide con los requerimientos del sistema.

La prueba de software es utilizada para asegurar la calidad del producto fnal. La prueba puede identifcar posibles lagunas entre las expectativas del sistema como se describen en el documento de requerimientos y el comportamiento real del sistema.

Un punto importante en la prueba de software se lleva a cabo por los testers (probadores) quienes verifcan la aplicación en acción para asegurarse que satisface los requerimientos. Los problemas identifcados por los testers son asignados a una persona para repararlos. Por ejemplo, un defecto en el código será asignado a un desarrollador para repararlo.

Comprender la Administración de LiberaciónLa actividad de administración de liberación es utilizada para administrar el desarrollo, entrega y soporte de liberaciones de software.

La administración de liberación incluye actividades tales como empaquetado y despliegue del software, administración de defectos de software y administración de solicitudes de cambio de software.

Los participantes principales en las actividades de administración son:

• Administrador de Liberación: el administrador de liberación coordina a varios equipos y unidades del negocio para garantizar la liberación a tiempo del producto de software.

• Personal de Operación: Se aseguran que el sistema sea entregado como se prometió. Esto podría involucrar quemar los DVDs y embarcarlos conforme se reciben las órdenes. O podría ser mantener un sistema de Software como un Service (SaaS) de forma regular. El personal de operación es también responsable de la liberación de cualquier actualización del sistema (con reparadores de errores o nuevas características).

• Personal de soporte técnico: Interactúan con clientes y ayudan a resolver sus problemas con el sistema. El soporte técnico puede generar métricas valiosas acerca de cuáles áreas del sistema son más difíciles para los usuarios y que posiblemente necesiten ser actualizadas en la próxima versión del software.

� Comprender las Pruebas

È EN RESUMEN

La prueba de software es el proceso de verifcar el software contra sus requerimientos. La prueba se realiza después de que la mayoría del trabajo de desarrollo es completado.

La prueba de software es un proceso de verifcar que el software funciona como se espera y cumple todos sus requerimientos técnicos y de negocios. Cuando hay diferencia entre

; ¿Listo para la certificación?

¿Comprende la administración del ciclo de vida de aplicación y sus actividades? — USD 3.1

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 82: 98-361 Fundamentos de Desarrollo de Software

81Desarrollo General de Software

lo esperado y el comportamiento actual del sistema, un defecto de software (o “bug”) es registrado y eventualmente pasado al responsable para repararlo.

Las pruebas de software involucran tanto pruebas funcionales y no funcionales. La prueba funcional es probar precisamente los requerimientos funcionales del sistema y las características que conforman la funcionalidad esencial. Por ejemplo, probar si el usuario puede agregar artículos a un carrito de compras es parte de la prueba funcional para un sitio web de comercio electrónico. Por otro lado, la prueba no funcional involucra pruebas de atributos de software que no son parte de la funcionalidad esencial pero son parte de los requerimientos no funcionales, tales como la escalabilidad, facilidad de uso, seguridad, etc.

Comprender los Métodos de PruebaLos métodos de prueba de software son generalmente divididos en pruebas de caja blanca y caja negra.

Tradicionalmente hay dos enfoques en la prueba de software:

• Prueba de caja negra

• Prueba de caja blanca

La prueba de caja negra trata al software como una caja negra, enfocándose sólo en las entradas y salidas. Cualquier conocimiento del funcionamiento del sistema interno no es utilizado para la prueba. En contraste, en la prueba de caja blanca, los testers utilizan su conocimiento del interior del sistema para probar el sistema. Por ejemplo, en la prueba de caja blanca, los testers tienen acceso al código fuente.

Estas técnicas se complementan entre sí. La prueba de caja negra es más utilizada para asegurarse que todos los requerimientos son cubiertos. La prueba de caja blanca es utilizada para asegurarse que cada método o función tiene sus propios casos de prueba disponibles.

Comprender los Niveles de PruebaLa prueba se lleva cabo en varias fases del ciclo de vida del desarrollo de aplicación. Los Niveles de Prueba especifcan donde tiene lugar la prueba del ciclo de vida.

Los niveles de prueba están defnidos por donde tiene lugar la prueba en el ciclo de vida del desarrollo de software. Están los siguientes cinco niveles de prueba:

• Prueba de unidad: La prueba de unidad verifca la funcionalidad de una unidad de código. Por ejemplo, una prueba de unidad puede probar si un método retorna el valor correcto. La prueba de unidad es una prueba de caja blanca y a menudo es hecha por el desarrollador que escribe el código. La prueba de unidad a menudo utiliza una herramienta automatizada que puede simplifcar el desarrollo de casos y también mantiene registro de si una modifcación de software causa que falle alguna de las pruebas de unidad existentes. Visual Studio tiene soporte integrado para la prueba de unidad. También puede utilizar herramientas de apertura de código tales como NUnit para automatizar pruebas de unidad para código de.NET Framework.

• Prueba de Integración: La prueba de integración prueba la interfaz entre los componentes de software. La prueba de integración puede ser desempeñada incrementalmente conforme los componentes se desarrollan, o puede ser llevada a cabo como un “bigbang” cuando todos los componentes están listos para trabajar juntos. El primer método se prefere sobre el segundo puesto que reduce el riesgo e incrementa la confanza en el sistema que se esté desarrollando. La prueba de integración puede también involucrar la prueba de interacción de componentes

Tome NotaEs importante notar que el proceso de prueba de software puede sólo ayudar a encontrar defectos, no garantiza la ausencia de defectos. El software complejo tiene un gran número de posibles rutas de ejecución y muchos parámetros que pueden afectar su comportamiento. No es factible y a menudo no es posible probar todas las diferentes situaciones que encontrará el software en un entorno de producción.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 83: 98-361 Fundamentos de Desarrollo de Software

82 Lección 3

con un sistema externo. Por ejemplo, si un componente se basa en datos de un servicio Web externo, la prueba de integración garantiza que el componente está funcionando correctamente con la aplicación externa.

• Prueba de sistema: La prueba de sistema es la prueba global del sistema de software. En este punto todos los componentes del sistema implementados están funcionando juntos y con cualquier sistema externo.

• Prueba de aceptación: Este nivel de prueba a menudo es desempeñado por los propios clientes. Generalmente hay dos niveles de pruebas aceptación previa a la liberación amplia del producto: prueba alfa y prueba beta. La prueba Alfa es desempeñada por un grupo muy limitado de usuarios y es una oportunidad para dar una vista de cerca al producto a los clientes más importantes y reunir retroalimentación. Las liberaciones Alfa pueden omitir algunas características y generalmente la falta de muchos atributos no funcionales tales como el rendimiento.

• En el siguiente nivel de prueba, la prueba beta, libera el producto a una audiencia más amplia de clientes y solicita retroalimentación. En términos de funcionalidad, la liberación beta del software es muy cercana a la liberación fnal. Sin embargo, los equipos de desarrollo podrían estar trabajando en mejorar el rendimiento y reparando algunos defectos conocidos.

• Prueba de Regresión: Conforme los defectos son reportados y reparados, es importante asegurarse que una reparación no rompe nada que funcionaba previamente. Esto se lleva a cabo como parte de la prueba de regresión. Con cada nueva reparación, los testers de software ejecutan una serie de pruebas de regresión para asegurarse que la funcionalidad que se sabía que funcionaba aun funciona.

� Comprender las Estructuras de Datos

È EN RESUMEN

Las estructuras de datos son técnicas para organizar y almacenar datos en la memoria de la computadora. El cómo la información es almacenada afecta la manera en la cual los datos son recuperados y manipulados. Comprender una estructura de datos involucra comprender no solo el patrón de almacenamiento sino también conocer los métodos utilizados para crear, acceder y manipular la estructura de datos.

Las estructuras de datos son los bloques de construcción de la mayoría de los programas de computadora y permite a los desarrolladores el implementar funcionalidad compleja. La mayoría de los frameworks de programación proporcionan soporte integrado para una variedad de estructuras de datos y métodos asociados para manipular estas estructuras de datos. En esta sección aprenderá algunos tipos distintos de estructuras de datos de manera que está familiarizado con las técnicas generales para la manipulación de estructuras de datos.

ArreglosUn arreglo es una colección de ítems almacenados en una ubicación de memoria contigua y direccionados utilizando uno o más índices.

Un arreglo es una estructura de datos muy común que representa una colección de ítems de un tipo similar. Los ítems en un arreglo son almacenados en ubicaciones de memoria contigua. Un arreglo es una estructura de datos homogénea ya que todos los ítems de un arreglo son del mismo tipo de datos. Cualquier ítem del arreglo puede ser directamente accedido utilizando un índice. En .NET Framework, los índices de arreglo están basados en ceros.

Tome Nota

Es mucho más efectivo y menos costoso encontrar defectos antes que tarde en el ciclo de desarrollo de software.

; ¿Listo para la certificación?

¿Comprende los distintos métodos de prueba? — USD 3.1

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 84: 98-361 Fundamentos de Desarrollo de Software

83Desarrollo General de Software

Representación Interna

En el siguiente código, la primera sentencia crea una variable de arreglo y la segunda sentencia inicializa la variable con un arreglo de cuatro enteros:

1. int[] numbers;

2. numbers = new int[4];

Inicialmente, los números variables serán establecidos a null debido a que el arreglo aún no está inicializado. La segunda sentencia inicializa el arreglo asignando un espacio de memoria contigua lo sufcientemente grande para almacenar cuatro enteros en la pila de memoria. La dirección de inicio en la memoria asignada es almacenada en la variable del arreglo numbers como se muestra en la Figura 3-2. Todos los elementos del arreglo son inicializados en este caso con el valor 0 ya que es el valor por defecto para un entero.

La variable numbers entonces actúa como una referencia a la ubicación de memoria asignada al arreglo. El nombre del arreglo puede ser utilizado para acceder a cada uno de los ítems de arreglo directamente. En el.NET Framework, todos los arreglos están basados en cero. Esto es, el primer ítem del arreglo es accedido utilizando un índice 0, como esto: numbers[0], el segundo ítem es accedido por numbers[1],y así sucesivamente.

También es posible tener arreglos multidimensionales. Un arreglo de dos dimensiones puede ser visto como una tabla donde cada celda es un elemento del arreglo y puede ser direccionado utilizando el número de fla y el número de columna al cual pertenece. Tanto el número de fla y el número de columna son indexados por cero. Por ejemplo, la expresión table[2, 3] se refere a un ítem en la tercera fla y en la cuarta columna de un arreglo por el nombre table.

Operaciones Comunes

El arreglo soporta las siguientes operaciones:

• Asignación

• Acceso

Para trabajar con un arreglo, primero asigne la memoria creando e inicializando un arreglo

Figura 3-2

Representación interna de una estructura de datos de un arreglo

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 85: 98-361 Fundamentos de Desarrollo de Software

84 Lección 3

como se mostró previamente. Una vez que el arreglo es asignado, puede acceder a cualquier elemento del arreglo en cualquier orden que desee directamente referenciando a su índice. Por ejemplo, el siguiente código asigna un valor de 10 al cuarto ítem del arreglo, y el doble de ese valor es entonces asignado a la variable calc:

3. number[3] = 10;

4. intcalc = number[3] * 2;

Rendimiento y uso

Los contenidos de un arreglo son establecidos como un bloque contiguo de memoria y puede ser directamente accedido utilizando el índice del arreglo. Por lo tanto la lectura o escritura en un arreglo es extremadamente rápida. Sin embargo, los arreglos están limitados por los requerimientos de homogeneidad y de tamaño fjo. Aunque el tamaño del arreglo puede ser incrementado, el hacerlo requiere la reasignación de todos los elementos del arreglo y es una operación que consume tiempo.

Los arreglos funcionan mejor cuando el número de ítems en la colección está predeterminado y se requiere de acceso rápido a cada ítem.

En el.NET Framework, puede utilizar la clase ArrayList para aproximarse a los requerimientos de un vector para lograr la homogeneidad y un tamaño fjo. Un ArrayList es un tipo de colección que puede mantener ítems de cualquier tipo de datos y se puede expandir dinámicamente cuando sea necesario. Sin embargo, un ArrayList no es tan rápido como un arreglo.

ColasUna cola es una colección de ítems en la cual el primer ítem añadido a la colección es el primer en ser removido.

La estructura de datos de una cola imita una cola en vida real. En una cola, los ítems son procesados en el orden en el que fueron agregados a la cola. En una cola, los ítems siempre son agregados al fnal de la cola y son removidos desde el frente de la cola. Esto es comúnmente conocido como el primero que entra es el primero que sale (FIFO). La capacidad de una cola es el número de ítems que puede mantener. Sin embargo, conforme los elementos son agregados a la cola, la capacidad es incrementada automáticamente. Una cola es una estructura de datos heterogénea, lo que signifca que los ítems en una cola pueden ser de diferentes tipos de datos.

Representación Interna

Con el fn de evitar la reubicación excesiva de espacio de memoria y permitir una administración sencilla, una cola a menudo es implementada internamente como un arreglo circular de objetos, como se muestra en la Figura 3-3.

En la Figura 3-3, el índice cabeza apunta a la ubicación 2 en la cola. Ya que la cola es circular, mientras tenga registro de los apuntadores de cabeza y cola, no importa en cual ubicación empieza la cola. El índice cabeza apunta al primer ítem en la cola y el índice cola apunta al último ítem en la cola. Cuando un ítem es removido, la cabeza se mueve al siguiente ítem en la cola. Un nuevo ítem siempre es agregado al fnal y la cola inicia apuntando al ítem recién agregado. Los espacios null en la Figura 3-3 son los lugares vacíos en la cola que pueden ser llenados antes de que la cola necesite una reasignación de memoria.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 86: 98-361 Fundamentos de Desarrollo de Software

85Desarrollo General de Software

El .NET Framework proporciona una implementación de la estructura de datos de una cola como parte de la clase Queue en el espacio de nombres de System.Collections. En lenguajes de programación que no proporcionan una implementación de una cola, puede escribir su propia clase Queue utilizando una estructura de datos parecida a un arreglo y simulando las operaciones de una cola.

Operaciones Comunes

Una cola soporta las siguientes operaciones comunes:

• Enqueue: Esta operación primero verifca si hay sufciente capacidad disponible en la cola para agregar un ítem más. Si la capacidad está disponible, el ítem es agregado al fnal de la cola. Si no hay espacio disponible en la cola, el arreglo es reasignado por un factor de crecimiento pre especifcado y luego el nuevo ítem es agregado a la cola.

• Dequeue: Esta operación remueve el elemento actual en la cabeza de la cola para apuntar al siguiente elemento en la cola, como se muestra en la Figura 3-3.

• Peek: La operación Peek le permite mirar el ítem actual en la posición de la cabeza sin removerlo realmente de la cola.

• Contains: Esta operación le permite determinar si existe un ítem en particular en la cola.

Rendimiento y Uso

Una cola es una estructura de datos de un propósito especial que es más adecuada para una aplicación donde necesita procesar ítems en el orden recibido. Algunos ejemplos pueden incluir una cola de impresión, sistema de mensajería y un calendario de trabajo. A diferencia de un arreglo, una cola no puede ser utilizada para acceder aleatoriamente a elementos. Las operaciones tales como enqueue y dequeue en realidad agregan y remueven los ítems de la cola.

PilasUna pila es una colección de ítems en la cual el último ítem agregado es el primero en ser removido.

Como opuesto a una cola, una pila es una estructura de datos en la que el ultimo que

Figura 3-3

Representación interna de una estructura de datos de una cola

Tome Nota

Una versión genérica de la clase Queue está disponible como parte del espacio de nombres de System.Collections.Generic. Esta versión genérica es utilizada para crear una cola de ítems que son del mismo tipo de datos.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 87: 98-361 Fundamentos de Desarrollo de Software

86 Lección 3

entra es el primero que sale (LIFO). Puede pensar en una pila como la pila de platos de cena en un buffet de mesa. El último en ser agregado es el primero en ser removido. La capacidad de una pila es el número de ítems que puede mantener. Sin embargo, conforme los elementos son agregados a la pila, la capacidad es automáticamente incrementada. Una pila es una estructura de datos heterogénea, lo que signifca que los ítems en una pila pueden ser de diferentes tipos de datos.

Representación Interna

Como una cola, una pila a menudo es implementada como un buffer circular con el fn de evitar la reubicación de espacio en memoria y para una administración más sencilla. Una pila puede ser visualizada justo como la cola en la Figura3-3, excepto que la cola ahora es llamada tope de la pila y la cabeza es llamada fondo de la pila.

Un nuevo ítem siempre es agregado en la parte superior de la pila, y el fondo de la pila inicia apuntando al elemento recién agregado. Los ítems también son removidos desde la parte superior de la pila y cuando esto sucede, la parte superior de la pila es ajustada para apuntar al siguiente ítem en la pila.

El .NET Framework proporciona una implementación de la estructura de datos de pila como parte de la clase Stack en el espacio de nombres de System.Collections. En lenguajes de programación que no proporcionan una implementación de la pila, puede escribir su propia clase Stack utilizando una estructura de datos parecida al arreglo y simular las operaciones de la pila.

Operaciones Comunes

Una pila soporta las siguientes operaciones comunes:

• Push: La operación push primero verifca si hay capacidad sufciente disponible en la pila para agregar un ítem más. Si la capacidad está disponible, el ítem es agregado en la parte superior de la pila. Si no hay espacio en la pila, el arreglo es reubicado por un factor de crecimiento pre especifcado y entonces el nuevo ítem es agregado a la pila.

• Pop: La operación pop remueve el elemento de la parte superior de la pila y establece la parte superior para que apunte al siguiente elemento en la pila.

• Peek: La operación Peek le permite mirar en el ítem actual en la parte superior de la pila sin removerlo realmente de la pila.

• Contains: La operación Contains le permite determinar si un ítem en particular existe en la pila.

Rendimiento y Uso

Una pila es una estructura de datos con propósito especial que es más adecuada para aplicaciones donde necesita procesar ítems en orden del último que entra es el primero que sale. Una pila es una estructura de datos muy útil debido a sus aplicaciones en la administración de memoria en tiempo de ejecución, evaluación de expresión, registro de llamado de método, etc. A diferencia de un arreglo, una pila no puede ser utilizada para acceder a elementos aleatoriamente. Las operaciones tales como push y pop realmente agregan y remueven los ítems de la pila.

Listas EnlazadasUna lista enlazada es una colección de nodos ordenados de forma que cada nodo contiene un enlace al siguiente nodo en la secuencia.

Tome Nota

Una versión generic de la clase Stack está disponible como parte del espacio de nombres de System.Collections.Generic. Esta versión genérica es utilizada para crear una pila de ítems que son del mismo tipo de datos.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 88: 98-361 Fundamentos de Desarrollo de Software

87Desarrollo General de Software

Una lista enlazada es una colección de nodos de tal manera que cada nodo contiene una referencia (o enlace) al siguiente nodo en la secuencia. A diferencia de un arreglo, los ítems en una lista enlazada no necesitan ser contiguos y por lo tanto una lista enlazada no requiere de reubicación de espacio en memoria para la lista entera cuando se necesita agregar más ítems.

Representación Interna

En memoria, una lista enlazada puede ser visualizada como una colección de nodos, como se muestra en la Figura 3-4.

Cada nodo contiene dos piezas de información: los datos correspondientes al nodo y el enlace al siguiente nodo. El primer nodo de la lista es llamado el nodo encabezado. Utilizando el enlace del nodo encabezado, puede llegar al siguiente nodo y continuar atravesando nodos hasta que el enlace fnal es un valor null. A menudo el termino cola es utilizado para referirse a la lista apuntada por el nodo encabezado, la cola es todo lo demás después del nodo encabezado. En la Figura 3-4, la cola es la lista enlazada iniciando desde el nodo B.

Algunas otras implementaciones de listas enlazadas pueden ser utilizadas dependiendo de los requerimientos. En una lista enlazada circular, el último nodo es la lista apuntando de regreso al primer nodo para crear un círculo. En una lista doblemente enlazada, cada nodo contiene dos enlaces, como se muestra en la Figura 3-5.

Un enlace es una referencia de dirección que apunta al siguiente nodo en la secuencia y el otro enlace es una referencia hacia atrás que apunta de regreso al nodo previo en la secuencia. Como puede imaginar, una lista doblemente enlazada es fácil de atravesar en cualquier dirección.

El .NET Framework proporciona una clase LinkedList como parte del espacio de nombres de System.Collections.Generic. Esta clase implementa homogéneamente una lista doblemente enlazada de un tipo de datos específco. Puede escribir sus propias clases para implementar un diferente tipo de implementación de lista enlazada.

Figura 3-4

Representación interna de una estructura de datos de una lista enlazada sencilla

Figura 3-5

Representación de una estructura de datos de una lista doblemente enlazada

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 89: 98-361 Fundamentos de Desarrollo de Software

88 Lección 3

Operaciones Comunes

Una lista enlazada soporta las siguientes operaciones comunes:

• Add: Agregar o insertar un ítem en una lista enlazada es un asunto de cambiar enlaces, como se muestra en la Figura 3-6. Digamos que le gustaría insertar un nuevo nodo (con valor Z) entre los nodos con valores A y B. primero necesita asignar memoria para el nuevo nodo y asignar el valor Z a la sección de datos del nodo. Luego, copiara la sección de enlace del nodo A a la sección de enlace del nodo Z de modo que el nodo Z está apuntando al nodo B. Finalmente, necesitará

copiar la dirección del nodo Z recién creado a la sección de enlace del nodo A

de manera que el nodo A inicia apuntando al nodo Z.

• Remove: Similar a la operación add, la operación de remove o delete es también asunto de cambiar enlaces. Por ejemplo, para eliminar el tercer nodo en la Figura 3-4, cambiará el enlace del Segundo nodo a un valor null. El tercer nodo ahora será una pieza de memoria sin referencia y eventualmente será retornada al pool de memoria disponible.

• Find: Esta operación encuentra un nodo con un valor dado en la lista enlazada. Para encontrar un valor, generalmente inicia desde el nodo encabezado y verifca si el valor coincide. Si no, seguirá el enlace al siguiente nodo y continuará la operación fnd hasta que alcance el fnal de la lista, lo cual sucede cuando encuentra un enlace null.

Rendimiento y Uso

Una lista enlazada no permite acceso aleatorio a sus ítems. La única manera de llegar a un ítem es iniciar desde el nodo encabezado y seguir los enlaces. Como resultado, las listas enlazadas son muy lentas en la recuperación de datos. Sin embargo, para operaciones de insertar y eliminar, las listas enlazadas son extremadamente rápidas: la inserción o eliminación de un nodo involucra solo cambiar un link. Además las listas enlazadas no tienen una capacidad máxima después de la cual el contenido necesita ser reasignado.

De hecho, una lista enlazada proporciona una manera alternativa para implementar las estructuras de datos de la cola y la pila. Si sus requerimientos realizan accesos frecuentes a datos pero rara vez necesita insertar o eliminar datos, un arreglo es la implementación ideal. Si en su lugar, los requerimientos llaman con frecuencia operaciones de insert y delete, entonces puede ser más recomendable utilizar una lista enlazada.

Figura 3-6

Agregando un nuevo nodo a una lista enlazada

; ¿Listo para la certificación?

¿Comprende las estructuras de datos comunes? — USD 3.2

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 90: 98-361 Fundamentos de Desarrollo de Software

89Desarrollo General de Software

� Comprender los Algoritmos de Ordenamiento

È EN RESUMEN

Los algoritmos de ordenamiento tales como Ordenamiento de burbuja y el Ordenamiento Rápido (QuickSort) ordenan ítems en una lista en un orden en particular. Comprender los algoritmos de ordenamiento pueden ayudarle a comprender, analizar y comparar distintas maneras de resolver un problema.

Los algoritmos de ordenamiento son algoritmos que ordenan los ítems en una lista en un cierto orden. Por ejemplo, puede utilizar un algoritmo de ordenamiento para ordenar una lista de estudiantes en orden ascendente de su apellido. En la época de los primeros procesamientos de datos, el ordenamiento era un problema muy importante. En estos días, puede encontrar capacidades de ordenamiento básicas ya integradas en librerías populares y estructuras de datos. Por ejemplo, en el .NET Framework, puede hacer uso del método Array.Sort para ordenar un arreglo. Sin embargo, aún es importante mirar el ordenamiento como una manera de comprender la resolución de un problema y análisis de algoritmos.

En esta sección, le echará un vistazo a dos algoritmos de ordenamiento comunes: ordenamiento de burbuja y ordenamiento rápido.

Ordenamiento de BurbujaEl algoritmo de ordenamiento de burbuja utiliza una serie de operaciones de comparación e intercambio para ordenar una lista en el orden correcto.

El ordenamiento de burbuja funciona comparando dos elementos para verifcar si están fuera de lugar, si lo están, los intercambia. El algoritmo continúa haciendo esto hasta que la lista entera está en el orden deseado. El ordenamiento de burbuja obtiene su nombre de la manera en que funciona el algoritmo; como el algoritmo progresa, los ítems más pequeños son “burbujeados” hacia arriba.

Visualicemos el ordenamiento de burbuja con ayuda de un ejemplo. Digamos que desea ordenar todos los ítems en la siguiente lista en orden ascendente: (20, 30, 10, 40). Los ítems deberían ser ordenados en orden del más pequeño al más grande. El algoritmo de ordenamiento de burbuja intenta solucionar este problema en una o más pasadas, con cada pasada escaneando completamente la lista de ítems. Si el algoritmo encuentra elementos fuera de lugar, los intercambia. El algoritmo termina cuando escanea toda la lista sin intercambiar ningún elemento, si no hubo intercambios entonces ninguno de los elementos esta fuera de lugar y la lista ha sido completamente ordenada.

Paso Antes Después Comentarios

1. 20, 30,

10, 4020, 30, 10, 40

El algoritmo compara los primeros dos elementos (20 y 30),y ya que están en el orden correcto, no es necesario el intercambio.

2. 20, 30, 10, 40

20, 10,

30, 40El algoritmo compara los siguientes dos elementos (30 y 10),y ya que están fuera de lugar, los elementos son intercambiados.

3. 20, 10, 30, 40

20, 10, 30,

40

El algoritmo compara los siguientes dos elementos (30 y 40),y ya que están en el orden correcto, no es necesario el intercambio.

Tabla 3-1

Primera pasada del ordenamiento de burbujaE

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 91: 98-361 Fundamentos de Desarrollo de Software

90 Lección 3

Al fnal de la primera pasada, el ordenamiento de burbuja ha desempeñado un intercambio y hay una posibilidad que los ítems aún no están completamente ordenados. De manera que el ordenamiento de burbuja da otra pasada a la lista.

Paso Antes Después Comentarios

1. 20, 10, 30, 40

10, 20, 30, 40

El algoritmo compara los primeros dos elementos (20 y 10),y como están fuera de lugar, los elementos son intercambiados.

2. 10, 20, 30, 40

10, 20,

30, 40El algoritmo compara los siguientes dos elementos (20 y 30),y ya que están en el orden correcto, no es necesario el intercambio.

3. 10, 20,

30, 40

10, 20,

30, 40

El algoritmo compara los siguientes dos elementos (30 y 40),y ya que están en el orden correcto, no es necesario el intercambio.

Al fnal de la segunda pasada, el ordenamiento de burbuja ha desempeñado un intercambio y aun no puede garantizar que la lista está completamente ordenada. De manera que el ordenamiento de burbuja da otra pasada a la lista:

Paso Antes Después Comentarios

1. 10, 20, 30, 40

10, 20, 30, 40

El algoritmo compara los siguientes dos elementos (10 y 20),ya que están en el orden correcto, no es necesario el intercambio.

2. 10, 20,

30, 4010, 20,

30, 40El algoritmo compara los siguientes dos elementos (20 y 30),y ya que están en el orden correcto, no es necesario el intercambio.

3. 10, 20,

30, 40

10, 20,

30, 40

El algoritmo compara los siguientes dos elementos (30 y 40),y ya que están en el orden correcto, no es necesario el intercambio.

Al fnal de la tercera pasada, el ordenamiento de burbuja no realizó ningún intercambio. Eso garantiza que la lista ahora esta ordenada y el algoritmo puede fnalizar.

En C# este algoritmo puede ser expresado por el siguiente método:

staticint[] BubbleSort(int[] numbers)

{

bool swapped;

do

{

swapped = false;

for (int i = 0; i <numbers.Length - 1; i++)

{

if (numbers[i] > numbers[i + 1])

{

//swap

Tabla 3-2

Primera pasada del ordenamiento de burbuja

Tabla 3-3

Primera pasada del ordenamiento de burbuja

Tome Nota

Cuando se utiliza el ordenamiento de burbuja puede asegurarse que un arreglo estará ordenado en un paso menos que el número de ítems. De manera que si hay cuatro ítems, como se ilustró arriba, el arreglo será ordenado (sin importar en qué orden empieza) en tres pasadas.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 92: 98-361 Fundamentos de Desarrollo de Software

91Desarrollo General de Software

int temp = numbers[i + 1];

numbers[i + 1] = numbers[i];

numbers[i] = temp;

swapped = true;

}

}

} while (swapped == true);

return numbers;

}

Ordenamiento Rápido (QuickSort)El algoritmo de ordenamiento rápido utiliza las operaciones de partición y comparación para ordenar los elementos de una lista en el orden correcto.

El algoritmo de ordenamiento rápido utiliza la técnica de divide y conquista para particionar continuamente una lista hasta que el tamaño del problema sea realmente pequeño y difícilmente requiera algún ordenamiento. Los siguientes pasos explican esto más a detalle:

• Un lista de tamaño cero o uno siempre es ordenada por sí misma.

• Para una lista más grande, puede elegir algún elemento como elemento pivote. Luego particionar la lista de tal manera que todos los elementos más pequeños que o iguales al elemento pivote van a la lista izquierda y todos los elementos más grandes que el elemento pivote van a la lista derecha. Ahora la combinación de la lista izquierda, el elemento pivote y la lista derecha están ordenadas.

• El problema ahora se particiona en dos listas más pequeñas, la lista de la izquierda y la lista de la derecha.

• Ambas listas pueden ser resueltas utilizando la técnica descrita en las viñetas anteriores.

• Finalmente, unir todas las pequeñas listas ordenadas con el fn de crear la lista ordenada completa.

La siguiente tabla explica el algoritmo de ordenamiento rápido con un pequeño ejemplo.

Paso Datos a ser ordenados Comentarios

1. 50, 10, 30, 20, 40 Inicia con una lista no ordenada y elige un elemento pivote, en este caso 30.

2. 20, 10 30 50, 40 Partición de la lista: los ítems menores al pivote van a la lista izquierda y los ítems más grandes que el pivote van a la lista derecha. Para ordenar la lista izquierda. Elija un pivote (10). Para ordenar la lista derecha, seleccione un pivote (40) para la lista derecha.

Tabla 3-4

Visualizando el ordenamiento rápidoE

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 93: 98-361 Fundamentos de Desarrollo de Software

92 Lección 3

3. - 10 20 30 - 40 50 En la lista izquierda, 20 es mayor que 10 y 50 es más grande que 40, por lo tanto ambos van en la lista derecha. Nos quedan listas con solo un número, las cuales por definición están ordenadas.

4. 10, 20, 30, 40, 50 La lista unida final es la lista ordenada.

El defecto principal del algoritmo descrito podría parecer la memoria adicional requerida por la creación de listas más pequeñas separadas. Sin embargo, crear listas separadas no es necesario. Utilizando una técnica ligeramente modifcada, el arreglo puede ser particionado, como se muestra en el siguiente código:

staticint Partition (int[] numbers, int left,

int right, intpivotIndex)

{

intpivotValue = numbers[pivotIndex];

// se mueve el elemento pivote al fnal

int temp = numbers[right];

numbers[right] = numbers[pivotIndex];

numbers[pivotIndex] = temp;

// newPivot almacena el indice del primer número

// mayor que el pivote

intnewPivot = left;

for (int i = left; i < right; i++)

{

if (numbers[i] <= pivotValue)

{

temp = numbers[newPivot];

numbers[newPivot] = numbers[i];

numbers[i] = temp;

newPivot++;

}

}

//mueve el elemento pivote a su posición //almacenada

temp = numbers[right];

numbers[right] = numbers[newPivot];

numbers[newPivot] = temp;

returnnewPivot;

}

En esta técnica, primero el elemento pivote es movido al fnal del arreglo. Luego todos

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 94: 98-361 Fundamentos de Desarrollo de Software

93Desarrollo General de Software

los elementos menores que o iguales al elemento pivote son movidos al frente del arreglo. Finalmente, el elemento pivote es ubicado justo antes del elemento más grande que él, efectivamente particionando el arreglo.

Este algoritmo de partición puede entonces ser utilizado por el ordenamiento rápido para particionar la lista, reducir el problema en problemas más pequeños y entonces lo resuelve recursivamente:

staticint[] QuickSort(int[] numbers,

int left, int right)

{

if (right > left)

{

intpivotIndex = left + (right - left) / 2;

//particiona el vector

pivotIndex= Partition(

numbers, left, right, pivotIndex);

//ordena la partición izquierda

QuickSort(

numbers, left, pivotIndex - 1);

// ordena la partición derecha

QuickSort(

numbers, pivotIndex + 1, right);

}

return numbers;

}

Debido al enfoque de partición, el algoritmo de ordenamiento rápido, es mucho más rápido que el algoritmo de ordenamiento de burbuja.

; ¿Listo para la certificación?

¿Comprende los algoritmos de ordenamiento comunes? — USD 3.3

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 95: 98-361 Fundamentos de Desarrollo de Software

94 Lección 3

Resumen de matriz de habilidades

En esta lección aprendió:

• La administración del ciclo de vida de aplicación son las distintas actividades que giran alrededor de un nuevo producto de software desde su comienzo a cuando el producto de software madura y tal vez se retira.

• La prueba de software es el proceso de verifcar el software contra sus requerimientos. Las pruebas toman lugar después que la mayoría del trabajo de desarrollo está completado.

• Las estructuras de datos son técnicas de organización y almacenamiento de datos en la memoria de la computadora. Como los datos son almacenados afecta cómo son recuperados y manipulados. Comprender una estructura de datos involucra comprender no solo el patrón de almacenamiento sino también los métodos utilizados para crear, acceder y manipular la estructura de datos.

• Un arreglo es una colección de ítems, del mismo tipo de datos, almacenados en ubicaciones de memoria contiguas y direccionadas utilizando uno o más índices.

• Una cola es una colección de ítems que permite operaciones tales que el primer ítem agregado a la colección es el primero en ser removido.

• Una pila es una colección de ítems que permite operaciones tales que el ultimo ítem agregado a la colección es el primero en ser removido.

• Una lista enlazada es una colección de nodos ordenados de tal manera que cada nodo contiene un enlace al siguiente nodo en la secuencia.

• El algoritmo de ordenamiento de burbuja utiliza una serie de operaciones de comparación e intercambio para ordenar los elementos en una lista en el orden correcto.

• El algoritmo de ordenamiento rápido utiliza las operaciones de partición y comparación para ordenar los elementos de una lista en el orden correcto.

» Evaluación de Conocimientos

Llene los Espacios en Blanco

Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los

espacios proporcionados.

1. En la prueba de________, los testers utilizan sus conocimientos del sistema interno para probar el sistema.

2. Con cada nueva reparación, los testers de software ejecutan una serie de ______ para asegurarse que la funcionalidad que se sabía que funcionaba aun funciona.

3. El algoritmo de ordenamiento de burbuja utiliza una serie de operaciones de ______ y ______ para ordenar los elementos de una lista en el orden correcto.

4. Una ______ es una colección de ítems que permite operaciones tales que el ultimo ítem agregado a la colección es el primero en ser removido.

5. El______ es el proceso de determinar los requerimientos detallados del negocio para un nuevo sistema de software.

6. Una lista enlazada es una colección de nodos tales que cada nodo contiene un ____ al

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 96: 98-361 Fundamentos de Desarrollo de Software

95Comprender los conceptos básicos de bases de datos

siguiente nodo en la secuencia.

7. La operación______agrega un ítem a la cola mientras que la operación ______remueve un ítem desde una cola.

8. El algoritmo de ordenamiento rápido utiliza las operaciones de ______ y comparación para ordenar los elementos de una lista en el orden correcto.

9. Un ______ es responsable de analizar las necesidades del negocio y convertirlas en requerimientos que pueden ser ejecutados por el equipo de desarrollo.

10. Tanto la prueba Alfa y la prueba Beta son parte de las pruebas de ______de un sistema.

Elección Múltiple

Encierre en un círculo la letra que corresponda a la mejor respuesta.

1. El producto que está desarrollando aún no está terminado, pero le gustaría liberar el producto a una audiencia de clientes más amplia para su retroalimentación y pruebas. ¿Bajo cuál de los siguientes niveles de pruebas caerá esta actividad?

a. Prueba de Integración

b. Prueba de Sistema

c. Prueba de Aceptación

d. Prueba de Regresión

2. Los testers del software tienen acceso a su código fuente. Los testers necesitan escribir casos de prueba que garanticen que el método retorna valores correctos. ¿En cuál de los siguientes niveles de pruebas caerá esta actividad?

a. Prueba de Integración

b. Prueba de Unidad

c. Prueba Alfa

d. Prueba Beta

3. ¿Cuál de las siguientes estructuras de datos permite acceso directo a todos sus ítems?

a. Arreglo

b. Pila

c. Cola

d. Lista enlazada

4. ¿Cuál de las siguientes actividades en el ciclo de vida de aplicación es utilizado por un arquitecto para crear el proyecto técnico del sistema?

a. Análisis de requerimientos

b. Diseño

c. Desarrollo

d. Mantenimiento

5. En su aplicación, usted está utilizando una estructura de datos de cola para manipular datos. Necesita encontrar cuál ítem de datos será procesado después, pero no desea realmente procesar los ítems aun. ¿Cuál de las siguientes operaciones de la cola utilizará?.

a. Enqueue

b. Dequeue

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 97: 98-361 Fundamentos de Desarrollo de Software

96 Lección 3

c. Peek

d. Contains

6. Está desarrollando un programa que requiere que registre los llamados de método. Puede invocar solo un método a la vez. Sin embargo, un llamado de método puede a su vez invocar a otros métodos. Cuando un método termina y retorna el control al método que lo llama. ¿Cuál estructura utilizará para registrar estos llamados de método?.

a. Cola

b. Arreglo

c. Lista enlazada

d. Pila

7. Está desarrollando un programa que simula una cola de trabajo. A menudo los trabajos se hacen más rápidos de lo que puede procesarlos y en ese caso los trabajos esperan su turno para ser procesados. Necesita asegurarse que el trabajo que llega primero es el que se procesa primero también. ¿Cuál de las siguientes estructuras de datos es más adecuada para este requerimiento?

a. Arreglo

b. Cola

c. Lista enlazada

d. Pila

8. Usted escribe el siguiente código en su programa:

a. int[] numbers = {2, 3, 1, 4};

b. numbers[2] = 4;

9. ¿Cuáles serán los contenidos del arreglo después de que la segunda sentencia es ejecutada?.

a. {2, 4, 1, 4}

b. {2, 3, 4, 4}

c. {2, 4, 1, 2}

d. {4, 3, 1, 4}

10. Está desarrollando un programa que desempeña operaciones de insertar y eliminar frecuentes en los datos. Su requerimiento también dicta una capacidad para acceder a registros previos y siguientes cuando el usuario presiona el botón de previo o siguiente. ¿Cuál de las siguientes estructuras de datos se ajustará mejor a sus requerimientos?.

a. Arreglo

b. Lista enlazada circular

c. Lista enlazada

d. Lista doblemente enlazada

11. Está desarrollando un programa que desempeña operaciones de insertar y eliminar frecuentes en los datos. los datos necesitan ser accedidos como una pila con la funcionalidad del último que entra es el primero que sale. Su solución debe requerir tan poca memoria como sea posible. ¿Cuál de las siguientes estructuras de datos se ajustará mejor a sus requerimientos?.

a. Arreglo

b. Lista enlazada circular

c. Lista enlazada

d. Lista doblemente enlazada

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 98: 98-361 Fundamentos de Desarrollo de Software

97Comprender los conceptos básicos de bases de datos

» Evaluación de Competencia

Caso 3-1: Utilizando Arreglos

Está escribiendo un programa que utiliza un arreglo bidimensional. El arreglo tiene cuatro flas cinco columnas. Necesita imprimir el elemento mayor en cada fla del arreglo. ¿Cómo escribiría tal programa?.

Proyecto 3-2: Utilizando Colas

Está escribiendo un programa que utiliza dos colas. Los datos en cada cola ya están en orden ascendente. Necesita procesar el contenido de ambas colas de tal manera en que la salida sea impresa en la pantalla ordenada. ¿Cómo escribiría tal programa?.

» Evaluación de Competencia

Proyecto 3-3: Utilizando Pilas

Está escribiendo un programa que utiliza dos pilas. Los datos en cada pila ya están en orden descendiente. Necesita procesar el contenido de ambas pilas de tal manera que la salida sea impresa en la pantalla en orden ascendente. ¿Cómo escribiría tal programa?.

Proyecto 3-4: Utilizando Listas Enlazadas

Está escribiendo un programa que almacena la lista de nombres de productos en una lista enlazada. El usuario introducirá un nombre de producto y un programa necesita verifcar si la lista enlazada contiene el producto dado. ¿Cómo escribiría tal programa?.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 99: 98-361 Fundamentos de Desarrollo de Software

98 Lección 3

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 100: 98-361 Fundamentos de Desarrollo de Software

Lección 4

Comprender las Aplicaciones Web

Matriz de Dominio de Objetivos

Habilidad Tecnológica Descripción del Dominio de Objetivo Número del Dominio del Objetivo

Comprender el Desarrollo de una Página Web Comprender el Desarrollo de una Página Web

4.1

Comprender el Desarrollo de una Aplicación ASP.NET

Comprender el desarrollo de una aplicación Web del Microsoft ASP.NET

4.2

Comprender el IIS Web Hosting Comprender el Web hosting 4.3

Comprender el Desarrollo de Servicios Web Comprender los servicios Web 4.4

Términos Clave

• Hojas de estilo en cascada (CSS)• Lenguaje de Marcado de Hipertexto

(HTML)• Servicios de Información de Internet

(IIS)• JavaScript• SOAP• Administración de estado

• Servicio Web• Lenguaje de Defnición de Servicio

Web (WSDL)

Como desarrollador de una gran empresa necesita desplegar aplicaciones que se puedan utilizar a través de redes como la World Wide Web. La aplicación será desplegada en un servidor Web de Windows pero sus usuarios utilizarán múltiples sistemas operativos y navegadores Web.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 101: 98-361 Fundamentos de Desarrollo de Software

100 Lección 4

� Comprender el Desarrollo de una Página Web

È EN RESUMEN

Una página Web es un documento que es servido a través de la World Wide Web (WWW) y que se puede mostrar a través de un navegador Web. Las páginas Web se desarrollan utilizando el Lenguaje de Marcado de Hipertexto (HTML) y se almacenan en un servidor Web. Los navegadores Web descargan el HTML solicitado del servidor Web y lo interpretan en la pantalla del usuario.

La World Wide Web (también conocida como WWW o “la Web”) es un sistema de documentos de hipertexto interconectados y otros recursos tales como imágenes y video que se pueden acceder vía internet. Tecnologías múltiples trabajan juntas para hacer posible la WWW. Discutiremos dos de estas tecnologías en esta sección:

• Protocolo de Transferencia de Hipertexto (HTTP)

• Lenguaje de Marcado de Hipertexto (HTML)

HTTP es el protocolo de comunicación fundamental utilizado por la World Wide Web. HTTP proporciona el lenguaje común que los servidores Web y los navegadores Web utilizan con el fn de comunicarse.

HTTP utiliza el Localizador de Recurso Uniforme (URL) para identifcar únicamente y direcciona cada recurso en Internet. Una URL es esencialmente una dirección Web y se parece a esto: http://www.microsoft.com/en/us/default.aspx. Cada URL inicia con un protocolo. En este ejemplo, el protocolo es HTTP. También notará el protocolo HTTPS (HTTP Seguro) en uso para asegurar aplicaciones donde los datos necesitan ser cifrados antes de que puedan ser transmitidos a través de la red. La siguiente parte de la URL es la dirección del servidor Web: (www.microsoft.com), seguido por el localizador del recurso dentro del servidor Web (/en/us/), y fnalmente el propio recurso solicitado (default.aspx). Cada documento, imagen, video y otros recursos en la Web es identifcado por una URL.

Cuando un navegador envía una solicitud HTTP para una página Web a un servidor Web (tanto la página y el servidor Web son identifcados por una URL), el servidor prepara una respuesta HTTP para el navegador. Esta respuesta especifca el contenido y presentación de la página Web.

El lenguaje que el servidor Web y el navegador Web utilizan para describir una página Web es el Lenguaje de Marcado de Hipertexto (HTML). HTML es un lenguaje basado en texto que utiliza varias etiquetas de marcado describiendo como el contenido es desplegado. HTML permite que imágenes, videos y otros objetos sean referenciados en un archivo para crear páginas Web multimedia. HTML puede incrustar scripts tales como JavaScript que afecta el comportamiento de las páginas Web. HTML también puede ser utilizado para incluir hojas de estilo en cascada (CSS) para defnir el formato y presentación del contenido de una página. El navegador Web lee el código HTML e interpreta los resultados en la pantalla.

Una página Web puede contener hipervínculos a otros recursos tales como imágenes y videos. Cada uno de estos recursos es identifcado por su propia URL. Con el fn de interpretar completamente una página, el navegador hará solicitudes HTTP adicionales para obtener esos recursos y desplegarlos como parte de la página Web.

En las siguientes secciones, aprenderá más acerca de varios componentes que conforman una página Web tales como HTML, CSS y JavaScript.

Tome Nota

Los términos “Internet” y “la Web” son comúnmente utilizados de forma indistinta pero son en realidad diferentes y no deben confundirse entre sí. El Internet es un sistema de comunicaciones de datos global que proporciona conectividad entre computadoras. En contraste, la Web es uno de los servicios disponibles en Internet que nos permite acceder a recursos hiper vinculados.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 102: 98-361 Fundamentos de Desarrollo de Software

101Comprender las Aplicaciones Web

Comprender HTMLEl Lenguaje de Marcado de Hipertexto (HTML) es el lenguaje utilizado por los servidores y navegadores Web para describir una página Web.

El propósito de HTML es proporcionar un lenguaje estándar para describir páginas Web de forma que diferentes navegadores Web pueden comprenderlo y desplegar las páginas Web. HTML es un lenguaje basado en texto, lo cual signifca que puede escribir y editar paginas HTML utilizando cualquier editor de texto. Cuando HTML es enviado al navegador Web, la mayoría de los navegadores le permiten visualizar el código fuente HTML de la página.

HTML consiste de un conjunto de etiquetas (también llamadas elementos HTML) que defnen la estructura y contenido de una página. Por ejemplo, la etiqueta <html> especifca el inicio del documento HTML. Las etiquetas HTML siempre son rodeadas por paréntesis angulares. Las etiquetas HTML siempre se utilizan en pares. Cada inicio de etiqueta tiene una etiqueta par al fnal. Las etiquetas fnales tienen un slash que indica que es una etiqueta de fnal. Por ejemplo, la etiqueta de fnal para <html>es </html>.

Una página HTML consta de dos partes: un encabezado y un cuerpo. El encabezado es encerrado dentro de las etiquetas <head>y</head>y es utilizado para proporcionar un título al documento y vínculos a ítems externos que pueden ser utilizados en la página, tales como archivos CSS y archivos de JavaScript. El cuerpo es encerrado dentro de las etiquetas <body>y</body> y es utilizado para proporcionar la estructura complete y contenido de la página que será desplegada dentro del navegador Web.

Este es un ejemplo de una etiqueta que despliega una imagen:

<img height=”400px” width=”400px”

alt=”Mimas Cassini” src=

“http://upload.wikimedia.org/wikipedia/commons/b/bc/Mimas_Cassini.jpg”/>

La etiqueta <img> especifca atributos adicionales. Por ejemplo, el atributo src especifca la ubicación del archivo de imagen, y los atributos height y width especifcan qué dimensiones utilizar cuando se interpreta la imagen en el navegador.

Este es otro ejemplo de una etiqueta HTML:

<a href=”http://en.wikipedia.org/wiki/Mimas_(moon)”>

Saturn’s moon</a>

Aquí, <a> es la etiqueta de anclaje, la cual es utilizada para crear hipervínculos en la página Web. El atributo href especifca la URL objetivo y el texto dentro de los paréntesis angulares es el que es mostrado como un enlace.

Tome los pasos en el siguiente ejercicio para crear un documento HTML.

Tome Nota

HTML está basado en texto. HTML utiliza etiquetas para incrustar imágenes, audio, video y otros muchos tipos de multimedia y contenido interactivo en la página.

Tome Nota

Note que el documento HTML no contiene la imagen en sí. La etiqueta img específica la URL de la imagen, la cual el navegador descarga separadamente y la interpreta como parte de la página.

Tome Nota

Esta lección no cubre todos los elementos HTML. Para aprender más sobre elementos HTML, busque “Elementos HTML” en el MSDN.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 103: 98-361 Fundamentos de Desarrollo de Software

102 Lección 4

Æ Trabajar con HTML

PREPÁRESE. Para crear un documento HTML, haga lo siguiente:

1. Abra el Visual Studio. Crear un Nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET. Nombre al proyecto TrabajandoConHTML y nombre la solución Leccion04.

2. Seleccione Proyecto, Agregar Nuevo Ítem, y seleccione la platilla de Pagina HTML. Nombre el archivo default.htm.

3. Remplace el código por defecto en el archivo HTML con el siguiente código:

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head>

<title>Saturn’s Moon</title>

</head>

<body>

<h1>Mimas Cassini</h1>

La etiqueta img es utilizada para mostrar la imagen de

<a href=”http://en.wikipedia.org/wiki/Mimas_(moon)”>

Saturn’s moon</a>: <br />

<img height=”400px” width=”400px”

alt=”Mimas Cassini”

src=”http://goo.gl/3BeK”/>

</body>

</html>

4. Seleccione Depurar y después Inicie la Depuración (o presione F5). La páginadefault.htm se abrirá en un navegador Web. Note que la salida se parece a la figura 4-1, donde puede ver las etiquetas <img>y<a>en acción.

Figura 4-1

Una página HTML simple con una imagen y un hipervínculo.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 104: 98-361 Fundamentos de Desarrollo de Software

103Comprender las Aplicaciones Web

Comprender las Hojas de Estilo en CascadaLas hojas de estilo en cascada (CSS) le permiten almacenar el estilo e información separada del código HTML. Esta separación hace más fácil el actualizar la apariencia de su sitio Web. Visual Studio incluye herramientas para construir y pre visualizar sus hojas de estilo.

CSS es un lenguaje que describe toda la información acerca de mostrar una página Web. Cuando se interpreta páginas Web en un navegador, HTML especifca lo que será mostrado. Por ejemplo, HTML puede especifcar que su documento tiene un encabezado H1 con un texto dado, mientras CSS puede especifcar la fuente y el color que serán aplicados al encabezado H1.

CSS le permite separar la presentación de una página Web de su contenido. Esta separación le permite cambiar uno sin afectar a otro. Mezclar el contenido y el estilo juntos reduce la posibilidad de mantenimiento de un sitio Web. Por ejemplo, digamos que quiere cambiar el color y fuente de todos los encabezados de H1 en su sitio Web. Un enfoque podría ser abrir un editor HTML y modifcar cada archivo en el sitio Web que utiliza la etiqueta H1. Esto podría ser una solución aceptable si el sitio Web tiene solo una o dos páginas, pero ¿y si el sitio web tiene un gran número de páginas, digamos 50 o 100? Imagine cambiar manualmente cada página. Si tal cambio es solicitado muy a menudo, el proceso de desarrollo Web será muy tedioso y propenso a errores (¿Cómo garantiza que no omitió ninguna etiqueta?).

Afortunadamente, con CSS puede poner toda la información de estilo en un archivo separado y conectar todas las páginas Web en un sitio Web con el archivo CSS. Una vez que está confgurado, para modifcar cualquier estilo (tal como el color y fuente de los encabezados H1), simplemente cambia el estilo en el archivo CSS, un simple cambio afectará todas las páginas en el sitio Web.

Diseño de Hojas de Estilo en Cascada

El lenguaje CSS está basado en texto y es fácil de leer y entender. A continuación se muestra un ejemplo de una página HTML que defne estilo CSS:

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head runat=”server”>

<title>Comprendiendo CSS</title>

<style type=”text/css”>

body

{

font-family: Verdana;

font-size: 9pt;

}

div

Tome Nota

Cuando se utiliza efectivamente, CSS es una gran herramienta para incrementar la consistencia del ancho del sitio y la posibilidad de mantenimiento.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 105: 98-361 Fundamentos de Desarrollo de Software

104 Lección 4

{

color:Red;

}

.block

{

background-color: Yellow;

border-color: Blue;

border-width: thin;

border-style: outset;

font-family: Arial;

}

</style>

</head>

<body>

Sample body text <br />

<div>Sample DIV text</div>

<div class=”block”>Sample DIV text

with block class</div>

<span class=”block”>Sample SPAN text

with block class</span>

</body>

</html>

Las defniciones CSS deben estar dentro del elemento <style> y son defnidos bajo el elemento <head>. Este CSS defne dos estilos de elemento y un estilo de clase. El primer estilo aplica al elemento cuerpo HTML y especifca que todo el texto en el elemento cuerpo debería utilizar la fuente Verdana con tamaño de fuente 9 pt. El segundo elemento de estilo especifca que el texto dentro del elemento DIV será escrito en rojo. Finalmente, una clase llamada “block” es defnida. Las defniciones de clase de CSS son prefjadas con un punto (“.”). Los contenidos de cualquier elemento HTML que utilice esta clase será mostrado con fondo Amarillo y un borde. Cuando muestra la página de arriba en el navegador, se parecerá a lo mostrado en la Figura 4-2.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 106: 98-361 Fundamentos de Desarrollo de Software

105Comprender las Aplicaciones Web

Note que el texto resaltado es mostrado como resultado de la clase block. Pero la clase CSS block no especifca el color del texto. En el primer texto resaltado, la clase block es aplicada al elemento DIV, en el segundo texto resaltado, la clase block es aplicada al elemento SPAN. En el primer caso, como la clase block es aplicada al texto DIV, el estilo de color del elemento DIV es llevado a la interpretación fnal.

En el ejemplo previo, el archivo CSS fue escrito dentro de HTML. Una aproximación más útil es escribir el CSS en un archivo separado por su cuenta y luego enlazar el archivo HTML al archivo CSS. Aprenderá como hacer esto en el siguiente ejercicio.

Æ Trabajar con Archivos CSS

PREPÁRESE. Para escribir el archivo CSS y enlazar a un archivo HTML, haga lo siguiente:

1. Agregue un Nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la solución Leccion04. Nombre el proyecto ComprendiendoCSS.

2. Seleccione Proyecto y después Agregar nuevo elemento. Seleccione la plantilla de Hoja de Estilo. Nombre el archivo estilos .css. Remplace el código por defecto en el archivo con el siguiente código:

body

{

font-family: Verdana;

font-size: 9pt;

}

div

{

color:Red;

}

.block

{

background-color: Yellow;

Figura 4-2

Formateando HTML con hojas de estilo en cascada

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 107: 98-361 Fundamentos de Desarrollo de Software

106 Lección 4

border-color: Blue;

border-width: thin;

border-style: outset;

font-family: Arial;

}

3. Seleccione Proyecto, después Agregar nuevo elemento y seleccione la plantilla de Página HTML. Nombre el archivo default.htm. Remplace el código por defecto en el archivo con el siguiente código:

<!DOCTYPE html PUBLIC

“-//W3C//DTD XHTML 1.0 Transitional//EN”

“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head>

<link rel=”STYLESHEET”

type=”text/css” href=”styles.css” />

<title>Understanding CSS</title>

</head>

<body>

Sample body text <br />

<div>Sample DIV text</div>

<div class=”block”>Sample DIV text

with block class</div>

<span class=”block”>Sample SPAN text

with block class</span>

</body>

</html>

4. Seleccione Depurar y después Inicie la depuración (o presione F5). La página default.htm se abrirá en un navegador Web. Note que la salida es similar a la Figura4-2.

El elemento HTML <link>es utilizado para enlazar el archivo CSS con la página HTML:

<link rel=”STYLESHEET”

type=”text/css” href=”styles.css” />

El elemento <link> siempre se pone dentro del elemento <head>. El atributo href especifca la dirección del archivo CSS a utilizar. Para enlazar múltiples páginas con un archivo CSS, necesitará poner el elemento <link>dentro de cada página HTML.

Visual Studio incluye un diseñador de estilo integrado que puede ayudarle en el diseño de nuevos estilos CSS o para modifcar estilos existentes. Cuando abre un archivo .css, verá un Nuevo menú llamado Styles. Puede crear un nuevo estilo seleccionando Styles, Add Style Rule. También puede modifcar el estilo seleccionado actualmente seleccionando Styles, Build Style option. Esta opción abre el editor de Modify Style como se muestra en la Figura 4-3.

Tome Nota

Cuando el CSS es almacenado en archivos separados, el navegador del usuario descargará y los almacenará localmente. Aunque pueden ser utilizados en múltiples paginas sin ninguna necesidad de volver a descargarlos, esto reduce la transferencia de datos innecesaria.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 108: 98-361 Fundamentos de Desarrollo de Software

107Comprender las Aplicaciones Web

Comprender JavaScriptJavaScript es un lenguaje de scripting de lado del cliente que se ejecuta dentro de un navegador Web para ayudar a crear páginas Web mucho más interactivas de lo que es posible utilizando sólo HTML plano. JavaScript es utilizado en millones de páginas Web y es soportado por todos los navegadores Web modernos.

JavaScript es utilizado para hacer sitios Web más sensibles y páginas Web más interactivas. JavaScript lleva a cabo esto ejecutando el código en el lado del cliente (el navegador Web) y minimizando las idas y vueltas innecesarias al y del servidor. Tomemos un ejemplo en el cual un usuario necesita introducir detalles personales tales como el nombre, dirección de correo electrónico y número de teléfono. Un requerimiento común es desempeñar validación de datos para garantizar que los campos introducidos no están vacíos y que la dirección de correo electrónico y el número de teléfono están en el formato requerido. Sin JavaScript, necesitaría entregar el formato al servidor, el cual desempeñará la validación de datos y retornará los resultados al cliente. Esta transmisión de información toma tiempo y degrada la experiencia del usuario. Una solución de JavaScript puede desempeñar este tipo de validación de datos dentro del navegador, proporcionando una mejor experiencia al usuario.

El código de JavaScript se ejecuta localmente dentro del navegador Web (el cliente), como opuesto al servidor Web. Aunque JavaScript también algunas veces es llamado como lenguaje de scripting del lado del cliente y con JavaScript es llamado programación del lado del cliente.

El comportamiento del tiempo de ejecución de la ejecución de código del lado del cliente depende del navegador que lo ejecuta. Sin embargo, es independiente de la tecnología del servidor o la estructura de programación. Para la ejecución de JavaScript en un navegador Web, no importa si la página Web fue generada por ASP.NET o PHP o si la página está siendo servida por un servidor Web de Windows o un servidor Web de Linux.

JavaScript y el lenguaje de programación C# utilizan una sintaxis infuida por el lenguaje de programación C. sin embargo, JavaScript y C# son muy diferentes en como son ejecutados.

Tome Nota

Muchos sitios Web modernos proporcionan una experiencia altamente interactiva que rivaliza con aplicaciones de escritorio. Tales aplicaciones pueden ser desarrolladas utilizando la programación Ajax. Ajax es una abreviatura para XML y JavaScript Asíncrono. Ajax utiliza extensivamente el JavaScript con el fin de proporcionar aplicaciones Web sensibles. ElASP.NET AJAX framework le permite implementar la funcionalidad de Ajax en páginas Web de ASP.NET.

Figura 4-3

El cuadro de diálogo Modify Style

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 109: 98-361 Fundamentos de Desarrollo de Software

108 Lección 4

JavaScript es ejecutado por el navegador Web. El código de JavaScript es interpretado en lugar de ser compilado, como en el caso de C#.

Todo el código de JavaScript debe ser ubicado dentro del elemento <script>. El elemento <script> esta generalmente dentro del elemento <head>, aunque no se requiere. Se le permite tener múltiples elementos <script> dentro de una página. Para ver el JavaScript en acción, tome los siguientes pasos:

Æ Trabajar con JavaScript

PREPÁRESE. Para comenzar a trabajar con JavaScript, realice las siguientes tareas:

1. Agregar un nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la solución Leccion04. Nombre el proyecto ComprendiendoJavaScript.

2. Seleccione Proyecto, después Agregar nuevo elemento y seleccione la plantilla de Pagina HTML. Nombre el archivodefault.htm. Remplace el código por defecto en el archivo con el siguiente código:

<!DOCTYPE html PUBLIC

“-//W3C//DTD XHTML 1.0 Transitional//EN”

“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head>

<title>Comprendiendo JavaScript</title>

<script type=”text/javascript”

language=”javascript”>

username = prompt(“Introduzca su Nombre”);

message = “Hola, “ + username +

“. Su nombre tiene “;

nameLen = username.length;

if (nameLen > 5)

message = message + “mas de “;

else if (nameLen < 5)

message = message + “menos de “;

else

message = message + “exactamente “;

message = message + “5 caracteres.”;

alert(message);

</script>

</head>

<body>

</body>

</html>

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 110: 98-361 Fundamentos de Desarrollo de Software

109Comprender las Aplicaciones Web

3. Seleccione Depurar y después Inicie la depuración (o presione F5). La página default.htm se abrirá en un navegador Web. Note que el código de JavaScript le pide que introduzca su nombre. El siguiente diálogo muestra un mensaje basado en la longitud del nombre introducido, como se muestra en las Figuras 4-4 y 4-5.

Como con los archivos CSS, también puede poner su código de JavaScript en un archivo separado y enlazar el archivo de JavaScript con el archivo HTML utilizando el elemento script, como se muestra abajo:

<script src=”SampleScript.js”>

</script>

Aquí el archivoSampleScript.js contiene todo el código de JavaScript y el elemento script enlaza a este archivo utilizando el atributo src. Almacenar el JavaScript en archivos externos ofrece muchas ventajas:

• Mayor facilidad de mantenimiento: Si utiliza el mismo código de JavaScript en cada página, puede almacenar el código en una página central en lugar de repetirlo en todas las páginas. Cuando es hora de modifcar el código de JavaScript, tendrá que cambiar el código sólo en un lugar.

• Mejora del rendimiento: Almacenar código en un archivo separado reduce el tamaño de la página Web. También, el navegador puede descargar y almacenar en cache el archivo de JavaScript externo de forma que no es descargado de nuevo a menos que sea modifcado.

Visual Studio incluye soporte complete de IntelliSense para código de JavaScript. Incluso los controles ASP.NET, como el control TreeView o los controles de validación, utiliza JavaScript donde es posible interpretar contenido dinámicamente.

Tome Nota

Aunque todos los navegadores modernos soportan el JavaScript, pueden ser configurados para desactivar el JavaScript. Algunos usuarios desactivan el JavaScript. Puede utilizar un elemento <noscript>para mostrar un mensaje específico a los usuarios quienes no están ejecutando JavaScript.

Figura 4-5

Cuadro de diálogo de JavaScript

Figura 4-4

Petición al Usuario de JavaScript

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 111: 98-361 Fundamentos de Desarrollo de Software

110 Lección 4

Programación del lado del cliente vs. lado del servidorSi un programa es de lado del cliente o lado del servidor depende de donde se ejecuta el programa al fnal.

La programación del lado del cliente se refere a los programas que se ejecutan completamente en la computadora local del usuario. Los ejemplos de programas del lado del cliente son la aplicación de Formularios de Windows y el código de JavaScript que se ejecuta dentro del navegador Web. Los programas del lado del cliente no consumen recursos del servidor.

Por otro lado, la programación del lado del servidor se refere a los programas que son ejecutados completamente en el servidor y que hacen uso de los recursos computacionales del servidor. Los únicos recursos del cliente utilizados son involucrados en realmente recuperar los resultados de procesamiento del servidor. Las aplicaciones Web y los servicios Web son un ejemplo de la programación del lado del servidor. La programación del lado del servidor utiliza una tecnología del lado del servidor tal como ASP.NET, PHP, o Ruby on Rails.

Las aplicaciones hibridas que utilizan tanto programación del lado del cliente y del lado del servidor se han hecho cada vez más populares. Puede diseñar aplicaciones de cliente inteligente que se ejecutan localmente en las computadoras cliente pero que hacen uso de servicios Web para llevar a cabo ciertas tareas. Las aplicaciones Ajax utilizan una mezcla de programación del lado del servidor y código del lado del cliente para crear aplicaciones Web interactivas y altamente sensibles.

ASP.NET le permite crear aplicaciones que se ejecutan completamente en el servidor o aplicaciones Ajax hibridas que proporcionan interfaces rápidas sensible mientras que almacenan la mayoría de la información en la Web.

� Comprender el desarrollo de una aplicación de ASP.

NET

È EN RESUMEN

ASP.NET es la parte del .NET Framework que le permite desarrollar formularios Web programables y servicios Web. Como con cualquier aplicación de .NET Framework, puede desarrollar aplicaciones ASP.NET en cualquier lenguaje que sea compatible con el tiempo de ejecución en.NET, incluyendo Visual Basic y C#.

La infraestructura de ASP.NET tiene dos partes principales:

• Un conjunto de clases e interfaces que permite la comunicación entre el navegador Web y el servidor Web. Estas clases están organizadas en el espacio de nombres System.Web.

• Un proceso en tiempo de ejecución, también conocido como el proceso trabajador de ASP.NET (aspnet_wp.exe), que maneja la solicitud Web para recursos de ASP.NET.

En un nivel alto, una aplicación Web de ASP.NET es ejecutada a través de una serie de solicitudes y mensajes de respuesta de HTTP entre los navegadores cliente y los servidores Web. El proceso ocurre como sigue:

; ¿Listo para la certificación?

¿Comprende cómo utilizar HTML, JavaScript y CSS para el desarrollo de una página Web? — USD 4.1

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 112: 98-361 Fundamentos de Desarrollo de Software

111Comprender las Aplicaciones Web

1. El usuario solicita un recurso del servidor Web tecleando una URL en el navegador Web. El navegador envía una solicitud HTTP al servidor Web destino.

2. El servidor Web analiza la solicitud HTTP y busca el proceso capaz de ejecutar la solicitud.

3. El resultado de la solicitud HTTP es retornada al navegador cliente en la forma de una respuesta HTTP.

4. El navegador lee la respuesta HTTP y la interpreta como una página Web para el usuario.

Este proceso está representado en la Figura 4-6.

Como desarrollador, estará interesado en conocer lo que sucede tras bambalinas cuando un servidor Web ejecuta una solicitud para una página ASP.NET. La siguiente lista describe el proceso:

5. Cuando el Servicio de Información de Internet (IIS) recibe una solicitud HTTP, utiliza la extensión del nombre del archivo para determinar qué programa de interfaz de programación de aplicación (ISAPI) del servidor ejecutar para procesar la solicitud. Cuando la solicitud es para una página ASP.NET, pasa la solicitud al ISAPI DLL capaz de manejar las solicitudes para páginas de ASP.NET, el cual es aspnet_isapi.dll.

6. El proceso aspnet_isapi.dll pasa la solicitud al proceso trabajador de ASP.NET (aspnet_wp.exe), el cual cumple la solicitud.

7. El proceso trabajador de ASP.NET compila el archivo .aspx en un assembly y le pide al CLR que ejecute el assembly.

8. Cuando el assembly se ejecuta, toma los servicios de varias clases en la librería de clases del .NET Framework para llevar a cabo su trabajo y genera mensajes para el cliente solicitante.

9. El proceso trabajador de ASP.NET colecta las respuestas generadas por la ejecución de la página Web, crea un paquete de respuesta y lo pasa al proceso aspnet_isapi.dll.

10. Aspnet_isapi.dll reenvía el paquete de respuesta a IIS, el cual a su vez pasa la respuesta a la maquina cliente solicitante.

Antes de la ejecución, cada página ASP.NET es convertida en una clase. Esta clase deriva la mayoría de su funcionalidad de la clase System.Web.UI.Page. La clase Page proporciona algunas propiedades importantes tales como Request, Response, Session y Server.

Ciclo de vida y modelo de evento de una página ASP.NETDurante su ejecución una página ASP.NET pasa a través de muchas etapas diferentes de procesamiento, cada una de estas etapas va a través de pasos de procesamiento específcos tales como inicialización, carga, código manejador de evento en ejecución e interpretación.

Conforme una página se ejecuta, va a través de varias etapas de procesamiento. La página también dispara algunos eventos con los cuales puede adjuntar un manejador de evento

Solicitud HTTP

Respuesta HTTP

Tome Nota

La clase Page proporciona algunos métodos y propiedades importantes que pueden controlar cómo una solicitud de página es procesada. Para la lista completa de métodos y propiedades, mire http://msdn.

microsoft.com/en-us/

library/system.web.

ui.page.aspx.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 113: 98-361 Fundamentos de Desarrollo de Software

112 Lección 4

para ejecutar su código personalizado en distintas etapas de procesamiento de la página. Los desarrolladores de ASP.NET deben tener una buena comprensión del ciclo de vida de una página de manera que pueden escribir código que es ejecutado exactamente en la etapa deseada del procesamiento de la página.

La tabla 4.1 enlista las diferentes etapas del ciclo de vida y sus eventos asociados.

Etapa Significado Eventos Asociados

Solicitud de página Cuando una solicitud de página es recibida, se inicia el ciclo de vida de la página. En este punto, ASP.NET decide si la página será fácilmente servida desde

la caché o si necesita ser analizada y compilada.

Inicio En esta etapa, se determina si la solicitud es una devolución de datos o una nueva solicitud. Algunas propiedades de la página tales como Request, Response, IsPostBack y UICulture son establecidas en esta etapa.

PreInit

Inicialización Durante la etapa de inicialización, todos los controles en la página son inicializados y se hacen disponibles. Un manejador de evento para el evento Init es el mejor lugar para el código que desea que se ejecute antes de seguir con el procesamiento de la página.

Init

Carga Si la solicitud es una devolución de datos, esta etapa es utilizada para restaurar las propiedades de control con información desde el estado de vista y el estado de control. Un método que maneja el evento Load es el mejor lugar para almacenar el código de inicialización para cualquier control

específico para esta página.

Load

Manejador de evento Postback

Si la solicitud es una devolución de datos, el control de los manejadores de evento son llamados, entonces, los valores de entrada son validados y la propiedad IsValid para la clase Page es establecida.

Pre interpretación Esta fase señala que la pagina esta por interpretar sus contenidos. Un manejador de evento para el evento PreRender es la última oportunidad para modificar la salida de la página antes de que sea enviada al cliente.

PreRender

Interpretación En esta etapa, la página llama al método Render para cada control y rellena la respuesta que será enviada al navegador.

Tome Nota

En un formulario de contacto típico, introduzca información y presione el botón de enviar. Cuando envía esta página, la página puede procesar los datos enviados para tomar alguna acción tal como el almacenamiento de los datos en una base de datos o enviar un correo electrónico. En muchos casos, la página principal es mostrada nuevamente con una confirmación del envío del formulario. Ocurre una devolución de datos cuando la información es publicada a la misma página Web para el procesamiento. Una devolución de datos es distinta a la carga inicial de la página debido a que la página recibe información adicional como datos de formulario como parte del postback de la página.

Tabla 4-1

Etapas importantes en el ciclo de vida de una página ASP.NET

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 114: 98-361 Fundamentos de Desarrollo de Software

113Comprender las Aplicaciones Web

Descarga En esta etapa, la respuesta es enviada al cliente y se desempeña la limpieza de la página. Como parte de la limpieza, las propiedades tales como Request y Response son descartadas.

Unload

Cuando desea manejar un evento, debe escribir el código que registra al método para manejar el evento (también llamado manejador de evento) con el evento. Esto se hace generalmente utilizando el patrón de registro de evento común a través del .NET Framework:

object.event += new EventHandler(eventhandler);

Aquí, reemplace object con el nombre del objeto que expone el evento, event con el nombre del evento, y eventhandler con el nombre del método que maneja al evento.

Sin embargo, ASP.NET proporciona seis métodos especiales que son reconocidos como manejadores de evento por defecto y que no necesitan el código de registro. Estos son llamados especialmente métodos Page_Init, Page_Load, Page_DataBind, Page_PreRender y Page_Unload. Estos métodos son tratados como manejadores de evento para los eventos correspondientes expuestos por la clase page. Este evento automático es controlado por el atributo AutoEventWireup de la directiva @Page. Por defecto el valor de este atributo es True, lo cual signifca que estos métodos llamados especialmente son automáticamente enlazados con sus eventos correspondientes.

Æ Comprender el ciclo de vida de una página ASP.NET

PREPÁRESE. Para ver cuántos eventos diferentes de la clase Page son ejecutados, desempeñe lo siguiente.

1. Crear un nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la solución Leccion04. Nombre el proyecto como PageEvents.

2. Seleccione Proyecto, Agregar nuevo elemento. Seleccione la plantilla de Formulario Web. Nombre el archivo WebForm1.aspx.

3. En la etiqueta HTML para la página (WebForm1.aspx), asegúrese que el atributo AutoEventWireup para la directiva @Page está establecida como True:

<%@ Page Language=”C#” AutoEventWireup=”true”

CodeBehind=”WebForm1.aspx.cs”

Inherits=”PageEvents.WebForm1” %>

4. Haga clic derecho en la ventana de código y seleccione Ver Código desde el menú para cambiar a la vista de código. Remplace el código en el archivo de código subyacente (WebForm1.aspx.cs) con el siguiente código:

using System;

namespace PageEvents

{

public partial class WebForm1

: System.Web.UI.Page

{

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 115: 98-361 Fundamentos de Desarrollo de Software

114 Lección 4

protected void Page_Load

(object sender, EventArgs e)

{

Response.Write

(“Mensaje desde Page_Load. <br/>”);

}

protected void Page_Init

(object sender, EventArgs e)

{

Response.Write

(“Mensaje desde Page_Init. <br/>”);

}

protected void Page_PreRender

(object sender, EventArgs e)

{

Response.Write

(“Mensaje desde Page_PreRender. <br/>”);

}

protected void Page_PreInit

(object sender, EventArgs e)

{

Response.Write

(“Mensaje desde Page_PreInit. <br/>”);

}

}

}

5. Seleccione Depurar y después Inicie la depuración (o presione F5). La página default.htm se abrirá en un navegador Web. Se mostrará la salida de la página en la Figura 4-7.

Los caracteres<% y %>son utilizados para incrustar bloques de código en la etiqueta HTML de una página. El código dentro de estos bloques de código incrustado es ejecutado durante la etapa de interpretación de la página. En los bloques de código incrustado, la sintaxis <%=expression>es utilizada para resolver una expresión y retornar su valor en el bloque. Por ejemplo, el siguiente bloque de código:

<i><% = DateTime.Now.ToShortDateString() %></i>

Cuando se ejecuta, visualizará la fecha actual en formato de itálicas:

12/01/2010

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 116: 98-361 Fundamentos de Desarrollo de Software

115Comprender las Aplicaciones Web

La directiva @Page especifca varios atributos que controlan como el ASP.NET interpreta una página. Por ejemplo, en este ejercicio, los atributos de la directiva @Page especifcan:

• C# es el lenguaje de programación para esta página Web (Language=”C#”)

• Los eventos de la página son auto-wired (AutoEventWireup=true)

• El nombre del archivo de código que contiene la clase asociada con la pagina (CodeBehind=”WebForm1.aspx.cs”)

• El nombre de la clase para la página a heredar (Inherits=”PageEvents.WebForm1”)

Administración de estadoLa administración de estado es importante para las aplicaciones Web debido a la naturaleza de desconexión de HTTP. Hay técnicas tanto del lado del cliente y del lado del servidor disponible para la administración de estado.

La administración de estado es el proceso de administrar el estado para una página Web a través de viajes. Los valores de las variables y controles colectivamente conforman el estado de una página Web.

ASP.NET proporciona algunas técnicas para preservar la información de estado a través de devoluciones de datos de la página. Estas técnicas pueden ser ampliamente categorizadas como del lado del cliente o del lado del proveedor, dependiendo de donde son consumidos los recursos.

Administración de estado del lado del cliente

Las técnicas del lado del cliente utilizan código HTML y las capacidades del navegador Web para almacenar información de estado en la computadora cliente. Las siguientes técnicas son utilizadas para almacenar información de estado en el lado del cliente:

• Cadenas de consulta: el estado es administrado poniendo los datos en la URL de la página como una cadena de consulta como un conjunto de pares de valores clave. Por ejemplo, la siguiente URL incrusta una clave (q) de la cadena de consulta y el valor par (televisión): http://www.bing.com/search?q=television. Para recuperar el valor en la clave en una página ASP.NET, utilice la expresión Request.QueryString[“q”]. Aquí la QueryString es una propiedad del objeto Request.

Figura 4-7

Formulario Web visualizando el orden de la ejecución de evento para una página ASP.NET

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 117: 98-361 Fundamentos de Desarrollo de Software

116 Lección 4

QueryString obtiene la colección de todas las variables de cadena de consulta.

• Cookies: Las Cookies son pequeños paquetes de información que son almacenados por el navegador Web localmente en la computadora del usuario. Las Cookies son utilizadas comúnmente para almacenar las preferencias del usuario y contenidos de carritos de compra y para darles una experiencia de navegación personalizada en visitas subsecuentes a la página Web. La clase HttpCookie representa una cookie en su código, el siguiente código le muestra cómo establecer una cookie en una computadora cliente:

HttpCookie cookie =

new HttpCookie(“Name”, “Bob”);

cookie.Expires = DateTime.Now.AddMinutes(10);

Response.Cookies.Add(cookie);

• El siguiente código muestra cómo leer una cookie:

if (Request.Cookies[“Name”] != null)

{

name =Request.Cookies[“Name”].Value;

}

• Campos ocultos: Los campos ocultos contienen información que no es visualizada en la página pero que son parte del código de la página HTML. Los campos ocultos pueden ser creados utilizando el elemento HTML <input type=”hidden”. El control de servidor HTML ASP.NET HtmlInputHidden también mapea a este elemento HTML.

• Estado de Vista: Es el mecanismo que utiliza el ASP.NET para administrar el estado de los controles a través de devoluciones de datos de página. Para facilitar esto, cuando ASP.NET ejecuta una página, reúne los valores de todos los controles que no son de devolución de datos que están modifcados en el código y los formatea en una sola cadena codifcada. Esta cadena es almacenada en una campo oculto en un control llamado VIEWSTATE. Por defecto, el ViewState está habilitado en una aplicación ASP.NET. Puede deshabilitar la ViewState en el nivel de un control estableciendo la propiedad EnableViewState del control a false:

<asp:GridView ID=”GridView1”

runat=”server” EnableViewState=”false” />

Puede deshabilitar el estado de vista en el nivel de página estableciendo el atributo EnableViewState de la directiva de página a false:

<%@ Page EnableViewState=”false” %>

Puede deshabilitar el estado de vista en el nivel de aplicación agregando la siguiente línea en el archivo web.confg:

<pages enableViewState=”false” />

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 118: 98-361 Fundamentos de Desarrollo de Software

117Comprender las Aplicaciones Web

Administración de estado del lado del servidor

La administración de estado del lado del servidor utiliza recursos del servidor para almacenar la información de estado. Utilizando técnicas del lado del servidor se elimina la posibilidad de que un usuario tratara de hackear el código del lado del cliente o de leer los datos de la sesión. Sin embargo, el almacenar y procesar información de la sesión en el servidor incrementa la carga del servidor y requiere de recursos del servidor adicionales para servir las páginas Web.

ASP.NET soporta la administración de estado del lado del servidor en dos niveles:

• Estado de Sesión: Una aplicación de ASP.NET crea una sesión única para cada usuario que manda una solicitud para una aplicación. ASP.NET identifca distintivamente cada una de estas sesiones enviando un SessionId único a la URL solicitada. Este SessionId es enviado como una cookie o es incrustado en la URL, dependiendo de la confguración de la aplicación. La habilidad de únicamente identifcar y relacionar solicitudes puede ser utilizada para almacenar datos específcos de la sesión que también se conoce como estado de sesión de la aplicación Web. Un ejemplo común del estado de sesión es para almacenar el contenido de los carritos de compra para usuarios conforme navegan a través de la tienda basada en Web.

• Estado de Aplicación: el estado de aplicación es utilizado para almacenar datos que son usados a los largo de la aplicación. El estado de aplicación puede ser accedido fácilmente a través de la propiedad Application de la clase Page. Esta propiedad proporciona acceso al objeto HttpApplicationState que almacena el estado de aplicación como una colección de pares de valores clave.

El siguiente ejercicio muestra cómo utilizar el estado de sesión. Este ejercicio utiliza dos formatos Web. El WebForm1.aspx obtiene un nombre de usuario y lo almacena en el estado de sesión. El formato entonces transfere al usuario al WebForm2.aspx, el cual recupera el nombre del usuario desde la sesión.

Æ Utilizar el Estado de Sesión

PREPÁRESE. Para utilizar el estado de sesión, haga lo siguiente:

1. Agregue un nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la solución Leccion04. Nombre el proyecto UtilizandoEstadoSesion.

2. Seleccione Proyecto, Agregar nuevo elemento. Seleccione la plantilla de Formulario Web. Nombre el archivo WebForm1.aspx

3. Cambie la etiqueta HTML, del WebForm1.aspx a lo siguiente:

<%@ Page Language=”C#” AutoEventWireup=”true”

CodeBehind=”WebForm1.aspx.cs”

Inherits=”UtilizandoEstadoSesion.WebForm1” %>

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head runat=”server”>

<title></title>

Tome Nota

El estado de sesión puede ser configurado para almacenarse en otro servidor o un Servidor SQL. Esto es muy útil cuando una solicitud del usuario puede ser procesada por uno de los muchos servidores en una granja Web- Una granja Web es una colección de servidores Web utilizados colectivamente para servir un sitio Web. Las granjas Web son necesarias para el soporte de tráfico en sitios Web populares.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 119: 98-361 Fundamentos de Desarrollo de Software

118 Lección 4

</head>

<body>

<form id=”form1” runat=”server”>

<div>

<asp:Label ID=”Label1” runat=”server”

Text=”Introduzca su nombre:” /><br />

<asp:TextBox ID=”TextBox1” runat=”server” />

<br /><br />

<asp:Button ID=”Button1” runat=”server”

Text=”Submit” onclick=”Button1_Click” />

</div>

</form>

</body>

</html>

4. Haga clic derecho en la ventana del código y seleccione Ver Código desde el menú contextual para cambiar al archivo de código subyacente (WebForm1.aspx.cs). Remplace el código en este archivo con el siguiente código:

using System;

namespace UsingSessionState

{

public partial class WebForm1

: System.Web.UI.Page

{

protected void Page_Load

(object sender, EventArgs e)

{

if (Session[“Name”] != null)

Response.Redirect(“WebForm2.aspx”);

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 120: 98-361 Fundamentos de Desarrollo de Software

119Comprender las Aplicaciones Web

}

protected void Button1_Click

(object sender, EventArgs e)

{

Session.Add(“Name”, TextBox1.Text);

Response.Redirect(“WebForm2.aspx”);

}

}

}

5. Agregue un nuevo formulario Web al proyecto (WebForm2.aspx). Cambie la etiqueta de la página a lo siguiente:

<%@ Page Language=”C#” AutoEventWireup=”true”

CodeBehind=”WebForm2.aspx.cs”

Inherits=”UsingSessionState.WebForm2” %>

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head runat=”server”>

<title></title>

</head>

<body>

<form id=”form1” runat=”server”>

<div>

<asp:Label ID=”Label1” runat=”server” /><br />

<asp:Button ID=”Button1” runat=”server”

Text=”Limpiar Sesión”

onclick=”Button1_Click” />

</div>

</form>

</body>

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 121: 98-361 Fundamentos de Desarrollo de Software

120 Lección 4

</html>

6. Cambie el código en el archivo de código subyacente (WebForm2.aspx.cs) en el formulario a lo siguiente:

using System;

namespace UsingSessionState

{

public partial class WebForm2

: System.Web.UI.Page

{

protected void Page_Load(

object sender, EventArgs e)

{

if (Session[“Name”] != null)

Label1.Text = String.Format(

“Bienvenido,{0}”, Session[“Name”]);

else

Response.Redirect(“WebForm1.aspx”);

}

protected void Button1_Click(

object sender, EventArgs e)

{

Session.Remove(“Name”);

Response.Redirect(“WebForm1.aspx”);

}

}

}

7. Seleccione Depurar y después Inicie la depuración (o presione F5). La páginaWebForm1.aspxse abrirá en un navegador Web. Vera la página Web mostrada en la Figura 4-8.Introduzca un nombre y haga clic en el botón enviar. Esta página almacena el nombre introducido en el estado de sesión.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 122: 98-361 Fundamentos de Desarrollo de Software

121Comprender las Aplicaciones Web

8. Será transferido al WebForm2.aspx mostrado en la Figura 4-9. WebForm2.aspx recupera el nombre de usuario desde el estado de sesión. En la misma ventana del navegador, de forma que está dentro de la misma sesión, intente acceder al WebForm1.aspx. Notará que mientras la sesión contenga una entrada de nombre, usted será re direccionado al WebForm2.aspx. Presione el botón de Limpiar Sesión. Esto limpia la sesión y usted es transferido al WebForm1.aspx.

� Comprender el IIS Web Hosting

È EN RESUMEN

El Web hosting involucra el confgurar el servidor web con las confguraciones y archivos de código correcto de modo que los usuarios remotos pueden tener acceso satisfactoriamente a la aplicación Web.

Las aplicaciones de ASP.NET deben ser desarrolladas en un servidor Web de Servicios de Información de Internet (IIS). IIS es una parte integral de los sistemas operativos de Windows Server y proporciona toda la funcionalidad para hospedar sitios Web.

Implementar una aplicación de ASP.NET no es complicado ya que ASP.NET proporciona la implementación xcopy. Lo que signifca que todo lo que necesita hacer para implementar un sitio Web de ASP.NET a un servidor Web es copiar archivos a las ubicaciones correctas. Puede copiar archivos utilizando el comando xcopy de Windows o utilizando una aplicación del Protocolo de Transferencia de Archivos (FTP).

Figura 4-8

La página almacena el nombre introducido al estado de sesión

Figura 4-9

La página recupera el nombre visualizado desde el estado de sesión

; ¿Listo para la certificación?

¿Comprende las bases del desarrollo de una aplicación Web en Microsoft ASP.NET? — USD 4.2

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 123: 98-361 Fundamentos de Desarrollo de Software

122 Lección 4

Comprender los Servicios de información de InternetServicios de Información de Internet (IIS) es un servidor Web para hospedar una aplicación Web en el sistema operativo Windows. Un Servidor Web IIS utiliza conceptos de sitios, aplicaciones y directorios virtuales.

Puede utilizar IIS para hospedar múltiples sitios Web y compartir información con usuarios a través del Internet o una intranet. IIS utiliza una relación jerárquica entre sitios, aplicaciones y directorios virtuales como bloque de construcción básico para hospedar contenido en línea.

IIS puede ser administrado utilizando el IIS Manager tool, el cual es parte del sistema operativo Windows. El IIS Manager tool, como se muestra en la Figura 4-10, proporciona una interfaz de usuario grafca para confgurar sitios Web, aplicaciones y directorios virtuales. La pantalla en la Figura 4-10 es de una computadora ejecutando Windows 7. La interfaz de usuario del IIS Manager es diferente en Windows XP.

Creación de directorios virtuales y Sitios WebUn Sitio Web es un contenedor de aplicaciones y directorios Virtuales. Un directorio virtual es un pequeño alias que se mapea a un directorio físico en un servidor Web.

Un sitio web es un contenedor de aplicaciones y directorios virtuales y puede ser accedido utilizando una dirección de un sitio Web. Por ejemplo, la URL www.northwind.com podría apuntar a un sitio Web que tenga muchos directorios virtuales tales como órdenes y cuentas, cada uno de los cuales puede ser accedido en combinación con la dirección del sitio Web tal como www.northwind.com/ordersywww.northwind.com/account.

Un servidor Web nunca expone la dirección física actual y la ubicación de los archivos al mundo externo. En lugar de eso, utiliza un sistema de alias que mapea a los directorios físicos. Estos alias también son llamados directorios virtuales. Los directorios virtuales se han convertido en parte de la URL, como se vio en el ejemplo anterior. Cuando IIS recibe una solicitud para una tal URL, mapea el directorio virtual a la ubicación física de los archivos.

Tome Nota

Algunas aplicaciones Web complejas podrían necesitar que implemente archivos DLL al Cache de ensamble global (GAC). En tal situación, usted podría necesitar crear un paquete instalador de Windows para implementar en lugar de utilizar xcopy o FTP.

Figura 4-10

Interfaz del Administrador de Servicios de Información de Internet (IIS)

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 124: 98-361 Fundamentos de Desarrollo de Software

123Comprender las Aplicaciones Web

Para crear un directorio virtual utilizando el IIS manager, siga los siguientes pasos:

1. Abra el IIS Manager. Para abrir el IIS Manager en Windows 7, teclee IIS en el menú inicio y luego haga clic en el acceso directo Administrador de los Servicios de Información de Internet (IIS). Para acceder al IIS Manager en Windows XP, vaya a Inicio, Ejecutar, teclee “inetmgr” y haga clic en el botón Aceptar.

2. Expanda los nodos en el panel izquierdo (referencia en la Figura 4-10) y seleccione el nodo de Default Web Site.

3. Haga clic derecho en el nodo Default Web Site y seleccione la opción Add Virtual Director y desde el menú de accesos directos. En Windows XP, el comando será New, Virtual Directory. En este punto aparecerá un asistente para la creación del directorio virtual en su pantalla. Le pedirá la información que necesita en el siguiente paso.

4. En el dialogo Add Virtual Directory, proporcione un Alias y una ruta física, como se muestra en la Figura 4-11 y haga clic en OK.

Implementar Aplicaciones WebImplementación de un solo sitio Web es llevada a cabo copiando los archivos a la ubicación correcta. Para instar un sitio Web complejo podría necesitar utilizar un Instalador de Windows.

Hay dos mejores manearas en las cuales puede implementar archivos a un sitio Web:

• Utilizando xcopy o FTP: Muchas aplicaciones Web y servicios Web solo requieren que los archivos sean copiados en el servidor Web. No requieren ninguna acción especial como reiniciar los servicios IIS, registrar los componentes en el Registro de Windows, etc. La implementación de xcopy o FTP es ideal para tales casos.

• Utilizar un Instalador de Windows: Un Instalador de Windows puede desempeñar un número de acciones personalizadas durante el proceso de implementación y por lo tanto, puede ser utilizado para implementar sitios Web muy complejos que requieren la creación automática de directorios virtuales, servicios de reinicio, registrar componentes, etc.

Figura 4-11

Cuadro de diálogo Add Virtual Directory

; ¿Listo para la certificación?

¿Comprende las bases del Web Hosting con el Servidor Web de IIS? — USD 4.3

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 125: 98-361 Fundamentos de Desarrollo de Software

124 Lección 4

� Comprender el desarrollo de Servicios Web

È EN RESUMEN

Un servicio Web es un componente de software que puede ser accedido a través de la red utilizando protocolos de red estándar tales como HTTP. Los servicios Web son descritos utilizando el Lenguaje de Descripción de Servicios Web (WSDL).

Los Servicios Web proporcionan una manera para interactuar con objetos de programación ubicados en computadoras remotas. Lo que hace especial a los servicios Web es que toda la comunicación entre los servidores de servicio Web y sus clientes es a través de mensajes de Lenguaje de Etiquetado Extensible (XML) transmitidos a través del Protocolo de Transferencia de Hipertexto (HTTP).

Utilizando estas tecnologías estándar, los objetos remotos pueden ser publicados y consumidos por otros sistemas no compatibles. Por ejemplo, un objeto remoto escrito en C# y publicado como un servicio Web en un servidor Web de Windows puede ser procesado por código Java ejecutándose en una máquina de Linux.

Antes de entrar en detalles de la creación y consumo de servicios Web, nos familiarizaremos con dos tecnologías clave que hacen posibles los servicios Web:

• Protocolo Simple de Acceso a Objetos (SOAP)

• Lenguaje de Descripción de Servicios Web (WSDL)

SOAPSOAP es el protocolo para el intercambio estructurado de información en una comunicación de servicio Web entre dos computadoras remotas.

SOAP es el protocolo que defne como las computadoras remotas intercambian mensajes como parte de una comunicación de servicio Web. SOAP se basa en XML en su formato de mensaje y uso de HTTP para transmisión de mensajes. El utilizar SOAP para comunicarse tiene dos benefcios mayores. Primero, ya que los mensajes están formateados como XML, son más fáciles de entender para sistemas no compatibles. Segundo, ya que estos mensajes son transmitidos a través de HTTP penetrante, pueden alcanzar normalmente cualquier maquina en Internet sin ser bloqueados por algún cortafuegos.

Este es un paquete típico de SOAP enviado desde un cliente a un servicio Web:

<?xml version=”1.0” encoding=”utf-8”?>

<soap:Envelope

xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

xmlns:xsd=http://www.w3.org/2001/XMLSchema

xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/”>

<soap:Body>

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 126: 98-361 Fundamentos de Desarrollo de Software

125Comprender las Aplicaciones Web

<ToLower xmlns=”http://northwindtraders.com”>

<inputString>SAMPLE STRING</inputString>

</ToLower>

</soap:Body>

</soap:Envelope>

Puede notar que algunos de los elementos obvios de este paquete SOAP:

• El paquete consiste de un envelope que contiene un cuerpo, cada uno de ellos es identifcado con una etiqueta XML.

• El cuerpo consiste del nombre del método que será invocado. En este paquete SOAP. El nombre del método es ToLower y toma un solo parámetro por el nombre de inputString y un valor dado.

Este es un paquete de respuesta desde el servidor:

<?xml version=”1.0” encoding=”utf-8”?>

<soap:Envelope

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xmlns:xsd=”http://www.w3.org/2001/XMLSchema”

xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/”>

<soap:Body>

<ToLowerResponse

xmlns=”http://northwindtraders.com”>

<ToLowerResult>sample string</ToLowerResult>

</ToLowerResponse>

</soap:Body>

</soap:Envelope>

En el paquete de respuesta, el elemento XML de ToLowerResponse es el resultado de la invocación del método en el servidor.

WSDLWSDL es un lenguaje basado en XML para describir servicios Web.

WSDL signifca Lenguaje de Descripción de Servicios Web y proporciona un estándar por el cual un servicio Web puede decirle al cliente qué tipo de mensajes aceptará y qué resultados serán retornados. Un archivo WSDL actúa como la interfaz publica de un servicio Web e incluye la siguiente información:

• Los tipos de datos que puede procesar

• Los métodos que expone

• Las URLs a través de las cuales estos métodos pueden ser accedidos

Tome Nota

Un servicio Web puede existir sin un archivo WSDL, pero debe saber el mensaje exacto SOAP entrante que el servicio Web espera antes de que lo pueda utilizar.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 127: 98-361 Fundamentos de Desarrollo de Software

126 Lección 4

Crear Servicios WebEn esta sección aprenderá como crear y publicar un servicio Web.

En esta sección, aprenderá como crear un servicio Web simple llamado TextWebService que expone dos métodos, ToLower y ToUpper. Estos métodos respectivamente convierten una cadena dada a letras minúsculas y mayúsculas. Aunque es simple, este cubre todos los aspectos de la creación de un servicio Web que puede involucrar una lógica de procesamiento más compleja.

Æ Creando un Servicio Web

PREPÁRESE. Para crear un servicio Web, haga lo siguiente:

1. Agregue un nuevo proyecto basado en plantilla de aplicación web vacía de ASP.NET a la solución Leccion04. Nombre el proyecto TextWebService como se muestra en la Figura 4-12.

2. Seleccione Proyecto, Agregar nuevo elemento desde el menú. Seleccione la plantilla de Servicio Web como se muestra en la Figura 4-13.Nombre el servicio WebTextWebService.asmx.

3. Cambie el código por defecto para la clase TextWebService en el archivo TextWebService.asmx.cs como se muestra debajo:

[WebService(Namespace = “http://northwindtraders.com/”)]

[WebServiceBinding(ConformsTo

= WsiProfles.BasicProfle1_1)]

public class TextWebService : System.Web.Services.WebService

{

[WebMethod]

public string ToUpper(string inputString)

Figura 4-12

Seleccione la plantilla de aplicación web vacía de ASP.NET para Servicios Web

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 128: 98-361 Fundamentos de Desarrollo de Software

127Comprender las Aplicaciones Web

Figura 4-13

Seleccione la plantilla de Servicio Web para crear un servicio Web

{

return inputString.ToUpper();

}

[WebMethod]

public string ToLower(string inputString)

{

return inputString.ToLower();

}

}

4. Seleccione Depurar después Generar TextWebService para compilar el proyecto y garantizar que no hay errores. El servicio Web ahora está listo para utilizarse.

En el código de arriba hay algunas cosas importantes para notar. Cada clase es expuesta como un servicio Web XML que necesita tener un atributo WebService. El atributo WebService tiene una propiedad Namespace que establece por defeco ahttps://tempuri.

org/. Ya que es correcto tener este valor en el tiempo de desarrollo, el valor de namespace debería ser cambiado antes de que el servicio Web sea publicado. Cada servicio Web debe tener un namespace único con el fin de que las aplicaciones cliente se distingan de otros servicios Web.

Cada método que es expuesto desde el servicio Web necesita tener un atributo WebMethod. Los métodos marcados con los atributos WebMethod son también conocidos como métodos Web. Los dos métodos utilizados en este ejercicio convierten una cadena dada en letras mayúsculas y minúsculas, respectivamente.

Para probar un servicio Web simple tal como el TextWebService creado arriba, todo lo que necesita es un navegador Web. Puede seleccionar métodos para invocar, pasar parámetros y revisar los valores de retorno desde dentro del navegador, como se muestra en el siguiente ejercicio.

Tome Nota

Puede utilizar el nombre de dominio de su compañía como parte del espacio de nombre (namespace) para distinguir sus servicios Web publicados de otras compañías.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 129: 98-361 Fundamentos de Desarrollo de Software

128 Lección 4

Æ Probar un Servicio Web

PREPÁRESE. Para probar un servicio Web, desempeñe las siguientes tareas:

1. Abra el proyecto TextWebService que creó en el ejercicio previo. Seleccione Depurar y después Inicie la depuración. Un navegador es lanzado mostrando la página de prueba del servicio Web, como se muestra en la Figura 4-14.

2. Haga clic en el enlace de Descripción del servicio en la página de prueba. Es capaz de ver el WSDL para este servicio Web. Haga clic en el botón para regresar a la página de prueba.

3. Todos los métodos Web aparecen como un enlace a la página de prueba. Para invocar un método Web, haga clic en su enlace. Se mostrará una página para probar el método Web seleccionado, como se muestra en la Figura 4-15.

Figura 4-14

Página de prueba de un servicio Web

Figura 4-15

Una página de prueba de un método Web

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 130: 98-361 Fundamentos de Desarrollo de Software

129Comprender las Aplicaciones Web

Figura 4-16

Valor de retorno desde un servicio Web

4. La página de prueba del método Web muestra el SOAP y otros mensajes que el servicio Web comprende. También contiene un formato que le permite introducir parámetros del método y probar el método Web. Introduzca una cadena de entrada de prueba y haga clic en el botón invocar. Se mostrará el resultado en la siguiente página, como se muestra en la Figura 4-16.

5. Pruebe invocar ambos métodos y cierre el navegador Web.

Cuando da clic en el botón Invocar, la página de prueba construye los paquetes SOAP apropiados para ser procesados por el servicio Web y luego visualice los resultados retornados desde el servicio Web.

Consumir Servicios WebEn esta sección, aprenderá cómo acceder a servicios Web desde una aplicación cliente.

Ya aprendió cómo invocar un servicio Web desde la página de prueba de un servicio Web. En esta sección, aprenderá cómo llamar un servicio Web por medio de programación desde dentro de una aplicación cliente de ASP.NET.

Æ Acceder a un Servicio Web desde una aplicación cliente

PREPÁRESE. Para acceder a un servicio Web desde una aplicación cliente, desempeñe los siguientes pasos:

1. Agregue un proyecto nuevo a la solución Leccion04 basado en la plantilla de aplicación web vacía de ASP.NET. Nombre el proyecto TextWebServiceClient.

2. Haga clic derecho en el nombre del proyecto en la ventana del Explorador de Soluciones y seleccione la opción Add Web Reference desde el menú. En el cuadro de diálogo Add Web Reference, introduzca la URL del servicio creado en el ejercicio previo y presione Enter (puede copiar la URL desde la barra de direcciones del navegador). Esta acción carga la lista de operaciones disponibles en el servicio Web, como se muestra en la Figura 4-17.

3. En el cuadro de diálogo Web Reference, cambie el nombre de la referencia Web a textWebServicey haga clic en el botón Add Reference. Esto agregará una referencia Web al proyecto, como se muestra en la Figura 4-18.

4. Cambie el código en Default.aspx a lo siguiente:

<%@ Page Title=”Home Page” Language=”C#”

AutoEventWireup=”true”

CodeBehind=”Default.aspx.cs”

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 131: 98-361 Fundamentos de Desarrollo de Software

130 Lección 4

Inherits=”TextWebServiceClient._Default” %>

<html>

<head><title>TextWebService Client

</title></head>

<body>

<form runat=”server”>

<h2>Formulario de prueba para TextWebService</h2>

<p>

<asp:TextBox ID=”TextBox1”

runat=”server”

Text=”Introduzca texto” />

<br />

<asp:Button ID=”Button1”

runat=”server”

Text=”Invocar Métodos de Servicio”

onclick=”Button1_Click” />

</p>

<p>

<strong>Results:</strong><br />

ToLower method:

<asp:Label ID=”toLowerLabel”

runat=”server”

Text=”Label” ForeColor=”Green” />

<br />

ToUpper method:

<asp:Label ID=”toUpperLabel”

runat=”server”

Text=”Label” ForeColor=”Green” />

</p>

</form>

</body>

</html>

5. Abra la Vista de Diseño de Default.aspx y de doble clic en el control Button. Esto agrega código para el manejador de evento Click. Modifique el código como se muestra debajo:

protected void Button1_Click(

object sender, EventArgs e)

{

var webService =

new textWebService.TextWebService();

toLowerLabel.Text =

webService.ToLower(TextBox1.Text);

toUpperLabel.Text =

webService.ToUpper(TextBox1.Text);

}

Tome Nota

Cuando invoca un método de servicio Web, tiene la elección de utilizar un método sincrónico o asincrónico. Podría desear utilizar el método asincrónico para incrementar la sensibilidad de la aplicación cliente.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 132: 98-361 Fundamentos de Desarrollo de Software

131Comprender las Aplicaciones Web

6. Seleccione Depurar y después Inicie la depuración para ejecutar la aplicación Web. Introduzca algún texto de ejemplo y haga clic en el botón Invocar Métodos de Servicio. Verá los resultados de TextWebService como se muestra en la Figura 4-19.

En el ejercicio de arriba, cuando agrega una referencia Web, Visual Studio crea un proxy local que representa el servicio remoto. El proxy simplifca la comunicación con el servicio Web aceptando mensajes, reenviándolos al servicio Web y regresándolos desde el servicio Web.

Puede utilizar fácilmente este proxy para crear objetos del servicio Web e invocar métodos. Como resultado, trabajar con objetos remotos es similar a trabajar con objetos locales.

Cuando crea una referencia Web, Visual Studio lee el archivo WSDL apropiado para determinar cuáles clases y métodos están disponibles en el servidor remoto. Cuando llama a un método en un objeto remoto, el .NET Framework traduce su llamado y lo resuelve en mensajes SOAP y los transmite sin intervención de su parte.

Figura 4-18

Nodo de referencias Web del proyecto

Figura 4-19

Nodo de referencias Web del proyecto

; ¿Listo para la certificación?

¿Comprende las bases del desarrollo de servicios Web? — USD 4.4

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 133: 98-361 Fundamentos de Desarrollo de Software

132 Lección 4

Resumen de Habilidades

En esta lección aprendió:

• Una página Web es un documento que es servido a través de la World Wide Web (WWW) y puede ser visualizado por un navegador Web.

• El lenguaje de Marcado de Hipertexto (HTML) es el lenguaje utilizado por los servidores y navegadores Web para describir una página Web.

• Las hojas de estilo en cascada (CSS) le permiten almacenar y formatear información separadamente del código HTML. Esta separación le facilita actualizar su sitio Web. Visual Studio incluye herramientas para construir y pre visualizar sus hojas de estilo.

• JavaScript es un lenguaje de scripting del lado del cliente que se ejecuta dentro de un navegador Web para ayudar a crear páginas Web mucho más interactivas de lo que es posible utilizando solo HTML plano.

• Técnicas de administración de estado del lado del cliente tales como cadenas de consulta, cookies, campos ocultos y estado de vista utilizando HTML y las capacidades del navegador Web para almacenar información de estado en la computadora cliente.

• Técnicas de administración de estado del lado del servidor tales como estado de sesión y estado de aplicación utilizan recursos de servidor para la administración de estado.

• Los Servicios de Información de Internet (IIS) es un servidor Web para hospedar aplicaciones Web en el sistema operativo Windows. Un servidor Web IIS utiliza los conceptos de sitios, aplicaciones y directorios virtuales.

• Los servicios Web le proporcionan una manera para invocar objetos remotos utilizando tecnologías estándar tales como XML y HTTP.

• SOAP es el protocolo que defne como las computadoras remotas intercambian mensajes como parte de la comunicación del servicio Web. SOAP se basa en XML para su formato de mensaje y utiliza HTTP para la transmisión del mensaje.

• WSDL proporciona un estándar por el cual un servicio Web puede decirle a su cliente cuales tipos de mensajes aceptará y qué resultados serán retornados.

» Evaluación de Conocimiento

Completar los espacios en blanco

Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los

espacios proporcionados.

1. En HTML la fcha de anclaje (<a>), el atributo _________ especifca la URL objetivo.

2. Puede poner código CSS en un archivo separado y enlazarlo a la página Web utilizando el elemento HTML _________.

3. El código de JavaScript en una página Web es ejecutado en el_________.

4. Puede utilizar un elemento _________ para visualizar un mensaje específco a los usuarios cuando el navegador no está ejecutando JavaScript.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 134: 98-361 Fundamentos de Desarrollo de Software

133Comprender los conceptos básicos de bases de datos

5. Puede deshabilitar el estado de vista en el nivel de página estableciendo el atributo _________de la directiva Page a false en la página ASP.NET.

6. El estado de_________ es utilizado para almacenar información que es utilizada globalmente a lo largo de una aplicación, como opuesto al estado de_________ que almacena información para una sesión de usuario.

7. Una aplicación Web es accedida utilizando un nombre de _________ en lugar de un nombre de carpeta física.

8. Debe marcar las clases con el atributo _________ para exponerlos como un servicio Web.

9. Todos los métodos en una clase de servicio Web, solo los métodos marcados con los atributos _________ son expuestos como métodos de servicio Web.

10. SOAP se basa en _________ como su formato de mensaje y utiliza _________ para la transmisión del mensaje.

Opción Múltiple

Encierre en un círculo la letra que corresponda a la mejor respuesta.

1. Escriba el siguiente código en su página Web:

<html>

<head>

<title>Pagina de Ejemplo</title>

<style type=”text/css”>

div

{

font-family: Verdana;

font-size: 9pt;

}

</style>

</head>

<body>

<div style=

“font-weight: bold; font-size: 12pt;”>

Texto de Ejemplo</div>

</body>

</html>

2. ¿Cuál sería el estilo para el texto visualizado como parte del elemento<div>?

a. font-family: Verdana; font-weight: bold; font-size: 12pt;

b. font-family: Verdana; font-weight: bold; font-size: 9pt;

c. font-family: Verdana; font-size: 12pt;

d. font-family: Verdana; font-size: 9pt;

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 135: 98-361 Fundamentos de Desarrollo de Software

134 Lección 4

3. Está desarrollando un sitio Web de mapas que permite a los usuarios explorar interactivamente el mapa utilizando acciones tales como panning and zooming. Desea que el sitio Web sea responsivo y accesible en la mayoría de los navegadores Web modernos. Sin embargo, desea que los usuarios instalen plug-ins adicionales con el fn de utilizar su sitio Web. ¿Cuál de las siguientes tecnologías debería utilizar para visualizar los mapas?

a. HTML.

b. Tecnología de programación del lado del Servidor tal como ASP.NET.

c. Adobe Flash.

d. JavaScript.

4. Su página ASP.NET contiene una variable de nivel de página del tipo Customer. Desea preservar el valor de esta variable a través de devoluciones de datos de página (postbacks), pero no necesita esta variable en ninguna otra página en la aplicación. ¿Cuál de las siguientes técnicas de administración de estado es la mejor manera de llevar a cabo esto?

a. Cadenas de consulta

b. Cookies

c. Estado de Vista

d. Sesión

5. Está desarrollando una aplicación Web para un banco en línea. Su aplicación permite a los usuarios acceder a la información de sus cuentas y transacciones desde dentro de un navegador Web. Cuando un usuario inicia sesión en la aplicación Web, desea que la aplicación muestre el nombre de usuario y el balance de cuenta en todas las páginas de la aplicación hasta que el usuario cierra sesión. También desea que la aplicación sea segura de usuarios maliciosos. ¿Cuál de las siguientes técnicas de administración de estado debería utilizar?

a. Cookies

b. Estado de vista

c. Estado de vista con cifrado

d. Sesión

6. Está desarrollando un formulario Web para visualizar la información del clima. Cuando un usuario solicita el formulario Web, el formulario necesita hacer alguna inicialización para cambiar la apariencia del formulario y asignar valores a algunos controles. ¿Dónde debería poner el código?

a. En el manejador de evento PreInit de la clase Page.

b. En el manejador de evento Init de la clase Page.

c. En el manejador de evento Load de la clase Page.

d. En el manejador de evento PreRender de la clase Page.

7. Desea visualizar valores de las expresiones de C# en una página ASP.NET. ¿Cuál de los siguientes tipos de bloque de código debería utilizar para encerrar la expresión?

a. <script runat=»server»>…</script>

b. <script>…</script>

c. <%= … %>

d. <form>…</form>

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 136: 98-361 Fundamentos de Desarrollo de Software

135Comprender los conceptos básicos de bases de datos

8. Ha desarrollado una aplicación de timesheet que será utilizada por todos los trabajadores en su compañía. Ha utilizado ASP.NET para desarrollar esta aplicación y la ha implementado en el servidor Web de la compañía. ¿Qué deben instalar todos los trabajadores de la compañía en sus computadoras antes de que puedan acceder a la aplicación de timesheet?

a. .NET Framework Redistributable

b. .NET Framework Software Development Kit

c. Visual Studio

d. Navegador Web

9. Su aplicación cliente llama a un servicio Web que desempeña cálculos complejos que consumen tiempo. El usuario se queja que mientras los resultados están siendo retornados la interfaz de usuario se congela momentáneamente. ¿Qué enfoque debería tomar para resolver este problema?

a. Instalar un mejor procesador en el servidor Web.

b. Instalar un mejor procesador en la computadora cliente.

c. Actualizar a una conexión de Internet más rápida.

d. Utilizar llamados asincrónicos para invocar al servicio Web.

10. Ha creado un servicio Web de ASP.NET que convierte de una moneda a otra. Uno de los métodos en su servicio Web está defnido con este código:

public double Convert(double amount,

string from, string to)

{

// Código para desarrollar la conversión de moneda

}

11. Los usuarios del servicio Web reportan que pueden establecer una referencia al servicio Web pero el método Convert no está disponible para ellos. ¿Cuál podría ser el problema?

a. El archivo .asmx del servicio Web no está disponible en el servidor Web.

b. La clase del servicio Web no está marcada con el atributo WebService.

c. El método Convert no está marcado con el atributo WebMethod.

d. Los servicios Web pueden solo exponer métodos y retornar valores de texto.

12. Está trabajando en dos proyectos de Visual Studio. El primer proyecto es un servicio Web que retorna un objeto DataSet perteneciente al espacio de nombre System.Data. El segundo proyecto accede al servicio Web creado por el primer proyecto. ¿Cuál proyecto en este caso requiere una referencia al espacio de nombre de System.Data?

a. El proyecto del Servicio Web.

b. El proyecto cliente que accede al servicio Web.

c. Tanto el proyecto cliente y el proyecto del servicio Web.

d. Ni el proyecto cliente ni el proyecto del servicio Web.E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 137: 98-361 Fundamentos de Desarrollo de Software

136 Lección 4

» Evaluación de Competencia

Proyecto 4-1: Utilizando JavaScript y HTML

Está desarrollando una página Web que proporciona una interfaz de usuario responsiva. Visualiza una imagen en la página. Cuando el usuario mueve el ratón sobre la imagen, la imagen original es remplazada por una nueva imagen. Cuando el ratón sale del área de la imagen, la imagen original es visualizada nuevamente. Necesita llevar a cabo este requerimiento utilizando código del lado del cliente de JavaScript y HTML. ¿Cómo crearía una página Web que funcione como se describe arriba?

Proyecto 4-2: Utilizando cadenas de consulta

Está desarrollando una porción de un sitio Web que permite a usuarios introducir su nombre y dirección de correo electrónico para suscribirse a su boletín informativo por correo electrónico. Su solución consiste de dos páginas Web. La primera página colecta el nombre de usuario y la dirección de correo electrónico y transfere el control a una segunda página. La segunda página acepta el nombre y la dirección de correo electrónico como parámetros de cadena de consulta y visualiza un mensaje de confrmación al usuario. Necesita escribir código para estas dos páginas. ¿Qué código escribirá para llevar a cabo este requerimiento?

» Evaluación de Dominio

Proyecto 4-3: Llamando un Servicio Web asincrónicamente

La clase proxy generada por Visual Studio para un servicio Web incluye métodos para la llamada del servicio Web sincrónicamente así como también asincrónicamente. Por defecto, la aplicación utiliza el método sincrónico. Si lo prefere la invocación asincrónica, necesita llamar la versión asincrónica del método. Las versiones asincrónicas no esperan al servicio Web que retorne una respuesta y utiliza un mecanismo de callback para obtener la respuesta cuando esté lista. La invocación asincrónica de un servicio Web podría ayudar a que las aplicaciones cliente sean más responsivas. En este proyecto, llamará al método ToLower del TextWebService creado previamente en una forma asincrónica. ¿Qué código escribiría para invocar asincrónicamente un servicio Web?

Proyecto 4-4: Utilizando el estado de sesión

Está desarrollando una porción de un sitio Web que permite a los usuarios introducir su nombre y dirección de correo electrónico a un boletín informativo por correo electrónico. Su solución consiste de dos páginas Web. La primera página colecta el nombre de usuario y dirección de correo electrónico, las agrega al estado de sesión y transfere el control a la segunda página. La segunda página recupera el nombre y la dirección de correo electrónico desde el estado de sesión y visualiza un mensaje de confrmación. Necesita escribir código para estas dos páginas. ¿Qué código escribirá para llevar a cabo este requerimiento?

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 138: 98-361 Fundamentos de Desarrollo de Software

• Parámetros de la línea de comando• Consola• Delegados

• Eventos• Instalador• Herencia visual

• Servicio de Windows

Lección 5

Comprender las Aplicaciones de Escritorio

Matriz de Dominio de Objetivos

Habilidad Tecnológica Descripción de Dominio de Objetivo Número del Dominio del Objetivo

Comprender los Objetos Comprender las aplicaciones de los Windows® Forms

5.1

Comprender Valores y Referencias Comprender las aplicaciones basadas en consola

5.2

Comprender la Encapsulación Comprender los Servicios de Windows 5.3

Términos Clave

Es un desarrollador de software para una gran organización de negocios. Necesita desarrollar una aplicación que se integre perfectamente con los escritorios de Windows de los usuarios y que proporcione una interfaz de usuario similar a las aplicaciones de escritorio populares en la plataforma de Windows. La aplicación necesita ser funcional ya sea que esté conectada o desconectada de la red. La aplicación debe ser capaz de comunicarse con dispositivos tales como escáneres e impresoras portátiles.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 139: 98-361 Fundamentos de Desarrollo de Software

138 Lección 5

� Comprender las aplicaciones de los Windows Forms

È EN RESUMEN

Las aplicaciones de los Windows Forms son aplicaciones cliente inteligentes que consisten de uno o más formularios que muestran una interfaz visual al usuario. Estas aplicaciones se integran bien con el sistema operativo, utilizan dispositivos conectados y pueden trabajar ya sea conectado a Internet o no.

Diseñar un Windows FormUn Windows Form es una superfcie visual que es capaz de visualizar una variedad de controles tales como cuadros de texto, botones y menús. Visual Studio proporciona un diseñador de Windows Forms con base en arrastrar elementos que puede utilizar para crear fácilmente sus aplicaciones.

Para diseñar Windows Forms, primero decida que controles le gustaría ubicar en el formulario. Los Windows Forms proporcionan una gran colección de controles comunes que puede utilizar fácilmente para crear una excelente interfaz de usuario. Si la funcionalidad que está buscando no está disponible como un control común, tiene la opción de, ya sea crear un control personalizado por usted mismo o comprar un control de un proveedor externo.

Puede utilizar la funcionalidad proporcionada por el Diseñador de Windows Forms del Visual Studio para ubicar y organizar controles rápidamente por sus requerimientos. Visual Studio proporciona acceso sencillo a los controles disponibles vía su Cuadro de Herramientas, como se muestra en la Figura 5-1.

Un formulario y sus componentes generalmente responden a las acciones del usuario tales como presionar una tecla o el movimiento del ratón. Estas acciones son llamadas Eventos. La mayoría del código que escribe como desarrollador de Formularios de Windows es capturar tales eventos y manejarlos creando una respuesta apropiada para cada evento. En el siguiente ejercicio creará un Formulario de Windows que muestra el valor de la fecha seleccionada por el usuario.

Tome Nota

Un control es un elemento de la interfaz de usuario distinto que acepta entradas de un usuario o visualiza una salida al usuario.

Figura 5-1

Cuadro de Herramientas de Visual Studio

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 140: 98-361 Fundamentos de Desarrollo de Software

139Comprender las Aplicaciones de Escritorio

Figura 5-2

Dialogo para nuevo proyecto de Visual Studio

Æ Crear un Windows Form

PREPÁRESE. Lance el Microsoft Visual Studio.

1. Cree un nuevo proyecto basado en la plantilla de Aplicación para Windows Forms como se muestra en la Figura 5-2. Nombre el proyecto como WindowsFormsDesign.

2. El proyecto de Aplicación de Windows Form carga con un formulario por defecto (Form1.cs) abierto a la vista del Diseñador para ser accedidos desde la ventana del Cuadro de herramientas. Si aún no ve la ventana del Cuadro de herramientas seleccione Ver y después or. La vista del Diseñador le permite trabajar visualmente con el formulario. Por ejemplo, puede organizar controles en la superficie del formulario y establecer sus propiedades. Los controles pueden visualizarse en la ventana del Cuadro de herramientas. Desde el Cuadro de herramientas arrastre y suelte un control Date Time Picker y un control Label en la superficie del Diseñador y organice los controles como se muestra en la Figura 5-3.

3. En la vista del Diseñador, seleccione el control Label y utilizando la ventana de Propiedades, establezca su propiedad Text a una cadena vacía.

4. En la vista del Diseñador, haga doble clic en el control Date Time Picker. Esta acción adjunta el manejador de evento por defecto para el evento Value Changed del control Date Time Picker y cambia la vista de Diseñador a Código. Cambie el código por defecto para el manejador de evento como sigue:

Figura 5-3

Windows Form con un Date Time Picker y un control Label

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 141: 98-361 Fundamentos de Desarrollo de Software

140 Lección 5

private void dateTimePicker1_ValueChanged

(object sender, EventArgs e)

{

label1.Text =

dateTimePicker1.Value.ToLongDateString();

}

5. Seleccione Depurar y después Inicie la depuración (o presione F5) para ejecutar el proyecto. En la interfaz de usuario, seleccione una nueva fecha y verifique que la fecha seleccionada es visualizada en el control Label.

En este ejercicio, note que cuando el formulario es visualizado inicialmente el control Label es establecido con una cadena vacía. Tan pronto como cambia la selección de fecha manipulando el control Date Time Picker, el valor de fecha seleccionado es establecido como el texto para el control Label.

Comprender el modelo de evento de un Windows FormEl manejo de evento juega un rol clave en la programación basada en la interfaz de usuario, a través del manejo de evento, responde a varios eventos que son disparados como resultado de las acciones del usuario y por lo tanto hacen interactivos a los programas. El modelo de evento de Windows Forms utiliza delegaciones de .NET Framework para enlazar los eventos a sus respectivos manejadores de evento.

Cada formulario y control expone un conjunto predefnido de eventos. Cuando ocurre un evento, el código en el manejador de evento asociado es invocado. En el ejercicio previo, cuando hace doble clic en el control Date Time Picker para agregar código al manejador de evento, Visual Studio genera el siguiente código para agregar el manejador de evento al evento:

this.dateTimePicker1.ValueChanged +=

newSystem.EventHandler(

this.dateTimePicker1_ValueChanged);

Aquí el Value Changed es el evento del control Date Time Picker que nos gustaría capturar. Así que, una nueva instancia del delegado de tipo Event Handler es creado y el método dateTimePicker1_ValueChanged es pasado al manejador de evento. El método dateTimePicker1_ValueChanged es el método en el cual realmente escribirá el código del manejador de evento.

Este código es generado automáticamente por el Diseñador de Visual Studio. Encontrará este código en el archivo de código subyacente del diseñador (Form1.Designer.cs), dentro de una región de código titulada código generado de Diseñador de Windows Form.

Otra cosa para notar es que la sintaxis para agregar un delegado utiliza el operador+=. Esto es debido a que el .NET Framework soporta delegados multicast donde un delegado puede ser enlazado a más de un método, por lo tanto permite notifcaciones de uno a muchos cuando el evento es disparado.

Tome Nota

En el ejercicio “Crear un Windows Form”, utilizamos los nombres de control por defecto. En formularios complejos con más controles, siempre es buena idea dar nombres más significativos a los controles.

Tome Nota

Un delegado se puede enlazar a cualquier método cuya firma coincide con la del manejador de evento.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 142: 98-361 Fundamentos de Desarrollo de Software

141Comprender las Aplicaciones de Escritorio

Utilizar Herencia VisualLa herencia visual le permite reutilizar la funcionalidad existente y el diseño de Windows Forms.

Uno de los principios esenciales de la programación orientada a objetos es la herencia. Cuando una clase hereda de una clase base, esta deriva su funcionalidad base de la clase base. Puede siempre extender la clase derivada para proporcionar funcionalidad adicional y ser más útil.

Un Windows Form, en esencia, sólo es otra clase y por lo tanto la herencia se aplica también. Sin embargo, cuando la herencia es aplicada a un Windows form, también causa la herencia de todas las características visuales de un formulario, tal como el tamaño, color y cualquier control ubicado en el formulario. También puede manipular cualquiera de las propiedades que hereda de la clase base. Por lo tanto, heredar Windows Forms a menudo es llamado herencia visual. En el siguiente ejercicio, creara un Windows Form que utiliza herencia visual para reutilizar un formulario existente.

Æ Crear un Windows Form utilizando herencia visual

PREPÁRESE. Lance el Microsoft Visual Studio y abra el Proyecto de Aplicación para Windows llamado WindowsFormsDesign.

1. Abra el Form1.designer.cs y cambie los modificadores de acceso del label1 y el control dateTimePicker1 de privado a protegido, como se muestra a continuación:

protectedSystem.Windows.Forms.Label label1;

protectedSystem.Windows.Forms.DateTimePicker

dateTimePicker1;

2. Seleccione Proyecto, Agregar Windows Forms para agregar un nuevo Windows Form basado en la plantilla de Formulario heredado. Puede buscar rápidamente esta plantilla tecleando su nombre en el cuadro de búsqueda, como se muestra en la Figura 5-4. Nombre el formulario heredado InheritedForm.cs. La plantilla de Formulario Heredado no está disponible en las ediciones de Visual Studio Express. Si está utilizando la edición express, sólo cree un Windows Form regular llamado InheritedForm.cs y proceda al Paso 4.

Figura 5-4

Plantilla de Formulario heredado

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 143: 98-361 Fundamentos de Desarrollo de Software

142 Lección 5

Figura 5-5

Cuadro de dialogo de Selector de Herencia

3. Haga clic en el botón Agregar. En el cuadro de diálogo de Selector de Herencia, seleccione el Form1 del espacio de nombres de Windows Forms Design, como se muestra en la Figura 5-5 y haga clic en el botón Aceptar.

4. Seleccione la vista de código para el InheritedForm, verá que la clase InheritedForm hereda del Form1 como se muestra a continuación. Si no utilizó la plantilla de Formulario heredado en el Paso 2, necesitará modificar manualmente el código para agregar el código para la herencia (mostrado en negritas en el código de abajo):

public partial class InheritedForm

: WindowsFormsDesign.Form1

{

publicInheritedForm()

{

InitializeComponent();

}

}

5. En la vista del Diseñador del InheritedForm, establezca la propiedad Text a “Formulario Heredado”.

6. En la vista del Diseñador, haga doble clic en InheritedForm. Esta acción agrega un manejador de evento para el evento Load del formulario y cambia la vista de Diseño a Código. Cambie el código por defecto para el manejador de evento como se muestra a continuación:

private void InheritedForm_Load(

object sender, EventArgs e)

{

label1.Text =

dateTimePicker1.Value.ToLongDateString();

}

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 144: 98-361 Fundamentos de Desarrollo de Software

143Comprender las Aplicaciones de Escritorio

7. Abra el Program.cs y modifique el método Main como se muestra abajo para garantizar que el InheritedForm es lanzado cuando ejecuta la aplicación:

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application

.SetCompatibleTextRenderingDefault(false);

Application.Run(new InheritedForm());

}

8. Seleccione Depurar y después Inicie la depuración (o presione F5) para ejecutar el proyecto. Cuando el InheritedForm es cargado, la fecha seleccionada actualmente es mostrada en el control label. A diferencia del Form1 creado previamente donde inicialmente el control label estaba vacío.

El formulario InheritedForm demuestra que tiene toda la funcionalidad del Form1 simplemente heredando el formulario. Cuando cambia el modifcador de acceso de los controles miembro de Form1, label1 y dateTimePicker1, de privado a protegido, será capaz de acceder a ellos desde dentro del formulario heredado. Este ejercicio también demuestra cómo puede extender la funcionalidad del formulario base en los formularios heredados.

Comprender las aplicaciones de interfaz de documentos múltiples (MDI)Las aplicaciones de interfaz de documentos múltiples son aplicaciones donde múltiples ventanas hijo residen bajo una sola ventana padre.

Las aplicaciones MDI permiten a múltiples ventanas compartir un solo menú y barra de herramientas de la aplicación. Las aplicaciones MDI a menudo tienen un menú llamado Ventana que permite a los usuarios administrar múltiples ventanas hijo ofreciendo características tales como cambiar entre ventanas hijo y organizar ventanas hijo. La Figura 5-6muestra al Microsoft Excel 2010 en modo MDI:

Figura 5-6

Microsoft Excel 2010 como una aplicación MDI

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 145: 98-361 Fundamentos de Desarrollo de Software

144 Lección 5

Las aplicaciones MDI contrastan con aplicaciones de interfaz de documentos simple (SDI) donde cada ventana contiene su propio menú y barra de herramientas. Las aplicaciones SDI se basan en el sistema operativo para proporcionar la funcionalidad de administración de ventana (por ejemplo, en Windows, puede cambian entre múltiples ventanas utilizando la Barra de Tareas de Windows).

Hay mucho debate entre los diseñadores de interfaz de usuario sobre qué interfaz de aplicación funciona mejor. Generalmente hablando, SDI es considerado más adecuado para usuarios novatos mientras que MDI es considerado más adecuado para usuarios avanzados. Muchas aplicaciones populares tales como Microsoft Word y Microsoft Excel soportan tanto SDI y MDI. Word y Excel se instalan por defecto como aplicaciones SDI pero proporcionan a los usuarios una opción para cambiar entre SDI y MDI. Por ejemplo, en Word 2010 y Excel 2010, puede cambiar a modo MDI desactivando la opción “Mostrar todas las ventanas en la barra de tareas” en el menú de opciones.

Æ Crear una aplicación MDI

PREPÁRESE. Lance el Microsoft Visual Studio y cree un nuevo proyecto de Aplicación de Windows Forms llamado MDIApplication.

1. Seleccione la ventana de Propiedades para el Form1 y establezca la propiedad Text a “MDI Application” y la propiedad IsMdiContainer a True.

2. Seleccione el control MenuStrip desde el Cuadro de Herramientas y agréguelo al formulario. Agregue un elemento del menú del nivel superior &Window, y agregue &New Window y &Arrange en el siguiente nivel. Bajo el menú Arrange, agregue tres opciones, &Cascade, &Horizontal y &Vertical, como se muestra en la Figura 5-7.

3. Para el control MenuStrip, establezca su propiedad MdiWindowListItem al nombre del menú Ventana (windowToolStripMenuItem por defecto).

4. En el Explorador de Soluciones, haga clic derecho en el proyecto y seleccione Agregar, Windows Form. Agregar Windows Form con el nombre ChildForm.

5. Haga doble clic en el formulario hijo y agregue el siguiente código para manejar el evento Load:private void ChildForm_Load(

object sender, EventArgs e)

{

Text = DateTime.Now.ToString();

}

Tome Nota

Puede ser complicado implementar soporte para múltiples monitores en aplicaciones MDI ya que la ventana padre necesita extenderse a múltiples monitores.

Figura 5-7

Agregando opciones de menú

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 146: 98-361 Fundamentos de Desarrollo de Software

145Comprender las Aplicaciones de Escritorio

Tome Nota

El signo & antes de un carácter en un texto de menú no se muestra sino que hace del carácter un acceso directo al menú. Por ejemplo, el menú & Window puede ser invocado presionando Alt+W. Las teclas de acceso no serán notorias hasta que el usuario presione la tecla Alt. Una opción en Windows controla si las teclas de acceso directo son visibles o no.

6. En el formulario padre, haga doble clic en Ventana, el elemento del menú de Nueva Ventana y agregue el siguiente manejador de evento para su evento Click:private void newWindowToolStripMenuItem_Click(

object sender, EventArgs e)

{

ChildForm child = new ChildForm();

child.MdiParent = this;

child.Show();

}

7. En el formulario padre, haga doble clic en Window, Arrange, Cascade, Horizontal y Vertical, respectivamente y agregue manejadores de evento para sus eventos Click:private void cascadeToolStripMenuItem_Click(

object sender, EventArgs e)

{

LayoutMdi(MdiLayout.Cascade);

}

private void horizontalToolStripMenuItem_Click(

object sender, EventArgs e)

{

LayoutMdi(MdiLayout.TileHorizontal);

}

private void verticalToolStripMenuItem_Click(

object sender, EventArgs e)

{

LayoutMdi(MdiLayout.TileVertical);

}

8. Seleccione Depurar y después Inicie la depuración (o presione F5) para ejecutar el proyecto. Seleccione Ventana, Nueva Ventana para crear múltiples ventanas hijo nuevas. Cambie entre las ventanas hijo. Note que solo hay una instancia de aplicación en la barra de tareas de Windows. Ahora utilice las opciones en menú Window, Arrange para ordenar las ventanas hijo. Por ejemplo, una aplicación con tres ventanas hijo podría parecerse a la imagen en la Figura 5-8 cuando las ventanas hijo son ordenadas horizontalmente.

Figura 5-8

Una aplicación MDI con tres ventanas hijo ordenadas horizontalmenteE

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 147: 98-361 Fundamentos de Desarrollo de Software

146 Lección 5

Revisemos algunas de las propiedades y métodos importantes utilizadas en este ejercicio. Primero, para el formulario padre, la propiedad IsMdiContainer está establecida como true. Esta propiedad indica que el formulario es un contenedor para múltiples formularios hijo MDI. Correspondientemente, para cada formulario hijo, establece la propiedad MdiParent para especifcar el formulario contenedor padre.

En seguida, la propiedad MdiWindowListItem del MenuStripes utilizado para indicar cuál elemento de menú será utilizado para mostrar la lista de ventanas hijo MDI. Cuando esta propiedad está establecida, el elemento de menú enlistará todas las ventanas hijo y también le permitirá cambiar entre ventanas hijo. Como resultado de un código en el método ChildForm_Load, la barra de título para cada formulario muestra la fecha y hora del instante cuando el formulario fue cargado.

Finalmente, el método LayoutMdies utilizado por los elementos de menú en el menú Ventana para ordenar las ventanas hijo. El método acepta un parámetro de tipo MdiLayout enumeration. El valor determina si la ventana hijo necesita mostrarse de forma horizontal o vertical, en cascada o como ícono.

� Comprender las aplicaciones basadas en consola

È EN RESUMEN

Las aplicaciones de consola no tienen una interfaz de usuario gráfca y utilizan una ventana de consola de modo texto para interactuar con el usuario. Las aplicaciones basadas en consola son más adecuadas para tareas que no requieren de una interfaz de usuario.

Una aplicación de consola es ejecutada desde la ventana de consola. La entrada en la aplicación de consola puede ser proporcionada utilizando parámetros de la línea de comando o la aplicación de consola puede leer interactivamente caracteres desde la ventana de consola. Similarmente, la salida de la aplicación de consola también es escrita en la ventana de comandos . Puede habilitar la lectura o escritura a la consola creando una aplicación y utilizando la plantilla de Aplicación de Consola en Visual Studio.

También puede utilizar aplicaciones de consola para crear comandos que pueden ser ejecutados desde la línea de comando. Por ejemplo, puede tomar ventaja de las tuberías y fltros proporcionados por el sistema operativo para pasar la salida de un comando como entrada a otro comando, de este modo creando comandos más poderosos y combinando comandos simples.

Trabajar con argumentos de la línea de comandosEn esta sección, aprenderá cómo aceptar parámetros de línea de comando dentro de una aplicación de consola.

El siguiente ejercicio crea una aplicación de consola sencilla que acepta el nombre de un archivo de texto como un argumento de línea de comando y muestra el contenido de ese archivo.

; ¿Listo para la certificación?

¿Comprende cómo desarrollar aplicaciones de Windows Forms? — USD 5.1

Tome Nota

Para habilitar la lectura o escritura a la consola desde una aplicación de Windows Forms, establezca el tipo de salida del proyecto a Aplicación de consola en las propiedades del proyecto.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 148: 98-361 Fundamentos de Desarrollo de Software

147Comprender las Aplicaciones de Escritorio

Æ Crear una aplicación de consola

PREPÁRESE. Lance el Microsoft Visual Studio.

1. Crear un nuevo proyecto basado en la plantilla de Aplicación de Consola como se muestra en la Figura 5-9. Nombre el proyecto DisplayFile.

2. En el Program.cs, modifique el código dentro del método Main como se muestra abajo:static void Main(string[] args)

{

if (args.Length< 1)

return;

string[] lines = File.ReadAllLines(args[0]);

foreach (string item in lines)

{

Console.WriteLine(item);

}

}

3. Agregue lo siguiente al archivo utilizando la directiva :

using System.IO;

4. Seleccione Generar y después Generar Solución (o presione F6) para generar el proyecto.

5. Cree un archivo de texto utilizando Visual Studio o el bloc de notas y guárdelo como Sample.txt en la misma carpeta como el archivo ejecutable (el ejecutable es creado por defecto en bin\debug folder bajo la carpeta del proyecto).

6. Abra el símbolo del sistema, navegue a la ruta del archivo EXE del proyecto. Ejecute el siguiente comando:

DisplayFile sample.txt

7. Se mostrará el comando que muestra el contenido del archivo de texto en la ventana de comandos.

Figura 5-9

Plantilla de Aplicación de Consola

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 149: 98-361 Fundamentos de Desarrollo de Software

148 Lección 5

8. De forma alternativa, también puede pasar el argumento de la línea de comando desde dentro del Visual Studio utilizando la ventana de propiedades de proyecto, como se muestra en la figura 5-10.Para ver la ventana de propiedades del proyecto, seleccione la opción del menú Propiedades del proyecto DisplayFile.

� Comprender los Servicios de Windows

È EN RESUMEN

Un Servicio de Windows es una aplicación que se ejecuta en el fondo y no tiene ninguna interfaz de usuario.

La naturaleza de los servicios de Windows los hacen ideales para crear programas de larga ejecución que se ejecutan en el fondo y no proporcionan directamente ninguna interacción de usuario. Un servicio de Windows puede ser iniciado, pausado y detenido. Un servicio de Windows también puede ser confgurado para iniciar automáticamente cuando la computadora es iniciada.

Algunos ejemplos de un servicio de Windows incluyen un servidor Web que escucha las solicitudes entrantes y envía una respuesta o la cola de impresión de un sistema operativo que proporciona servicios de impresión a los programas de aplicación.

Los servicios juegan un rol importante en la arquitectura de la aplicación Enterprise. Por ejemplo, puede tener un servicio que escuche órdenes entrantes e inicie un fujo de trabajo de procesamiento de orden cuando una orden es recibida.

Figura 5-10

Estableciendo opciones de inicio en la ventana de propiedades del proyecto

; ¿Listo para la certificación?

¿Comprende cómo desarrollar aplicaciones basadas en consola? — USD 5.2

Tome Nota

Debido a que un servicio de Windows es capaz de ejecutarse en el fondo, no necesita que un usuario inicie sesión con el fin de funcionar. Los servicios de Windows ejecutan sus propias sesiones de Windows en el contexto de seguridad especificado. Dependiendo en qué servicios son necesitados, puede especificar una cuenta de usuario bajo el cual ejecutar el servicio.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 150: 98-361 Fundamentos de Desarrollo de Software

149Comprender las Aplicaciones de Escritorio

Crear un servicio de WindowsPara crear un servicio de Windows en Visual Studio, utilice la plantilla de aplicación de Servicio de Windows. Un servicio de Windows necesita ser instalado antes de poder ser utilizado.

Todos los servicios de Windows deben derivarse de la clase ServiceBase. Esta clase base proporciona la estructura y funcionalidad básica para crear un servicio de Windows. Puede invalidar los métodos de clase baseOnStart, OnStop, OnPause y OnContinue, para agregar su lógica personalizada que desearía para ejecutar, en respuesta de los cambios en estados de servicio.

El siguiente ejercicio demuestra cómo crear un servicio de Windows simple que escribe mensajes a un Event log de aplicación. Los EventLogs son parte de Windows que son utilizados por tareas del sistema operativo y aplicaciones ejecutándose en el fondo para registrar errores u otros mensajes informativos. Windows defne tres event logs por defecto: Sistema, Aplicación y Seguridad. Las aplicaciones generalmente utilizan el event log de Aplicación para informar su mensaje. La utilidad del Visor de Sucesos puede ser utilizada para ver los mensajes en los event logs.

Æ Crear un servicio de Windows

PREPÁRESE. Lance el Microsoft Visual Studio.

1. Cree un nuevo proyecto basado en la plantilla de Servicio de Windows. Nombre el proyecto FirstService, como se muestra en la Figura 5-11.

2. Seleccione la ventana de propiedades para Service1 y establezca las propiedades (Name) y el ServiceName a “FirstService”.

3. En el Explorador de Soluciones, renombre el archivo Service1.cs a FirstService.cs. Abra Program.cs y verifique que las referencias a Service1 han sido cambiadas a FirstService.

4. Seleccione las ventanas de propiedades para el servicio y establezca la propiedad Can Pause And Continue y la propiedad Can Shutdown a True.

Tome Nota

La edición de Visual Studio Express no proporciona plantillas para crear proyectos de servicio de Windows. Necesitará Visual Studio para completar los ejercicios que utilizan los proyectos de Servicio de Windows.

Figura 5-11

Seleccionar la plantilla de proyecto de Servicio de Windows

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 151: 98-361 Fundamentos de Desarrollo de Software

150 Lección 5

5. Abra el diseñador para FirstService y agregue un componente EventLog desde el cuadro de herramientas. El componente EventLog le permite conectarse con los eventlogs.

6. Vea el código para FirstService y modifique el constructor como se muestra a continuación. En este código, primero crea una fuente de evento con el nombre FirstService. El EventSource es utilizado para distinguir mensajes generados por una aplicación específica de todos los mensajes en un event log. Luego, establezca la propiedad Source del componente event log al nombre del eventsource. La propiedad Log del componente event log, eventLog1, es utilizado para especificar el event log utilizado para registrar los mensajes:

publicFirstService()

{

InitializeComponent();

if (!EventLog.SourceExists(“FirstService”))

{

EventLog.CreateEventSource(

“FirstService”, “Application”);

}

eventLog1.Source = “FirstService”;

eventLog1.Log = “Application”;

}

7. Agregue el siguiente código a los métodos de cambio de estado de servicio para definir su comportamiento. El método WriteEntry del componente event log, eventLog1, es utilizado para escribir un mensaje a un event log. Como parte del método puede especificar el tipo de mensaje. Por ejemplo, su mensaje puede ser error, advertencia o solo una pieza de información:

protected override void OnStart(string[] args)

{

eventLog1.WriteEntry(

“Iniciando el servicio”,

EventLogEntryType.Information, 1001);

}

protected override void OnStop()

{

eventLog1.WriteEntry(

“Deteniendo el Servicio”, EventLogEntryType.Information, 1001);

}

protected override void OnPause()

{

eventLog1.WriteEntry(

“Pausando el servicio”,

EventLogEntryType.Information, 1001);

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 152: 98-361 Fundamentos de Desarrollo de Software

151Comprender las Aplicaciones de Escritorio

}

protected override void OnContinue()

{

eventLog1.WriteEntry(

“Continuando el servicio “,

EventLogEntryType.Information, 1001);

}

protected override void OnShutdown()

{

eventLog1.WriteEntry(

“Apagando el servicio “,

EventLogEntryType.Information, 1001);

}

8. Seleccione Generar y después Generar Solución (o presione F6) para generar el proyecto.

El código para FirstServicein valida los métodos OnStart, OnStop, OnPause, OnContinue y OnShutdown para escribir mensajes al event log. No todos los servicios necesitan invalidar estos métodos. Si un servicio necesita invalidar estos métodos depende del valor de las propiedades Can Pause And Continue y Can Shutdown del servicio de Windows.

El método WriteEntry del event log toma el mensaje para escribirlo en el log, el tipo de la entrada del event log (Información, Error, advertencia, etc.), y un eventId, el cual es una id para especifcar la aplicación para identifcar el evento.

El servicio de WindowsFirstService ahora está listo pero antes de que pueda utilizarse, debe ser instalado en la base de datos de servicios de Windows. Esto se hace agregando un Instalador de Servicio de Windows al proyecto de Servicio de Windows. El siguiente ejercicio le muestra cómo hacer esto.

Æ Agregar un instalador al servicio de Windows

PREPÁRESE. Lance el Microsoft Visual Studio.

1. Abra el proyecto FirstService creado en el ejercicio previo. Haga clic derecho en la superficie del Diseñador de FirstService.cs y seleccione la opción Agregar instalador desde el menú de contexto.

2. Esta acción agrega un nuevo archivo ProjectInstaller.cs al proyecto. Abra el Diseñador para ProjectInstall.cs. se dará cuenta que se agregan dos componentes al Diseñador, como se muestra en la Figura 5-12.

3. Acceda a las propiedades para el componente ProcessInstaller1y cambie la propiedad AccountaLocalService.

4. En seguida, accede a las propiedades del componente serviceInstaller1. Cambie la propiedad de DisplayNameaFirstService y la propiedad Description a “Una simple prueba de servicio”. Note que el valor de la propiedad StartType es establecida por defecto a Manual.

5. Seleccione Generar, Generar Solución (o presione F6) para generar el proyecto. El servicio de Windows ahora está listo para ser instalado.

Tome Nota

La propiedad StartType de la clase ServiceInstaller indica cómo y cuándo un servicio es iniciado. La propiedad StartType puede tener uno de tres valores posibles. El valor Manual, el cual también es el valor por defecto, indica que necesita iniciar el servicio manualmente. El valor Automatic indica que el servicio será iniciado automáticamente cuando Windows inicie. El valor Disabled indica que el servicio no puede ser iniciado.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 153: 98-361 Fundamentos de Desarrollo de Software

152 Lección 5

Cuando agrega un instalador a un proyecto de servicio de Windows, las clases ServiceProcessInstaller y ServiceInstaller son agregadas al proyecto. La clase ServiceProcessInstaller desempeña tareas de instalación que son comunes a todos los servicios de Windows en una aplicación. Estas incluyen la confguración de la cuenta de inicio de sesión para el servicio de Windows. La clase ServiceInstaller, por otra parte, desempeña las tareas de instalación que son específcas a un solo servicio de Windows, tales como la confguración de ServiceNameyStartType.

La propiedad Account de la clase ServiceProcessInstaller especifca el tipo de cuenta bajo el cual se ejecutan los servicios. La propiedad Account es el tipo de enumeración de ServiceAccount donde los valores posibles son LocalService, LocalSystem, NetworkService y User. El valor LocalSystem especifca una cuenta con privilegios altos mientras la cuenta LocalService actúa como un usuario sin privilegios.

Un archivo ejecutable que tiene el código para las clases del instalador de servicio puede ser instalado utilizando la herramienta de instalador de línea de comando (installutil.exe). El siguiente ejercicio muestra como instalar una aplicación de servicio de Windows en la base de datos de servicios de Windows.

Æ Instalar un Servicio de Windows

PREPÁRESE. Para instalar un servicio de Windows, haga lo siguiente:

1. Ejecute el símbolo del sistema de Visual Studio como administrador. Para acceder al símbolo del sistema, vaya a Inicio seleccione Todos los Programas, después Visual Studio, posteriormente VisualStudio Tools y elija Símbolo del sistema de Visual Studio. Para ejecutar un programa como administrador en Windows, haga clic derecho en el acceso directo del programa y seleccione la opción Ejecutar como administrador desde el menú.

2. Cambie el directorio al directorio de salida del proyecto FirstService. Este es el directorio donde se ubican los archivos ejecutables.

3. Ejecute el siguiente comando, verá los resultados como se muestra en la Figura 5-13 (instalar un servicio de Windows requiere acceso al Registro de Windows. Por lo tanto, necesita asegurarse que ejecuta el installUtil.exe como administrador):

installutil FirstService.exe

4. El servicio de Windows de FirstService ahora está instalado.

La aplicación de servicio de Windows ahora esta almacenada en la base de datos de servicios de Windows. Anteriormente, cuando agrego un ServiceInstaller para FirstService, establece una propiedad StartTypedel componente serviceInstaller1 a Manual. Como resultado, necesitará iniciar manualmente el servicio cuando sea necesario. El siguiente ejercicio demuestra cómo iniciar, pausar, continuar y detener un servicio de Windows.

Figura 5-12

Vista de Diseñador para ProjectInstaller.cs

Tome Nota

Con el fin de minimizar los riesgos a la seguridad, a menos que un servicio de Windows necesite privilegios de seguridad más altos con el fin de funcionar, deberá abstenerse de utilizar la cuenta Local System para ejecutar un servicio de Windows.

Tome Nota

Instalar un servicio de Windows requiere acceso al Registro de Windows. Por lo tanto, necesita asegurarse que ejecuta el installUtil.exe como administrador.

Tome Nota

Para desinstalar un servicio de Windows, utilice InstallUtil.exe con la opción -u.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 154: 98-361 Fundamentos de Desarrollo de Software

153Comprender las Aplicaciones de Escritorio

Figura 5-13

Vista de Diseñador para ProjectInstaller.cs

Æ Trabajar con un servicio de Windows

PREPÁRESE. Lance la ventana de Administración de Equipos haciendo clic derecho en Mi Pc y seleccionando Administrar desde el menú.

1. En la ventana de Administración de Equipos, expanda la sección de Servicios y Aplicaciones y seleccione Servicios. Se muestra una lista de todos los servicios instalados en la computadora como en la Figura 5-14.

2. Seleccione el servicio First Service y haga clic en el hiperenlace Iniciar, como se muestra en la Figura 5-14. Observa un cuadro de diálogo mostrando el progreso, como se muestra en la Figura 5-15. Cuando el servicio es iniciado, el estatus del servicio cambia a Iniciado.

3. Expanda el nodo de Visor de Sucesos y seleccione el log de Windows de Aplicación. Podrá ver un mensaje de First Service diciendo “Iniciando el Servicio”, como se muestra en la Figura 5-16.

4. Regrese a la lista de Servicios e intente pausar, reanudar o detener el First Service. Revise de nuevo el event log para verificar que los mensajes apropiados están siendo mostrados.

En los últimos ejercicios vio cómo crear, instalar y utilizar un servicio de Windows. También aprendió cómo agregar mensajes por medio de programación al even log de Aplicación de Windows.

Figura 5-14

La sección de servicios le permite trabajar con servicios instalados

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 155: 98-361 Fundamentos de Desarrollo de Software

154 Lección 5

Figura 5-15

Mensaje de control de servicio cuando se está iniciando un servicio

Figura 5-16

Mensaje de control de servicio cuando se inicia un servicio

; ¿Listo para la certificación?

¿Comprende cómo desarrollar servicios de Windows? — USD 5.3

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 156: 98-361 Fundamentos de Desarrollo de Software

155Comprender los conceptos básicos de bases de datos

Resumen de Habilidades

En esta lección aprendió:

• Un Formulario de Windows es una superfcie visual que puede mostrar una variedad de controles tales como cuadros de texto, botones y menús. Visual Studio proporciona un diseñador de Windows Forms para arrastrar y soltar que puede utilizar para crear sus aplicaciones.

• Cada formulario y control expone un conjunto predefnido de eventos. Cuando ocurre un evento, el código en el manejador de evento asociado es invocado. El modelo de eventos de los formularios de Windows utiliza delegados de .NET Framework para enlazar los eventos a sus respectivos manejadores de eventos.

• La herencia Visual le permite reutilizar la funcionalidad existente y el diseño para formularios de Windows.

• Las aplicaciones de interfaz de documentos múltiples son aplicaciones donde múltiples ventanas hijo residen bajo una sola ventana padre.

• Las aplicaciones de consola no tienen una interfaz de usuario gráfca y utilizan una ventana de consola de modo texto para interactuar con el usuario. Las aplicaciones basadas en consola son más adecuadas para tareas que requieren una interfaz mínima o que no requieren de una interfaz de usuario.

• Los servicios de Windows son ideales para la creación de aplicaciones de larga ejecución que se ejecutan en el fondo y no tienen una interfaz de usuario.

• Puede crear servicios de Windows utilizando la plantilla de Servicio de Windows de Visual Studio.

• Antes de que un servicio pueda ser utilizado, debe ser instalado en el Registro de Windows. Para hacer esto, agrega el componente Installer a la aplicación de servicio de Windows. Esto le permitirá instalar el servicio de Windows utilizando una herramienta de instalación tal como InstallUtil.exe.

» Evaluación de Conocimiento

Llene los espacios en blanco

Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los

espacios proporcionados.

1. Utilice la propiedad _________________de la clase ServiceInstaller para especifcar un breve comentario que explica el propósito del servicio.

2. La propiedad _________________ de la clase _________________ indica el tipo de cuenta bajo el cual el servicio de Windows se ejecutará.

3. La propiedad ________________ de la clase EventLog es utilizada para especifcar el nombre de la aplicación a utilizar cuando se escribe en un event log.

4. _____________________ le permite reutilizar la funcionalidad y diseño existentes para formularios de Windows.

5. Las aplicaciones de _____________________ son aplicaciones donde múltiples ventanas hijo residen bajo una sola ventana padre.

6. Un _________________ es ideal para la creación de aplicaciones de larda ejecución que se ejecutan en el fondo y no tienen ninguna interfaz de usuario.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 157: 98-361 Fundamentos de Desarrollo de Software

156 Lección 5

7. Las _________________ no tienen interfaz de usuario gráfca y utilizan una ventana de consola de modo texto para interactuar con el usuario.

8. Las aplicaciones _______________ proporcionan su propia funcionalidad de administración de ventana, mientras que las aplicaciones_______________ se basan en el sistema operativo para la administración de ventana.

9. Un delegado puede ser enlazado a cualquier método del cual coincide la frma con la de la_______________________.

10. Los _______________________ pueden ser enlazados a más de un método, permitiendo notifcaciones de uno a muchos cuando un evento es disparado.

Opción Múltiple

Encierre en un círculo la letra que corresponda a la mejor respuesta.

1. Necesita diseñar un servicio de Windows que no puede ser pausado. ¿Cuál de las siguientes opciones le ayudara a llevar a cabo esto?

a. Establecer la propiedad Can Pause And Continue del servicio de Windows a False.

b. Establecer la propiedad del servicio de Windows a True.

c. Establecer la propiedad del servicio de Windows a True, pero establecer la propiedad de Can Shutdown a False.

d. No anular los métodos On Pause y On Continue en el servicio de Windows.

2. Ha desarrollado un servicio de Windows. Necesita instalar este servicio de Windows con el fn de instalar su funcionalidad. ¿Cuál de las siguientes opciones debe elegir para llevar a cabo esto?

a. Utilizar el Explorador de Servidores de Visual Studio.

b. Utilizar el nodo de Servicios en la ventana de Administración de Equipos.

c. Utilizar InstallUtil.exe.

d. Utilizar gacutil.exe.

3. Ha desarrollado un servicio de Windows. Este servicio necesita ejecutarse como un usuario sin privilegios con el fn de minimizar cualquier riesgo de seguridad. ¿Cuál de las siguientes cuentas debe utilizar para ejecutar este servicio de Windows?

a. LocalSystem

b. NetworkService

c. LocalService

d. User (donde la propiedad UserName está establecida a un miembro del rol de administrador).

4. Está diseñando una aplicación de servicio de Windows que contiene sólo un servicio de Windows. Le gustaría que este servicio se inicie automáticamente cuando la computadora es reiniciada. ¿Cuál de las siguientes clases debe utilizar para especifcar esta confguración?

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 158: 98-361 Fundamentos de Desarrollo de Software

157Comprender los conceptos básicos de bases de datos

a. ServiceBase

b. ServiceInstaller

c. ServiceProcessInstaller

d. ServiceController

5. Necesita cambiar la visualización y comportamiento de un formulario de Windows de forma que pueda contener múltiples ventanas hijo. ¿Qué debe hacer¿

a. Establecer la propiedad IsMdiContainer del formulario a true.

b. Establecer la propiedad de MdiParent para todas las ventanas hijo.

c. Establecer la propiedad MdiChilddel formulario.

d. Establecer la propiedad IsMdiChild del formulario.

6. Está desarrollando un formulario de Windows que responde a los eventos del ratón. Cuando el ratón se mueve, necesita invocar al método Form1_HandleMouse. Cualquier código que escriba no debería afectar ningún código de manejador de evento existente. ¿Qué sentencia debe utilizar para agregar el manejador de evento al evento?

a. this.MouseDown = new MouseEventHandler

(Form1_HandleMouse);

b. this.MouseMove = new MouseEventHandler

(Form1_HandleMouse);

c. this.MouseDown+= new MouseEventHandler

(Form1_HandleMouse);

d. this.MouseMove+= new MouseEventHandler

(Form1_HandleMouse);

7. Está desarrollando un formulario de Windows con una interfaz de documentos múltiples (MDI). Necesita escribir código que ordene las ventanas hijo verticalmente dentro de la región del cliente con el formulario MDI padre. ¿Cuál de las siguientes sentencias debe utilizar?

a. LayoutMdi(MdiLayout.TileVertical);

b. LayoutMdi(MdiLayout.Cascade);

c. MdiLayout(LayoutMdi.TileVertical);

d. MdiLayout(LayoutMdi.Cascade);

8. Está desarrollando una aplicación para que sea ejecutada desde la línea de comando. ¿Cuál de los siguientes métodos debe utilizar para la salida de la línea de comando?

a. Console.Read

b. Console.Write

c. File.Read

d. File.Write

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 159: 98-361 Fundamentos de Desarrollo de Software

158 Lección 5

9. Está desarrollando una aplicación que muestra una superfcie visual capaz de mostrar una variedad de controles tales como cuadros de texto, botones y menús. La aplicación debería también permitir múltiples ventanas hijo que residan bajo una sola ventana padre. ¿Cuál de los siguientes tipos de aplicación debe desarrollar?

a. Aplicación basada en consola.

b. Aplicación de Servicio de Windows.

c. Aplicación de interfaz de documentos simple (SDI).

d. Aplicación de interfaz de documentos múltiples (MDI).

10. Está extendiendo una aplicación de Windows existente. Le gustaría crear un nuevo formulario que deriva sus características visuales tales como tamaño, color y algunos controles desde un formulario creado previamente. ¿Qué técnica debe utilizar para crear el nuevo formulario?

a. Herencia Visual

b. Encapsulación Visual

c. Abstracción Visual

d. Polimorfsmo Visual

» Evaluación de Competencia

Proyecto 5-1: Utilizar Herencia Visual

Necesita crear un Formulario de Windows similar a uno que creó en el ejercicio VisualInheritance. Sin embargo, esta vez el requerimiento es que el color del fondo debe coincidir con el color seleccionado actualmente del escritorio del usuario. ¿Cómo desarrollaría tal formulario?

Proyecto 5-2: Manejar el Evento Mouse Down

Está desarrollando un juego que permite a los usuarios golpear un área objetivo en un formulario de Windows con el ratón. Necesita desarrollar un formulario experimental que muestre las coordenadas X y Y de la ubicación cliqueada por el usuario en la barra de título del formulario. ¿Cómo debe llevar a cabo esto?

» Evaluación de Competencia

Proyecto 5-3: Trabajar con Entradas de Consola

Está desarrollando un programa que manipula texto. Necesita escribir una aplicación de consola que acepte texto del usuario y lo convierta a texto en letras mayúsculas. ¿Qué código necesita escribir para cumplir este requerimiento?

Proyecto 5-4: Utilizar la utilidad Net (net.exe)

La utilidad de línea de comando net.exe viene instalada con Windows. Esta utilidad le permite desempeñar varios comandos de red, incluyendo el control de los servicios de Windows. En este ejercicio, utilizará el net.exe para trabajar con el servicio de Windows creado previamente de First Service. ¿Qué pasos toma con el fn de pausar, detener e iniciar un servicio de Windows utilizando la utilidad Net?

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 160: 98-361 Fundamentos de Desarrollo de Software

• Diagrama de entidad - relación• Primera forma normal• Archivos planos• Normalización

• Procedimiento almacenado parametrizado

• Segunda forma normal• Procedimiento almacenado

• Lenguaje de consulta estructurado• Tercera forma normal• XML

Lección 6

Comprender las Bases de Datos

Matriz de Dominio de Objetivos

Habilidad Tecnológica Descripción de Dominio de Objetivo Número del Dominio del Objetivo

Comprender los Objetos Comprender los sistemas de administración de bases de datos relacionales

6.1

Comprender los Valores y Referencias Comprender los métodos de consulta de bases de datos

6.2

Comprender el encapsulamiento Comprender los métodos de conexión de bases de datos

6.3

Términos Clave

Es un desarrollador de software para la Northwind Corporation. Como parte de su trabajo, interactúa y procesa datos acerca de clientes, productos, proveedores y órdenes. Su trabajo involucra interactuar con bases de datos relaciones tales como Microsoft SQL Server. Sin embargo, también trabaja con información almacenada en otros formatos tales como archivos planos, archivos XML y datos en memoria. Para ser efectivo en su trabajo, necesita saber cómo conectarse a varias fuentes de datos y cómo recuperar y actualizar efectivamente datos en varios tipos de fuentes de datos.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 161: 98-361 Fundamentos de Desarrollo de Software

160 Lección 6

� Comprender los conceptos de bases de datos

relacionales

È EN RESUMEN

Una base de datos relacional es una colección de datos interrelacionados que está basado en el modelo relacional desarrollado por E.F. Codd. El modelo relación defne entidades de datos distintas, sus atributos y relaciones entre entidades.

Comprender las bases de datosUna base de datos es una colección organizada de datos interrelacionados que es administrada como una sola unidad.

Una base de datos le permite almacenar, administrar y recuperar información de negocios importante. Si una base de datos es diseñada apropiadamente, puede ser utilizada por múltiples aplicaciones y por múltiples usuarios. Un sistema de administración de base

de datos (DBMS), por otro lado, es un software que organiza bases de datos y proporciona facilidades tales como almacenamiento, acceso de datos, seguridad, respaldo, etc. Los ejemplos de DBMS populares incluyen el Microsoft SQL Server, Microsoft Access, Oracle y MySql.

Los sistemas de administración de bases de datos pueden ser implementados basados en diferentes modelos. El modelo relacional es el modelo de base de datos más popular. En el modelo relacional, los datos están organizados en tablas donde cada tabla puede tener múltiples flas. Los DBMS basados en modelos relaciones son llamados DBMS relacionales. SQL Server, Access, Oracle y MySql son todos RDBMSs.

Otros sistemas de administración de bases de datos están basados en modelos diferentes. Por ejemplo, el Object DBMS (ODBMS) está basado en el modelo de objeto donde los datos son almacenados como una colección de objetos. En esta lección. Nos enfocaremos solamente a las bases de datos relacionales más populares.

Los DBMS relacionales utilizan el lenguaje de consulta estructurado (SQL) para recuperar y manipular datos. Los sistemas de administración de bases de datos relacionales más populares proporcionan soporte para la versión estandarizada de SQL, permitiéndole utilizar sus habilidades a través de distintos sistemas de bases de datos relacionales.

Comprender los conceptos de bases de datos relacionalesUna base de datos relacional organiza datos en tablas bidimensionales que consisten de flas y columnas.

Una base de datos relacional organiza información en tablas. Una tabla es una lista de flas y columnas que es conceptualmente similar a una hoja de trabajo de Microsoft Excel. Una fla también es llamada registro o tuple. A una columna también se le conoce como campo. La columna o campo especifca el tipo de datos que serán almacenados en cada registro de la tabla. Por ejemplo, las órdenes personalizadas pueden ser almacenadas en una tabla Orders donde cada fla representa una orden única. Las columnas tales como Order Date especifcan si un valor valido es del tipo correcto de dato. Un ejemplo de la tabla Order aparece en la Figura 6-1.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 162: 98-361 Fundamentos de Desarrollo de Software

161Comprender las Bases de Datos

Comprender el diseño de bases de datos relacionalesDiseñar una base de datos relacional es un proceso que determina la estructura de base de datos relacional apropiada que satisfaga los requerimientos del negocio.

La información de una organización probablemente es el activo más importante. Cuando diseña una base de datos, unos de los principios rectores es garantizar la integridad de la

base de datos. Integridad signifca que los datos en la base de datos son siempre precisos y consistentes .

El proceso de diseño de base de datos consiste de los siguientes pasos:

1. Desarrollar un enunciado de misión para la base de datos. Esto identifcará el propósito de la base de datos, cómo será utilizada y quién la utilizará. Este paso establece el tono para el resto del proceso de diseño.

2. Determinar la información que necesita sea almacenada. En este paso, identifca los tipos de datos que necesitan ser almacenados en la base de datos. Generalmente la información es reunida como parte de los requerimientos de la tarea de análisis por medio de diagramas entidad - relación.

3. Dividir los datos en tablas y columnas. En este paso identifca las tablas y la información que desea almacenar en esas tablas.

4. Elegir claves principales. Una clave principal es una columna o conjunto de columnas que identifcan únicamente a cada fla de datos en una tabla.

5. Identifcar relaciones. En este paso identifca cómo los datos en una tabla están relacionados a los datos en otra tabla. Por ejemplo, para cada cliente en la tabla Customers, puede tener muchas órdenes en la tabla Orders, esta relación es llamada relación de uno a muchos.

6. Aplicar el proceso de normalización. En este paso fnal, aplica reglas de normalización para garantizar que cualquier problema que pudiera afectar la integridad de los datos está resuelto. Más adelante aprenderá acerca del proceso de normalización .

Después de que ha establecido el propósito de la base de datos, el siguiente conjunto de pasos (Paso 2 al Paso 5) pueden ser completados como parte del modelado entidad - relación. El paso fnal de normalización puede ser entonces aplicado a la salida desde el modelado entidad - relación.

Figura 6-1

Una tabla de base de datos

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 163: 98-361 Fundamentos de Desarrollo de Software

162 Lección 6

Comprender los diagramas Entidad - RelaciónLos diagramas Entidad – Relación se utilizan para modelar las entidades, sus atributos y las relaciones entre las entidades. Los diagramas Entidad - Relación pueden ayudarle a determinar los datos que necesitan ser almacenados en la base de datos.

El modelado Entidad – Relación es un proceso de modelado para crear el modelo de datos conceptual de un sistema. Los diagramas Entidad – Relación (ERD) son la herramienta de modelado gráfco para llevar a cabo el modelado Entidad – Relación. Los bloques de construcción básicos para un ERD son Entidad, Atributos y Relación.

• Entidad: Una entidad es la construcción de un objeto físico o un concepto. Los ejemplos incluyen una orden, un cliente, un empleado, etc. Una entidad generalmente es llamada por el nombre que representa.

• Atributo: Los atributos son las distintas propiedades de una entidad. Por ejemplo, para una entidad Order, algunos atributos útiles podrían ser Order Number, Order Date, Ship Date, Ship Via, etc. Para una entidad Employee, algunos atributos útiles podrían ser EmployeeId,LastName, FirstName, Title, HireDate, etc. Cada entidad debe tener un conjunto de atributos de identifcación única que es la clave principal de la entidad. Por ejemplo, un OrderNumber es un atributo que identifca como única a una orden y por lo tanto es una clave principal para la entidad Order.

• Relación: Una relación es una asociación entre entidades. Por ejemplo, Takes es una relación entre la entidad Employee y una entidad Order (EmployeeTakesOrder).

Los diagramas ER no muestran entidades simples o relaciones simples. Por ejemplo, puede haber miles de entidades Order y cientos de entidades Customer. En lugar de eso, ellos muestran conjuntos de entidades y conjuntos de relaciones. Por ejemplo, todas las miles de entidades Order conforman un conjunto de entidades. Cuando una Order o Customer aparecen en el diagrama ER, regularmente se refere a un conjunto de entidades en lugar de una entidad individual.

En un diagrama ER:

• Un rectángulo representa un conjunto de entidades.

• Una elipse representa un atributo.

• Un diamante representa un conjunto de relaciones.

• Las líneas sólidas enlazan conjuntos de entidades a relaciones y conjuntos de entidades a atributos.

La Figura 6-2 muestra un ejemplo de diagrama ER. En este diagrama ER, los dos conjuntos de entidades son Customer y Order. Los atributos asociados con Customer son ID, Name y City. Los atributos asociados con Order son Order ID, Order Date y Ship Date. Los atributos que forman una clave principal están subrayados. La relación entre Customer y Order es Places.

Una relación puede ser clasifcada como relación uno a uno, relación uno a muchos o relación muchos a muchos. En la Figura 6-2, la línea que conecta la relación Places con Customer esta etiquetada “1”, mientras que la línea entre Places y Order esta etiquetada “N”. Este es un ejemplo de relación uno a muchos. Por lo tanto, en esta relación un cliente puede colocar muchas órdenes, pero una orden solo puede tener un cliente asociado con ella.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 164: 98-361 Fundamentos de Desarrollo de Software

163Comprender las Bases de Datos

Figura 6-2

Un diagrama Entidad - Relación

Mapear diagramas ER a una base de datos relacional

Con el fn de convertir un diagrama ER a una base de datos relacional, haga lo siguiente:

1. Mapee las entidades: Cree una tabla para cada conjunto de entidades en el diagrama. Los atributos serán columnas. Establezca el atributo de clave principal a las columnas de clave principal de la tabla.

2. Mapee la Relación: Puede mapear la relación uno a muchos asegurándose que la tabla en el lado N de la relación contiene la columna clave de la tabla en el lado 1 de la relación. Para la Figura6-2, esto puede ser llevado a cabo agregando una columna Customer ID en la tabla Order que mapea a la columna ID a la tabla Customer. En el contexto de la tabla Order, es posible responder preguntas tales como “¿Cuáles son todas las órdenes colocadas por un cliente específico?” y “¿Quién es el cliente para una orden específica?”

El diagrama ER en la Figura 6-2, cuando se mapea a una base de datos relación, se generan las siguientes tablas:

Clientes

ID Name City

1001 Jane Doe Berlin

1002 John Doe Tokyo

1003 Howard Steel Sydney

Ordenes

OrderID CustomerId OrderDate ShipDate

101 1001 10/1/2010 10/7/2010

102 1002 10/5/2010 10/10/2010

103 1001 10/4/2010 10/10/2010

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 165: 98-361 Fundamentos de Desarrollo de Software

164 Lección 6

Comprender la normalizaciónEl proceso de normalización de datos garantiza que el diseño de la base de datos está libre de cualquier problema que podría llevar a la pérdida de la integridad de datos.

El análisis Entidad – Relación le ayuda a garantizar que ha identifcado los elementos de información correctos para su base de datos. En la normalización, aplica un conjunto de reglas de normalización para garantizar que tiene el diseño correcto de base de datos. Esto es, las columnas pertenecen a las tablas correctas con el fn de garantizar que su base de datos está libre de cualquier problema indeseado.

Por ejemplo, como parte del análisis de entidad – relación, puede tener una tabla Book que tiene las siguientes columnas:

Books

BookId BookName CategoryId CategoryName

1 Cocina ligera 1001 Cocina

2 Profecía 1002 Misterio y Suspenso

3 Cambio 1003 Negocios

4 La Confesión 1002 Misterio y Suspenso

Pero este diseño sufre de los siguientes tres problemas:

• Anomalía de Insert: La anomalía de Insert es una situación donde no puede insertar nueva información en la base de datos debido a una dependencia no relacionada. Por ejemplo, si desea que su base de datos tenga una nueva CategoryId y un CategoryName para libros de historia, el diseño actual no lo permitirá a menos que primero tenga un libro de historia para ubicarlo en esa categoría.

• Anomalía de Delete: La anomalía delete es una situación donde la eliminación de datos le causa pérdida no intencionada de otra información. Por ejemplo, si fuera a eliminar el BookId 3 de la tabla Books, el hecho de que ha tenido un CategoryName de Negocios será pérdida.

• Anomalía de Update: La anomalía update es una situación donde actualizar un solo dato requiere que múltiples flas sean actualizadas. Por ejemplo, digamos que ha decidido cambiar el nombre de categoría de Misterio y Suspenso a solamente Misterio. Con el diseño de tabla actual, tendrá que cambiar el nombre de la categoría para cada libro en esa categoría. También hay el riesgo de que si actualiza el nombre de la categoría en una tabla pero no en otra, terminará teniendo datos inconsistentes en la base de datos.

Cada uno de estos problemas puede ser reparado siguiendo el proceso de normalización. Hay cinco formas normales, estas formas son utilizadas como parte del proceso de normalización. Esta lección solo discute las primeras tres, ya que son las requeridas en la mayoría de los casos.

Primera Forma Normal

Con el fn de que una tabla esté en la primera forma normal (1NF), ninguna de las columnas deberá tener múltiples valores en la misma fla de datos. Por ejemplo, si una tabla Customers almacena datos como se muestra abajo, entonces la tabla Customers no está en la 1NF debido a que la columna PhoneNumber está almacenando más de un valor.

Tome Nota

La normalización puede ayudarle a garantizar un diseño de base de datos correcto, pero no puede garantizarle que tiene los elementos de información correctos para empezar.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 166: 98-361 Fundamentos de Desarrollo de Software

165Comprender las Bases de Datos

Customer

Id FirstName LastName PhoneNumber

1 Jane Doe (503) 555-6874

2 John Doe (509) 555-7969, (509) 555-7970

3 Howard Steel (604) 555-3392, (604) 555-3393

Para que esta tabla este en la 1NF, necesita dividir la tabla en dos:

Customer

Id FirstName LastName

1 Jane Doe

2 John Doe

3 Howard Steel

CustomerPhones

Id PhoneNumber

1 (503) 555-6874

2 (509) 555-7969

2 (509) 555-7970

3 (604) 555-3392

3 (604) 555-3393

Aquí, la tabla Customer y la tabla CustomerPhones están ambas en la 1NF. Ambas tablas tienen una clave principal (Id en la primer tabla y la combinación de Id y PhoneNumber en la segunda tabla) que establece una relación entre ellas. Dando cualquier Id para un cliente, puede encontrar todos los números telefónicos para ese cliente sin ninguna confusión. Por otra parte, LastName no es una clave principal debido a que el apellido tendrá entradas duplicadas.

Segunda Forma Normal

Para que una tabla esté en la segunda forma normal (2NF), primero debe cumplir los requerimientos para 1NF. Además, la 2NF requiere que todas las columnas que no son clave sean funcionalmente dependientes de toda la clave principal.

Con el fn de comprender la 2NF, primero debe comprender la dependencia funcional. Tomemos el ejemplo de la tabla Customers de arriba. En la tabla Customers, la columna Id es la clave principal, ya que identifca de forma única a cada fla. Las columnas FirstName y LastName no son columnas clave debido a que no son parte de la clave principal. Tanto FirstName y LastName son funcionalmente dependientes de Id debido a que, dando un valor de Id, siempre puede encontrar un valor para el FirstName y LastName correspondiente sin ninguna ambigüedad. No hay una columna que no sea clave en la

Tome Nota

Una práctica general consiste en subrayar el nombre de la columna(s) de una tabla que son parte de la clave principal.

Tome Nota

Crear columnas repetidas tales como PhoneNumber1 y PhoneNumber2 para normalizar la tabla Customer no es una solución aceptable debido a que la 1NF no permite repetir columnas.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 167: 98-361 Fundamentos de Desarrollo de Software

166 Lección 6

tabla Customers que no sea funcionalmente dependiente de la clave principal. Las tablas Customer y CustomerPhones ya están en la 2NF.

Sin embargo, tome el ejemplo de la siguiente tabla:

Ordenes

OrderId CustomerId OrderDate CustomerName

101 1 10/1/2010 Jane Doe

102 2 10/5/2010 John Doe

103 1 10/4/2010 Jane Doe

Aquí, las columnas OrderId y CustomerId juntas identifcan una fla única y por lo tanto hacen una clave principal compuesta. Sin embargo, la columna OrderDate es funcionalmente dependiente solo en OrderId, y CustomerNamees dependiente solo en CustomerId. Esto viola la 2NF debido a que las columnas que no son clave son funcionalmente dependientes en parte de la clave principal.

Una manera posible en la que puede modifcar la tabla Orders para que se ajuste a la 2NF es sacar a CustomerName fuera de la tabla y tener solo tres columnas OrderId, CustomerId y OrderDate, donde solo OrderId es la clave principal. En esta solución, tanto CustomerId y OrderDate son funcionalmente dependientes en OrderId y en consecuencia se ajusta a la 2NF.

Tercera Forma Normal

La tercera forma normal (3NF) requiere que 2NF debe cumplirse y que no haya dependencia funcional entre los atributos que no son clave. En otras palabras, cada atributo que no es clave debe ser dependiente solo de la clave principal y nada más. Por ejemplo, considere la siguiente tabla:

Items

ItemId SupplierId ReorderFax

101 100 (514) 555-2955

102 11 (514) 555-9022

103 525 (313) 555-5735

Aquí ItemId es la clave principal. El ReorderFaxes un número de fax para el proveedor y por lo tanto es funcionalmente dependiente en el SupplierId. Para satisfacer el requerimiento de 3NF, esta tabla debe ser descompuesta en dos tablas: Items (ItemId, SupplierId) y Supplier (SupplierId, ReorderFax).

Items

ItemId SupplierId

101 100

102 11

103 525

Tome Nota

La 2NF solo aplica a tablas que tengan claves principales compuestas (múltiples columnas juntas forman una clave principal). Los valores combinados de todos los cambios en una clave principal compuesta deben ser únicos.

Si una tabla satisface la 1NF y tiene una sola columna en la clave principal, entonces la tabla también se ajusta a 2NF.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 168: 98-361 Fundamentos de Desarrollo de Software

167Comprender las Bases de Datos

Supplier

SupplierId ReorderFax

100 (514) 555-2955

11 (514) 555-9022

525 (313) 555-5735

� Comprender los métodos de consulta de bases de

datos

È EN RESUMEN

Los datos son esenciales para muchas aplicaciones de negocios y como desarrollador le gusta pasar mucho tiempo trabajando en tareas relacionadas con información. En esta sección aprenderá cómo utilizar el lenguaje de consulta estructurado (SQL) y los procedimientos almacenados de SQL Server para seleccionar, insertar, actualizar y eliminar información.

SQL es el lenguaje utilizado por la mayoría de los sistemas de bases de datos para administrar datos en la base de datos. comandos de SQL pueden permitirle recuperar y actualizar datos. Los comandos de SQL también le permiten crear y administrar objetos de bases de datos tales como tablas. SQL puede ser considerado como un lenguaje de programación para bases de datos relacionales. Sin embargo, SQL es declarativo por naturaleza, como opuesto a la naturaleza imperativa de los lenguajes de programación más comunes.

En SQL, le dice a la base de datos lo que necesita hacer y es trabajo de la base de datos averiguar cómo hacerlo. Por ejemplo, puede decir: seleccionar las primeras 10 flas de una tabla. Compare esto con un lenguaje de programación imperativo tal como C#, donde necesita especifcar en detalle cómo debe ser desempeñado el trabajo: por ejemplo, crear un ciclo que se ejecute diez veces, establezca e inicialice variables, mover el registro de punteros, etc.

SQL es un estándar ANSI (Instituto Nacional Americano de Estándares), pero diferentes proveedores de bases de datos han implementado sus propias extensiones al estándar SQL. La implementación de Microsoft SQL Server de SQL es llamado Transact-SQL (T-SQL).

Hay dos maneras principales para entregar T-SQL a SQL Server. Puede, ya sea utilizar sentencias ad-hoc que son ejecutadas directamente o utilizar procedimientos almacenados. Los procedimientos almacenados con una colección de sentencias SQL y de programación lógica que es almacenada en el servidor de base de datos como objetos nombrados.

Trabajar con consultas de SQLLas sentencias SELECT, INSERT, UPDATE y DELETE son los cuatro tipos principales de sentencias SQL utilizadas para manipular datos en SQL Server.

Utilizando consultas ad-hoc SQL es una manera fexible para trabajar con una base de datos de SQL Server. En esta lección, aprenderá acerca de lo esencial de los cuatro tipos principales de sentencias de SQL que le ayudan a manipular los datos de SQL Server:

; ¿Listo para la certificación?

¿Comprende las bases de los sistemas de administración de bases de datos relacionales? — USD 6.1

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 169: 98-361 Fundamentos de Desarrollo de Software

168 Lección 6

• Las sentencias SELECT le permiten recuperar información almacenada en la base de datos.

• Las declaraciones INSERT le permiten agregar nueva información a la base de datos.

• Las sentencias UPDATE le permiten modifcar información existente en la base de datos.

• Las sentencias DELETE le permiten eliminar información de la base de datos.

Conectarse a una base de datos de SQL serverNecesita conectarse a una base de datos de SQL Server antes de que pueda manipular información.

En esta lección, aprenderá como trabajar con una base de datos de Microsoft SQL Server. Si no tiene acceso a una versión reciente de SQL Server, puede descargar el SQL Server 2008 Express gratis desde microsoft.com/express/database. Esta lección utilice la base de datos de ejemplo de SQL Server de Northwind. Esta base de datos no está instalada por defecto con SQL Server pero puede descargar el archivo de la base de datos siguiendo las instrucciones en msdn.com/en-us/library/ms143221.aspx.

El siguiente ejercicio muestra como conectarse y utilizar la base de datos de Northwind con Visual Studio.

Æ Conectarse a la base de datos de Northwind

PREPÁRESE. Antes de empezar estos pasos, asegúrese de lanzar el Microsoft Visual Studio.

1. Abra la ventana de Explorador de Servidores. Seleccione el nodo Conexiones de Datos y haga clic en el botón Conectar con Base de Datos en la barra de herramientas del Explorador de Servidores.

2. En el cuadro de diálogo de Agregar Conexión, navegue al archivo de base de datos de la base de datos de Northwind (northwnd.mdf), como se muestra en la Figura 6-3.

Tome Nota

En la edición del Visual Studio Express, la ventana del Explorador de Servidores se llama Explorador de Bases de Datos y puede abrirse seleccionando Ver, Otras Ventanas, Explorador de Bases de Datos.

Figura 6-3

Conectándose a una base de datos

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 170: 98-361 Fundamentos de Desarrollo de Software

169Comprender las Bases de Datos

Figura 6-4

Accediendo a una base de datos a través del Explorador de Servidores

Figura 6-5

Propiedades de la base de datos

3. Utilice la Autenticación de Windows como modo de autenticación y presiones el botón Probar Conexión para asegurarse que puede conectarse a la base de datos. Finalmente, haga clic en el botón Aceptar para agregar la conexión a la base de datos.

4. Una vez que la conexión a la base de datas es establecida, la base de datos está disponible como conexión bajo el nodo de Conexiones de Datos en el Explorador de Servidores. Expanda la base de datos para ver tablas, procedimientos almacenados y otros objetos de la base de datos, como se muestra en la Figura 6-4.

5. Haga clic derecho en el nodo NORTHWND.MDF y seleccione propiedades. Se mostrará la ventana de propiedades en la Figura 6-5. Note la propiedad de Cadena de Conexión. Se mostrará el valor de esta propiedad para conectarse a esta base de datos desde una aplicación de C#.

PAUSA. Accederá a los datos desde la base de datos de Northwind en el siguiente ejercicio.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 171: 98-361 Fundamentos de Desarrollo de Software

170 Lección 6

Ejecutar Consultas SQLHay muchas maneras disponibles para comunicarse con un SQL Server con el fn de ejecutar sus consultas.

Hay muchas maneras por las cuales puede enviar consultas a un SQL Server. Por ejemplo, puede utilizar:

• Entorno de Desarrollo Integrado de Visual Studio (IDE)

• Aplicación C#

• SQL QueryAnalyzer

• Utilidad osqlcommandprompt

Las utilidades de SQL Query Analyzer y osqlcommand-prompt son herramientas instaladas con SQL Server.

Æ Ejecutar consultas desde Visual Studio

PREPÁRESE. Para utilizar las aplicaciones de Visual Studio IDE y C# para ejecutar consultas, desempeñe lo siguiente:

1. Seleccione la base de datos de Northwind en el Explorador de Servidores. Haga clic derecho y seleccione Nueva Consulta, esta acción abre un Diseñador de Consultas y muestra un cuadro de diálogo de Agregar Tabla. Seleccione la tabla Customers y haga clic en Agregar. Haga clic en Cerrar en el cuadro de diálogo de Agregar Tabla.

2. En el panel SQL del diseñador de consulta (el cual es el área que muestra el texto de la consulta), modifique la sentencia SQL a lo siguiente:

SELECT * FROM Customers

3. Desde el menú de Visual Studio, seleccione Diseñador de Consultas, la opción Ejecutar SQL o haga clic en el botón de Ejecutar SQL en la barra de Herramientas. La sentencia SQL es enviada al servidor SQL para la ejecución y sus resultados son mostrados como se muestra en la Figura 6-6.

Figura 6-6

Diseñador de Consultas de Visual Studio

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 172: 98-361 Fundamentos de Desarrollo de Software

171Comprender las Bases de Datos

El Diseñador de Consultas en Visual Studio muestra cuatro paneles. Desde arriba para abajo, los paneles están como sigue:

• El Panel de Diagrama, el cual muestra las tablas involucradas en la consulta y la relación entre estas tablas, así como también todas las columnas que contiene la tabla.

• El Panel de Criterios, el cual muestra las columnas que han sido seleccionadas como parte de la consulta, así como también información para ordenar y fltrar.

• El panel SQL, el cual muestra la sentencia SQL actual que será ejecutada.

• El panel de Resultados, el cual muestra los resultados (si hay) después de que la consulta ha sido ejecutada.

La barra de herramientas del Diseñador de Consultas incluye botones que puede utilizar para esconder o mostrar cualquiera de estos cuatro paneles. Para esta lección, necesita solo el panel SQL y el panel de Resultados.

Æ Ejecutar Consultas desde una Aplicación de C#

PREPÁRESE. Para ejecutar consultas desde aplicaciones de C#, haga lo siguiente:

1. Cree un nuevo proyecto de Aplicación para Windows llamado Query CS.

2. En el Formulario para Windows, agregue un control TextBox, un control Button y un control DataGridView. Establezca la propiedad MultiLine del TextBoxaTrue. Establezca la propiedad Text del control Button para Ejecutar SQL.

3. Haga doble clic en el control Button para generar un manejador de evento para su evento Click. Modifique el manejador de evento como se muestra abajo:

private void button1_Click(

object sender, EventArgs e) {

if (textBox1.TextLength > 0)

{ SelectData(textBox1.Text);

} }

4. Agregue el siguiente método a la clase. Asegúrese de cambiar la cadena de conexión para que coincida con la ruta local del archivo de la base de datos en su computadora:

private void SelectData(string selectCommandText) { try { // Cambie la cadena de conexión // para que coincide con su sistema. string selectConnection = @”Data Source=.\SQLEXPRESS;” + @”AttachDbFilename=” + @”c:\SqlSampleDB\NORTHWND.MDF;” + @”Integrated Security=True;” + @”Connect Timeout=30;User Instance=True”; SqlDataAdapter dataAdapter = new SqlDataAdapter( selectCommandText, selectConnection);

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 173: 98-361 Fundamentos de Desarrollo de Software

172 Lección 6

DataTable table = new DataTable(); dataAdapter.Fill(table); dataGridView1.DataSource = table; } catch (Exception ex) { MessageBox.Show(ex.Message); } }

5. Agregue la siguiente directiva using al código:

usingSystem.Data;

usingSystem.Data.SqlClient;

6. Seleccione Depurar y después Iniciar Depuración para ejecutar el proyecto. Introduzca una consulta SQL y haga clic en el control Button. Podrá ver la salida como se muestra en la Figura 6-7.

El código en este ejercicio implementa un método SelectData que inicializa un objeto SqlDataAdapter y lo utiliza para llenar un DataTable. El DataTable es entonces enlazado como una fuente de datos para el componente DataGridView. El objeto SqlDataAdapter actúa como una tubería entre SQL Server y el DataTable para recuperar datos. El método Fill cambia los datos en el DataTable para que coincidan los datos en la fuente de datos. El select CommandText es utilizado para identifcar los datos en la fuente de datos.

Seleccionar DatosLa sentencia SELECT es utilizada para recuperar datos desde una o más tablas de la base de datos.

La sentencia SELECT generalmente es de la siguiente forma:

SELECT lista_de_campos

FROM lista_de_tablas

Figura 6-7

Ejecutando consultas desde una aplicación de C#

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 174: 98-361 Fundamentos de Desarrollo de Software

173Comprender las Bases de Datos

WHERE clausula_where

GROUP BY agrupado_por_clausula

HAVING clausula_teniendo

ORDER BY clausula_ordenar_por

Cada una de estas líneas de código en la sentencia SELECT es llamada cláusula. El SELECT y FROM son requeridos y el resto son opcionales. Por ejemplo, está una sentencia SQL que contiene solo las clausulas requeridas:

SELECT OrderId, CustomerId

FROM Orders

Si desea enlistar todos los campos de la tabla, también puede utilizar el siguiente atajo en lugar de enlistar explícitamente todos los campos:

SELECT *

FROM Orders

También puede seleccionar información desde múltiples tablas, por ejemplo:

Select OrderId, Customers.CustomerId, ContactName

From Orders, Customers

Customers.CustomerId es llamado un nombre totalmente califcado, especifcando tanto el nombre de la tabla como el nombre del campo. Esto es necesario debido a que tanto la tabla Orders y la Customers incluyen este campo y necesita decirle al SQL Server a cuál desea referirse.

Si ejecuta esta consulta, obtendrá mucho más registros de los que podría haber esperado. Esto sucede debido a que aunque le dice a SQL Server cuales tablas incluir, no incluyó ninguna información para cómo relacionar esas tablas. Como resultado, SQL Server construye el resultado para que incluya todas las flas de la tabla Customer para cada fla de la tabla Orders. Este tipo de unión es llamado cross join y no es muy útil en este caso.

Una consulta más útil, por supuesto, coincidiría cada orden con su respectivo cliente. La palabra clave INNER JOIN puede ayudarle a llevar a cabo esto, como se muestra en la siguiente consulta:

SELECT OrderID, Customers.CustomerId, ContactName

FROM Orders INNER JOIN Customers

ON Orders.CustomerId = Customers.CustomerId

Esta consulta le dice a SQL Server que tome cada fla en la tabla Orders y que empate todas las flas en la tabla Customers en las cuales el CustomerId de la orden es igual al CustomerId del cliente. Debido a que CustomerId es único en la tabla Customers, esto es lo mismo que solo incluir una sola fla para cada orden en los resultados. En este caso, como resultado tendrá tantas flas como las hay en la tabla Orders.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 175: 98-361 Fundamentos de Desarrollo de Software

174 Lección 6

¿Pero y si desea ver solo algunas de las flas en la tabla? Puede utilizar una clausula WHERE. La cláusula WHERE evalúa a cada fla para una condición y decide si incluirla o no en los resultados. Por ejemplo:

SELECT *

FROM Orders

WHERE ShipCountry = ‘Canada’

Aquí la cláusula WHERE mira a cada fla en la tabla Orders para ver si ShipCountry tiene el valor exacto “Canadá”. Si lo tiene, la fla es incluida en los resultados, si no, la fla no es incluida en los resultados.

También puede combinar múltiples condiciones en una sola cláusula WHERE. Por ejemplo:

SELECT *

FROM Orders

WHERE (ShipCountry = ‘Canada’)

AND (OrderDate>= ‘01/01/97’)

AND (OrderDate<= ‘01/31/97’)

Aquí las condiciones WHERE fltran las órdenes donde ShipCountry es “Canadá” y la fecha de orden es en Enero de 1997.

Por defecto, SQL no garantiza que los resultados estén en un orden particular, sin embargo, puede utilizar la cláusula ORDER BY para garantizar que los datos son regresados en un orden particular. Por ejemplo, para enlistar las órdenes basadas en la fecha de orden puede utilizar la siguiente consulta:

SELECT *

FROM Orders

WHERE (ShipCountry = ‘Canada’)

AND (OrderDate>= ‘01/01/97’)

AND (OrderDate<= ‘01/31/97’)

ORDER BY OrderDate

Puede modifcar el tipo de orden utilizando ya sea la palabra clave ASC (para orden ascendente) o DESC (para orden descendiente). El tipo de orden por defecto es ascendente. La siguiente consulta enlista las órdenes más recientes en la parte superior:

SELECT *

FROM Orders

Tome Nota

El delimitador estándar para texto y fechas en SQL es una comilla simple.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 176: 98-361 Fundamentos de Desarrollo de Software

175Comprender las Bases de Datos

WHERE (ShipCountry = ‘Canada’)

AND (OrderDate>= ‘01/01/97’)

AND (OrderDate<= ‘01/31/97’)

ORDER BY OrderDate DESC

Es muy común para las aplicaciones de negocios el solicitar información agregada o resumida. Tales requerimientos pueden ser direccionados utilizando la cláusula GROUP BY y las funciones agregadas.

Por ejemplo, puede utilizar la siguiente consulta para encontrar a cuáles países está embarcando más en sus órdenes:

SELECT ShipCountry, COUNT (ShipCountry) AS OrderCount

FROM Orders

GROUP BY ShipCountry

ORDER BY OrderCount DESC

Esto mostrará el nombre del país seguido por el número total de órdenes que embarca a ese país. La cláusula ORDER BY ordena los resultados y ubica los países con más órdenes en la parte superior de la lista.

Puede pensar en la cláusula GROUP BY como creador de “buckets”, en este caso uno para cada país. Conforme cada motor de base de datos examina cada registro, lo coloca en el bucket apropiado. Después de que este proceso es llevado a cabo, el motor de base de datos cuenta el número de registros que terminaron en cada bucket y genera una fla para cada uno. La Figura 6-8 muestra el inicio de los resultados de esta consulta.

Figura 6-8

Resumiendo información utilizando la cláusula GROUP BY

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 177: 98-361 Fundamentos de Desarrollo de Software

176 Lección 6

En la sentencia SQL previa, Count es una función agregada, una función que retorna un resultado basado en un grupo de flas. T-SQL soporta un número de funciones agregadas. Aquí hay algunos de los más comunes:

• Count: Retorna el número de registros.

• Sum: Valor total en una columna dada.

• Avg: Valor promedio en una columna dada.

• Min: Valor más pequeño en una columna dada.

• Max: Valor más grande en una columna dada.

Actualizar datosLa sentencia UPDATE es utilizada para actualizar datos en las tablas de la base de datos.

Otra sentencia SQL muy útil es la sentencia UPDATE. El propósito de una sentencia UPDATE es actualizar o modifcar datos. Por ejemplo, puede actualizar un campo en un registro en la tabla Customers utilizando esta consulta:

UPDATE Customers

SET ContactName = ‘Maria Anderson’

WHERE CustomerId = ‘ALFKI’

En esta consulta, la palabra clave SET le dice a SQL Server cuales columnas actualizar y la palabra clave WHERE le dice cuales flas actualizar. En la tabla Customers, el CustomerId es una clave principal y únicamente identifca a una sola fla. De manera que esta sentencia update puede actualizar a lo mucho una fla.

No está limitado a actualizar un solo registro. Si la cláusula WHERE selecciona múltiples registros, todos los registros serán actualizados:

UPDATE Customers

SET Country = ‘United States’

WHERE Country = ‘USA’

También puede actualizar más de un campo a la vez con la sentencia UPDATE:

UPDATE Customers

SET ContactName = ‘Maria Anderson’,

CITY = ‘Tokyo’

WHERE CustomerId = ‘ALFKI’

Tome Nota

En una sentencia UPDATE la cláusula SET es requerida y puede ser especificada solo una vez.

Tome Nota

Es altamente recomendado que revise la cláusula WHERE para cada sentencia UPDATE. Si no es cuidadoso, podría actualizar datos de más filas de las que desea.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 178: 98-361 Fundamentos de Desarrollo de Software

177Comprender las Bases de Datos

Insertar DatosLa sentencia INSERT es utilizada para agregar una o más flas a la tabla de la base de datos.

La sentencia INSERT enlista los campos para una tabla objetivo seguido por un conjunto de valores para insertar en esos campos. Por ejemplo, la siguiente sentencia INSERT inserta una fla en la tabla OrderDetails:

INSERT INTO [Order Details]

(OrderId, ProductId, UnitPrice, Quantity, Discount)

VALUES (10248, 2, 19.00, 2, 0)

Se requieren corchetes cuando el nombre de las tablas o campos contienen espacios. Aquí, el primer conjunto de paréntesis tienen una lista de columna y el Segundo conjunto mantiene el valor a insertar. Si un campo tiene un valor por defecto, puede ser nulo o es un campo de entidad, puede dejarlo fuera de la lista de campos, como en el siguiente ejemplo:

INSERT INTO [Order Details]

(OrderId, ProductId, UnitPrice, Quantity)

VALUES (10249, 2, 19.00, 2)

Esto funciona, aunque no fue especifcado, un valor para el campo Discount. También, puede reordenar esta lista de campos mientras que reordene la lista de valores para que coincidan:

INSERT INTO [Order Details]

(ProductId, OrderId, UnitPrice, Quantity)

VALUES (2, 10250, 19.00, 2)

La sentencia INSERT no está limitada a insertar un solo registro. Hay un segundo formato que inserta los resultados de una sentencia SELECT en una determinada tabla. Por ejemplo, esa consulta inserta un producto para cada proveedor en la tabla Products:

INSERT INTO Products

(SupplierId, ProductName, CategoryId)

SELECT SupplierId, ‘Almond’, 7

FROM Suppliers

Esto funciona construyendo los resultados de la sentencia SELECT y luego poniendo cada fla retornada por la sentencia SELECT en una tabla determinada. Por supuesto, las columnas aun necesitan coincidir apropiadamente.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 179: 98-361 Fundamentos de Desarrollo de Software

178 Lección 6

Eliminar datosLa sentencia DELETE es utilizada para mover datos desde tablas de bases de datos.

La sentencia DELETE remueve datos de una tabla. Con el fn de practicar y evitar eliminar alguna información de la misma base de datos, puede copiar una tabla utilizando una sentencia SELECT tal como:

SELECT * INTO CustomersCopy

FROM Customers

Esta sentencia selecciona todos los registros de la tabla Customers y los copia en una nueva tabla llamada Customers Copy.

Para eliminar una sola fla de datos de la tabla CustomersCopy, puede utilizar la siguiente sentencia DELETE:

DELETE FROM CustomersCopy

WHERE CustomerId = ‘ALFKI’

Sea cuidadoso: si omite la cláusula WHERE, eliminara toda la información de la tabla:

DELETE FROM CustomersCopy

Trabajar con procedimientos almacenadosUn procedimiento almacenado es un conjunto de sentencias SQL que es almacenado en la base de datos. Los procedimientos almacenados son nombrados y pueden ser utilizados por múltiples aplicaciones.

En contraste con las consultas ad-hoc, los procedimientos almacenados son consultas almacenadas permanentemente en el SQL Server. En muchas maneras, puede pensar en un procedimiento almacenado como un SQL equivalente a un método C#.

Los procedimientos almacenados tienen dos benefcios principales, primero, los puede utilizar para guardar sentencias SQL complejas para ejecuciones futuras. Segundo, SQL Server compila los procedimientos almacenados de forma que se ejecutan más rápido que las consultas ad-hoc. En esta sección, aprenderá cómo crear y ejecutar procedimientos almacenados.

Crear y Ejecutar un procedimiento almacenadoEl comando CREATE PROCEDURE puede ser utilizado para crear un nuevo procedimiento almacenado.

Puede utilizar la palabra clave CREATE PROCEDURE de T-SQL para crear un procedimiento almacenado. Puede ejecutar la sentencia CREATEPROCEDURE desde cualquier interfaz que le permita introducir y ejecutar T-SQL.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 180: 98-361 Fundamentos de Desarrollo de Software

179Comprender las Bases de Datos

Æ Crear un procedimiento almacenado desde visual studio

PREPÁRESE. Para crear un procedimiento almacenado desde Visual Studio, haga lo siguiente:

1. Abra el Explorador de Servidores y seleccione la base de datos de Northwind. Haga clic derecho en el nodo de Procedimientos Almacenados y seleccione la opción Agregar Nuevo Procedimiento Almacenado.

2. En el diseñador de procedimiento almacenado, remplace el texto repetitivo con el siguiente código:

CREATE PROCEDURE GetCustomersFromFrance

AS

SELECT * FROM Customers

Where Country = ‘France’

RETURN

3. Guarde el procedimiento almacenado. El procedimiento almacenado ahora es agregado a la base de datos.

4. Para ejecutar un procedimiento almacenado, haga clic en el procedimiento almacenado en el Explorador de Servidores y seleccione Ejecutar. El resultado del procedimiento almacenado es visualizado en la ventana de salida.

5. También puede ejecutar este procedimiento almacenado desde el proyecto QueryCS que creó antes. En lugar de una sentencia SQL, solo teclee el nombre del procedimiento almacenado y presione el botón Ejecutar SQL. El resultado del procedimiento almacenado es visualizado en el Formulario de Windows.

Trabajar con procedimientos almacenados parametrizadosLos procedimientos almacenados parametrizados le permiten pasar argumentos de tiempo de ejecución a SQL Server.

La habilidad de pasar parámetros incrementa signifcativamente el poder de los procedimientos almacenados. El valor del parámetro puede ser proporcionado en tiempo de ejecución para los procedimientos almacenados.

Considere que desea encontrar las ventas totales para cierto cliente en la base de datos de Northwind. Debería ser capaz de especifcar el CustomerId en tiempo de ejecución.

Æ Crear un procedimiento almacenado parametrizado

PREPÁRESE. Para crear un procedimiento almacenado parametrizado, haga lo siguiente:

1. Abra el Explorador de Servidores y seleccione la base de datos de Northwind. Haga clic derecho en el nodo de Procedimientos Almacenados y seleccione la opción Agregar Nuevo Procedimiento Almacenado.

2. En el diseñador de procedimiento almacenado, remplace el texto repetitivo con el siguiente código:

Tome Nota

Puede utilizar la sentencia ALTER PROCEDURE para modificar la definición de un procedimiento almacenado existente.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 181: 98-361 Fundamentos de Desarrollo de Software

180 Lección 6

CREATE PROCEDURE dbo.GetCustomerSales

(

@CustomerIdchar(5),

@TotalSales money OUTPUT

)

AS

SELECT @TotalSales = SUM(Quantity * UnitPrice)

FROM (Customers INNER JOIN Orders

ON Customers.CustomerId = Orders.CustomerId)

INNER JOIN [Order Details]

ON Orders.OrderId = [Order Details].OrderId

WHERE Customers.CustomerId = @CustomerId

RETURN

3. Guarde el procedimiento almacenado. El procedimiento almacenado ahora es agregado a la base de dados.

En este procedimiento almacenado, tanto @CustomerId y @TotalSales son parámetros. @CustomerId es un parámetro de entrada, debe proporcionar este parámetro cuando ejecuta el procedimiento almacenado. @TotalSales es un parámetro de salida, retorna un valor del procedimiento almacenado. Cuando ejecuta este procedimiento almacenado desde Visual Studio, obtiene un cuadro de diálogo que le pide que introduzca el valor para todos los parámetros, como se muestra en la Figura 6-9.

Figura 6-9

El cuadro de diálogo Ejecutar procedimiento almacenado aparece para los valores del parámetro

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 182: 98-361 Fundamentos de Desarrollo de Software

181Comprender las Bases de Datos

Para ejecutar este procedimiento almacenado, introduzca ALFKI como el valor para @CustomerId e introduzca NULL como el valor para @TotalSales. Cuando presiona el botón OK, el valor calculado del parámetro de salida, @TotalSales, es visualizado en la ventana de Salida.

No puede, sin embargo, ejecutar un procedimiento almacenado desde el proyecto QueryCS, ya que el código no puede aceptar parámetros.

Æ Ejecutar procedimientos almacenados parametrizados desde C#

PREPÁRESE. Para ejecutar procedimientos almacenados parametrizados desde C#, desempeñe las siguientes tareas:

1. Cree un nuevo proyecto de Aplicación para Windows llamado ParameterizedSP.

2. Ubique dos controles Label (label1 y TotalSalesLabel), un TextBox (CustomerIdTextBox) y un Button (GetTotalSalesButton) y ordene los controles como se muestra en la Figura 6-10.

3. Haga doble clic en el control Button para generar un manejador de evento para su evento Click. Modifique el manejador de evento como se muestra abajo:

private void GetTotalSalesButton_Click(

object sender, EventArgs e)

{

TotalSalesLabel.Text = String.Format(

“Total Sales: {0}”,

GetTotalSales(CustomerIdTextBox.Text));

}

4. Agregue el siguiente método a la clase. Asegúrese de cambiar la cadena de conexión para que coincida con la ruta local del archivo de la base de datos en su computadora:

private double GetTotalSales(string customerId)

{

doubletotalSales = -1;

try

{

// Cambia el string de conexión

// para coincidir con su sistema.

stringconnectionString =

@”Data Source=.\SQLEXPRESS;” +

@”AttachDbFilename=” +

@”c:\SqlSampleDB\NORTHWND.MDF;” +

@”Integrated Security=True;” +

@”Connect Timeout=30;User Instance=True”;

SqlConnection connection =

newSqlConnection(connectionString);

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 183: 98-361 Fundamentos de Desarrollo de Software

182 Lección 6

SqlCommand command =

connection.CreateCommand();

command.CommandType =

CommandType.StoredProcedure;

command.CommandText = “GetCustomerSales”;

command.Parameters.AddWithValue(

“@CustomerId”, customerId);

command.Parameters.AddWithValue(

“@TotalSales”, null);

command.Parameters[“@TotalSales”].DbType

= DbType.Currency;

command.Parameters[“@TotalSales”].Direction

= ParameterDirection.Output;

connection.Open();

command.ExecuteNonQuery();

totalSales = Double.Parse(

command.Parameters[“@TotalSales”]

.Value.ToString());

connection.Close();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

returntotalSales;

}

5. Agregue la siguiente directiva using al código:

usingSystem.Data; using System.Data.SqlClient;

6. Seleccione Depurar, Iniciar Depuración para ejecutar el proyecto. Introduzca un CustomerId válido. Podrá ver la salida como se muestra en la Figura 6-10.

Figura 6-10

Ejecutando procedimientos almacenados parametrizados desde una aplicación de C#

Tome Nota

Si agrega una nueva fila a la tabla con una columna de identidad, puede utilizar la variable de SQL Server @@IDENTITY para recuperar el valor de la columna de identidad para la fila recién creada.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 184: 98-361 Fundamentos de Desarrollo de Software

183Comprender las Bases de Datos

En el código, los parámetros son representados por objetos SqlParameter. El código funciona estableciendo el valor para el parámetro @CustomerId, ejecutando el objeto SqlCommand correspondiente al procedimiento almacenado y luego recuperando la propiedad Value del parámetroTotalSales.

El código previo tiene las siguientes líneas:

connection.Open();

command.ExecuteNonQuery();

totalSales = Double.Parse(

command.Parameters[“@TotalSales”]

.Value.ToString());

connection.Close();

Aquí, primero abre la conexión a la base de datos, haga lo que necesite hacer con la conexión y entonces fnalmente cierre la conexión. El objeto que mantiene las referencias de la conexión a la base de datos utiliza muchos recursos de sistema y es un recurso costoso. De forma que, se recomienda que cierre este objeto tan pronto como acabe de utilizarlo. Si no cierra la conexión está creando una falta de memoria en el programa que podría impactar su desempeño.

C# también le da una sentencia using que ayuda a garantizar que los objetos costosos tales como las conexiones a bases de datos son automáticamente cerradas cuando recién acaba de trabajar con ellas.

Esta es una versión alternativa al código de arriba que hace uso de la sentencia using para cerrar automáticamente la conexión a la base de datos.

// deshechar objetos con la sentencia using

using (connection)

{

connection.Open();

command.ExecuteNonQuery();

totalSales = Double.Parse(

command.Parameters[“@TotalSales”]

.Value.ToString());

}

La sentencia using defne un alcance para el objeto de la conexión, cuando el código alcanza el fn del alcance, el objeto de la conexión es cerrado automáticamente y todos los recursos son liberados.

Tome Nota

El objeto utilizado con la sentencia using

debe implementar la interfaz de IDisposable.

; ¿Listo para la certificación?

¿Comprende los distintos métodos de consulta de bases de datos? — USD 6.2

; ¿Listo para la certificación?

¿Comprende los métodos de conexión a bases de datos? — USD 6.3

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 185: 98-361 Fundamentos de Desarrollo de Software

184 Lección 6

� Comprender los métodos de conexión a bases de

datos

È EN RESUMEN

Las aplicaciones de negocios pueden necesitar trabajar con datos en varios formatos. También puede necesitar trabajar con datos almacenados dentro de archivos planos, archivos XML y objetos en memoria.

El .NET Framework proporciona clases que son optimizadas para trabajar con archivos planos, archivos XML y objetos en memoria. La información almacenada dentro de archivos planos puede ser manejada utilizando las clases en el espacio de nombre de System.IO. Para trabajar con datos XML, las clases en el espacio de nombres de System.Xml pueden ser utilizadas. Finalmente, para trabajar con objetos tales como un DataSet, se utilizan clases del espacio de nombres de System.Data. Aprenderá más acerca de cómo trabajar con cada uno de estos formatos en las siguientes secciones.

Trabajar con Archivos PlanosUn archivo plano es como una tabla de una base de datos que esta almacenada dentro de un archivo de disco stand-alone.

Un archivo plano generalmente contiene una fla de datos por línea y las columnas son separadas por delimitadores tales como comas o tiene una longitud fja. Los datos en el archivo plano pueden ser texto plano o binario. Estos archivos son llamados archivos planos para distinguirlos de formularios más estructurados de almacenamiento tales como bases de datos relacionales y archivos XML.

Históricamente, antes de la llegada de las bases de datos modernas, los archivos planos eran muy populares para almacenar y organizar información. Los archivos planos aún son útiles pero sólo en casos limitados en lugar de bases de datos con propósitos generales. Algunos de los lugares donde se utilizan los archivos planos son en un sistema operativo o archivos de confguración de aplicación, cuando se transfere información a sistemas remotos y cuando se migran datos entre sistemas no compatibles.

La entrada y salida con base en archivos en el .NET Framework gira en torno al concepto de streams y backingstore.

Un stream es un fujo de datos en bruto. Un almacén de respaldo es la fuente o destino de un stream. Un almacén de respaldo podría ser cualquier cosa tal como un archivo de disco, memoria, conexión de red, etc. Puede encontrar clases para trabajar con streams y almacenes de respaldo en el espacio de nombres de System.IO.

Los archivos planos pueden ser datos ya sea en formato de texto plano o en formato binario. Los archivos de texto a menudo son organizados como líneas de texto separadas por caracteres de fn de línea. Las clases StreamReader y StreamWriter le proporcionan una manera sencilla de manipular tales archivos de texto.

Los archivos binarios almacenan su contenido como una secuencia de bytes. Aunque los archivos binarios no son legibles por el humano como los archivos de texto, son capaces de almacenar diferente variedad de datos tales como imágenes, sonidos, video, etc. Siempre necesitará un programa de computadora para interpretar el contenido de un archivo

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 186: 98-361 Fundamentos de Desarrollo de Software

185Comprender las Bases de Datos

binario. Las BinaryReader y BinaryWriter le proporcionan una manera sencilla para manipular los archivos binarios.

En el siguiente ejercicio seleccione las columnas de la tabla Customers y las escribe en un archivo de texto. Después abre el archivo de texto y visualiza su contenido en la ventana de Consola.

Æ Leer de y escribir a un archivo de texto

PREPÁRESE. Para leer de y escribir un archivo de texto, haga lo siguiente:

1. Cree un nuevo proyecto de Aplicación de Consola llamado WorkingWithTextFiles.

2. Agregue el siguiente código a la clase Program. Necesitará corregir la ruta de su base de datos de Northwind en el código:

static void Main(string[] args)

{

stringmyDocumentsPath =

Environment.GetFolderPath(

Environment.SpecialFolder.MyDocuments);

CopyDataToTextFile(myDocumentsPath

+ @”\CustomerList.txt”);

DisplayTextFile(myDocumentsPath

+ @”\CustomerList.txt”);

}

static private void CopyDataToTextFile(

stringfleName)

{

try

{

// Cambia elstring de conexión

// para coincidir con su sustema.

stringconnectionString =

@”Data Source=.\SQLEXPRESS;” +

@”AttachDbFilename=” +

@”c:\SqlSampleDB\NORTHWND.MDF;” +

@”Integrated Security=True;” +

@”Connect Timeout=30;User Instance=True”;

SqlConnection connection =

newSqlConnection(connectionString);

SqlCommand command =

connection.CreateCommand();

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 187: 98-361 Fundamentos de Desarrollo de Software

186 Lección 6

command.CommandText =

“SELECT CustomerId, CompanyName, “

+ “ContactName, Phone FROM Customers”;

using (connection)

{

connection.Open();

SqlDataReader reader =

command.ExecuteReader();

using (StreamWritersw =

newStreamWriter(fleName))

{

while (reader.Read())

{

stringcustomerRow =

String.Format(“{0}, {1}, {2}, {3}”,

reader.GetValue(0),

reader.GetValue(1),

reader.GetValue(2),

reader.GetValue(3));

sw.WriteLine(customerRow);

}

}

}

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

}

static void DisplayTextFile(string fleName)

{

try

{

using (StreamReadersr =

newStreamReader(fleName))

{

string line;

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 188: 98-361 Fundamentos de Desarrollo de Software

187Comprender las Bases de Datos

while ((line = sr.ReadLine()) != null)

{

Console.WriteLine(line);

}

}

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

}

3. Agregue la siguiente directiva using a su código:

usingSystem.Data.SqlClient;

using System.IO;

4. Genere y ejecute el programa, Verifique la carpeta Mis Documentos por el archivoCustomerList.txt y verifique que los datos del cliente han sido escritos. También verifique la salida en la ventana de Consola contra el contenido del archivo.

El código en este ejercicio primero abre una nuevo objeto StreamWriter y llama a su método WriteLine varias veces para escribir el texto al archivo de texto. Luego crea un objeto StreamReader para leer el texto desde el archivo que ha sido creado utilizando el método ReadLine. Cuando ya no hay datos por leer, el objeto ReadLine retornará un valor nulo. El código utiliza este hecho para determinar cuándo terminar de leer desde el archivo de texto.

Trabajar con XMLXML (Lenguaje de Etiquetado Extensible) es un formato basado en texto para la representación de datos estructurados.

En XML, puede almacenar tanto datos y metadatos (información acerca de los datos almacenados). Por ejemplo, este es un poco de XML que representa datos para dos clientes:

<?xml version=”1.0” encoding=”utf-8”?>

<!--Customer List-->

<Customers>

<Customer Id=”ALFKI”>

<CompanyName>AlfredsFutterkiste</CompanyName>

<Phone>030-0074321</Phone>

</Customer>

<Customer Id=”EASTC”>

<CompanyName>Eastern Connection</CompanyName>

<Phone>(171) 555-0297</Phone>

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 189: 98-361 Fundamentos de Desarrollo de Software

188 Lección 6

</Customer>

</Customers>

Aun sin saber nada acerca de XML, puede comprender el contenido de este archivo solo mirándolo. XML consiste de etiquetas (contenidas dentro de paréntesis) y datos. Las etiquetas siempre aparecen en pares, con una de apertura y una de cierre. Por ejemplo, <Customers> es una etiqueta de apertura y </Customers> es una de cierre.

La primera línea de un documento XML es la declaración XML:

<?xmlversion=”1.0” encoding=”utf-8”?>

Las etiquetas XML que empiezan con los caracteres <? Son llamados instrucciones

de procesamiento. Esta instrucción de procesamiento no dice que el documento es un documento XML, que se ajusta a las especifcaciones de XML versión 1.0 y utiliza el conjunto de caracteres UTF-8 para sus elementos de datos.

Las etiquetas de apertura y de cierre con su contenido se conocen cada una como elemento. Por ejemplo, este es un elemento XML simple del documento de arriba:

<Phone>030-0074321</Phone>

Esto defne un elemento con el nombre Phone cuyo valor es 030-0074321. Los elementos pueden ser anidados y no se pueden sobreponer. Por ejemplo, el siguiente XML es inválido debido a la superposición entre los elementos CompanyName y Phone:

<Customer Id=”EASTC”>

<CompanyName>Eastern Connection<Phone>

</Phone>(171) 555-0297</CompanyName>

</Customer>

</Customers>

Los documentos XML son jerárquicos por naturaleza. Cada documento XML contiene un solo elemento raíz que contiene todo los otros nodos. Un documento XML puede ser visualizado como un árbol de nodos.

Los elementos pueden contener atributos. Un atributo es una pieza de información que además describe un elemento:

<Customer Id=”ALFKI”>

Aquí el elemento Customer incluye un atributo cuyo nombre es Id y cuyo valor es ALFKI.

Finalmente, un documento XML puede contener comentarios. Los comentarios inician con los caracteres <!—y terminan con los caracteres-->.

XML puede ser más complejo de lo discutido en esta sección. Pero estas bases son sufcientes para que comprenda la mayoría de los documentos XML que es probable que se encuentre hasta que inicie a trabajar con XML a profundidad.

Hay muchas maneras en las cuales puede trabajar con información XML. Las clases para trabajar con información XML están organizadas en el espacio de nombres de System.Xml. Esta lección se enfoca en las siguientes clases utilizadas comúnmente:

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 190: 98-361 Fundamentos de Desarrollo de Software

189Comprender las Bases de Datos

• XmlReaderyXmlWriter: Estas clases proporcionan una manera rápida, sin entrar a cache y solo hacia adelante para leer o escribir datos XML.

• XmlDocument: Esta clase es una representación en memoria de datos XML y permite la navegación y edición del documento XML.

En el siguiente ejercicio utilice la clase XmlReader para leer un archivo XML llamado Customers.xml de una manera secuencial y solo hacia adelante:

Æ Leer desde un Archivo XML

PREPÁRESE. Para leer desde un archivo XML, haga lo siguiente:

1. Cree un nuevo proyecto de Aplicación de Consola llamado WorkingWithXmlReader.

2. Agregue el siguiente código al método Main de la clase Program:

using (XmlReader reader =

XmlReader.Create(“Customers.xml”))

{

while (reader.Read())

{

if (reader.IsStartElement())

{

switch (reader.Name)

{

case “CompanyName”:

if (reader.Read())

{

Console.Write(

“Company Name: {0}, “,

reader.Value);

}

break;

case “Phone”:

if (reader.Read())

{

Console.WriteLine(

“Phone: {0}”, reader.Value);

}

break;

}

}

}

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 191: 98-361 Fundamentos de Desarrollo de Software

190 Lección 6

}

3. Necesitará agregar la siguiente directiva using al programa:

usingSystem.Xml;

4. Agregue un nuevo archivo XML llamado Customers.xml al proyecto. Asegúrese que el archivo XML contiene la siguiente información:

<?xmlversion=”1.0” encoding=”utf-8”?>

<!--CustomerList-->

<Customers>

<Customer Id=”ALFKI”>

<CompanyName>AlfredsFutterkiste</CompanyName>

<Phone>030-0074321</Phone>

</Customer>

<Customer Id=”EASTC”>

<CompanyName>Eastern Connection</CompanyName>

<Phone>(171) 555-0297</Phone>

</Customer>

</Customers>

5. Genere el programa. Copie el archivo Customers.xml a la carpeta del programa ejecutable. Ejecute el programa, se mostrará una lista de todos los nombres de compañías y sus números telefónicos.

El código en este ejercicio primero crea una nueva instancia de XmlReader utilizando el método XmlReader.Create. Esto lanzara una excepción si el archivo no es encontrado. Este programa se terminará cuando el método XmlReader.Read no tenga nada por leer. Puede utilizar las propiedades tales como Name y Value para acceder a varias porciones de XML.

Trabajar con DataSetEl XML (Lenguaje de Etiquetado Extensible) es un formato basado en texto para la representación de datos estructurados.

Un DataSet es una representación en memoria de datos relacionales. Justo como una base de datos, un DataSet puede tener tablas, relaciones y restricciones de integridad de datos como las restricciones únicas y las restricciones de clave foránea. Un DataSet es generalmente creado recuperando información desde una fuente de datos tal como una base de datos. Una vez que ha creado un DataSet, puede trabajar con toda la información en el DataSet aun cuando el enlace a la fuente de datos no está disponible temporalmente. Cuando hay cambios en los datos, solo la copia en memoria de los datos es actualizada. La conexión a la fuente de datos es necesaria solo cuando es tiempo de actualizar la fuente de datos con los cambios del DataSet. El DataSet es muy útil para la creación de aplicaciones

desconectadas. Las aplicaciones desconectadas son aplicaciones que pueden continuar funcionando sin una conexión constante a recursos de red tal como una base de datos.

Todas las clases relacionadas con el DataSet son parte del espacio de nombres de System.Data. Un objeto DataSet es creado utilizando la clase DataSet. El DataSet consiste de una

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 192: 98-361 Fundamentos de Desarrollo de Software

191Comprender las Bases de Datos

colección de objetos DataTable. Un DataTable es justo como una tabla de una base de datos relacional. Un objeto DataTable tiene una colección de objetos DataColumn que representan las columnas en la tabla. Las flas en el DataTable son representadas por la colección DataRow.

El DataAdapter actúa como un Puente entre la fuente de datos y el DataSet. El DataAdapter almacena la conexión de datos y los comandos de datos necesarios para conectarse a la fuente de datos. El DataAdapter también proporciona comandos para la recuperación de datos desde la fuente de datos y comandos para la actualización de la fuente de datos con cualquier cambio.

El .NET Framework proporciona tres tipos de clases DataAdapter para trabajar con distintos tipos de Fuentes de datos:

• La clase OdbcDataAdapter es utilizada para trabajar con fuentes de datos ODBC. La clase OdbcDataAdapter es parte del espacio de nombres de System.Data.Odbc.

• La clase OleDbDataAdapter es utilizada para trabajar con fuentes de datos OLEDB. La clase OleDbDataAdapter es parte del espacio de nombres de System.Data.OleDb.

• La clase SqlDataAdapter es utilizada para trabajar con una base de datos de SQL Server. La clase SQLDataAdapter es parte del espacio de nombres de System.Data.SqlClient.

• dbcAdapteryOleDbAdapter. Sin embargo, la clase SQLDataAdapteres optimizada para SQL Server. Por lo tanto, cuando se trabaja con SQL Server, es preferible utilizar la claseSQLDataAdapter.

En una aplicación típica que crea y actualiza un DataSet, tendrá los siguientes pasos:

1. Generar y llenar cada DataTable en el DataSet con datos de la fuente de datos utilizando un DataAdapter.

2. Cambiar los datos en los objetos DataTable individuales agregando, actualizando o eliminando objetos DataRow.

3. Invocar el método AcceptChanges en el DataSet. Este método conecta a las fuentes de datos originales y las actualiza con todos los cambios hechos en el DataSet desde que fue cargado o desde la última vez que AcceptChanges fue llamado. Alternativamente, puede llamar al método RejectChanges para cancelar todos los cambios que fueron hechos al DataSet desde que fue cargado o desde la última vez que AcceptChanges fue llamado.

En el siguiente ejercicio utilice las clases discutidas hasta ahora para leer datos desde la base de datos de SQL Server de Northwind en un DataSet y luego iterar sobre la tabla Customer para visualizar el número de órdenes para cada cliente.

Æ Leer un objeto DataSet en memoria

PREPÁRESE. Para leer desde un objeto DataSet en memoria, haga lo siguiente:

1. Cree un nuevo proyecto de Aplicación de Consola llamado WorkingWithDataSet.

2. Remplace el código en la clase Program con el siguiente código. Asegúrese de cambiar la cadena de conexión para que coincida con la ruta local del archivo de la base de datos en su computadora:

static void Main(string[] args) {

Tome Nota

También se puede conectar a una base de datos de SQL Server utilizando las clases

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 193: 98-361 Fundamentos de Desarrollo de Software

192 Lección 6

WorkingWithDataSet(); } static void WorkingWithDataSet() { string cString = @”Data Source=.\SQLEXPRESS;”

+ @”AttachDbFilename=B:\SqlSampleDB\NORTHWND.MDF;”

+ “Integrated Security=True;”

+ “Connect Timeout=30;User Instance=True”;

SqlConnection northwindConnection = new SqlConnection(cString); string customerCommandText = “SELECT * FROM Customers”; SqlDataAdapter customerAdapter = new SqlDataAdapter( customerCommandText, northwindConnection); string ordersCommandText =

“SELECT * FROM Orders”; SqlDataAdapter ordersAdapter = new SqlDataAdapter( ordersCommandText, northwindConnection); DataSet customerOrders = new DataSet(); customerAdapter.Fill(

customerOrders, “Customers”); ordersAdapter.Fill(

customerOrders, “Orders”); DataRelation relation = customerOrders.Relations.Add(“CustomerOrders”, customerOrders.Tables[“Customers”] .Columns[“CustomerID”], customerOrders.Tables[“Orders”] .Columns[“CustomerID”]); foreach (DataRow customerRow in customerOrders.Tables[“Customers”].Rows) { Console.WriteLine(customerRow[“CustomerID”]); foreach (DataRow orderRow in customerRow.GetChildRows(relation)) Console.WriteLine(“\t” +

orderRow[“OrderID”]); }

Console.WriteLine(

“Press any key to continue...”);

Console.ReadKey(); }

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 194: 98-361 Fundamentos de Desarrollo de Software

193Comprender las Bases de Datos

3. Necesitará agregar la siguiente directiva using al programa:

usingSystem.Data;

usingSystem.Data.SqlClient;

4. Seleccione Proyecto, posteriormente configure como Startup Project para hacer que el proyecto sea el inicial para esta solución.

5. Seleccione Depurar y después Iniciar Depuración (o presione F5) para ejecutar el programa. Notará que la ventana de consola enlista todos los clientes de la tabla Customers. Cada CustomerID es seguido por el OrderID correspondiente a ese cliente.

El código en este ejercicio primero crea un DataSet con dos objetos DataTable, Customers y Orders. El DataSet también crea un objeto DataRelation que establece la relación entre la tabla Customers y la tabla Orders en la columna CustomerID. Esta relación le permite llamar al método GetChildRow en una fla de cliente para recuperar las flas de las órdenes correspondientes a cada cliente.

Tome Nota

Un DataSet puede leer y escribir datos como documentos XML. Para escribir datos como XML, utilice el método WriteXmlde la clase DataSet. Para leer un documento de datos XML, puede utilizar el método ReadXml de la clase DataSet.

; ¿Listo para la certificación?

¿Comprende los distintos métodos de conexión a bases de datos? — USD 6.3

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 195: 98-361 Fundamentos de Desarrollo de Software

194 Lección 6

Resumen de Habilidades

En esta lección aprendió:

• Las características y capacidades de un sistema de administración de base de datos.

• El proceso del diseño de una base de datos, cómo crear diagramas entidad - relación y las reglas de normalización.

• Las bases de SQL (lenguaje de consulta estructurado). Aprendió cómo crear consultas SELECT, INSERT, UPDATE y DELETE. También aprendió cómo crear procedimientos almacenados y cómo acceder a consultas SQL y procedimientos almacenados desde un programa de C#.

• Cómo conectarse a archivos planos y a archivos XML para acceder y manipular datos en algunas Fuentes de datos no relacionales.

• Cómo trabajar con objetos de datos en memoria utilizando las clases DataSet y DataAdapter.

» Evaluación de Conocimientos

Llene los espacios en blanco

Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los

espacios proporcionados.

1. Con el fn de que una tabla esté en la _________________, ninguna de las columnas debe tener valores múltiples en la misma fla de datos.

2. La _______________requiere que todas las columnas que no son clave sean funcionalmente dependientes de toda la clave principal.

3. La _______________requiere que no haya dependencia funcional entre los atributos que no son clave.

4. Los bloques de construcción básicos para un diagrama entidad - relación son _______________, _______________ y_______________.

5. La cláusula _______________en una sentencia SELECT evalúa cada fla para una condición y decide si incluirlos o no en el conjunto de resultados.

6. El objeto utilizado con la sentencia using debe implementar la interfaz_______________.

7. La sentencia _______________de T-SQL puede ser utilizada para crear un procedimiento almacenado.

8. En el proceso de _______________, aplica un conjunto de reglas para garantizar que su diseño de base de datos ayuda con la integridad de datos y es fácil de administrar en el futuro.

9. Encuentra clases para trabajar con streams y almacenes de respaldo en el espacio de nombres de _______________.

10. El formato ____________ es una representación de datos jerárquica.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 196: 98-361 Fundamentos de Desarrollo de Software

195Comprender los conceptos básicos de bases de datos

Opción Múltiple

Encierre en un círculo la letra que corresponda a la mejor respuesta.

1. Su aplicación necesita almacenar la imagen del producto hacia un archivo en disco. Le gustaría minimizar el tamaño del archivo de disco. ¿Cuál de los objetos debe utilizar para escribir el archivo?

a. FileStream

b. StreamWriter

c. BinaryWriter

d. XmlWriter

2. Su programa de C# necesita retornar el número total de clientes en una base de datos. El programa será utilizado varias veces al día. ¿Cuál es la manera más rápida de retornar esta información desde su programa?

a. Escribir una consulta SQL y utilizar el método SqlCommand.ExecuteScalar para ejecutar la consulta SQL.

b. Crear un procedimiento almacenado que retorne el número total de clientes. Utilizar el método SqlCommand.ExecuteScalar para ejecutar el procedimiento almacenado.

c. Escribir una consulta SQL y utilizar el método SqlDataAdapter.Fill para ejecutar la consulta SQL.

d. Crear un procedimiento almacenado para retornar el número total de cliente. Utilizar el método SqlDataAdapter.Fill para ejecutar el procedimiento almacenado.

3. Necesita modifcar los registros de la tabla Productsy marcar productos como Descontinuados. Sin embargo, necesita hacer esto solo cuando tanto UnitsInStock y UnitsOnOrder son cero. ¿Cuál de las siguientes sentencias SQL debe utilizar?

a. INSERT

b. SELECT

c. UPDATE

d. DELETE

4. Necesita actualizar los campos de Región para los clientes de Japón. Escribe la siguiente sentencia SQL UPDATE:

UPDATE Customers

SET Region = ‘EastAsia’

5. Prueba la consulta en una base de datos de prueba y encuentra que se afectan más registros de lo esperado. Necesita corregir la sentencia SQL. ¿Qué debe hacer?

a. Agregar una clausula WHERE a la sentencia UPDATE.

b. Agregar una clausula SET adicional a la sentencia UPDATE.

c. Agregar una clausula GROUP BY a la sentencia UPDATE.

d. Agregar una clausula HAVING a la sentencia UPDATE.

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 197: 98-361 Fundamentos de Desarrollo de Software

196 Lección 6

6. Está desarrollando una aplicación que necesita recuperar una lista de clientes desde una base de datos de SQL Server. La aplicación debería moverse a través de la lista secuencialmente una vez, procesar cada registro de cliente. ¿Cuál de las siguientes clases debe utilizar para mantener la lista de clientes con el fn de lograr un desempeño máximo?

a. DataSet

b. DataTable

c. DataView

d. SqlDataReader

7. La aplicación que está desarrollando necesita leer datos desde un archivo plano que incluye ítems tales como una clave entera de 5 dígitos, seguido por un nombre de cliente de 20 caracteres, seguido por dos campos de fecha y hora. ¿Cuál de las siguientes clases debe utilizar?

a. FileStream

b. StreamReader

c. BinaryReader

d. DataReader

8. Está desarrollando una aplicación que necesitará copiar datos desde una vista de SQL Server a un DataSet. Nombra al objeto DataSet como dsData. ¿Cuál de los siguientes métodos debe utilizar para copiar los datos?

a. Fill

b. InsertCommand

c. SelectCommand

d. Update

9. Está desarrollando una aplicación que administra clientes y sus órdenes. ¿Cuál de las siguientes situaciones no es un buen candidato para la implantación con procedimientos almacenados en su aplicación?

a. Recuperar la lista de todos los clientes en la base de datos

b. Recuperar la lista de todas las órdenes para un cliente en particular

c. Insertar una nueva orden en la tabla Orders

d. Hacer consultas Ad-hoc por el administrador de la base de dato

10. Su aplicación se conecta a una base de datos de SQL Server que contiene una tabla llamada Employees con las siguientes columnas:

a. EmployeeID (int, identity)

b. EmployeeType (char(1))

c. EmployeeDate (datetime)

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 198: 98-361 Fundamentos de Desarrollo de Software

197Comprender los conceptos básicos de bases de datos

11. Necesita escribir una consulta que elimine todas las flas de la tabla donde el valor de EmployeeTypees ya sea C o T. No desea eliminar ninguna otra fla. ¿Cuál sentencia debe utilizar?

a. DELETE FROM Employees

WHERE EmployeeType LIKE ‘[CT]’

b. DELETE FROM Employees

WHERE EmployeeType LIKE ‘[C-T]’

c. DELETE FROM Employees

WHERE EmployeeType LIKE ‘C’ OR ‘T’

d. DELETE * FROM Employees

WHERE EmployeeType IN (‘C’, ‘T’)

12. Su aplicación incluye un objeto SqlDataAdapter llamado SqlDataAdapter que se conecta a la tabla Employees. Basado en este SQLDataAdapter, su aplicación también incluye un objeto DataSet, dsEmployees. ¿Cuál línea de código debe utilizar para cargar toda la información desde la base de datos en el objeto DataSet?

a. dsEmployees = sqlDataAdapter.Fill(“Employees”);

b. sqlDataAdapter.Fill(“dsEmployees”, “Employees”);

c. sqlDataAdapter.Fill(dsEmployees);

d. sqlDataAdapter.Fill(dsEmployees, “Employees”);

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com

Page 199: 98-361 Fundamentos de Desarrollo de Software

198 Lección 6

» Evaluación de Competencia

Proyecto 6-1: Crear un Diagrama Entidad - relación

Una compañía tiene un número de empleados. Cada empleado puede ser asignado a uno o más proyectos. Un proyecto puede tener uno o más empleados trabajando en él. Dibuje un diagrama entidad - relación para esta situación.

Proyecto 6-2: Crear un Procedimiento Almacenado

A menudo necesita una lista de clientes para cierto país. Necesita crear un procedimiento almacenado que acepte el nombre del país como parámetro y retorne todos los clientes de ese país. ¿Cómo haría eso?

» Evaluación de Competencia

Proyecto 6-3: Normalizar Tablas

Está convirtiendo un diagrama entidad - relación en tablas. Obtiene la siguiente tabla:

Books

BookId BookName CategoryId CategoryName

1 Cocinando Sano 1001 Cocina

2 Profecía 1002 Misterio y Suspenso

3 Cambio 1003 Negocios

4 La Confesión 1002 Misterio y Suspenso

Necesita aplicar las reglas de normalización para garantizar la integridad de datos. ¿Cómo garantizaría que la tabla Books está en la tercera forma normal?

Proyecto 6-4: Crear y Manejar Eventos

Está trabajando en una aplicación que requiere que guarde información de cliente desde la tabla Customers de la base de datos de Northwind en un archivo XML. Este archivo XML será utilizado por varias tareas de integración de datos. Necesita garantizar que el nodo raíz del XML es llamado Customers. El nodo raíz entonces tendrá un nodo Customer para cada cliente en la tabla Customers. ¿Cómo debe llevar a cabo esta tarea?

E

T

C

I

B

E

R

O

Á

M

E

R

I

C

A

www.pdftron.com