Escolar Documentos
Profissional Documentos
Cultura Documentos
ER
ÁM
www.pdftron.com
RO
BE
CI
ET
Lección 1
Introducción a la programación
ICA
Comprender la programación de computadoras Comprender el almacenamiento y los 1.1
tipos de datos computacionales
ER
Comprender las estructuras de repetición Identificar el método apropiado para el 1.3
manejo de las repeticiones
Comprender el manejo de excepciones Comprender el manejo de errores 1.4
Términos clave
ÁM
www.pdftron.com
• Algoritmo • Diagrama de fujo • Programa
• Vector • Ciclo for • Recursión
• Constante • Ciclo foreach • Switch
• Tabla de decisión • If • Try-catch-fnally
RO
• Ciclo do-while • If-else • Variable
• Excepción • Operador • Ciclo while
BE
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.
ET
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.
2 Lección 1
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.
ICA
Un algoritmo es un conjunto de pasos ordenados y fnitos para resolver un problema dado.
ER
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
ÁM
de escribir los programas para contar con una mejor comprensión de la solución.
www.pdftron.com
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
RO
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.
BE
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.
Figura 1-1
Un diagrama de flujo
sencillo que compara
dos números y da como
resultado el mayor
ICA
ER
ÁM
Como puede ver, este diagrama de fujo muestra en el orden correcto todos los pasos
www.pdftron.com
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.
RO
Introducción a las tablas de decisión
Cuando se requiere de una gran cantidad de condiciones en un algoritmo, las tablas de
BE
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
CI
(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.
ET
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.
En un nivel muy básico, las computadoras utilizan el sistema binario para representar
ICA
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
ER
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.
ÁM
La mayoría de los programas modernos se encuentran escritos en un lenguaje de alto nivel
www.pdftron.com
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.
RO
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
BE
El .NET Framework
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
ET
Æ Escriba un programa en C#
Tome Nota
C# es un lenguaje de PREPÁRESE. Para escribir un programa en C#, realice lo siguiente:
programación sensible
1. Inicie Visual Studio. Seleccione Archivo y después Nuevo proyecto, Visual c#, Seleccione
a mayúsculas. Por
Aplicación de consola en Plantillas
ejemplo, si escribe
Class en lugar de class, 2. Ingrese IntrodCS en el cuadro Nombre. Asegúrese que el cuadro de verificación Crear
le resultará un error de directorio para la solución se encuentre seleccionado e ingrese el nombre Lesson01 en el
sintaxis. 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.
ICA
4. Modifique la plantilla para que luzca como el siguiente código:
Otra Manera using System;
También puede
ejecutar el programa
si abre una ventana namespace Lesson01
ER
de línea de comandos
{
(cmd.exe) y después
navega a la carpeta class Program
de salida del proyecto,
que de forma {
predeterminada
ÁM
www.pdftron.com
static void Main(string[] args)
es bin/debug bajo
la ubicación del {
proyecto. Se puede Console.WriteLine(“¡hola, mundo!”);
iniciar el programa
escribiendo el nombre }
RO
del programa en la
}
ventana de comandos
y presionando Enter. }
5. Seleccione Depurar, Iniciar sin depurar, o presione Ctrl+F5.
BE
en una ventana
ET
Tome Nota El programa que acaba de crear es muy sencillo pero resulta de utilidad para comprender
Cuando seleccione la estructura de un programa, su construcción y ejecución. Primero comentemos sobre la
la opción Depurar, parte de la construcción y ejecución. A continuación se menciona lo que sucede cuando
Iniciar sin depurar y selecciona la opción Depurar y posteriormente Iniciar sin depurar en el paso 5 del ejercicio
Visual Studio muestra anterior:
automáticamente el
mensaje “Presione 1. Visual Studio invoca el compilador de C# para traducir el código en un lenguaje de bajo
una tecla para nivel, en código de Lenguaje Intermedio Común (CIL). Este código de bajo nivel se almacena
continuar…”. La en un archivo ejecutable de nombre Lesson01.exe. El nombre del archivo resultante se
ventana de línea de puede cambiar al modificar las propiedades del proyecto.
comandos permanece 2. A continuación, Visual Studio toma el resultado del proyecto y solicita al sistema operativo
abierta para que pueda que lo ejecute. Aquí es cuando ve que la ventana de línea de comandos muestra el resultado.
ICA
ver el resultado. Si
selecciona la opción 3. Cuando el programa termina, Visual Studio muestra el mensaje, “Presione una tecla para
Depurar y después continuar…”. Observe que este mensaje sólo se genera cuando ejecuta el programa al
Iniciar depuración, utilizar la opción “Iniciar sin depurar”.
la ventana de
comandos se cierra 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
ER
tan pronto como se
termina la ejecución rápido utilizar Visual Studio para evaluar sus programas.
del programa. Es
importante saber
que la opción
Depurar e Iniciar
ÁM
www.pdftron.com
depuración cuenta
con capacidades de
depuración como
lo es la habilidad de
pausar un programa en
ejecución en un punto
RO
dado y revisar el valor
de varias variables en
memoria.
BE
CI
Tome Nota
Antes de que se pueda
ejecutar el código en
Lenguaje Intermedio
Común (CIL), primero
ET
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.
Figura 1-3
Listado del programa con
ICA
números de línea
ER
Tome Nota
Para habilitar la
vista de los números
de línea en Visual
Studio, seleccione
Herramientas y
ÁM
www.pdftron.com
después Opciones. A
continuación, expanda
el nodo Editor de
texto y seleccione
C#. Finalmente, en
RO
la sección Mostrar,
seleccione la opción
Números de línea
(active la opción Un programa en C# está formado por una o más clases y otros tipos. Una clase es un
Mostrar todas las conjunto de datos y métodos. El código en la Figura 1-3 defne una clase de nombre
configuraciones). Program de las líneas 5 a la 11. Una clase se defne utilizando la palabra clave class seguida
BE
del nombre de la clase. El contenido de la clase se defne entre una llave de apertura ({) y
una de cierre (}).
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.
Referencia cruzada Program. C# requiere que el nombre de una clase completamente califcado sea único. Por
Puede encontrar más lo tanto, no puede tener otro nombre de clase para Program con el nombre Lesson01,
información y otros pero puede utilizar Program para otro nombre como Lesson02. La clase Program defnida
ET
tipos en la Lección 2. 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!”);
8 Lección 1
Tome Nota Puesto que los nombres de las clases aparecen con frecuencia en el código, escribir el
Todas las sentencias nombre de la clase completamente califcados puede ser tedioso y hacer que los programas
en C# deben terminar contengan exceso de palabras. Este problema se puede solucionar utilizando la directiva de
con un punto y coma 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.
Tome Nota La clase de Programa defne un solo método por el nombre Main (líneas 7 a la 10). Main
El método Main debe es un método especial que también sirve como punto de entrada al programa. Cuando
ser declarado como el tiempo de ejecución inicia un programa, siempre empieza en el método Main. Un
static. El método static programa puede tener muchas clases y cada clase puede tener muchos métodos, pero
es invocable en una debería tener sólo un método Main. Un método puede a su vez llamar a otros métodos. En
clase aun cuando no la línea 9, el método Main está llamando al método WriteLine de la clase System.Console
ICA
se haya creado una para mostrar una cadena de caracteres en la ventana de línea de comandos. Esa es la forma
instancia de la clase. en la cual aparece el mensaje.
Aprenderá más de este
tema en la siguiente
lección.
ER
Comprender las variables
Las variables proporcionan almacenamiento temporal durante la ejecución de un programa.
ÁM
www.pdftron.com
Tome Nota 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 nombre de una
el valor que esta puede contener y el tipo de operaciones que se pueden desarrollar. Por
variable debe empezar
ejemplo, la siguiente declaración crea una variable de nombre number del tipo de datos
con una letra o un
guión bajo y puede
int y asigna un valor de 10 a la variable:
RO
contener sólo letras,
números y guiones int number = 10;
bajos. El nombre
de una variable no Cuando se declara una variable, se crea una ubicación en la memoria de la computadora
debe ser mayor a lo sufcientemente grande para contener el valor de este tipo de dato. Por ejemplo, en una
255 caracteres. Una máquina de 32-bit, una variable de un tipo de datos int necesitará dos bytes de memoria.
BE
variable debe ser única El valor de una variable se puede modifcar por otra asignación, como por ejemplo:
dentro del ámbito en el
cual se haya definido. number = 20;
CI
Las 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:
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.
Introducción a la programación 9
Referencia cruzada C# ofrece varios tipos de datos predefnidos que puede utilizar en sus programas. También
Puede obtener más puede defnir nuevos tipos al establecer una estructura de datos como una clase o un struct.
información sobre Este capítulo se enfoca en algunos de los tipos de datos predefnidos más utilizados.
la creación de sus
propios tipos de datos La tabla 1-3 contiene algunos de los tipos de datos predefnidos más utilizados en C#. El
en la Lección 2. tamaño mencionado en la tabla se refere a una computadora con longitudes de palabra
ICA
de 32 bits. Para longitudes más grandes, como de 64 bits, los tamaños serán diferentes.
ER
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
ÁM 4 bytes ±1.5e−45 a ±3.4e38
www.pdftron.com
Tome Nota double 8 bytes ±5.0e−324 a ±1.7e308
Las versiones sin signo bool 2 bytes Verdadero o falso
de short, int y long son
string - Cero o más caracteres Unicode
ushort, uint y ulong
respectivamente. Los
RO
tipos sin signo tienen
el mismo tamaño como Todos los tipos de datos mencionados en la tabla 1-3 son tipos de valores con excepción de
las versiones con string, el cual es un tipo de referencia. Las variables que se encuentran basadas directamente
signo pero almacenan en los tipos de valores contienen el valor en sí. En el caso del tipo de referencia, la variable
rangos mucho mayores contiene la dirección de la ubicación en memoria donde se encuentran almacenados los
BE
sólo para valores datos. Aprenderá más sobre las diferencias entre los tipos de valores y referencias en la
positivos. Lección 2.
Un arreglo es un conjunto de elementos en donde cada uno de ellos se accede a través de un índice único.
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.
10 Lección 1
Tome Nota Para acceder a un elemento individual de un arreglo, se utiliza el nombre del arreglo
El tema de los arreglos seguido del índice dentro de corchetes. Por ejemplo, numbers[0] devuelve el valor 1 del
se cubre a mayor arreglo declarado anteriormente y numbers[4] devuelve el valor 5. Es ilegal acceder a un
detalle en la Lección arreglo fuera de sus límites defnidos. Por ejemplo, obtendrá un error si intenta acceder al
3, Comprender el elemento del arreglo numbers[5].
desarrollo de software
en general.
ICA
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.
ER
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
ÁM
operador ternario, ?:, en C#.
www.pdftron.com
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
RO
antes que los de baja. Los operadores que aparecen en la misma fla tienen la misma .
Tabla 1-4
Categoría Operadores
Precedencia de
BE
operadores
Primario x.y f(x) a[x] x++ x-- new
typeof checked unchecked
Multiplicativo * / %
Aditivo + -
Desplazamiento << >>
ET
int x = 10;
ICA
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:
ER
int y = x++; // el valor de y es 12
www.pdftron.com
después de que se ejecuta la sentencia, el valor de y es 12 y el valor de x es 13.
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.
; ¿Listo para la
CI
certificación? El método Main no regresa un valor, lo cual se indica utilizando la palabra void. Si un
¿Comprende los método fuera a regresar un valor, se colocaría un tipo de datos apropiado del valor retornado
elementos básicos de en lugar de void.
la programación como
ET
las variables, tipos de Los miembros de la clase pueden tener modifcadores como static, public y private. Estos
datos, operadores y modifcadores especifcan cómo y dónde se pueden acceder los miembros de la clase.
métodos? -1.1 Aprenderá más sobre estos modifcadores en la Lección 2.
12 Lección 1
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.
ICA
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
ER
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.
ÁM
www.pdftron.com Æ Uso de la sentencia if
RO
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.
Figura 1-4
INICIO
El diagrama de flujo
equivalente a la sentencia
if
n1 = 10
n2 = 20
No
n2 > n1?
ICA
Si
Salida “n2
es > n1”
ER
FIN
ÁM
Aquí la sentencia de salida sólo se ejecutará si la expresión booleana en el paréntesis es
www.pdftron.com
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
RO
anterior equivale a:
Console.WriteLine(number2);
ET
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:
if (number1 > 5)
ICA
}
Puesto que las dos condiciones se evalúan como verdadero, se generará el siguiente
resultado:
ER
number1 es mayor que 5
Considere los siguientes pasos para crear un programa que utiliza una sentencia if-else.
a la solución Lesson01.
2. Agregue el siguiente código al método Main de la clase Program.cs:
TestIfElse(10);
ICA
else
{
Console.WriteLine(“n es mayor que o igual a 30”);
}
ER
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.
ÁM
www.pdftron.com
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.
RO
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
BE
equivalente a la sentencia
Si Salida “n
if-else n < 10?
< 10”
No
ET
Si Salida “n
n < 20?
< 20”
No
Si Salida “n
n < 30?
< 30”
No
Salida “n
>= 30”
FIN
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.
ICA
del mismo tipo de datos
de la expresión del
Considere los siguientes pasos para crear un programa que utiliza una sentencia switch
switch.
para evaluar expresiones simples.
ER
Æ Uso de la sentencia switch
www.pdftron.com
solución Lesson01.
{
BE
int result;
switch (opr)
CI
case ‘+’:
break;
case ‘-’:
break;
case ‘*’:
Introducción a la programación 17
ICA
la cadena de formato Console.WriteLine(“Operador desconocido”);
“{0}” se reemplaza con
el valor del siguiente
return;
argumento, result.
ER
Console.WriteLine(“Resultado: {0}”, result);
return;ÁM
}
www.pdftron.com
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.
RO
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.
BE
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
CI
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
ET
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:
{
18 Lección 1
ICA
condiciones que son case DayOfWeek.Thursday:
más apropiadas
de utilizar con las case DayOfWeek.Friday:
sentencias if-else. En
el método TestSwitch, Console.WriteLine(«Hoy es un día laboral»);
las decisiones se
ER
basan en valores break;
constantes, por lo que
el código es mucho default:
más legible en una
sentencia switch. Console.WriteLine(«Hoy es un día de fn de semana»);
ÁM
www.pdftron.com
break;
}
; ¿Listo para la
certificación? }
RO
¿Comprende las
estructuras de decisión Aquí si el valor de la expresión dt.DayofWeek es DayOfWeek.Monday, entonces existe
computacionales como una coincidencia con el primer case, pero puesto que no hay código (o una sentencia de
las bifurcaciones y la transferencia de control, la ejecución continúa a la siguiente sentencia, resultando en la
repetición? -1.2 aparición del mensaje “Hoy es un día laboral” en la ventana de consola.
BE
È EN RESUMEN
ET
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.
sentencia
Aquí, se lleva a cabo una evaluación booleana al principio del ciclo. Si es verdadero, se
ICA
Tome Nota 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
La evaluación booleana
debe colocarse entre
del ciclo.
paréntesis. Si se
ejecuta más de una Puesto que la evaluación booleana se lleva a cabo antes de la ejecución del ciclo, es posible
sentencia como parte que el cuerpo del while nunca se ejecute. Esto pasa si la evaluación resulta falsa desde la
ER
del ciclo while, se primera vez.
deben colocar entre
llaves. Considere los siguientes pasos para crear un programa que utiliza la sentencia while.
ÁM
www.pdftron.com
Æ Uso de la sentencia while
PREPÁRESE. Para utilizar la sentencia while, lleve a cabo las siguientes tareas:
RO
1. Agregue un nuevo proyecto de aplicación de consola (de nombre while_Statement) a la
solución Lesson01.
WhileTest();
BE
int i = 1;
ET
while (i <= 5)
i++;
}
20 Lección 1
ICA
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
ER
El valor de i = 2
El valor de i = 3 ÁM
El valor de i = 4
www.pdftron.com
El valor de i = 5
i=1
BE
No
i <= 5?
CI
Si
Imprimir i
ET
i=i+1
FIN
Introducción a la programación 21
Tome Nota La sentencia en el ciclo, el cual incrementa el valor de i, juega un papel crítico. Si omite esa
Para evitar un sentencia, la conducción de terminación nunca se alcanzará y se tendrá un ciclo infnito.
ciclo infinito, debe
asegurarse que este En la mayoría de los casos, para tener un ciclo while bien diseñado, debe contar con tres
se haya diseñado de partes:
forma tal que lleve a
una terminación. 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
ICA
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.
ER
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.
Tome Nota
ÁM
www.pdftron.com
La forma general del ciclo do-while es
La evaluación booleana
se debe colocar
do
entre paréntesis. Si
se necesita ejecutar
sentencia
más de una sentencia
RO
como parte del ciclo
while (evaluación booleana);
do-while, se deben
colocar dentro de
llaves. Considere los siguientes pasos para crear un programa que utilice la sentencia do-while.
BE
DoWhileTest();
int i = 1;
do
22 Lección 1
i++;
ICA
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.
ER
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
ÁM
verdadera (2<=5), el control regresa a la sentencia do-while y el bloque de sentencias
www.pdftron.com
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
RO
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.
El 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.
CI
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:
ET
ForTest();
ICA
private static void ForTest()
ER
{
}
ÁM
www.pdftron.com
}
Cuando se ejecuta el método ForTest, se produce el mismo resultado que con el método
BE
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
CI
omitir todas las expresiones para crear un ciclo infnito como el siguiente:
for (; ;)
{
ET
El ciclo foreach puede concebirse como una versión mejorada del ciclo for para la
24 Lección 1
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.
ICA
Æ Uso de la sentencia foreach
ER
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.
int[] numbers = { 1, 2, 3, 4, 5 };
}
ET
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.
Introducción a la programación 25
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.
ICA
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:
ER
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
ÁM
pequeño. Por ejemplo, se puede desglosar 3! de la siguiente manera: 3! = 3 * 2! à 3 * 2
www.pdftron.com
* 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.
RO
Factorial(5);
if (n == 0)
}
26 Lección 1
else
ICA
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.
ER
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
; ¿Listo para la
certificación?
ÁM
un caso base en su algoritmo recursivo, se crea una recursión infnita. Una recursión
www.pdftron.com
infnita hará que su computadora se quede sin memoria y arrojará una excepción
¿Puede identificar System.StackOverfowException.
apropiadamente
los métodos para
• El caso recursivo: La parte que mueve el algoritmo hacia la clase base. El caso
el manejo de las
recursivo en el método Factorial es la parte del else, donde se llama nuevamente el
repeticiones? 1.3 método pero con un valor menor para progresar hacia el caso base.
RO
È EN RESUMEN
El .NET Framework soporta el manejo de excepciones para errores en tiempo de ejecución. En esta sección aprenderá
CI
Una excepción es una condición de error que ocurre durante la ejecución de un programa
ET
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.
Introducción a la programación 27
Manejo de excepciones
Para 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
ICA
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.
ER
2. Agregue el siguiente código al método Main de la clase Program.cs:
ExceptionTest();
www.pdftron.com
{
StreamReader sr = null;
try
RO
{
sr = File.OpenText(@”c:\data.txt”);
Tome Nota
La clase StreamReader Console.WriteLine(sr.ReadToEnd());
es parte del espacio }
BE
de nombres System.
IO. Cuando este código catch (FileNotFoundException fnfe)
se ejecuta, necesitará {
agregar una directiva
using para el espacio Console.WriteLine(fnfe.Message);
CI
de nombres System.IO. }
catch (Exception ex)
{
ET
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.
28 Lección 1
ICA
errores de compilación. 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.
Tome Nota 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
Un bloque try debe
ER
catch no atrapa la excepción arrojada, el control se mueve al siguiente bloque catch y así
tener al menos un
sucesivamente. Si la excepción no se maneja en el método, el tiempo de ejecución revisa la
bloque catch o un
bloque finally asociado.
sentencia catch en el código y continúa para el resto de la pila de llamadas.
Uso de try-catch-finally
ÁM
www.pdftron.com
El 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.
RO
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.
BE
Æ Uso de try-catch-finally
TryCatchFinallyTest();
Console.WriteLine(sr.ReadToEnd());
}
catch (FileNotFoundException fnfe)
{
Console.WriteLine(fnfe.Message);
}
catch (Exception ex)
{
ICA
Console.WriteLine(ex.Message);
}
fnally
{
ER
if (sr != null)
{
sr.Close();
ÁM}
www.pdftron.com
}
}
4. Cree un archivo de texto (“data.txt”) utilizando el Bloc de notas o Visual Studio en la unidad
RO
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.
BE
; ¿Listo para la
CI
certificación? En este ejercicio, el programa se asegura que el objeto StreamReader se cierre y que se
¿Comprende cómo liberen los recursos cuando se complete la operación. El código en el bloque fnally se
manejar errores en sus ejecuta sin importar si aparece una excepción o no.
programas? -1.4
ET
30 Lección 1
ICA
• 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.
ER
• 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.
•
ÁM
El tipo de datos determina el tamaño de memoria necesario para almacenar los
www.pdftron.com
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
RO
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
BE
» Evaluación de conocimiento
ICA
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
ER
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í
ÁM
mismo para poder computar un resultado.
www.pdftron.com
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.
RO
Opción múltiple
BE
int n = 20;
CI
int d = n++ + 5;
b. 26
c. 27
d. 28
3. Si escribe el siguiente código:
int i = 1;
32 Lección 1
while (i < 5)
i++;
ICA
4. ¿Cuántas veces se ejecutará el ciclo while en este código?
a. 0
b. 1
c. 4
d. 5
ER
5. Si escribe el siguiente código:
Console.WriteLine(“number1”);
Console.WriteLine(“number2”);
RO
6. ¿Cuál resultado aparecerá después de ejecutar este código?
a. number1
b. number2
BE
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?
CI
a. break
b. continue
c. default
d. return
ET
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
Comprender los conceptos básicos de bases de datos 33
ICA
c. DivideByZeroException
d. InvalidOperationException
11. Se encuentra aprendiendo cómo desarrollar algoritmos repetitivos en C#: Escribe el
siguiente método:
ER
private static void ForTest()
}
RO
}
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
CI
c. Clase
d. Tipo de datos
14. Al escribir el siguiente código:
15. También crea una variable del tipo RectangleHandler como se muestra a
continuación:
RectangleHandler handler;
34 Lección 1
» Evaluación de destreza
ICA
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?
ER
Cantidad < 10 S N N N
Cantidad < 50 S S N N
Cantidad < 100 S S S N
Descuento
ÁM
5% 10% 15% 20%
www.pdftron.com
Escenario 1-2: Convierta un diagrama de flujo en un programa de C#
INICIO
BE
Ingresar n
fact = 1
CI
No
n > 1?
ET
Si
fact = fact * n
n=n-1
Salida de
fact
FIN
Comprender los conceptos básicos de bases de datos 35
» Evaluación de aptitud
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
ICA
escribiría un programa con estas características?
ER
el mismo. Necesita crear un programa recursivo para solucionar este problema. ¿Cómo
escribiría un programa con estas características?
ÁM
www.pdftron.com
RO
BE
CI
ET
36 Lección 1
ICA
ER
ÁM
www.pdftron.com
RO
BE
CI
ET
Lección 2
ICA
Comprender los objetos Comprender los principios básicos de las 2.1
clases
Comprender los valores y las referencias Comprender el almacenamiento y los tipos 1.1
de datos
Comprender el encapsulamiento Comprender el encapsulamiento 2.4
ER
Comprender la herencia Comprender la herencia 2.2
Comprender el polimorfismo Comprender el polimorfismo 2.3
Comprender las interfaces Comprender las interfaces 2.4
ÁM
www.pdftron.com
Términos clave
• Accessors • Evento • Propiedad
• Clase abstracta • Herencia • Tipo de referencia
• Constructor • Interfaz • Tipo de valor
RO
• Delegado • Espacio de nombres
• Encapsulamiento • Polimorfsmo
BE
CI
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.
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.
ICA
Un objeto de software es conceptualmente similar a un objeto en el mundo real.
ER
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
ÁM
se dará cuenta que aunque un coche es un objeto complejo, sólo necesita saber algunas
www.pdftron.com
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.
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
ET
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.
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.
Introducción a la programación orientada a objetos 39
ICA
length = l;
width = w;
}
ER
{
return length * width;
}
ÁM
www.pdftron.com
}
• Genere el proyecto y asegúrese de que no tenga errores.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
RO
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
BE
de una clase se le
relaciona con un tipo.
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
40 Lección 2
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
ICA
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)
ER
{
Tome Nota length = l;
El nombre del
width = w;
método, su lista de
parámetros y el orden }
ÁM
www.pdftron.com
de los tipos de datos
de los parámetros se El método InitFields toma dos parámetros y utiliza los valores de los mismos para asignar
reconocen en conjunto de forma respectiva lo campos de datos length y width. Cuando el tipo de retorno de
como la firma del un método es void, se puede utilizar una sentencia return sin valor. Si no se utiliza una
método. Una firma de sentencia return, como en el método InitFields, el método dejará de ejecutarse cuando
método debe ser única
RO
llegue al fnal del bloque de código. El método InitFields se puede utilizar para inicializar
en la clase. 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.
Los 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
CI
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.
ET
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.
Introducción a la programación orientada a objetos 41
Crear objetos
Los objetos se crean a partir de plantillas defnidas por clases.
Æ Crear un objeto
ICA
{
static void Main(string[] args)
{
Rectangle rect = new Rectangle(10.0, 20.0);
ER
double area = rect.GetArea();
Console.WriteLine(“Área del Rectángulo: {0}”,
ÁM area);
}
www.pdftron.com
}
2. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola
mostrando el área del rectángulo.
3. GUARDE su proyecto.
RO
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
Tome Nota
Las clases y los objetos La clase Rectangle cuenta con solo una forma de construir una instancia de la clase:
son diferentes. Una invocando un constructor con dos argumentos del tipo de datos double. Se crea un objeto
BE
clase define la plantilla utilizando la palabra reservada new seguida de la invocación al constructor de clase
de un objeto pero no al apropiado.
objeto en sí. Por otro
lado, un objeto es una
Cuando se ejecuta el código, un objeto de tipo Rectangle se crea en la memoria heap.
instancia concreta de
CI
Una referencia a esta memoria se almacena dentro de la variable rect. La variable rect se
una clase pero no la
almacena en la pila. Posteriormente, en este bloque de código, puede utilizar rect para
clase en sí.
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,
ET
Las propiedades son miembros de la clase que se pueden acceder como los campos de
42 Lección 2
Tome Nota datos pero que puede contener código como un método. Las propiedades se utilizan con
A las propiedades, frecuencia para exponer los campos de datos de una clase de una forma más controlada. Por
generalmente se ejemplo, un campo privado se puede exponer utilizando una propiedad pública, pero no es
les conoce como necesario utilizar las propiedades de esta manera.
campos “inteligentes”
ya que pueden Una propiedad tiene dos accessors, get y set. El accessor get se utiliza para retornar
contener código para el valor de la propiedad y el accessor set se utiliza para asignar un nuevo valor a la
la verificación de propiedad. A una propiedad frecuentemente se le defne como public y siempre tiene un
consistencia o validez nombre que comienza con una letra mayúscula. Por el contrario. Al asignar nombres a
de datos. los campos de datos privados se utiliza siempre al principio una letra minúscula.
ICA
Æ Crear propiedades
ER
class Rectangle
{
private double length;
private double width;
ÁM
www.pdftron.com
public double Length
{
get
RO
{
return length;
}
BE
set
{
if ( value > 0.0)
length = value;
CI
}
}
ET
{
if (value > 0.0 )
width = value;
}
}
ICA
}
}
ER
static void Main(string[] args)
{
Rectangle rect = new Rectangle();
ÁM rect.Length = 10.0;
www.pdftron.com
rect.Width = 20.0;
double area = rect.GetArea();
Console.WriteLine(
RO
“Área del rectángulo: {0}”, area);
}
}
3. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola mostrando el
BE
En este ejercicio, modifcó la clase Rectangle para ingresar dos propiedades, Length y
Tome Nota Width. Las propiedades generalmente se defnen con un modifcador de acceso público.
El patrón de
En el código para la propiedad Length, el accessor get simplemente retorna el valor del
ET
programación general
campo de datos length. Sin embargo, el accessor set revisa el valor signado (utilizando
es que todos los
la palabra reservada value) a la propiedad y modifca el campo de datos length sólo si el
campos de datos valor es positivo. Los campos privados length y width también se conocen como campos
de una clase deben de respaldo por las propiedades que los exponen.
declararse como
private y que el acceso Además, la clase Rectangle no declara ningún contructor explícito. En este caso, los
a estos campos usuarios de la clase (el método Main) necesita utilizar el constructor predefnido y confar
privados debe ser vía en las propiedades para inicializar los datos de la clase.
propiedades públicas
y revisar los valores El método Main utiliza las propiedades Length y Width para establecer los datos para el
de datos para su objeto rect. Se ignorará si se trata de establecer Length o Width como un valor negativo
validación. y en ese caso los campos de datos seguirán conservando su valor original de 60.
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.
ICA
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;
ER
public double Length
{
get
ÁM
www.pdftron.com
{
return length;
}
set
RO
{
length = value;
}
BE
get
{
return width;
ET
}
set
{
width = value;
}
}
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.
ICA
{
Rectangle rect = new Rectangle
{ Length = 10.0, Width = 20.0 };
Console.WriteLine(
“Area of Rectangle: {0}”, rect.GetArea());
ER
}
www.pdftron.com 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:
RO
class Rectangle
{
private double length;
BE
length = l;
width = w;
}
ET
{
private double length;
private double width;
public Rectangle(double l, double w)
{
this.length = l;
this.width = w;
}
ICA
public double GetArea()
{
return this.length * this.width;
}
ER
}
Tome Nota
En C#, los caracteres // Como puede ver, la palabra this se utilizó dentro del constructor y del método GetArea
se utilizan para agregar para referirlo a los campos de datos del objeto actual de la clase Rectangle. Aun cuando no
comentarios en una era necesario utilizar la palabra this en este caso, utilizarla proporciona mayor fexibilidad
sola línea en el código.
ÁM
al nombrar los parámetros del método. Por ejemplo, podría defnir el constructor como se
www.pdftron.com
El texto después de los muestra a continuación:
caracteres // se ignora
por el compilador. Los public Rectangle(double length, double width)
comentarios en varias {
líneas comienzan con // los nombres de parámetro length y width
RO
los caracteres/* y // opacan los miembros de clase length y
terminan con */.
// width en este ámbito
this.length = length;
this.width = width;
}
BE
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.
CI
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.
Introducción a la programación orientada a objetos 47
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:
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:
ICA
RectangleHandler handler;
ER
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.
ÁM
www.pdftron.com
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);
RO
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.
BE
Entre otras muchas aplicaciones, los delegados forman la base para las declaraciones de
eventos, como se comentará en la siguiente sección.
Los 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.
ET
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.
ICA
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
ER
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.
Tome Nota {
El campo EventArgs. get
Empty representa un
evento sin datos. El {
campo equivale a tener
CI
return length;
una instancia de sólo
lectura de la clase }
EventArgs.
set
ET
{
length = value;
Changed(this, EventArgs.Empty);
}
}
}
{
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)
{
ICA
Rectangle r = (Rectangle)sender;
Console.WriteLine(
“Value Changed: Length = {0}”,
Tome Nota
r.Length);
El código en el
ER
método r_Changed }
utiliza un operador }
cast para convertir
un tipo de datos de 3. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola para mostrar
objeto en el tipo de
datos Rectangle. El
ÁM
que el valor de la propiedad Length cambió.
www.pdftron.com
casting se explicará 4. GUARDE su proyecto.
más adelante en esta PAUSA. Deje su proyecto abierto para utilizarlo en el siguiente ejercicio.
lección en la sección
“Casting entre tipos”.
RO
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.
BE
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:
CI
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
ET
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.
50 Lección 2
ICA
{
public class Widget { … }
}
and
namespace CompanyB
ER
{
public class Widget { … }
}
ÁM
www.pdftron.com
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
RO
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#
BE
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;
CI
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;
ET
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.
Introducción a la programación orientada a objetos 51
ICA
}
public double Length { get; set; }
public double Width { get; set; }
ER
{
return this.Length * this.Width;
}
}
ÁM
2. Modifique el código de la clase Program a lo siguiente:
www.pdftron.com
class Program
{
static void Main(string[] args)
{
RO
Rectangle rect = new Rectangle
{ Length = 10.0, Width = 20.0 };
Rectangle.ShapeName,
rect.GetArea());
}
}
CI
3. Seleccione Depurar, Iniciar sin depurar. Aparecerá una ventana de consola para mostrar el
nombre y área de la forma.
4. GUARDE su proyecto.
ET
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.
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
ICA
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.
ER
La 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.
ÁM
Las estructuras se defnen utilizando la palabra reservada struct como se muestra a
www.pdftron.com
continuación:
{
RO
Tome Nota
Las estructuras se public double X, Y;
utilizan generalmente
para crear tipos }
simples. Si se
encuentra creando Las estructuras pueden contener la mayoría de los elementos que puede contener una
BE
una estructura muy clase, como constructores, métodos, propiedades, etc. Sin embargo, como aprenderá en
compleja, considere la siguiente sección, las estructuras son tipos de valores mientras que las clases son tipos
mejor utilizar una de referencias. A diferencia de una clase, una estructura no puede heredar de otra clase o
clase. estructura.
CI
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).
Introducción a la programación orientada a objetos 53
Figura 2-1 Production note: This figure should be redrawn on a smaller scale. Please also make
Visualización de un tipo
the arrows as straight lines when you redraw it.
de valor en memoria
número
int number;
0
number = 10;
número
10
ICA
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.
ER
Esta variable almacenará la dirección en memoria (una referencia) de la ubicación donde
de hecho se almacenará el string.
Figura 2-2
Vista de Código Vista de Memoria
Visualización de un tipo
ÁM
www.pdftron.com
nombre
de referencia en memoria
string name; dirección datos
null
name = “Northwind”;
ICA
p2.X = 100;
Console.WriteLine(“p1.X = {0}”, p1.X);
ER
Rectangle rect2 = rect1;
rect2.Length = 100.0;
ÁM
www.pdftron.com
Console.WriteLine(“rect1.Length = {0}”,
rect1.Length);
}
RO
3. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola para
Tome Nota mostrar los valores para p1.X y rect1.Length.
Cuando copia una 4. GUARDE su proyecto.
variable de tipo de
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente eje
BE
referencia a otra
variable del mismo
tipo, sólo se copian
las referencias. Como La primera parte del programa crea una copia del tipo de valor Point y la segunda mitad
resultado, después del programa crea una copia del tipo de referencia Rectangle. Analicemos como se realiza
la copia del tipo de valor.
CI
Point p2 = p1;
p2.X = 100;
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:
ICA
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
; ¿Listo para la objeto Rectangle. Ahora, si intenta hacer referencia a la misma ubicación en memoria vía
ER
certificación? el objeto rect1, obtendrá el objeto modifcado y aparecerá el siguiente código mostrando
¿Comprende los tipos el valor “rect1.Length = 100”.
de datos y l asignación
de memoria? -1.1 Console.WriteLine(“rect1.Length = {0}”,
ÁM
rect1.Length);
www.pdftron.com
Comprender la memoria heap y la pila call
RO
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
BE
Comprender el encapsulamiento
È EN RESUMEN
ET
El encapsulamiento es un mecanismo para ocultar información que hace que el código sea fácil de mantener y
entender.
ICA
independiente.
ER
Los modifcadores de acceso controlan dónde se puede utilizar un tipo o miembro de tipo.
Tabla 7-2 Todos los tipos y miembros de tipo tienen un nivel de acceso que especifca donde esa clase
Las partes que
ÁM
o sus miembros se pueden utilizar en su código. El nivel de acceso se puede establecer
www.pdftron.com
conforman al elemento utilizando uno de los modifcadores de acceso especifcados en la Tabla 2-1.
<authorization>
Tome Nota 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
Debería utilizar el
ET
(declaradas directamente bajo un espacio de nombres) sólo pueden ser public o internal.
nivel de acceso más
El modifcador de acceso internal es el predeterminado para una clase si no se especifca
restrictivo que tenga
ningún modifcador de acceso. La clase Rectangle defnió en el ejercicio anterior elementos
sentido para un
predeterminados para tener un acceso interno. La accesibilidad de una clase anidada puede
miembro de tipo.
no ser menos restrictiva que la accesibilidad de una clase contenedora.
; ¿Listo para la
certificación?
¿Comprende el
encapsulamiento? -2.4
Introducción a la programación orientada a objetos 57
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ó.
ICA
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
Tome Nota rectángulos o triángulos. Estas clases tendrán algunas propiedades en común como anchura
A diferencia de las y longitud. Para este caso, se puede crear una clase base Polygon con las propiedades
ER
clases, las estructuras Width y Length, y las clases derivadas Rectangle y Triangle heredarán estas propiedades
no soportan la a la vez que cuentan con su propia funcionalidad. El siguiente ejercicio explica lo anterior
herencia. de forma más detallada.
ÁM
Æ Crear clases derivadas
www.pdftron.com
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Agregue una nueva clase Polygon como se muestra a continuación:
class Polygon
RO
{
public double Length { get; protected set; }
public double Width { get; protected set; }
BE
Width = width;
}
ICA
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.
ER
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. ÁM
Las propiedades Length y Width en la clase Polygon se declaran como un modifcador
www.pdftron.com
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.
RO
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.
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.
CI
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.
ICA
class Rectangle : Polygon
{
public Rectangle(double length, double width)
{
ER
Length = length;
Width = width;
}
ÁM
www.pdftron.com
public override double GetArea()
{
return Width * Length;
RO
}
}
rectángulo.
4. GUARDE su proyecto.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
CI
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
ET
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
Tome Nota ejemplo, la clase Rectangle sobrescribe el método abstracto GetArea de la clase base y
No puede crear proporciona una implementación completa. Como resultado, la clase Rectangle ya no es
instancias de una clase una clase abstracta y se puede instanciar de forma directa.
abstracta.
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
ICA
que se sobrescriban en una clase derivada. Por ejemplo, puede decir:
sealed public override double GetArea()
Tome Nota {
C# no soporta la
return Width * Length;
herencia de más de
ER
una clase base, a lo }
cual se le conoce
como herencia Esta declaración asegura que el método GetArea no se pueda sobrescribir en una clase
múltiple. derivada. ÁM
www.pdftron.com
Herencia desde la clase Object
La clase Object es la clase base más importante de todas las clases en el .NET Framework.
RO
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
{
BE
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.
Introducción a la programación orientada a objetos 61
ICA
Width = width;
}
ER
return Width * Length;
}
Las clases derivadas tienen una relación “es un” con la clase base. Por ejemplo, podemos
CI
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.
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.
Rectangle r = (Rectangle) o;
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
Tome Nota operador is para revisar si se permite el casteo antes de llevarlo a cabo:
ICA
Si se encuentra if (o is Rectangle)
utilizando un operador
as para convertir un {
tipo, la revisión del
operador is no es Rectangle r = (Rectangle) o;
necesaria. Puede
ER
simplemente revisar el }
valor de retorno de as
contra null. 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.
ÁM
www.pdftron.com
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:
RO
Rectangle r = o as Rectangle;
if (r != null)
{
BE
// hacer algo
; ¿Listo para la
}
certificación?
¿Comprende la Si en tiempo de ejecución, no es posible castear el valor de la variable o a rectangle, se
CI
Comprender el polimorfismo
ET
È 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
Introducción a la programación orientada a objetos 63
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.
ICA
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Modifique la clase Polygon como se muestra a continuación:
class Polygon
{
ER
public virtual void Draw()
{
Console.WriteLine(“Dibujando: Polígono”);
}
ÁM
www.pdftron.com
}
Console.WriteLine(“Dibujando: Rectángulo”);
}
}
CI
ICA
}
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.
ER
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.
Tome Nota
ÁM
Lo importante aquí es notar la palabra reservada virtual. Esta palabra permite a las clases
derivadas sobrescribir el método.
www.pdftron.com
Si el método en una
clase derivada no se Tanto la clase Rectangle como Triangle sobrescriben el método Draw de la clase base
encuentra precedida con sus propias defniciones utilizando la palabra reservada override. Cuando se ejecuta el
por las palabras método Main se genera el siguiente resultado:
RO
new u override, el
Dibujando: Polígono
compilador afrontará
una advertencia y el Dibujando: Rectángulo
método se comportará
Dibujando: Triángulo
como si la palabra new
estuviera presente.
BE
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
CI
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.
ET
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.
Introducción a la programación orientada a objetos 65
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.
ICA
}
Tome Nota }
La clase System.Object
proporciona un método Ahora modifquemos el código en la clase Main de la siguiente manera:
ER
ToString. Por estándar, Triangle t = new Triangle();
debe utilizar este
método para retornar t.Draw();
la representación
legible para el humano
con respecto a una
ÁM
Polygon p = t;
www.pdftron.com
clase. Cuando cree sus p.Draw();
tipos, es recomendable
practicar la El programa producirá el siguiente resultado:
sobrescritura de este
método para retornar Dibujando: Triángulo
RO
información legible
Dibujando: Polígono
sobre los objetos.
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
; ¿Listo para la se castee como una clase base, se ejecuta la versión oculta de la clase base del método Draw.
BE
certificación?
¿Comprende el
polimorfismo? -2.3
CI
È 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.
interface IComparable
}
Tome Nota
Por estándar, todas las La interface IComparable tiene un solo método (CompareTo) que acepta un objeto y retorna
interfaces definidas un int. El valor de retorno de este método indica el resultado de comparar un parámetro
ICA
en el .NET Framework dado con el objeto actual. De acuerdo con la documentación del método CompareTo:
empiezan con la
letra I mayúscula. • Si la instancia es igual al parámetro, CompareTo retorna 0.
Aun cuando puede • Se retorna un valor positivo si el valor del parámetro es menor que la instancia o
asignar nombres a sus si el parámetro es null.
interfaces de la forma • Si el valor del parámetro es mayor que la instancia entonces se retorna un valor
ER
que quiera, es mejor negativo.
utilizar el estándar de
Framework. • 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
ÁM
Employee? No lo hace. Las clases que están interesadas en tales comparaciones deben
www.pdftron.com
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.
RO
Æ Uso de la interface IComparable
Console.WriteLine(“Dibujando: Rectángulo”);
}
if (!(obj is Rectangle))
throw new ArgumentException();
ICA
Rectangle target = (Rectangle)obj;
double diff = this.GetArea() - target.GetArea();
if (diff == 0)
ER
return 0;
else if (diff > 0)
return 1;
else return -1;
ÁM
www.pdftron.com
}
}
Console.WriteLine(rect1.CompareTo(rect2));
CI
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.
ET
GUARDE su proyecto.
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.
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,
; ¿Listo para la si existe una relación de herencia entre SalariedEmployee y Employee, entonces puede
certificación? utilizar una clase abstracta para estandarizar la funcionalidad común entre clases derivadas.
¿Comprende el Por otro lado, no hay una relación “es un” entre Employee y la IComparable. Por lo tanto,
encapsulamiento? -2.4 la funcionalidad de comparación es mejor si se implementa como una interface.
ICA
ER
ÁM
www.pdftron.com
RO
BE
CI
ET
Comprender los conceptos básicos de bases de datos 69
ICA
• 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
ER
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.
•
ÁM
Los espacios de nombre le permiten organizar código y crear nombres de clase
www.pdftron.com
ú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
RO
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
BE
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
CI
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.
70 Lección 2
» Evaluación de conocimiento
ICA
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
ER
son el __________, __________, y __________.
6. Podemos utilizar __________ para agrupar clases relacionaras para reducir la colisión
de nombres. ÁM
7. La palabra reservada __________ se refere a la instancia actual de la clase.
www.pdftron.com
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
RO
pertenece a la clase en sí en vez de a un objeto específco.
Opción múltiple
b. Private
c. Protected
d. Internal
ET
ICA
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.
ER
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?
ÁM
a. Método
www.pdftron.com
b. Propiedad
c. Evento
d. Delegado
6. Se encuentra escribiendo un código para una clase de nombre Product. Necesita
RO
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.
BE
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. {
ET
{
public override void Draw()
{
// código adicional...
}
}
b. class Square : Polygon
{
public new void Draw()
ICA
{
// código adicional...
}
}
ER
c. class Square : Polygon
{
public virtual void Draw()
{
ÁM
www.pdftron.com
// código adicional...
}
}
RO
d. class Square : Polygon
{
public static void Draw()
{
BE
// código adicional...
}
}
CI
{
public double Length { get; set; }
public double Width { get; set; }
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)
{
ICA
Rectangle target = (Rectangle)obj;
double diff = this.GetArea() - target.GetArea();
if (diff == 0)
ER
return 0;
else if (diff > 0)
return 1;
ÁM
else return -1;
www.pdftron.com
}
b. public int CompareTo(object obj)
{
RO
Rectangle target = (Rectangle)obj;
double diff = this.GetArea() - target.GetArea();
if (diff == 0)
BE
return 1;
else if (diff > 0)
return -1;
CI
else return 0;
}
c. public int CompareTo(object obj)
ET
{
Rectangle target = (Rectangle)obj;
if (this == target)
return 0;
else if (this > target)
return 1;
else return -1;
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;
ICA
else return 0;
}
ER
b. {
c.
d. }
ÁM
www.pdftron.com
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?
RO
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;
BE
13. Se encuentra escribiendo el código para controlar los eventos en su programa. Defne
un delegado de nombre RectangleHandler como el siguiente:
CI
» Evaluación de destreza
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?.
ICA
Escenario 2-2: Creación de un Struct
ER
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
ÁM
Proyecto 2-3: Sobrescribiendo el método ToString
www.pdftron.com
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
RO
product al código invocador. ¿Cuál código necesita escribir para la clase Product para
cumplir con este requisito?.
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
76 Lección 2
ICA
ER
ÁM
www.pdftron.com
RO
BE
CI
ET
Lección 3
ICA
del Objetivo
Comprender la Administración del Ciclo de Comprender la Administración del Ciclo de Vida 3.1
Vida de una Aplicación de una Aplicación
Comprender las Pruebas Comprender la Administración del Ciclo de Vida 3.1
de una Aplicación
Comprender las Estructuras de Datos Comprender los algoritmos y estructuras de 3.3
ER
datos
Comprender los Algoritmos de Comprender los algoritmos y estructuras de 3.3
Clasificación ÁM datos
www.pdftron.com
Términos Clave
• Arreglos o vectores • Ordenamiento rápido • Pruebas de unidad
RO
• Pruebas de caja negra • Colas • Pruebas de caja blanca
• Ordenamiento de burbuja • Pruebas de regresión
• Listas enlazadas • Pilas
BE
Como desarrollador para la Corporación de Northwind, trabaja como parte de un equipo para
CI
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.
ICA
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.
ER
Figura 3-1
Administración del Ciclo
de Vida de Aplicación
ÁM
www.pdftron.com
RO
BE
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
CI
ICA
El proceso de diseño es utilizado para crear planes, modelos y la arquitectura de cómo el software será implementado.
ER
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.
La actividad de desarrollo de software involucra la implantación de diseño creando código de software, bases de datos
y otro contenido relacionado.
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 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
80 Lección 3
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.
ICA
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.
ER
La actividad de administración de liberación es utilizada para administrar el desarrollo, entrega y soporte de
liberaciones de software.
ÁM
La administración de liberación incluye actividades tales como empaquetado y despliegue
www.pdftron.com
del software, administración de defectos de software y administración de solicitudes de
cambio de software.
de aplicación y problemas con el sistema. El soporte técnico puede generar métricas valiosas acerca
sus actividades? de cuáles áreas del sistema son más difíciles para los usuarios y que posiblemente
— USD 3.1 necesiten ser actualizadas en la próxima versión del software.
ET
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.
ICA
Los métodos de prueba de software son generalmente divididos en pruebas de caja blanca y caja negra.
ER
• 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
ÁM
conocimiento del interior del sistema para probar el sistema. Por ejemplo, en la prueba de
www.pdftron.com
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.
RO
Comprender los Niveles de Prueba
La 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.
BE
Tome Nota
Es importante notar Los niveles de prueba están defnidos por donde tiene lugar la prueba en el ciclo de vida
que el proceso de del desarrollo de software. Están los siguientes cinco niveles de prueba:
prueba de software • Prueba de unidad: La prueba de unidad verifca la funcionalidad de una unidad
CI
tiene un gran número y también mantiene registro de si una modifcación de software causa que falle
de posibles rutas de alguna de las pruebas de unidad existentes. Visual Studio tiene soporte integrado
ejecución y muchos para la prueba de unidad. También puede utilizar herramientas de apertura de
parámetros que código tales como NUnit para automatizar pruebas de unidad para código de.NET
pueden afectar su Framework.
comportamiento. No
es factible y a menudo • Prueba de Integración: La prueba de integración prueba la interfaz entre los
no es posible probar componentes de software. La prueba de integración puede ser desempeñada
todas las diferentes incrementalmente conforme los componentes se desarrollan, o puede ser llevada a
situaciones que cabo como un “bigbang” cuando todos los componentes están listos para trabajar
encontrará el software juntos. El primer método se prefere sobre el segundo puesto que reduce el riesgo
en un entorno de e incrementa la confanza en el sistema que se esté desarrollando. La prueba de
producción. integración puede también involucrar la prueba de interacción de componentes
82 Lección 3
ICA
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
ER
reparando algunos defectos conocidos.
; ¿Listo para la • Prueba de Regresión: Conforme los defectos son reportados y reparados,
certificación? es importante asegurarse que una reparación no rompe nada que funcionaba
¿Comprende los previamente. Esto se lleva a cabo como parte de la prueba de regresión. Con cada
distintos métodos de nueva reparación, los testers de software ejecutan una serie de pruebas de regresión
prueba? — USD 3.1
ÁM
para asegurarse que la funcionalidad que se sabía que funcionaba aun funciona.
www.pdftron.com
Comprender las Estructuras de Datos
RO
È 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.
BE
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
CI
Arreglos
Un 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.
Desarrollo General de Software 83
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
ICA
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.
Figura 3-2
Representación interna de
una estructura de datos
ER
de un arreglo
ÁM
www.pdftron.com
RO
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.
CI
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
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
ICA
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.
ER
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.
www.pdftron.com
expandir dinámicamente cuando sea necesario. Sin embargo, un ArrayList no es tan rápido
como un arreglo.
Colas
RO
Una 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
BE
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
CI
Representación Interna
ET
ICA
Tome Nota
Una versión genérica
de la clase Queue
está disponible como
parte del espacio de
nombres de System.
ER
Collections.Generic.
Esta versión genérica
es utilizada para crear
una cola de ítems que
son del mismo tipo de
datos.
ÁM
www.pdftron.com
Operaciones Comunes
Una cola soporta las siguientes operaciones comunes:
RO
• 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.
•
BE
la cola.
Rendimiento y Uso
ET
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.
Pilas
Una 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
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
ICA
Tome Nota pila puede ser visualizada justo como la cola en la Figura3-3, excepto que la cola ahora es
Una versión generic llamada tope de la pila y la cabeza es llamada fondo de la pila.
de la clase Stack
está disponible como Un nuevo ítem siempre es agregado en la parte superior de la pila, y el fondo de la pila
parte del espacio de inicia apuntando al elemento recién agregado. Los ítems también son removidos desde la
nombres de System. parte superior de la pila y cuando esto sucede, la parte superior de la pila es ajustada para
ER
Collections.Generic. apuntar al siguiente ítem en la pila.
Esta versión genérica
es utilizada para crear El .NET Framework proporciona una implementación de la estructura de datos de pila
una pila de ítems que como parte de la clase Stack en el espacio de nombres de System.Collections. En lenguajes
son del mismo tipo de de programación que no proporcionan una implementación de la pila, puede escribir su
datos.
ÁM
propia clase Stack utilizando una estructura de datos parecida al arreglo y simular las
www.pdftron.com
operaciones de la pila.
Operaciones Comunes
Una pila soporta las siguientes operaciones comunes:
RO
• 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
BE
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.
CI
Rendimiento y Uso
ET
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 Enlazadas
Una lista enlazada es una colección de nodos ordenados de forma que cada nodo contiene un enlace al siguiente nodo
en la secuencia.
Desarrollo General de Software 87
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.
Figura 3-4
ICA
Representación interna de
una estructura de datos
de una lista enlazada
sencilla
ER
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
ÁM
atravesando nodos hasta que el enlace fnal es un valor null. A menudo el termino cola es
www.pdftron.com
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.
Representación de una
estructura de datos de
una lista doblemente
enlazada
CI
ET
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.
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.
•
ICA
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
ER
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. ÁM
Figura 3-6
www.pdftron.com
Agregando un nuevo nodo
a una lista enlazada
RO
BE
CI
Rendimiento y Uso
ET
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.
; ¿Listo para la
De hecho, una lista enlazada proporciona una manera alternativa para implementar las
certificación?
estructuras de datos de la cola y la pila. Si sus requerimientos realizan accesos frecuentes
¿Comprende las a datos pero rara vez necesita insertar o eliminar datos, un arreglo es la implementación
estructuras de datos ideal. Si en su lugar, los requerimientos llaman con frecuencia operaciones de insert y
comunes? — USD 3.2 delete, entonces puede ser más recomendable utilizar una lista enlazada.
Desarrollo General de Software 89
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
ICA
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.
ER
En esta sección, le echará un vistazo a dos algoritmos de ordenamiento comunes:
ordenamiento de burbuja y ordenamiento rápido.
Ordenamiento de Burbuja
ÁM
www.pdftron.com
El algoritmo de ordenamiento de burbuja utiliza una serie de operaciones de comparación e intercambio para ordenar
una lista en el orden correcto.
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.
ET
ICA
3. 10, 20, 10, 20, El algoritmo compara los siguientes dos elementos
30, 40 30, 40 (30 y 40),y ya que están en el orden correcto, no es
necesario el intercambio.
ER
ordenamiento de burbuja da otra pasada a la lista:
www.pdftron.com
necesario el intercambio.
2. 10, 20, 10, 20, El algoritmo compara los siguientes dos elementos
30, 40 30, 40 (20 y 30),y ya que están en el orden correcto, no es
necesario el intercambio.
RO
3. 10, 20, 10, 20, El algoritmo compara los siguientes dos elementos
30, 40 30, 40 (30 y 40),y ya que están en el orden correcto, no es
necesario el intercambio.
Eso garantiza que la lista ahora esta ordenada y el algoritmo puede fnalizar.
{
Tome Nota bool swapped;
Cuando se utiliza
el ordenamiento
ET
de burbuja puede do
asegurarse que {
un arreglo estará
ordenado en un paso swapped = false;
menos que el número for (int i = 0; i <numbers.Length - 1; i++)
de ítems. De manera
que si hay cuatro {
ítems, como se ilustró if (numbers[i] > numbers[i + 1])
arriba, el arreglo será
ordenado (sin importar {
en qué orden empieza)
//swap
en tres pasadas.
Desarrollo General de Software 91
swapped = true;
}
}
} while (swapped == true);
ICA
return numbers;
}
ER
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.
ÁM
El algoritmo de ordenamiento rápido utiliza la técnica de divide y conquista para
www.pdftron.com
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.
•
RO
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.
•
BE
ordenada completa.
La siguiente tabla explica el algoritmo de ordenamiento rápido con un pequeño ejemplo.
ET
Tabla 3-4
Paso Datos a ser ordenados Comentarios
Visualizando el
ordenamiento rápido 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.
92 Lección 3
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
ICA
particionado, como se muestra en el siguiente código:
ER
intpivotValue = numbers[pivotIndex];
www.pdftron.com
numbers[pivotIndex] = temp;
{
temp = numbers[newPivot];
numbers[newPivot] = numbers[i];
numbers[i] = temp;
CI
newPivot++;
}
}
ET
returnnewPivot;
}
En esta técnica, primero el elemento pivote es movido al fnal del arreglo. Luego todos
Desarrollo General de Software 93
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:
ICA
{
if (right > left)
{
intpivotIndex = left + (right - left) / 2;
//particiona el vector
ER
pivotIndex= Partition(
numbers, left, right, pivotIndex);
//ordena la partición izquierda
QuickSort(
ÁM
numbers, left, pivotIndex - 1);
www.pdftron.com
// ordena la partición derecha
QuickSort(
; ¿Listo para la numbers, pivotIndex + 1, right);
certificación? }
RO
¿Comprende los return numbers;
algoritmos de
ordenamiento }
comunes? — USD 3.3
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.
BE
CI
ET
94 Lección 3
ICA
• 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
ER
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
ÁM
ítem agregado a la colección es el primero en ser removido.
www.pdftron.com
• 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.
RO
• 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
BE
espacios proporcionados.
1. En la prueba de________, los testers utilizan sus conocimientos del sistema interno
para probar el sistema.
ET
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
Comprender los conceptos básicos de bases de datos 95
ICA
Elección Múltiple
ER
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.
ÁM
Prueba de Aceptación
www.pdftron.com
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?
RO
a. Prueba de Integración
b. Prueba de Unidad
c. Prueba Alfa
d. Prueba Beta
BE
3. ¿Cuál de las siguientes estructuras de datos permite acceso directo a todos sus ítems?
a. Arreglo
b. Pila
c. Cola
CI
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?
ET
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
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
ICA
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?
ER
a. Arreglo
b. Cola
c. Lista enlazada
d. Pila
ÁM
8. Usted escribe el siguiente código en su programa:
www.pdftron.com
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?.
RO
a. {2, 4, 1, 4}
b. {2, 3, 4, 4}
c. {2, 4, 1, 2}
d. {4, 3, 1, 4}
BE
a. Arreglo
b. Lista enlazada circular
c. Lista enlazada
d. Lista doblemente enlazada
ET
» Evaluación de Competencia
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?.
ICA
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
ER
Proyecto 3-3: Utilizando Pilas
Está escribiendo un programa que utiliza dos pilas. Los datos en cada pila ya están en
ÁM
orden descendiente. Necesita procesar el contenido de ambas pilas de tal manera que la
www.pdftron.com
salida sea impresa en la pantalla en orden ascendente. ¿Cómo escribiría tal programa?.
Está escribiendo un programa que almacena la lista de nombres de productos en una lista
RO
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?.
BE
CI
ET
98 Lección 3
ICA
ER
ÁM
www.pdftron.com
RO
BE
CI
ET
Lección 4
ICA
Comprender el Desarrollo de una Página Web Comprender el Desarrollo de una Página 4.1
Web
Comprender el Desarrollo de una Aplicación Comprender el desarrollo de una aplicación 4.2
ASP.NET Web del Microsoft ASP.NET
Comprender el IIS Web Hosting Comprender el Web hosting 4.3
ER
Comprender el Desarrollo de Servicios Web Comprender los servicios Web 4.4
Términos Clave
ÁM
www.pdftron.com
• Hojas de estilo en cascada (CSS) (IIS) • Servicio Web
• Lenguaje de Marcado de Hipertexto • JavaScript • Lenguaje de Defnición de Servicio
(HTML) • SOAP Web (WSDL)
• Servicios de Información de Internet • Administración de estado
RO
BE
Como desarrollador de una gran empresa necesita desplegar aplicaciones que se puedan utilizar a
CI
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.
ET
100 Lección 4
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
ICA
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)
ER
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.
ÁM
HTTP utiliza el Localizador de Recurso Uniforme (URL) para identifcar únicamente y
www.pdftron.com
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
RO
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
BE
(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
Tome Nota de la página Web.
Los términos “Internet”
y “la Web” son El lenguaje que el servidor Web y el navegador Web utilizan para describir una página
comúnmente utilizados
CI
Internet es un sistema utilizado para incluir hojas de estilo en cascada (CSS) para defnir el formato y presentación
de comunicaciones del contenido de una página. El navegador Web lee el código HTML e interpreta los
de datos global resultados en la pantalla.
que proporciona
conectividad entre
Una página Web puede contener hipervínculos a otros recursos tales como imágenes
computadoras. En
y videos. Cada uno de estos recursos es identifcado por su propia URL. Con el fn de
contraste, la Web es
interpretar completamente una página, el navegador hará solicitudes HTTP adicionales
uno de los servicios
disponibles en Internet
para obtener esos recursos y desplegarlos como parte de la página Web.
que nos permite
acceder a recursos En las siguientes secciones, aprenderá más acerca de varios componentes que conforman
hiper vinculados. una página Web tales como HTML, CSS y JavaScript.
Comprender las Aplicaciones Web 101
Comprender HTML
El Lenguaje de Marcado de Hipertexto (HTML) es el lenguaje utilizado por los servidores y navegadores Web para
describir una página Web.
ICA
incrustar imágenes, HTML consiste de un conjunto de etiquetas (también llamadas elementos HTML)
audio, video y otros que defnen la estructura y contenido de una página. Por ejemplo, la etiqueta <html>
muchos tipos de especifca el inicio del documento HTML. Las etiquetas HTML siempre son rodeadas por
multimedia y contenido paréntesis angulares. Las etiquetas HTML siempre se utilizan en pares. Cada inicio de
interactivo en la etiqueta tiene una etiqueta par al fnal. Las etiquetas fnales tienen un slash que indica que
página. es una etiqueta de fnal. Por ejemplo, la etiqueta de fnal para <html>es </html>.
ER
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
ÁM
etiquetas <body>y</body> y es utilizado para proporcionar la estructura complete y
www.pdftron.com
contenido de la página que será desplegada dentro del navegador Web.
separadamente y la
interpreta como parte
La etiqueta <img> especifca atributos adicionales. Por ejemplo, el atributo src especifca
de la página. 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.
CI
<a href=”http://en.wikipedia.org/wiki/Mimas_(moon)”>
ET
Saturn’s moon</a>
ICA
<head>
<title>Saturn’s Moon</title>
</head>
<body>
ER
<h1>Mimas Cassini</h1>
La etiqueta img es utilizada para mostrar la imagen de
<a href=”http://en.wikipedia.org/wiki/Mimas_(moon)”>
ÁM
Saturn’s moon</a>: <br />
www.pdftron.com
<img height=”400px” width=”400px”
alt=”Mimas Cassini”
src=”http://goo.gl/3BeK”/>
</body>
RO
</html>
Figura 4-1
Una página HTML simple
con una imagen y un
CI
hipervínculo.
ET
Comprender las Aplicaciones Web 103
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.
ICA
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
ER
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
Tome Nota de desarrollo Web será muy tedioso y propenso a errores (¿Cómo garantiza que no omitió
Cuando se utiliza ninguna etiqueta?).
efectivamente, CSS es
ÁM
www.pdftron.com
una gran herramienta Afortunadamente, con CSS puede poner toda la información de estilo en un archivo
para incrementar la separado y conectar todas las páginas Web en un sitio Web con el archivo CSS. Una vez
consistencia del ancho que está confgurado, para modifcar cualquier estilo (tal como el color y fuente de los
del sitio y la posibilidad encabezados H1), simplemente cambia el estilo en el archivo CSS, un simple cambio
de mantenimiento. afectará todas las páginas en el sitio Web.
RO
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:
BE
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
CI
<title>Comprendiendo CSS</title>
<style type=”text/css”>
ET
body
font-family: Verdana;
font-size: 9pt;
div
104 Lección 4
color:Red;
.block
background-color: Yellow;
ICA
border-color: Blue;
border-width: thin;
border-style: outset;
ER
font-family: Arial;
} ÁM
</style>
www.pdftron.com
</head>
<body>
RO
Sample body text <br />
</body>
ET
</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.
Comprender las Aplicaciones Web 105
Figura 4-2
Formateando HTML
con hojas de estilo en
cascada
ICA
Note que el texto resaltado es mostrado como resultado de la clase block. Pero la clase
ER
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.
ÁM
En el ejemplo previo, el archivo CSS fue escrito dentro de HTML. Una aproximación
www.pdftron.com
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.
{
font-family: Verdana;
font-size: 9pt;
ET
}
div
{
color:Red;
}
.block
{
background-color: Yellow;
106 Lección 4
border-color: Blue;
border-width: thin;
border-style: outset;
font-family: Arial;
}
ICA
“-//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>
ER
<link rel=”STYLESHEET”
type=”text/css” href=”styles.css” />
<title>Understanding CSS</title>
</head>
ÁM
www.pdftron.com
<body>
Sample body text <br />
<div>Sample DIV text</div>
RO
<div class=”block”>Sample DIV text
with block class</div>
<span class=”block”>Sample SPAN text
with block class</span>
BE
</body>
</html>
Figura 4-3
El cuadro de diálogo
Modify Style
ICA
ER
Comprender JavaScript
ÁM
www.pdftron.com
JavaScript 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.
RO
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)
Tome Nota
y minimizando las idas y vueltas innecesarias al y del servidor. Tomemos un ejemplo en
Muchos sitios el cual un usuario necesita introducir detalles personales tales como el nombre, dirección
Web modernos de correo electrónico y número de teléfono. Un requerimiento común es desempeñar
BE
proporcionan una validación de datos para garantizar que los campos introducidos no están vacíos y que la
experiencia altamente dirección de correo electrónico y el número de teléfono están en el formato requerido. Sin
interactiva que rivaliza JavaScript, necesitaría entregar el formato al servidor, el cual desempeñará la validación de
con aplicaciones datos y retornará los resultados al cliente. Esta transmisión de información toma tiempo
de escritorio. Tales y degrada la experiencia del usuario. Una solución de JavaScript puede desempeñar este
CI
aplicaciones pueden tipo de validación de datos dentro del navegador, proporcionando una mejor experiencia
ser desarrolladas al usuario.
utilizando la
programación Ajax.
El código de JavaScript se ejecuta localmente dentro del navegador Web (el cliente), como
Ajax es una abreviatura
ET
opuesto al servidor Web. Aunque JavaScript también algunas veces es llamado como
para XML y JavaScript
Asíncrono. Ajax utiliza
lenguaje de scripting del lado del cliente y con JavaScript es llamado programación del
extensivamente el
lado del cliente.
JavaScript con el
fin de proporcionar El comportamiento del tiempo de ejecución de la ejecución de código del lado del cliente
aplicaciones Web depende del navegador que lo ejecuta. Sin embargo, es independiente de la tecnología del
sensibles. ElASP.NET servidor o la estructura de programación. Para la ejecución de JavaScript en un navegador
AJAX framework le Web, no importa si la página Web fue generada por ASP.NET o PHP o si la página está
permite implementar la siendo servida por un servidor Web de Windows o un servidor Web de Linux.
funcionalidad de Ajax
en páginas Web de JavaScript y el lenguaje de programación C# utilizan una sintaxis infuida por el lenguaje de
ASP.NET. programación C. sin embargo, JavaScript y C# son muy diferentes en como son ejecutados.
108 Lección 4
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:
PREPÁRESE. Para comenzar a trabajar con JavaScript, realice las siguientes tareas:
ICA
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:
ER
<!DOCTYPE html PUBLIC
“-//W3C//DTD XHTML 1.0 Transitional//EN”
ÁM
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
www.pdftron.com
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Comprendiendo JavaScript</title>
RO
<script type=”text/javascript”
language=”javascript”>
username = prompt(“Introduzca su Nombre”);
message = “Hola, “ + username +
BE
“. Su nombre tiene “;
nameLen = username.length;
if (nameLen > 5)
CI
else
message = message + “exactamente “;
message = message + “5 caracteres.”;
alert(message);
</script>
</head>
<body>
</body>
</html>
Comprender las Aplicaciones Web 109
Figura 4-4
Petición al Usuario de
JavaScript
ICA
ER
Figura 4-5
Cuadro de diálogo de
JavaScript
ÁM
www.pdftron.com
RO
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
BE
JavaScript, pueden cada página, puede almacenar el código en una página central en lugar de repetirlo
ser configurados en todas las páginas. Cuando es hora de modifcar el código de JavaScript, tendrá
para desactivar el que cambiar el código sólo en un lugar.
JavaScript. Algunos • Mejora del rendimiento: Almacenar código en un archivo separado reduce el
usuarios desactivan tamaño de la página Web. También, el navegador puede descargar y almacenar en
el JavaScript. Puede cache el archivo de JavaScript externo de forma que no es descargado de nuevo a
utilizar un elemento
menos que sea modifcado.
<noscript>para mostrar
un mensaje específico Visual Studio incluye soporte complete de IntelliSense para código de JavaScript. Incluso
a los usuarios quienes los controles ASP.NET, como el control TreeView o los controles de validación, utiliza
no están ejecutando JavaScript donde es posible interpretar contenido dinámicamente.
JavaScript.
110 Lección 4
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
ICA
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.
ER
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
; ¿Listo para la inteligente que se ejecutan localmente en las computadoras cliente pero que hacen uso de
certificación? servicios Web para llevar a cabo ciertas tareas. Las aplicaciones Ajax utilizan una mezcla
¿Comprende cómo
ÁM
de programación del lado del servidor y código del lado del cliente para crear aplicaciones
www.pdftron.com
utilizar HTML, Web interactivas y altamente sensibles.
JavaScript y CSS
para el desarrollo ASP.NET le permite crear aplicaciones que se ejecutan completamente en el servidor
de una página Web? o aplicaciones Ajax hibridas que proporcionan interfaces rápidas sensible mientras que
— USD 4.1 almacenan la mayoría de la información en la Web.
RO
Comprender el desarrollo de una aplicación de ASP.
NET
BE
È EN RESUMEN
ASP.NET es la parte del .NET Framework que le permite desarrollar formularios Web programables y servicios
CI
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#.
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.
ICA
Solicitud HTTP
Respuesta HTTP
ER
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:
ÁM
5. Cuando el Servicio de Información de Internet (IIS) recibe una solicitud HTTP, utiliza la
www.pdftron.com
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.
Tome Nota
RO
6. El proceso aspnet_isapi.dll pasa la solicitud al proceso trabajador de ASP.NET (aspnet_
La clase Page
wp.exe), el cual cumple la solicitud.
proporciona algunos
métodos y propiedades 7. El proceso trabajador de ASP.NET compila el archivo .aspx en un assembly y le pide al CLR
importantes que que ejecute el assembly.
pueden controlar cómo
BE
una solicitud de página 8. Cuando el assembly se ejecuta, toma los servicios de varias clases en la librería de clases
es procesada. Para del .NET Framework para llevar a cabo su trabajo y genera mensajes para el cliente
la lista completa de solicitante.
métodos y propiedades, 9. El proceso trabajador de ASP.NET colecta las respuestas generadas por la ejecución de la
mire http://msdn. página Web, crea un paquete de respuesta y lo pasa al proceso aspnet_isapi.dll.
CI
microsoft.com/en-us/
library/system.web. 10. Aspnet_isapi.dll reenvía el paquete de respuesta a IIS, el cual a su vez pasa la respuesta a
ui.page.aspx. la maquina cliente solicitante.
Antes de la ejecución, cada página ASP.NET es convertida en una clase. Esta clase deriva
ET
La tabla 4.1 enlista las diferentes etapas del ciclo de vida y sus eventos asociados.
ICA
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 PreInit
es una devolución de datos o una nueva
solicitud. Algunas propiedades de la
ER
página tales como Request, Response,
IsPostBack y UICulture son establecidas
en esta etapa.
Tome Nota Inicialización Durante la etapa de inicialización, Init
En un formulario todos los controles en la página son
de contacto típico,
ÁMinicializados y se hacen disponibles.
www.pdftron.com
introduzca información Un manejador de evento para el evento
y presione el botón Init es el mejor lugar para el código que
de enviar. Cuando desea que se ejecute antes de seguir
envía esta página, la con el procesamiento de la página.
página puede procesar
RO
Carga Si la solicitud es una devolución de Load
los datos enviados
datos, esta etapa es utilizada para
para tomar alguna
restaurar las propiedades de control
acción tal como el
con información desde el estado de
almacenamiento de
vista y el estado de control. Un método
los datos en una base
que maneja el evento Load es el mejor
BE
de datos o enviar un
lugar para almacenar el código de
correo electrónico.
inicialización para cualquier control
En muchos casos, la
específico para esta página.
página principal es
mostrada nuevamente Manejador de Si la solicitud es una devolución de
CI
publicada a la misma Pre interpretación Esta fase señala que la pagina esta PreRender
página Web para el por interpretar sus contenidos. Un
procesamiento. Una manejador de evento para el evento
devolución de datos PreRender es la última oportunidad para
es distinta a la carga modificar la salida de la página antes de
inicial de la página
que sea enviada al cliente.
debido a que la página
recibe información Interpretación En esta etapa, la página llama al
adicional como datos método Render para cada control y
de formulario como rellena la respuesta que será enviada al
parte del postback de la navegador.
página.
Comprender las Aplicaciones Web 113
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:
ICA
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
ER
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
ÁM
es True, lo cual signifca que estos métodos llamados especialmente son automáticamente
www.pdftron.com
enlazados con sus eventos correspondientes.
CodeBehind=”WebForm1.aspx.cs”
Inherits=”PageEvents.WebForm1” %>
ET
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
{
114 Lección 4
ICA
(object sender, EventArgs e)
{
Response.Write
(“Mensaje desde Page_Init. <br/>”);
ER
}
{
Response.Write
(“Mensaje desde Page_PreInit. <br/>”);
}
CI
}
}
ET
12/01/2010
Comprender las Aplicaciones Web 115
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”)
Figura 4-7
ICA
Formulario Web
visualizando el orden de la
ejecución de evento para
una página ASP.NET
ER
ÁM
www.pdftron.com
Administración de estado
RO
La 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.
través de viajes. Los valores de las variables y controles colectivamente conforman el estado
de una página Web.
ICA
cookie.Expires = DateTime.Now.AddMinutes(10);
Response.Cookies.Add(cookie);
• El siguiente código muestra cómo leer una cookie:
ER
if (Request.Cookies[“Name”] != null)
{ ÁM
name =Request.Cookies[“Name”].Value;
www.pdftron.com
}
• 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
RO
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
BE
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:
CI
<asp:GridView ID=”GridView1”
Tome Nota
ASP.NET soporta la administración de estado del lado del servidor en dos niveles:
El estado de sesión • Estado de Sesión: Una aplicación de ASP.NET crea una sesión única para
ICA
puede ser configurado cada usuario que manda una solicitud para una aplicación. ASP.NET identifca
para almacenarse distintivamente cada una de estas sesiones enviando un SessionId único a la URL
en otro servidor o un solicitada. Este SessionId es enviado como una cookie o es incrustado en la URL,
Servidor SQL. Esto es dependiendo de la confguración de la aplicación. La habilidad de únicamente
muy útil cuando una identifcar y relacionar solicitudes puede ser utilizada para almacenar datos
solicitud del usuario específcos de la sesión que también se conoce como estado de sesión de la aplicación
puede ser procesada Web. Un ejemplo común del estado de sesión es para almacenar el contenido de
ER
por uno de los muchos los carritos de compra para usuarios conforme navegan a través de la tienda basada
servidores en una en Web.
granja Web- Una • Estado de Aplicación: el estado de aplicación es utilizado para almacenar datos que
granja Web es una son usados a los largo de la aplicación. El estado de aplicación puede ser accedido
colección de servidores
Web utilizados
ÁM
fácilmente a través de la propiedad Application de la clase Page. Esta propiedad
www.pdftron.com
proporciona acceso al objeto HttpApplicationState que almacena el estado de
colectivamente para aplicación como una colección de pares de valores clave.
servir un sitio Web.
Las granjas Web son El siguiente ejercicio muestra cómo utilizar el estado de sesión. Este ejercicio utiliza dos
necesarias para el formatos Web. El WebForm1.aspx obtiene un nombre de usuario y lo almacena en el
soporte de tráfico en
RO
estado de sesión. El formato entonces transfere al usuario al WebForm2.aspx, el cual
sitios Web populares. recupera el nombre del usuario desde la sesión.
CodeBehind=”WebForm1.aspx.cs”
Inherits=”UtilizandoEstadoSesion.WebForm1” %>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title></title>
118 Lección 4
</head>
<body>
<div>
ICA
<asp:TextBox ID=”TextBox1” runat=”server” />
ER
Text=”Submit” onclick=”Button1_Click” />
</div> ÁM
</form>
www.pdftron.com
</body>
</html>
RO
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;
BE
namespace UsingSessionState
: System.Web.UI.Page
{
ET
if (Session[“Name”] != null)
Response.Redirect(“WebForm2.aspx”);
Comprender las Aplicaciones Web 119
Session.Add(“Name”, TextBox1.Text);
Response.Redirect(“WebForm2.aspx”);
ICA
}
ER
5. Agregue un nuevo formulario Web al proyecto (WebForm2.aspx). Cambie la etiqueta de la
página a lo siguiente:
www.pdftron.com
Inherits=”UsingSessionState.WebForm2” %>
<html xmlns=”http://www.w3.org/1999/xhtml”>
RO
<head runat=”server”>
<title></title>
</head>
BE
<body>
<div>
Text=”Limpiar Sesión”
onclick=”Button1_Click” />
</div>
</form>
</body>
120 Lección 4
</html>
using System;
namespace UsingSessionState
ICA
: System.Web.UI.Page
ER
object sender, EventArgs e)
{ ÁM
if (Session[“Name”] != null)
www.pdftron.com
Label1.Text = String.Format(
“Bienvenido,{0}”, Session[“Name”]);
RO
else
Response.Redirect(“WebForm1.aspx”);
}
BE
Session.Remove(“Name”);
Response.Redirect(“WebForm1.aspx”);
ET
ICA
ER
Figura 4-9
La página recupera el
nombre visualizado desde
ÁM
www.pdftron.com
el estado de sesión
; ¿Listo para la
certificación?
RO
¿Comprende las bases
del desarrollo de una
aplicación Web en
Microsoft ASP.NET?
— USD 4.2
BE
È EN RESUMEN
El Web hosting involucra el confgurar el servidor web con las confguraciones y archivos de código correcto de modo
ET
que los usuarios remotos pueden tener acceso satisfactoriamente a la aplicación Web.
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
ICA
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.
Figura 4-10
ER
Interfaz del Administrador
de Servicios de
Información de Internet
(IIS) ÁM
Tome Nota
www.pdftron.com
Algunas aplicaciones
Web complejas
podrían necesitar que
implemente archivos
DLL al Cache de
RO
ensamble global (GAC).
En tal situación, usted
podría necesitar crear
un paquete instalador
de Windows para
BE
implementar en lugar
de utilizar xcopy o FTP.
Un 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.
ET
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.
Comprender las Aplicaciones Web 123
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
ICA
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.
Figura 4-11
Cuadro de diálogo Add
ER
Virtual Directory
ÁM
www.pdftron.com
RO
BE
Implementació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.
ET
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.
; ¿Listo para la • Utilizar un Instalador de Windows: Un Instalador de Windows puede desempeñar
certificación? un número de acciones personalizadas durante el proceso de implementación y por
¿Comprende las bases lo tanto, puede ser utilizado para implementar sitios Web muy complejos que
del Web Hosting con el requieren la creación automática de directorios virtuales, servicios de reinicio,
Servidor Web de IIS? registrar componentes, etc.
— USD 4.3
124 Lección 4
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
ICA
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
ER
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.
SOAP
RO
SOAP 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
BE
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
CI
<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>
Comprender las Aplicaciones Web 125
<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:
•
ICA
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.
ER
Este es un paquete de respuesta desde el servidor:
<?xml version=”1.0” encoding=”utf-8”?>
<soap:Envelope
Tome Nota
Un servicio Web
ÁM
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
www.pdftron.com
puede existir sin un xmlns:xsd=”http://www.w3.org/2001/XMLSchema”
archivo WSDL, pero
debe saber el mensaje xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/”>
exacto SOAP entrante <soap:Body>
que el servicio Web
RO
espera antes de que lo <ToLowerResponse
pueda utilizar.
xmlns=”http://northwindtraders.com”>
<ToLowerResult>sample string</ToLowerResult>
BE
</ToLowerResponse>
</soap:Body>
</soap:Envelope>
CI
WSDL
ET
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.
ICA
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.
ER
Figura 4-12
Seleccione la plantilla de
aplicación web vacía de
ASP.NET para Servicios
Web
ÁM
www.pdftron.com
RO
BE
[WebService(Namespace = “http://northwindtraders.com/”)]
ET
[WebServiceBinding(ConformsTo
= WsiProfles.BasicProfle1_1)]
[WebMethod]
return inputString.ToUpper();
[WebMethod]
Tome Nota {
Puede utilizar el return inputString.ToLower();
nombre de dominio
ICA
de su compañía como }
parte del espacio de
nombre (namespace) }
para distinguir
sus servicios Web 4. Seleccione Depurar después Generar TextWebService para compilar el proyecto y garantizar
publicados de otras que no hay errores. El servicio Web ahora está listo para utilizarse.
ER
compañías.
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
ÁM
tener un namespace único con el fin de que las aplicaciones cliente se distingan de otros
www.pdftron.com
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
RO
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
BE
ejercicio.
Figura 4-13
Seleccione la plantilla de
CI
Figura 4-14
Página de prueba de un
servicio Web
ICA
ER
ÁM
www.pdftron.com
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
RO
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-15
BE
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.
Figura 4-16
Valor de retorno desde un
servicio Web
ICA
ER
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.
ÁM
www.pdftron.com
Consumir Servicios Web
En esta sección, aprenderá cómo acceder a servicios Web desde una aplicación cliente.
RO
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.
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
CI
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
ET
(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”
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”
ICA
Text=”Introduzca texto” />
<br />
<asp:Button ID=”Button1”
runat=”server”
Text=”Invocar Métodos de Servicio”
ER
onclick=”Button1_Click” />
</p>
<p>
<strong>Results:</strong><br />
ÁM
ToLower method:
www.pdftron.com
<asp:Label ID=”toLowerLabel”
runat=”server”
Text=”Label” ForeColor=”Green” />
<br />
RO
ToUpper method:
<asp:Label ID=”toUpperLabel”
runat=”server”
Text=”Label” ForeColor=”Green” />
BE
</p>
</form>
</body>
</html>
CI
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:
ET
Figura 4-18
Nodo de referencias Web
del proyecto
ICA
ER
ÁM
www.pdftron.com
Figura 4-19
Nodo de referencias Web
RO
del proyecto
BE
CI
ET
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.
; ¿Listo para la Como resultado, trabajar con objetos remotos es similar a trabajar con objetos locales.
certificación?
¿Comprende las Cuando crea una referencia Web, Visual Studio lee el archivo WSDL apropiado para
bases del desarrollo determinar cuáles clases y métodos están disponibles en el servidor remoto. Cuando llama
de servicios Web? a un método en un objeto remoto, el .NET Framework traduce su llamado y lo resuelve en
— USD 4.4 mensajes SOAP y los transmite sin intervención de su parte.
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
ICA
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.
•
ER
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
ÁM
sesión y estado de aplicación utilizan recursos de servidor para la administración
www.pdftron.com
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
RO
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.
•
BE
» Evaluación de Conocimiento
CI
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.
Comprender los conceptos básicos de bases de datos 133
ICA
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
ER
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>
ÁM
www.pdftron.com
<head>
<title>Pagina de Ejemplo</title>
<style type=”text/css”>
RO
div
{
font-family: Verdana;
font-size: 9pt;
BE
}
</style>
</head>
CI
<body>
<div style=
“font-weight: bold; font-size: 12pt;”>
ET
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;
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
ICA
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
ER
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
ÁM
un navegador Web. Cuando un usuario inicia sesión en la aplicación Web, desea que
www.pdftron.com
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
RO
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
BE
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>
Comprender los conceptos básicos de bases de datos 135
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
ICA
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.
ER
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:
ÁM
public double Convert(double amount,
www.pdftron.com
string from, string to)
{
// Código para desarrollar la conversión de moneda
RO
}
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.
BE
» Evaluación de Competencia
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?
ICA
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
ER
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?
ÁM
www.pdftron.com
» Evaluación de Dominio
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?
CI
Está desarrollando una porción de un sitio Web que permite a los usuarios introducir su
ET
ICA
Comprender los Objetos Comprender las aplicaciones de los 5.1
Windows® Forms
Comprender Valores y Referencias Comprender las aplicaciones basadas en 5.2
consola
Comprender la Encapsulación Comprender los Servicios de Windows 5.3
ER
Términos Clave
• Parámetros de la línea de comando • Eventos • Servicio de Windows
• Consola
ÁM
• Instalador
www.pdftron.com
• Delegados • Herencia visual
RO
BE
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
CI
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.
ET
138 Lección 5
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.
ICA
Un 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
ER
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.
ÁM
www.pdftron.com
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.
RO
Figura 5-1
Cuadro de Herramientas
de Visual Studio
BE
CI
ET
Tome Nota
Un control es un Un formulario y sus componentes generalmente responden a las acciones del usuario tales
elemento de la interfaz como presionar una tecla o el movimiento del ratón. Estas acciones son llamadas Eventos.
de usuario distinto que La mayoría del código que escribe como desarrollador de Formularios de Windows es
acepta entradas de un capturar tales eventos y manejarlos creando una respuesta apropiada para cada evento. En
usuario o visualiza una el siguiente ejercicio creará un Formulario de Windows que muestra el valor de la fecha
salida al usuario. seleccionada por el usuario.
Comprender las Aplicaciones de Escritorio 139
Figura 5-2
Dialogo para nuevo
proyecto de Visual Studio
ICA
ER
ÁM
www.pdftron.com 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
RO
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
BE
en la superficie del Diseñador y organice los controles como se muestra en la Figura 5-3.
Figura 5-3
Windows Form con un
Date Time Picker y un
CI
control Label
ET
ICA
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.
ER
Comprender el modelo de evento de un Windows Form
El 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
ÁM
enlazar los eventos a sus respectivos manejadores de evento.
www.pdftron.com
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
RO
de evento, Visual Studio genera el siguiente código para agregar el manejador de evento
al evento:
this.dateTimePicker1.ValueChanged +=
BE
newSystem.EventHandler(
this.dateTimePicker1_ValueChanged);
Aquí el Value Changed es el evento del control Date Time Picker que nos gustaría
CI
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.
ET
Otra cosa para notar es que la sintaxis para agregar un delegado utiliza el operador+=.
Tome Nota Esto es debido a que el .NET Framework soporta delegados multicast donde un
Un delegado se puede delegado puede ser enlazado a más de un método, por lo tanto permite notifcaciones de
enlazar a cualquier uno a muchos cuando el evento es disparado.
método cuya firma
coincide con la del
manejador de evento.
Comprender las Aplicaciones de Escritorio 141
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
ICA
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.
ER
Æ 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.
ÁM
www.pdftron.com
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
RO
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
BE
Figura 5-4
Plantilla de Formulario
heredado
ET
142 Lección 5
Figura 5-5
Cuadro de dialogo de
Selector de Herencia
ICA
ER
4. Seleccione la vista de código para el InheritedForm, verá que la clase InheritedForm hereda
ÁM
del Form1 como se muestra a continuación. Si no utilizó la plantilla de Formulario heredado
www.pdftron.com
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
RO
{
publicInheritedForm()
{
BE
InitializeComponent();
}
CI
6. En la vista del Diseñador, haga doble clic en InheritedForm. Esta acción agrega un manejador
ET
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(
label1.Text =
dateTimePicker1.Value.ToLongDateString();
}
Comprender las Aplicaciones de Escritorio 143
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]
Application.EnableVisualStyles();
Application
.SetCompatibleTextRenderingDefault(false);
ICA
Application.Run(new InheritedForm());
ER
es mostrada en el control label. A diferencia del Form1 creado previamente donde
inicialmente el control label estaba vacío.
www.pdftron.com
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.
Las aplicaciones MDI permiten a múltiples ventanas compartir un solo menú y barra de
BE
Figura 5-6
Microsoft Excel 2010
como una aplicación MDI
ET
144 Lección 5
Tome Nota Las aplicaciones MDI contrastan con aplicaciones de interfaz de documentos simple (SDI)
Puede ser complicado donde cada ventana contiene su propio menú y barra de herramientas. Las aplicaciones SDI
implementar soporte se basan en el sistema operativo para proporcionar la funcionalidad de administración de
para múltiples ventana (por ejemplo, en Windows, puede cambian entre múltiples ventanas utilizando la
monitores en Barra de Tareas de Windows).
aplicaciones MDI ya
que la ventana padre Hay mucho debate entre los diseñadores de interfaz de usuario sobre qué interfaz de
necesita extenderse a aplicación funciona mejor. Generalmente hablando, SDI es considerado más adecuado
múltiples monitores. 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,
ICA
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.
ER
PREPÁRESE. Lance el Microsoft Visual Studio y cree un nuevo proyecto de Aplicación de
Windows Forms llamado MDIApplication.
ÁM
1. Seleccione la ventana de Propiedades para el Form1 y establezca la propiedad Text a “MDI
www.pdftron.com
Application” y la propiedad IsMdiContainer a True.
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();
}
Comprender las Aplicaciones de Escritorio 145
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(
Tome Nota
object sender, EventArgs e)
El signo & antes de un
carácter en un texto {
de menú no se muestra ChildForm child = new ChildForm();
sino que hace del child.MdiParent = this;
carácter un acceso
child.Show();
directo al menú. Por
ejemplo, el menú & }
Window puede ser
7. En el formulario padre, haga doble clic en Window, Arrange, Cascade, Horizontal y Vertical,
ICA
invocado presionando
Alt+W. Las teclas respectivamente y agregue manejadores de evento para sus eventos Click:
de acceso no serán private void cascadeToolStripMenuItem_Click(
notorias hasta que el object sender, EventArgs e)
usuario presione la
{
tecla Alt. Una opción
en Windows controla LayoutMdi(MdiLayout.Cascade);
ER
si las teclas de acceso }
directo son visibles
o no.
private void horizontalToolStripMenuItem_Click(
object sender, EventArgs e)
{
ÁM
www.pdftron.com
LayoutMdi(MdiLayout.TileHorizontal);
}
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
ET
ICA
¿Comprende
cómo desarrollar Finalmente, el método LayoutMdies utilizado por los elementos de menú en el menú
aplicaciones de Ventana para ordenar las ventanas hijo. El método acepta un parámetro de tipo MdiLayout
Windows Forms? enumeration. El valor determina si la ventana hijo necesita mostrarse de forma horizontal
— USD 5.1 o vertical, en cascada o como ícono.
ER
Comprender las aplicaciones basadas en consolaÁM
È EN RESUMEN
www.pdftron.com
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.
RO
Una aplicación de consola es ejecutada desde la ventana de consola. La entrada en
Tome Nota la aplicación de consola puede ser proporcionada utilizando parámetros de la línea de
Para habilitar la lectura comando o la aplicación de consola puede leer interactivamente caracteres desde la ventana
o escritura a la consola de consola. Similarmente, la salida de la aplicación de consola también es escrita en la
BE
desde una aplicación ventana de comandos . Puede habilitar la lectura o escritura a la consola creando una
de Windows Forms, aplicación y utilizando la plantilla de Aplicación de Consola en Visual Studio.
establezca el tipo de
salida del proyecto a También puede utilizar aplicaciones de consola para crear comandos que pueden ser
Aplicación de consola ejecutados desde la línea de comando. Por ejemplo, puede tomar ventaja de las tuberías y
CI
en las propiedades del fltros proporcionados por el sistema operativo para pasar la salida de un comando como
proyecto. entrada a otro comando, de este modo creando comandos más poderosos y combinando
comandos simples.
ET
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.
Comprender las Aplicaciones de Escritorio 147
ICA
ER
ÁM
www.pdftron.com
2. En el Program.cs, modifique el código dentro del método Main como se muestra abajo:
static void Main(string[] args)
{
RO
if (args.Length< 1)
return;
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
Figura 5-10
Estableciendo opciones
de inicio en la ventana de
propiedades del proyecto
ICA
; ¿Listo para la
certificación?
¿Comprende
cómo desarrollar
ER
aplicaciones basadas
en consola? — USD 5.2
Un Servicio de Windows es una aplicación que se ejecuta en el fondo y no tiene ninguna interfaz de usuario.
RO
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
BE
computadora es iniciada.
Tome Nota
Debido a que un Algunos ejemplos de un servicio de Windows incluyen un servidor Web que escucha las
servicio de Windows 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.
CI
es capaz de ejecutarse
en el fondo, no
necesita que un Los servicios juegan un rol importante en la arquitectura de la aplicación Enterprise. Por
usuario inicie sesión ejemplo, puede tener un servicio que escuche órdenes entrantes e inicie un fujo de trabajo
con el fin de funcionar. de procesamiento de orden cuando una orden es recibida.
ET
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.
Comprender las Aplicaciones de Escritorio 149
Todos los servicios de Windows deben derivarse de la clase ServiceBase. Esta clase base
Tome Nota proporciona la estructura y funcionalidad básica para crear un servicio de Windows. Puede
La edición de Visual invalidar los métodos de clase baseOnStart, OnStop, OnPause y OnContinue, para agregar
Studio Express no su lógica personalizada que desearía para ejecutar, en respuesta de los cambios en estados
proporciona plantillas de servicio.
para crear proyectos
ICA
de servicio de El siguiente ejercicio demuestra cómo crear un servicio de Windows simple que escribe
Windows. Necesitará mensajes a un Event log de aplicación. Los EventLogs son parte de Windows que son
Visual Studio para utilizados por tareas del sistema operativo y aplicaciones ejecutándose en el fondo para
completar los registrar errores u otros mensajes informativos. Windows defne tres event logs por
ejercicios que utilizan defecto: Sistema, Aplicación y Seguridad. Las aplicaciones generalmente utilizan el event
los proyectos de log de Aplicación para informar su mensaje. La utilidad del Visor de Sucesos puede ser
Servicio de Windows.
ER
utilizada para ver los mensajes en los event logs.
Figura 5-11
RO
Seleccionar la plantilla de
proyecto de Servicio de
Windows
BE
CI
ET
ICA
InitializeComponent();
if (!EventLog.SourceExists(“FirstService”))
{
EventLog.CreateEventSource(
ER
“FirstService”, “Application”);
}
eventLog1.Source = “FirstService”;
eventLog1.Log = “Application”;
ÁM
www.pdftron.com
}
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
RO
información:
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry(
BE
“Iniciando el servicio”,
EventLogEntryType.Information, 1001);
}
CI
“Deteniendo el Servicio”,
EventLogEntryType.Information, 1001);
}
protected override void OnPause()
{
eventLog1.WriteEntry(
“Pausando el servicio”,
EventLogEntryType.Information, 1001);
Comprender las Aplicaciones de Escritorio 151
}
protected override void OnContinue()
{
eventLog1.WriteEntry(
“Continuando el servicio “,
EventLogEntryType.Information, 1001);
}
protected override void OnShutdown()
{
ICA
eventLog1.WriteEntry(
“Apagando el servicio “,
EventLogEntryType.Information, 1001);
}
ER
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
ÁM
invalidar estos métodos. Si un servicio necesita invalidar estos métodos depende del valor
www.pdftron.com
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.
RO
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.
Tome Nota
BE
servicio es iniciado. La 1. Abra el proyecto FirstService creado en el ejercicio previo. Haga clic derecho en la
propiedad StartType superficie del Diseñador de FirstService.cs y seleccione la opción Agregar instalador
puede tener uno de desde el menú de contexto.
tres valores posibles.
El valor Manual, el 2. Esta acción agrega un nuevo archivo ProjectInstaller.cs al proyecto. Abra el Diseñador
ET
cual también es el para ProjectInstall.cs. se dará cuenta que se agregan dos componentes al Diseñador, como
valor por defecto, se muestra en la Figura 5-12.
indica que necesita
3. Acceda a las propiedades para el componente ProcessInstaller1y cambie la propiedad
iniciar el servicio
AccountaLocalService.
manualmente. El valor
Automatic indica que el 4. En seguida, accede a las propiedades del componente serviceInstaller1. Cambie la
servicio será iniciado propiedad de DisplayNameaFirstService y la propiedad Description a “Una simple prueba
automáticamente de servicio”. Note que el valor de la propiedad StartType es establecida por defecto a
cuando Windows Manual.
inicie. El valor Disabled
indica que el servicio 5. Seleccione Generar, Generar Solución (o presione F6) para generar el proyecto. El servicio
no puede ser iniciado. de Windows ahora está listo para ser instalado.
152 Lección 5
Figura 5-12
Vista de Diseñador para
ProjectInstaller.cs
Tome Nota
Cuando agrega un instalador a un proyecto de servicio de Windows, las clases
Con el fin de minimizar ServiceProcessInstaller y ServiceInstaller son agregadas al proyecto. La clase
ICA
los riesgos a la ServiceProcessInstaller desempeña tareas de instalación que son comunes a todos los
seguridad, a menos servicios de Windows en una aplicación. Estas incluyen la confguración de la cuenta
que un servicio de de inicio de sesión para el servicio de Windows. La clase ServiceInstaller, por otra parte,
Windows necesite
desempeña las tareas de instalación que son específcas a un solo servicio de Windows, tales
privilegios de
como la confguración de ServiceNameyStartType.
seguridad más altos
ER
con el fin de funcionar,
deberá abstenerse
La propiedad Account de la clase ServiceProcessInstaller especifca el tipo de cuenta
de utilizar la cuenta bajo el cual se ejecutan los servicios. La propiedad Account es el tipo de enumeración de
Local System para ServiceAccount donde los valores posibles son LocalService, LocalSystem, NetworkService
ejecutar un servicio de y User. El valor LocalSystem especifca una cuenta con privilegios altos mientras la cuenta
LocalService actúa como un usuario sin privilegios.
Windows.
ÁM
www.pdftron.com
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.
RO
Æ Instalar un Servicio de Windows
1. Ejecute el símbolo del sistema de Visual Studio como administrador. Para acceder al
de Windows requiere símbolo del sistema, vaya a Inicio seleccione Todos los Programas, después Visual Studio,
acceso al Registro de posteriormente VisualStudio Tools y elija Símbolo del sistema de Visual Studio. Para ejecutar
Windows. Por lo tanto, un programa como administrador en Windows, haga clic derecho en el acceso directo del
necesita asegurarse programa y seleccione la opción Ejecutar como administrador desde el menú.
que ejecuta el
CI
installUtil.exe como 2. Cambie el directorio al directorio de salida del proyecto FirstService. Este es el directorio
administrador. 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,
ET
Figura 5-13
Vista de Diseñador para
ProjectInstaller.cs
ICA
Æ Trabajar con un servicio de Windows
ER
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
ÁM
computadora como en la Figura 5-14.
www.pdftron.com
Figura 5-14
La sección de servicios
le permite trabajar con
servicios instalados
RO
BE
CI
2. Seleccione el servicio First Service y haga clic en el hiperenlace Iniciar, como se muestra
ET
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.
154 Lección 5
Figura 5-15
Mensaje de control de
servicio cuando se está
iniciando un servicio
ICA
Figura 5-16
ER
Mensaje de control de
servicio cuando se inicia
un servicio
ÁM
www.pdftron.com
RO
BE
CI
ET
; ¿Listo para la
certificación?
¿Comprende cómo
desarrollar servicios de
Windows? — USD 5.3
Comprender los conceptos básicos de bases de datos 155
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
ICA
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.
ER
• 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
ÁM
ejecución que se ejecutan en el fondo y no tienen una interfaz de usuario.
www.pdftron.com
• 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
RO
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
BE
espacios proporcionados.
1. Utilice la propiedad _________________de la clase ServiceInstaller para especifcar
un breve comentario que explica el propósito del servicio.
ET
ICA
Opción Múltiple
ER
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.
ÁM
b. Establecer la propiedad del servicio de Windows a True.
www.pdftron.com
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.
RO
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.
BE
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?
Comprender los conceptos básicos de bases de datos 157
a. ServiceBase
b. ServiceInstaller
c. ServiceProcessInstaller
d. ServiceController
ICA
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
ER
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);
ÁM
b. this.MouseMove = new MouseEventHandler
www.pdftron.com
(Form1_HandleMouse);
c. this.MouseDown+= new MouseEventHandler
(Form1_HandleMouse);
RO
d. this.MouseMove+= new MouseEventHandler
(Form1_HandleMouse);
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);
CI
b. LayoutMdi(MdiLayout.Cascade);
c. MdiLayout(LayoutMdi.TileVertical);
d. MdiLayout(LayoutMdi.Cascade);
ET
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
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
ICA
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
ER
d. Polimorfsmo Visual
» Evaluación de Competencia ÁM
www.pdftron.com
Proyecto 5-1: Utilizar Herencia Visual
Está desarrollando un juego que permite a los usuarios golpear un área objetivo en un
BE
» Evaluación de Competencia
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?
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?
Lección 6
ICA
Comprender los Objetos Comprender los sistemas de administración 6.1
de bases de datos relacionales
Comprender los Valores y Referencias Comprender los métodos de consulta de 6.2
bases de datos
Comprender el encapsulamiento Comprender los métodos de conexión de 6.3
ER
bases de datos
Términos Clave ÁM
• Diagrama de entidad - relación • Procedimiento almacenado • Lenguaje de consulta estructurado
www.pdftron.com
• Primera forma normal parametrizado • Tercera forma normal
• Archivos planos • Segunda forma normal • XML
• Normalización • Procedimiento almacenado
RO
BE
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.
ET
160 Lección 6
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.
ICA
Comprender las bases de datos
Una base de datos es una colección organizada de datos interrelacionados que es administrada como una sola unidad.
ER
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.
ÁM
www.pdftron.com
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.
RO
SQL Server, Access, Oracle y MySql son todos RDBMSs.
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
CI
Una 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.
Comprender las Bases de Datos 161
Figura 6-1
Una tabla de base de
datos
ICA
Comprender el diseño de bases de datos relacionales
Diseñ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.
ER
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
ÁM
y consistentes .
www.pdftron.com
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
RO
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.
BE
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.
CI
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.
ET
ICA
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
ER
ú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.
•
ÁM
Relación: Una relación es una asociación entre entidades. Por ejemplo, Takes es una
www.pdftron.com
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
RO
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:
BE
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
ET
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.
Comprender las Bases de Datos 163
Figura 6-2
Un diagrama Entidad -
Relación
ICA
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:
ER
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.
ÁM
Para la Figura6-2, esto puede ser llevado a cabo agregando una columna Customer ID en la
www.pdftron.com
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?”
Clientes
BE
ID Name City
1001 Jane Doe Berlin
1002 John Doe Tokyo
CI
Ordenes
Comprender la normalización
El 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.
ICA
Por ejemplo, como parte del análisis de entidad – relación, puede tener una tabla Book que
tiene las siguientes columnas:
Books
ER
1 Cocina ligera 1001 Cocina
2 Profecía 1002 Misterio y Suspenso
3 Cambio 1003 Negocios
4
ÁM
La Confesión 1002 Misterio y Suspenso
www.pdftron.com
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
RO
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
BE
datos correcto, pero no Cada uno de estos problemas puede ser reparado siguiendo el proceso de normalización.
puede garantizarle que Hay cinco formas normales, estas formas son utilizadas como parte del proceso de
tiene los elementos de normalización. Esta lección solo discute las primeras tres, ya que son las requeridas en la
información correctos mayoría de los casos.
para empezar.
Customer
ICA
la clave principal.
Customer
Id FirstName LastName
1 Jane Doe
ER
2 John Doe
3 Howard Steel
CustomerPhones
ÁM
www.pdftron.com
Id PhoneNumber
1 (503) 555-6874
Tome Nota
2 (509) 555-7969
RO
Crear columnas
repetidas tales como 2 (509) 555-7970
PhoneNumber1 y 3 (604) 555-3392
PhoneNumber2 para
normalizar la tabla 3 (604) 555-3393
Customer no es una
BE
solución aceptable Aquí, la tabla Customer y la tabla CustomerPhones están ambas en la 1NF. Ambas tablas
debido a que la 1NF tienen una clave principal (Id en la primer tabla y la combinación de Id y PhoneNumber
no permite repetir en la segunda tabla) que establece una relación entre ellas. Dando cualquier Id para
columnas. 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
CI
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.
Tome Nota tabla Customers que no sea funcionalmente dependiente de la clave principal. Las tablas
La 2NF solo aplica Customer y CustomerPhones ya están en la 2NF.
a tablas que tengan
claves principales Sin embargo, tome el ejemplo de la siguiente tabla:
compuestas (múltiples
columnas juntas Ordenes
forman una clave
principal). Los valores
OrderId CustomerId OrderDate CustomerName
combinados de
todos los cambios en 101 1 10/1/2010 Jane Doe
una clave principal 102 2 10/5/2010 John Doe
compuesta deben ser
103 1 10/4/2010 Jane Doe
ICA
únicos.
Si una tabla satisface
Aquí, las columnas OrderId y CustomerId juntas identifcan una fla única y por lo tanto
la 1NF y tiene una sola
hacen una clave principal compuesta. Sin embargo, la columna OrderDate es funcionalmente
columna en la clave
dependiente solo en OrderId, y CustomerNamees dependiente solo en CustomerId. Esto
principal, entonces la
viola la 2NF debido a que las columnas que no son clave son funcionalmente dependientes
tabla también se ajusta
en parte de la clave principal.
ER
a 2NF.
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
ÁM
y OrderDate son funcionalmente dependientes en OrderId y en consecuencia se ajusta a
www.pdftron.com
la 2NF.
Items
BE
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
ET
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
Comprender las Bases de Datos 167
ICA
datos
È EN RESUMEN
Los datos son esenciales para muchas aplicaciones de negocios y como desarrollador le gusta pasar mucho tiempo
ER
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.
ÁM
SQL es el lenguaje utilizado por la mayoría de los sistemas de bases de datos para administrar
www.pdftron.com
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.
RO
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
BE
un ciclo que se ejecute diez veces, establezca e inicialice variables, mover el registro de
punteros, etc.
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.
ET
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:
168 Lección 6
ICA
Tome Nota En esta lección, aprenderá como trabajar con una base de datos de Microsoft SQL Server.
En la edición del Visual Si no tiene acceso a una versión reciente de SQL Server, puede descargar el SQL Server
Studio Express, la 2008 Express gratis desde microsoft.com/express/database. Esta lección utilice la base
ventana del Explorador 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
ER
de Servidores se llama
Explorador de Bases instrucciones en msdn.com/en-us/library/ms143221.aspx.
de Datos y puede
abrirse seleccionando El siguiente ejercicio muestra como conectarse y utilizar la base de datos de Northwind
Ver, Otras Ventanas, con Visual Studio.
Explorador de Bases
ÁM
www.pdftron.com
de Datos.
Æ 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
RO
y haga clic en el botón Conectar con Base de Datos en la barra de herramientas del
Explorador de Servidores.
Figura 6-3
Conectándose a una base
de datos
CI
ET
Comprender las Bases de Datos 169
Figura 6-4
Accediendo a una base
de datos a través del
Explorador de Servidores
ICA
ER
ÁM
www.pdftron.com
RO
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#.
BE
Figura 6-5
Propiedades de la base
de datos
CI
ET
PAUSA. Accederá a los datos desde la base de datos de Northwind en el siguiente ejercicio.
170 Lección 6
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
ICA
Las utilidades de SQL Query Analyzer y osqlcommand-prompt son herramientas
instaladas con SQL Server.
ER
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
ÁM
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
www.pdftron.com
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:
RO
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.
BE
Figura 6-6
Diseñador de Consultas
de Visual Studio
CI
ET
Comprender las Bases de Datos 171
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.
ICA
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.
ER
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.
www.pdftron.com
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(
RO
object sender, EventArgs e)
{
if (textBox1.TextLength > 0)
{
BE
SelectData(textBox1.Text);
}
}
para que coincida con la ruta local del archivo de la base de datos en su computadora:
private void SelectData(string selectCommandText)
{
try
ET
{
// 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);
172 Lección 6
ICA
usingSystem.Data;
usingSystem.Data.SqlClient;
ER
Figura 6-7
Ejecutando consultas
desde una aplicación
de C#
ÁM
www.pdftron.com
RO
BE
Seleccionar Datos
La sentencia SELECT es utilizada para recuperar datos desde una o más tablas de la base de datos.
SELECT lista_de_campos
FROM lista_de_tablas
Comprender las Bases de Datos 173
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:
ICA
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:
ER
SELECT *
FROM Orders
ÁM
También puede seleccionar información desde múltiples tablas, por ejemplo:
www.pdftron.com
Select OrderId, Customers.CustomerId, ContactName
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.
CI
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:
ET
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.
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
ICA
para texto y fechas incluida en los resultados.
en SQL es una comilla
simple.
También puede combinar múltiples condiciones en una sola cláusula WHERE. Por
ejemplo:
SELECT *
ER
FROM Orders
Aquí las condiciones WHERE fltran las órdenes donde ShipCountry es “Canadá” y la
RO
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:
BE
SELECT *
FROM Orders
CI
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
Comprender las Bases de Datos 175
ICA
Por ejemplo, puede utilizar la siguiente consulta para encontrar a cuáles países está
embarcando más en sus órdenes:
FROM Orders
ER
GROUP BY ShipCountry
Puede pensar en la cláusula GROUP BY como creador de “buckets”, en este caso uno para
RO
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.
BE
Figura 6-8
Resumiendo información
utilizando la cláusula
GROUP BY
CI
ET
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 datos
La sentencia UPDATE es utilizada para actualizar datos en las tablas de la base de datos.
ICA
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:
ER
UPDATE Customers
UPDATE Customers
BE
UPDATE Customers
CITY = ‘Tokyo’
Tome Nota
Es altamente WHERE CustomerId = ‘ALFKI’
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.
Comprender las Bases de Datos 177
Insertar Datos
La 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:
ICA
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
ER
campo de entidad, puede dejarlo fuera de la lista de campos, como en el siguiente ejemplo:
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
RO
coincidan:
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,
CI
FROM Suppliers
Eliminar datos
La 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:
FROM Customers
ICA
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:
ER
DELETE FROM CustomersCopy
www.pdftron.com
DELETE FROM CustomersCopy
En contraste con las consultas ad-hoc, los procedimientos almacenados son consultas
BE
Los procedimientos almacenados tienen dos benefcios principales, primero, los puede
CI
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.
ET
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.
ICA
AS
ER
RETURN
www.pdftron.com
Tome Nota
en el Explorador de Servidores y seleccione Ejecutar. El resultado del procedimiento
Puede utilizar la almacenado es visualizado en la ventana de salida.
sentencia ALTER
PROCEDURE para 5. También puede ejecutar este procedimiento almacenado desde el proyecto QueryCS
modificar la definición que creó antes. En lugar de una sentencia SQL, solo teclee el nombre del procedimiento
RO
de un procedimiento almacenado y presione el botón Ejecutar SQL. El resultado del procedimiento almacenado
almacenado existente. es visualizado en el Formulario de Windows.
Los procedimientos almacenados parametrizados le permiten pasar argumentos de tiempo de ejecución a SQL Server.
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.
ET
@CustomerIdchar(5),
AS
ICA
SELECT @TotalSales = SUM(Quantity * UnitPrice)
ON Customers.CustomerId = Orders.CustomerId)
ER
INNER JOIN [Order Details]
www.pdftron.com
RETURN
Figura 6-9
CI
El cuadro de diálogo
Ejecutar procedimiento
almacenado aparece para
los valores del parámetro
ET
Comprender las Bases de Datos 181
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.
ICA
las siguientes tareas:
1. Cree un nuevo proyecto de Aplicación para Windows llamado ParameterizedSP.
ER
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)
{
ÁM
www.pdftron.com
TotalSalesLabel.Text = String.Format(
“Total Sales: {0}”,
GetTotalSales(CustomerIdTextBox.Text));
RO
}
{
doubletotalSales = -1;
try
CI
{
// Cambia el string de conexión
// para coincidir con su sistema.
ET
stringconnectionString =
@”Data Source=.\SQLEXPRESS;” +
@”AttachDbFilename=” +
@”c:\SqlSampleDB\NORTHWND.MDF;” +
@”Integrated Security=True;” +
@”Connect Timeout=30;User Instance=True”;
SqlConnection connection =
newSqlConnection(connectionString);
182 Lección 6
SqlCommand command =
connection.CreateCommand();
command.CommandType =
CommandType.StoredProcedure;
Tome Nota
Si agrega una nueva command.CommandText = “GetCustomerSales”;
fila a la tabla con una command.Parameters.AddWithValue(
columna de identidad,
puede utilizar la “@CustomerId”, customerId);
variable de SQL Server command.Parameters.AddWithValue(
@@IDENTITY para
ICA
recuperar el valor de la “@TotalSales”, null);
columna de identidad command.Parameters[“@TotalSales”].DbType
para la fila recién
creada. = DbType.Currency;
command.Parameters[“@TotalSales”].Direction
ER
= ParameterDirection.Output;
connection.Open();
command.ExecuteNonQuery();
totalSales = Double.Parse(
ÁM
www.pdftron.com
command.Parameters[“@TotalSales”]
.Value.ToString());
connection.Close();
}
RO
catch (Exception ex)
{
MessageBox.Show(ex.Message);
BE
}
returntotalSales;
}
CI
Figura 6-10
Ejecutando
procedimientos
almacenados
parametrizados desde una
aplicación de C#
Comprender las Bases de Datos 183
ICA
.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
ER
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.
ÁM
C# también le da una sentencia using que ayuda a garantizar que los objetos costosos tales
www.pdftron.com
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.
RO
// deshechar objetos con la sentencia using
using (connection)
{
BE
connection.Open();
command.ExecuteNonQuery();
totalSales = Double.Parse(
command.Parameters[“@TotalSales”]
CI
; ¿Listo para la
certificación? .Value.ToString());
¿Comprende los
}
distintos métodos de
consulta de bases de
ET
datos? — USD 6.2 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.
; ¿Listo para la
certificación?
¿Comprende los
métodos de conexión
a bases de datos?
— USD 6.3
184 Lección 6
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
ICA
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.
ER
Trabajar con Archivos Planos
Un archivo plano es como una tabla de una base de datos que esta almacenada dentro de un archivo de disco stand-
alone.
ÁM
www.pdftron.com
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
RO
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.
BE
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
CI
de streams y backingstore.
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
Comprender las Bases de Datos 185
ICA
1. Cree un nuevo proyecto de Aplicación de Consola llamado WorkingWithTextFiles.
ER
stringmyDocumentsPath =
Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments);
ÁM
CopyDataToTextFile(myDocumentsPath
www.pdftron.com
+ @”\CustomerList.txt”);
DisplayTextFile(myDocumentsPath
+ @”\CustomerList.txt”);
RO
}
static private void CopyDataToTextFile(
stringfleName)
{
BE
try
{
// Cambia elstring de conexión
CI
@”AttachDbFilename=” +
@”c:\SqlSampleDB\NORTHWND.MDF;” +
@”Integrated Security=True;” +
@”Connect Timeout=30;User Instance=True”;
SqlConnection connection =
newSqlConnection(connectionString);
SqlCommand command =
connection.CreateCommand();
186 Lección 6
command.CommandText =
“SELECT CustomerId, CompanyName, “
+ “ContactName, Phone FROM Customers”;
using (connection)
{
connection.Open();
SqlDataReader reader =
command.ExecuteReader();
ICA
using (StreamWritersw =
newStreamWriter(fleName))
{
ER
while (reader.Read())
{
stringcustomerRow =
String.Format(“{0}, {1}, {2}, {3}”,
ÁM
www.pdftron.com
reader.GetValue(0),
reader.GetValue(1),
reader.GetValue(2),
reader.GetValue(3));
RO
sw.WriteLine(customerRow);
}
}
BE
}
}
catch (Exception ex)
{
CI
Console.WriteLine(ex.Message);
}
}
ET
ICA
Console.WriteLine(ex.Message);
}
}
ER
usingSystem.Data.SqlClient;
using System.IO;
www.pdftron.com
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
RO
nulo. El código utiliza este hecho para determinar cuándo terminar de leer desde el archivo
de texto.
XML (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
CI
clientes:
<?xml version=”1.0” encoding=”utf-8”?>
<!--Customer List-->
ET
<Customers>
<Customer Id=”ALFKI”>
<CompanyName>AlfredsFutterkiste</CompanyName>
<Phone>030-0074321</Phone>
</Customer>
<Customer Id=”EASTC”>
<CompanyName>Eastern Connection</CompanyName>
<Phone>(171) 555-0297</Phone>
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.
ICA
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.
ER
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
ÁM
pueden ser anidados y no se pueden sobreponer. Por ejemplo, el siguiente XML es inválido
www.pdftron.com
debido a la superposición entre los elementos CompanyName y Phone:
<Customer Id=”EASTC”>
<CompanyName>Eastern Connection<Phone>
</Phone>(171) 555-0297</CompanyName>
RO
</Customer>
</Customers>
Los documentos XML son jerárquicos por naturaleza. Cada documento XML contiene
BE
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:
CI
<Customer Id=”ALFKI”>
Aquí el elemento Customer incluye un atributo cuyo nombre es Id y cuyo valor es ALFKI.
ET
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:
Comprender las Bases de Datos 189
ICA
1. Cree un nuevo proyecto de Aplicación de Consola llamado WorkingWithXmlReader.
ER
{
while (reader.Read())
{
ÁM
if (reader.IsStartElement())
www.pdftron.com
{
switch (reader.Name)
{
RO
case “CompanyName”:
if (reader.Read())
{
Console.Write(
BE
break;
case “Phone”:
if (reader.Read())
ET
{
Console.WriteLine(
“Phone: {0}”, reader.Value);
}
break;
}
}
}
190 Lección 6
ICA
<CompanyName>AlfredsFutterkiste</CompanyName>
<Phone>030-0074321</Phone>
</Customer>
<Customer Id=”EASTC”>
ER
<CompanyName>Eastern Connection</CompanyName>
<Phone>(171) 555-0297</Phone>
</Customer>
</Customers>
ÁM
www.pdftron.com
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.
RO
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.
BE
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
Comprender las Bases de Datos 191
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 .NET Framework proporciona tres tipos de clases DataAdapter para trabajar con
ICA
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.
Tome Nota • La clase OleDbDataAdapter es utilizada para trabajar con fuentes de datos OLEDB.
También se puede La clase OleDbDataAdapter es parte del espacio de nombres de System.Data.
ER
conectar a una base OleDb.
de datos de SQL Server • La clase SqlDataAdapter es utilizada para trabajar con una base de datos de SQL
utilizando las clases Server. La clase SQLDataAdapter es parte del espacio de nombres de System.Data.
SqlClient.
• dbcAdapteryOleDbAdapter. Sin embargo, la clase SQLDataAdapteres optimizada para
ÁM
SQL Server. Por lo tanto, cuando se trabaja con SQL Server, es preferible utilizar la
www.pdftron.com
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
RO
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
BE
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.
CI
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.
ET
WorkingWithDataSet();
}
ICA
new SqlConnection(cString);
string customerCommandText =
“SELECT * FROM Customers”;
SqlDataAdapter customerAdapter =
new SqlDataAdapter(
ER
customerCommandText, northwindConnection);
string ordersCommandText =
“SELECT * FROM Orders”;
ÁM
SqlDataAdapter ordersAdapter =
www.pdftron.com
new SqlDataAdapter(
ordersCommandText, northwindConnection);
DataRelation relation =
BE
customerOrders.Relations.Add(“CustomerOrders”,
customerOrders.Tables[“Customers”]
.Columns[“CustomerID”],
customerOrders.Tables[“Orders”]
.Columns[“CustomerID”]);
CI
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();
}
Comprender las Bases de Datos 193
ICA
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.
; ¿Listo para la
certificación?
ER
¿Comprende los
distintos métodos de
conexión a bases de
datos? — USD 6.3
ÁM
www.pdftron.com
RO
BE
CI
ET
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
ICA
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.
ER
» Evaluación de Conocimientos
Opción Múltiple
ICA
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
ER
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.
ÁM
c. Escribir una consulta SQL y utilizar el método SqlDataAdapter.Fill para ejecutar
www.pdftron.com
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.
RO
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
BE
b. SELECT
c. UPDATE
d. DELETE
CI
4. Necesita actualizar los campos de Región para los clientes de Japón. Escribe la
siguiente sentencia SQL UPDATE:
UPDATE Customers
ET
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.
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
ICA
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
ER
b. StreamReader
c. BinaryReader
d. DataReader
ÁM
8. Está desarrollando una aplicación que necesitará copiar datos desde una vista de SQL
www.pdftron.com
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
RO
c. SelectCommand
d. Update
9. Está desarrollando una aplicación que administra clientes y sus órdenes. ¿Cuál de las
BE
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)
Comprender los conceptos básicos de bases de datos 197
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’
ICA
d. DELETE * FROM Employees
WHERE EmployeeType IN (‘C’, ‘T’)
ER
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”);
ÁM
www.pdftron.com
c. sqlDataAdapter.Fill(dsEmployees);
d. sqlDataAdapter.Fill(dsEmployees, “Employees”);
RO
BE
CI
ET
198 Lección 6
» Evaluación de Competencia
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.
ICA
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
ER
Proyecto 6-3: Normalizar Tablas
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?
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
ET
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?