Você está na página 1de 199

ICA

ER
ÁM
www.pdftron.com
RO
BE
CI
ET
Lección 1

Introducción a la programación

Matriz de dominio de objetivos

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


objetivos

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

Comprender las estructuras de decisión Comprender estructuras de decisión 1.2


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

Como desarrollador de software para corporación Northwind, parte de su trabajo es desarrollar


programas de computadora que resuelvan problemas de la compañía. Algunos de estos ejemplos
CI

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

ƒ Comprender la programación de computadoras


È EN RESUMEN

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

Introducción a los Algoritmos

ICA
Un algoritmo es un conjunto de pasos ordenados y fnitos para resolver un problema dado.

El término algoritmo se refere a un método para solucionar problemas. Los algoritmos se


pueden describir con palabras pero podrían suceder errores de comprensión relacionados

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

Introducción a los diagramas de flujo


Un diagrama de fujo es una representación gráfca de un algoritmo. Un diagrama de
CI

fujo se realiza generalmente utilizando símbolos estandarizados para diagramas de fujo.


Algunos de los símbolos comunes de diagramas de fujo aparecen en la tabla 1-1.

Tabla 1-1 Símbolo del diagrama de flujo Descripción


ET

Símbolos de diagramas de Inicio o final de un algoritmo


flujo comunes
Un proceso u operación computacional

Operación de entrada o salida

Operación de toma de decisión

Especifica el flujo de control


Introducción a la programación 3

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

Tabla 1-2 Cantidad < 10 S N N N


Una tabla de decisión que Cantidad < 50 S S N N
calcula descuentos
Cantidad < 100 S S S N
Descuento 5% 10% 15% 20%
****Note las líneas en negritas que dividen la tabla en cuadrantes*****
Para descubrir cual acción se debe aplicar, se evalúa cada condición para encontrar la regla
coincidente y seleccionar la acción especifcada en la columna con la regla coincidente. Por
ejemplo, si el valor de la cantidad es 75 entonces la primera regla evalúa un No, la segunda
regla evalúa un No y la tercera evalúa un Sí. Por lo que debe seleccionar el elemento de la
acción de la columna (N, N, S) que establece un descuento de 15%.
4 Lección 1

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

Como se mencionó en la sección anterior, las computadoras necesitan de instrucciones


precisas y completas para llevar a cabo una tarea. Este conjunto de instrucciones se conocen
como programas de computadora o simplemente programas.

En un nivel muy básico, las computadoras utilizan el sistema binario para representar

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

directamente en su programa de C#.

El .NET Framework

El .NET Framework cuenta con tres componentes principales: un ambiente en tiempo de


CI

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

las librerías de clase base con las que cuenta el Framework.

En este curso utilizará un ambiente de desarrollo integrado (IDE) para desarrollar su


código. Utilizará Visual Studio o la edición gratuita de Visual Studio Express para escribir
su código. Cualquiera de estas herramientas le ofrece un ambiente altamente productivo
para desarrollar y evaluar sus programas.
Introducción a la programación 5

Æ 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

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


Figura 1-2.
Figura 1-2
Resultado del programa
CI

en una ventana
ET

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


PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
6 Lección 1

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

se debe traducir para


la arquitectura de la
máquina donde se
ejecutará el código.
El sistema en tiempo
de ejecución de .NET
Framework se encarga
de esta traducción tras
bambalinas utilizando
un proceso llamado
compilación just-in-
time.
Introducción a la programación 7

ƒ Comprender la estructura de un programa en C#


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

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

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 (}).

La línea 3 defne un espacio de nombre, Lesson01. Los Espacios de nombres se utilizan


para organizar clases e identifcarlas de forma única. El espacio de nombre y los nombres
CI

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

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


number.

Comprender las constantes


ET

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:

const int i = 10;

Aquí se declara una constante i del tipo de datos int y almacena un valor de 10. Una vez
declarado, el valor de una constante no puede cambiar.
Introducción a la programación 9

Comprender los tipos de datos


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

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.

Tabla 1-3 Tipo de dato Tamaño Rango de valores


Algunos tipos de datos byte 1 byte 0 a 255
predefinidos

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.

Comprender los Arreglos


CI

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

Un arreglo en C# se utiliza comúnmente para representar un conjunto de elementos de


ET

tipo similar. A continuación se incluye un ejemplo de una declaración de un arreglo:

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

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

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

Comprender los operadores


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

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

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


CI

Multiplicativo * / %
Aditivo + -
Desplazamiento << >>
ET

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


Igualdad == !=
AND lógico &
XOR lógico ^
Logical OR |
AND Condicional &&
OR Condicional ||
Condicional ?:
Asignación = *= /= %= += -= <<= >>= &= ^= |=
Introducción a la programación 11

El operador de incremento unario (++) agrega 1 al valor de un identifcador. De igual


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

int x = 10;

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

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

Sin embargo, la forma en la cual funcionan los operadores de incremento y decremento

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

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


ÁM
Aquí en la primera sentencia, el valor de x se regresa antes del incremento. Como resultado,

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 segunda sentencia, el valor de x se incrementa antes de regresar su valor para la


asignación. Por lo tanto, después de ejecutar la sentencia, el valor tanto de x como de z
es 14.
RO
Comprender los métodos
Los métodos sonbloques de código que contienen series de sentencias. Los métodos pueden recibir entradas vía
argumentos y pueden regresar un valor a quien los invoca.
BE

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

ƒ Comprender las estructura de decisión


È EN RESUMEN

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

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

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.

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


BE

int number1 = 10;

int number2 = 20;

if (number2 > number1)


CI

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


ET

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


4. Verá el resultado del programa en la ventana de línea de comandos.
5. Presione una tecla para cerrar la ventana de consola.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

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


Introducción a la programación 13

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:

if (number2 > number1)

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


BE

Por otro lado, observe este ejemplo:

if (number2 > number1)


CI

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

Console.WriteLine(number2);
ET

Aquí, sólo la primera sentencia Console.WriteLine es parte de la sentencia if. La segunda


sentencia Console.WriteLine siempre se ejecutará no importando el valor de la expresión
booleana.

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

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

int number1 = 10;


14 Lección 1

if (number1 > 5)

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

if (number1 < 20)

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

ICA
}

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

ER
number1 es mayor que 5

number1 es menor que 20


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

number1 es mayor que 5


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

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

Æ Uso de la sentencia if-else


CI

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


1. Agregue un nuevo proyecto de aplicación de consola (de nombre ifelse_Statement)
ET

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

TestIfElse(10);

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


public static void TestIfElse(int n)
{
if (n < 10)
{
Introducción a la programación 15

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


}
else if (n < 20)
{
Console.WriteLine(“n es menor que 20”);
}
else if (n < 30)
{
Console.WriteLine(“n es menor que 30”);
}

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

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

Figura 1-5 INICIO


Diagrama de flujo
CI

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.

La sentencia switch consiste de la palabra reservada switch, seguida de una expresión en


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

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

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


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

www.pdftron.com
solución Lesson01.

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

TestSwitch(10, 20, ‘+’);


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

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

{
BE

int result;

switch (opr)
CI

case ‘+’:

result = op1 + op2;


ET

break;

case ‘-’:

result = op1 - op2;

break;

case ‘*’:
Introducción a la programación 17

Tome Nota result = op1 * op2;


El método Console.
Write puede utilizar break;
cadenas de formato
como “Resultados: case ‘/’:
{0}” para dar formato
al resultado. Aquí la result = op1 / op2;
cadena {0} representa
el primer argumento break;
que sigue a la cadena
de formato. En el default:
método TestSwitch,

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:

public static void TestSwitchFallThrough()

{
18 Lección 1

Tome Nota DateTime dt = DateTime.Today;


Puede decidir entre
utilizar sentencias if- switch (dt.DayOfWeek)
else o una sentencia
switch dependiendo {
de la naturaleza
de comparación y case DayOfWeek.Monday:
legibilidad del código.
Por ejemplo, el código case DayOfWeek.Tuesday:
del método TestIfElse
toma decisiones case DayOfWeek.Wednesday:
con base en las

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

ƒ Comprender las estructuras de repetición


CI

È 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.

Un ciclo también puede interrumpirse utilizando una sentencia de transferencia de control


que asigne el control fuera del ciclo. Estas sentencias son break, goto, return o throw. La
sentencia continue se puede utilizar para pasar el control a la siguiente iteración del ciclo
sin salir de este.
Introducción a la programación 19

Comprender el ciclo while


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

La forma general de un ciclo while es

while (boolean test)

sentencia

Aquí, se lleva a cabo una evaluación booleana al principio del ciclo. Si es verdadero, se

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.

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

WhileTest();
BE

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

private static void WhileTest()


CI

int i = 1;
ET

while (i <= 5)

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

i++;

}
20 Lección 1

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


5. Verá el resultado del programa en la ventana de línea de comandos.
6. Presione una tecla para cerrar la ventana.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

En este ejercicio, a la variable i se le asigna el valor 1. A continuación, se evalúa la condición


del ciclo while. Puesto que la condición es verdadera (1<=5), se ejecuta el código del
bloque de sentencias while. El valor de i se escribe en la ventana de línea de comandos y el
valor de i se incrementa en 1, por lo que ahora vale 3. El control pasa entonces de vuelta a
la sentencia while y la condición se evalúa de nuevo. Puesto que la condición sigue siendo

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

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


Figura 1-6
RO
Diagrama de flujo
INICIO
equivalente al ciclo while

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.

Comprender el ciclo do-while


El ciclo do-while ejecuta repetidamente un bloque de sentencias hasta que una expresión booleana específca se

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

Æ Uso de la sentencia do-while


CI

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


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

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

DoWhileTest();

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

private static void DoWhileTest()

int i = 1;

do
22 Lección 1

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

i++;

while (i <= 5);

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.

Comprender los ciclos


BE

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

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

Tome Nota sentencia


Las tres expresiones
de control se deben Como puede ver, el ciclo for combina las tres expresiones de control esenciales de la
colocar entre iteración, lo cual resulta en código más legible. El ciclo for es particularmente útil para
paréntesis. Si se crear iteraciones que se deben ejecutar una cantidad especifcada de veces.
necesita ejecutar más
de una sentencia como Considere los siguientes pasos para crear un programa que utilice la sentencia for.
parte del ciclo for, se
deben colocar dentro
de llaves.
Introducción a la programación 23

Æ Uso de la sentencia for

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


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

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

ForTest();

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

ICA
private static void ForTest()

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

ER
{

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

}
ÁM
www.pdftron.com
}

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


5. Verá el resultado de su programa en la ventana de línea de comandos.
RO
6. Presione una tecla para cerrar la ventana.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

Cuando se ejecuta el método ForTest, se produce el mismo resultado que con el método
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

//no hace nada

Comprender los ciclos foreach


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

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

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


foreach es la siguiente:

foreach (TipoElemento elemento in colección)

sentencia

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

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.

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


ÁM
www.pdftron.com
ForEachTest();

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

private static void ForEachTest()


RO
{

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

foreach (int i in numbers)


BE

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


CI

}
ET

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


5. Verá el resultado de su programa en la ventana de línea de comandos.
6. Presione una tecla para cerrar la ventana.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.

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

La recursividad y la iteración se encuentran relacionadas. Se puede escribir un método que


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

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

Æ Uso del método recursivo


BE

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


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

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


CI

Factorial(5);

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


ET

public static int Factorial(int n)

if (n == 0)

return 1; //caso base

}
26 Lección 1

else

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

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


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

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

ƒ Comprender el manejo de excepciones


BE

È EN RESUMEN

El .NET Framework soporta el manejo de excepciones para errores en tiempo de ejecución. En esta sección aprenderá
CI

a utilizar las excepciones try, catch, y fnally.

Una excepción es una condición de error que ocurre durante la ejecución de un programa
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();

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


ÁM private static void 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

Tome Nota Presione una tecla para cerrar la ventana.


En el método 7. Elimine el archivo data.txt y ejecute nuevamente el programa. Esta vez aparecerá una
ExceptionTest, es excepción a FileNotFoundException y aparecerá un mensaje en la ventana.
incorrecto cambiar
el orden de los dos PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente ejercicio.
bloques catch. Las
excepciones más
específicas necesitan
enlistarse antes de
las excepciones Para manejar la excepción, se colocan la sentencias que pueden causar la excepción en un
genéricas, de lo bloque try. Luego se agregan los bloques catch para manejar una o más excepciones. En este
contrario ocurrirán ejemplo, además de manejar la excepción FileNotFoundException, también utilizamos un

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

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


CI

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


solución Lesson01.

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


ET

TryCatchFinallyTest();

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


private static void TryCatchFinallyTest()
{
StreamReader sr = null;
try
{
sr = File.OpenText(@”c:\data.txt”);
Introducción a la programación 29

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

Presione una tecla para cerrar la ventana.


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

; ¿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

Matriz de resumen de habilidades


En esta lección aprendió:

• Un algoritmo es un conjunto de pasos ordenado y fnito para solucionar un


problema dado. Puede encontrar de utilidad expresar un algoritmo a través de un
diagrama de fujo o de una tabla de decisión antes de desarrollar un programa de
manera formal.

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

llevar a cabo tareas repetitivas: el ciclo while, el do-while, el for y el foreach.


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

• El ciclo for combina los tres elementos de iteración: la sentencia de inicialización,


la condición de terminación y la sentencia de incremento/decremento en un código
más legible.
• El ciclo foreach es útil para iterar los elementos de una colección.
ET

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


mismo para computar un resultado.
• El .NET Framework soporta el manejo de excepciones estándar y maneja errores
en tiempo de ejecución. Para manejar las excepciones, se coloca código que arroja
excepciones dentro de un bloque try y se coloca código que maneja las excepciones
en un bloque catch.
• El bloque fnally se utiliza con el bloque try. El bloque fnally siempre se ejecuta sin
importar si se arroja o no una excepción. El bloque fnally se utiliza con frecuencia
para escribir código de limpieza.
Comprender los conceptos básicos de bases de datos 31

» Evaluación de conocimiento

Complete los espacios en blanco

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


espacios en blanco proporcionados.
1. La sentencia ______ selecciona la ejecución de una lista de sentencias teniendo una
etiqueta asociada que corresponda al valor de una expresión.
2. El ciclo ______ evalúa la condición al fnal en lugar de hacerlo al principio del ciclo.

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

Encierre la letra que corresponda a la respuesta correcta.


1. Si escribe el siguiente código:

int n = 20;
CI

int d = n++ + 5;

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


a. 25
ET

b. 26
c. 27
d. 28
3. Si escribe el siguiente código:

private static void WhileTest()

int i = 1;
32 Lección 1

while (i < 5)

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

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:

int number1 = 10;

int number2 = 20;


ÁM
www.pdftron.com
if (number2 > number1)

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

para almacenar estos valores?


a. Byte
b. Char
c. Short
d. Int
10. Si no tiene una clase base en su algoritmo recursivo, crea una recursión infnita. Una
recursión infnita causará que su programa arroje una excepción. ¿Cuál excepción será
esta?
a. OutOfMemoryException
b. StackOverfowException

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()

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


ÁM
www.pdftron.com
{

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

}
RO
}

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


a. 0
BE

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

tipos globalmente únicos?


a. Assemblies
b. Espacio de nombres
ET

c. Clase
d. Tipo de datos
14. Al escribir el siguiente código:

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

int val = numbers[1];

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

RectangleHandler handler;
34 Lección 1

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


a. 1
b. 2
c. 3
d. 4

» Evaluación de destreza

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

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#

Se encuentra desarrollando una librería de funciones matemáticas. Antes desarrolló


RO
el siguiente diagrama de fujo para describir el algoritmo para calcular el factorial de
un número. Necesita escribir un equivalente en C# para este diagrama de fujo. ¿Cómo
escribiría el programa?

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

Proyecto 1-3: Maneje excepciones

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

ICA
escribiría un programa con estas características?

Proyecto 1-4: Cree un algoritmo recursivo

Se encuentra desarrollando una librería de funciones de utilidad para su aplicación. Necesita


escribir un método que tome un entero y cuente la cantidad de dígitos signifcativos en

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

Introducción a la programación orientada a objetos

Matriz de dominio de objetivos

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


del objetivo

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

Como desarrollador de software para la corporación Northwind, forma parte de un equipo de


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

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.

Pensar de forma orientada a objetos

ICA
Un objeto de software es conceptualmente similar a un objeto en el mundo real.

Una buena manera de empezar a pensar de forma orientada a objetos es observando el


mundo real por ejemplo, un coche, un teléfono, un reproductor de música, etc. Notará

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.

Un objeto de software es conceptualmente similar a uno del mundo real. Un objeto


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

Comprender las clases


Una clase es una plantilla de la cual se crean los objetos individuales.
CI

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.

Æ Crear una clase

PREPÁRESE. Antes de realizar estos pasos, asegúrese de abrir Microsoft Visual Studio y abrir
un nuevo proyecto de aplicación de consola de nombre Lesson02.
1. Agregue una nueva clase de Visual C# de nombre Rectangle al proyecto.
Introducción a la programación orientada a objetos 39

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


class Rectangle
{
private double length;
private double width;

public Rectangle(double l, double w)


{

ICA
length = l;
width = w;
}

public double GetArea()

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

ejemplo, un modifcador de acceso public no limita el acceso pero el modifcador de acceso


private limita el acceso dentro de la clase en la cual se defna el campo.

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


Tome Nota
CI

Cada clase es una


definición de un nuevo
tipo de datos. Por lo
tanto, una definición
ET

de una clase se le
relaciona con un tipo.

Comprender los métodos


Un método es un bloque de código contiene una serie de sentencias.

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

es público, el tipo de retorno es double, el nombre del método es GetArea, la lista de


parámetros está vacía y el bloque de código es una sentencia return sencilla.

Un método puede regresar un valor al código invocador. Si un método no regresa ningún


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

El tipo de retorno del método GetArea es double, lo que signifca que el método GetArea
debe retornar un valor del tipo doble. El método GetArea satisface este requerimiento al

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.

Comprender los constructores


BE

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

Un constructor que no toma argumentos se conoce como el constructor default. Si se


defne una clase sin ningún constructor, se genera automáticamente un constructor default
invisible que no hace nada.

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

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


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

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

el código llama al método GetArea en el objeto y el valor retornado por el método se


almacena en la variable área. Los campos de datos, length y width, del objeto rect no están
accesibles aquí debido a que están marcados como private en la defnición de la clase.

Comprender las propiedades


Las propiedades le permiten accede a los datos de una clase de una forma segura y fexible.

Las propiedades son miembros de la clase que se pueden acceder como los campos de
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

UTILICE el proyecto que guardó en el ejercicio anterior.


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

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

public double Width


{
get
{
return width;
}
set
Introducción a la programación orientada a objetos 43

{
if (value > 0.0 )
width = value;
}
}

public double GetArea()


{
return length * width;

ICA
}
}

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


class Program
{

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

área del rectángulo.


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

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.

Comprender las propiedades auto-implementadas


Las propiedades auto-implementadas simplifcan las declaraciones de las propiedades.

C# introdujo las propiedades auto-implementadas con la versión 3 para simplifcar la

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

public double Width


{
CI

get
{
return width;
ET

}
set
{
width = value;
}
}

Con las propiedades auto-implementadas de C#, la sintaxis simplifcada para la declaración


de la propiedad inicia de la siguiente forma:
Introducción a la programación orientada a objetos 45

public double Length { get; set; }

public double Width { get; set; }

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

Las propiedades auto-implementadas utilizadas con los constructores predefnidos también


simplifcan la creación e inicialización de los objetos. Por ejemplo, ahora se puede crear e
inicializar un objeto de la siguiente manera:
static void Main(string[] args)

ICA
{
Rectangle rect = new Rectangle
{ Length = 10.0, Width = 20.0 };
Console.WriteLine(
“Area of Rectangle: {0}”, rect.GetArea());

ER
}

Uso de la palabra reservada this


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

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

private double width;

public Rectangle(double l, double w)


{
CI

length = l;
width = w;
}
ET

public double GetArea()


{
return length * width;
}

Pero se pudo haber escrito de la siguiente manera:


class Rectangle
46 Lección 2

{
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

Comprender los delegados


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

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:

public void DisplayArea(Rectangle rect)


{
Console.WriteLine(rect.GetArea());
}

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

ICA
RectangleHandler handler;

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


handler += new Rectanglehandler(DisplayArea);

Como alternativa, puede utilizar la siguiente sintaxis:

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.

Comprender los eventos


CI

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.

Los eventos no se limitan a la programación en GUI. De hecho, los eventos tienen un


papel importante en las librerías de clase del .NET Framework para que los objetos hagan
notar cualquier cambio en sus estados. Trabajará con eventos en prácticamente todos los
programas.
48 Lección 2

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


• Un delegado que conecta al evento con su controlador(es) de evento(s).
• Una clase que contiene los datos del evento. Esta clase generalmente se deriva de
la clase EventArgs.
Para defnir un evento, puede utilizar un delegado personalizado. Sin embargo, en la
mayoría de los casos si el evento no contiene información específca del mismo, no será
sufciente con utilizar el delegado predefnido EventHandler. El delegado EventHanler se
defne de la siguiente manera:
public delegate void EventHandler(Object sender, EventArgs
e);

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.

Æ Publicar y suscribirse a eventos


ÁM
www.pdftron.com
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Modifique el código de la clase Rectangle de la siguiente forma:
class Rectangle
{
RO
public event EventHandler Changed;
private double length;
public double Length
BE

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);
}
}
}

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


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

{
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

r.Changed += new EventHandler(r_Changed);

La frma del método r_Changed coincide con los requerimientos del delegado EventHandler.
El método r_Changed se invoca tan pronto se establece el valor de la propiedad Length
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

Comprender los espacios de nombres


Un espacio de nombres le permite organizar el código y crear nombres de clase únicos.

Un espacio de nombres es un elemento del lenguaje que le permite organizar código


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

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

Comprender los miembros estáticos


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

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

Æ Crear miembros estáticos

UTILICE el proyecto que guardó en el ejercicio anterior.


1. Modifique el código de la clase Rectangle como se muestra a continuación:
class Rectangle
{
public static string ShapeName
{
get { return “Rectángulo”; }

ICA
}
public double Length { get; set; }
public double Width { get; set; }

public double GetArea()

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 };

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


{1}”,
BE

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

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

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

; ¿Listo para la Un miembro estático no se puede referenciar a través de un objeto de instancia. En su


certificación? lugar, un miembro estático se referencia a través del nombre de la clase (como Rectangle.
¿Comprende los ShapeName en el ejercicio anterior). No se puede utilizar la palabra reservada this con un
conceptos básicos de método estático o una propiedad debido a que sólo se puede utilizar para acceder a objetos
las clases? -2.1 de instancia.
52 Lección 2

ƒ Comprender los valores y las referencias


È EN RESUMEN

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

Un tipo de valor almacena directamente los datos en su memoria. Los tipos de referencia,
por otro lado, sólo almacenan una referencia a la ubicación en memoria. Los datos se
encuentran almacenados en la ubicación en memoria a la cual se hace referencia. La mayoría

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.

Comprender las estructuras

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:

public struct Point

{
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

Comprender la asignación de memoria


Después de introducir un valor o texto en una celda, puede modifcarla de varias formas. Puede eliminar el contenido
ET

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"; nombre m100 "Northwind"


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

name = “Northwind”;

la cadena “Northwind” se crea en una ubicación de memoria en particular (para simplifcar,


digamos que la dirección en memoria es m100) y esa dirección de memoria se almacena en
CI

el nombre de la variable. Cuando es hora de recuperar el valor del nombre de la variable,


el tiempo de ejecución sabrá que su contenido no se encuentra almacenado en la variable
en si sino en la ubicación en memoria a la cual apunta la variable.
ET

Æ Copiar valores y tipos de referencia

UTILICE el proyecto que guardó en el ejercicio anterior.


1. Agregue el siguiente código después de la definición de la clase Rectangle para crear una
estructura Point:
struct Point
{
public double X, Y;
}
54 Lección 2

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


static void Main(string[] args)
{
Tome Nota
Point p1 = new Point();
Es posible crear un
struct sin utilizar el p1.X = 10;
operador new. Puede
p1.Y = 20;
simplemente decir
Point p1;
para crear una variable
Point p2 = p1;
del tipo struct.

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

Rectangle rect1 = new Rectangle


{ Length = 10.0, Width = 20.0 };

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

de la copia, las dos


variables apuntan al
mismo proyecto. Cuando se ejecuta la siguiente sentencia, se crea una nueva variable p2 en memoria y su
contenido se copia desde la variable p1:
ET

Point p2 = p1;

Después de ejecutar esta sentencia, se crea la variable p2 y el contenido de la variable p1 se


copia a la variable p2. Tanto p1 como p2 tienen su propio conjunto de valores disponibles
en sus ubicaciones en memoria respectivas. Por lo que, cuando se ejecuta la siguiente
sentencia:

p2.X = 100;

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


valor de X para la variable p1 permanece sin cambios.
Introducción a la programación orientada a objetos 55

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

Rectangle rect2 = rect1;

Pero puesto que la clase Rectangle es un tipo de referencia, el contenido de la variable


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

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

retorna un método. La memoria asignada en el heap se reclama automáticamente por el


recolector de basura cuando los objetos ya no se utilizan (ya no hay objetos que hacen
referencia a ellos).
CI

ƒ 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.

El encapsulamiento es un mecanismo para restringir el acceso a una clase o miembros clase


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

Tome Nota En los ejercicios anteriores, vio el encapsulamiento cuando:


Cuando el código en C# • Declaró los miembros de datos como private y reforzó la inicialización de campos
se compila, el código de datos vía un constructor. Como los miembros de datos se encuentran ocultos
ejecutable de salida de los usuarios de la clase, el desarrollador de la clase Rectangle puede cambiar los
contenido dentro de nombres de los campos de datos sin la necesidad de cambiar el código invocador.
un archivo .dll o .exe
también se llama • Las propiedades ofrecen una excelente manera de encapsular los campos de datos
como una asamblea. junto con cualquier otro tipo de lógica.
Una asamblea es una • Los modifcadores de acceso como private y public le permiten controlar el nivel
unidad de código de acceso que quiera tener para un miembro de la clase o para la clase en sí.
ejecutable que puede • En esta sección aprenderá más sobre los modifcadores de acceso.
instalar de forma

ICA
independiente.

Comprender los modificadores de acceso

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>

Modificador de acceso Descripción


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

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


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

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ó.

La herencia le permite crear clases nuevas que reutilizan, extienden y modifcan la


funcionalidad defnida en las clases existentes. La clase que hereda la funcionalidad se
conoce como clase derivada y la clase cuya funcionalidad es heredada se conoce como

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

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


class Rectangle : Polygon
{
CI

public Rectangle(double length, double width)


{
Length = length;
ET

Width = width;
}

public double GetArea()


{
return Width * Length;
}
}
58 Lección 2

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


static void Main(string[] args)
{
Rectangle rect = new Rectangle(10, 20);
Console.WriteLine(
“Width={0}, Length={1}, Area = {2}”,
rect.Width, rect.Length, rect.GetArea());
}

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.

Comprender las clases abstractas y selladas


BE

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

En el ejercicio anterior defnió un método GetArea en la clase Rectangle. Suponga que


quiere crear otra clase, Triangle, que es del tipo Polygon. Ahora, necesitará un método
GetArea en la clase Triangle para calcular el área de un triángulo.
ET

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

Æ Crear clases abstractas

UTILICE el proyecto que guardó en el ejercicio anterior.


1. Modifique la clase Polygon como se muestra a continuación:
Introducción a la programación orientada a objetos 59

abstract class Polygon


{
public double Length { get; protected set; }
public double Width { get; protected set; }

abstract public double GetArea();


}

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

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
}
}

3. No se necesita realizar modificaciones al método Main. Seleccione Depurar, Iniciar sin


depurar. Aparecerá una ventana de consola para mostrar el ancho, longitud y área del
BE

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

public double Length { get; protected set; }


public double Width { get; protected set; }
}
CI

era funcionalmente equivalente a la siguiente declaración:


class Polygon : Object
{
ET

public double Length { get; protected set; }


public double Width { get; protected set; }
}

Pero no tiene que declarar la clase Polygon de la segunda manera porque la herencia de la
clase Object se asume de forma implícita. Como parte de esta herencia, una clase derivada
sobrescribe los métodos de la clase Object. Dos de los métodos más comunes son:
• Equals: Soporta la comparación entre dos objetos. Retorna true si los dos objetos
tienen el mismo valor.
Introducción a la programación orientada a objetos 61

• ToString: Retorna una representación string de la clase. De manera predeterminada,


retorna el nombre complete de la clase. Es con frecuencia útil para sobrescribir este
método para que regrese una representación string del estado actual del objeto.
El siguiente ejemplo muestra como sobrescribir el método ToString en la clase Rectangle:
class Rectangle : Polygon
{
public Rectangle(double length, double width)
{
Length = length;

ICA
Width = width;
}

public override double GetArea()


{

ER
return Width * Length;
}

public override string ToString()


ÁM
www.pdftron.com
{
return String.Format(
“Width = {0}, Length = {1}”,
Width, Length);
RO
}
}

Casting entre tipos


BE

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

Las clases derivadas tienen una relación “es un” con la clase base. Por ejemplo, podemos
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.

El tiempo de ejecución le permite castear un objeto a su clase o a cualquiera de sus clases


base. Por ejemplo, puede decir:
ET

Polygon p = new Rectangle(10, 20);

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

También se puede castear de la siguiente manera:

Object o = new Rectangle(10, 20);

Rectangle r = (Rectangle) o;
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

herencia? -2.2 asigna un valor null a la variable r. No se arrojarán excepciones.

ƒ 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.

Æ Uso del polimorfismo

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
}

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


class Rectangle : Polygon
RO
{
public override void Draw()
{
BE

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

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


class Triangle : Polygon
{
ET

public override void Draw()


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

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


static void Main(string[] args)
{
64 Lección 2

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


polygons.Add(new Polygon());
polygons.Add(new Rectangle());
polygons.Add(new Triangle());
foreach (Polygon p in polygons)
{
p.Draw();
}

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

Comprender las palabras reservadas override y new


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

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

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


class Triangle : Polygon
{
public new void Draw()
{
Console.WriteLine(“Dibujando: Triángulo”);

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

ƒ Comprender las interfaces


ET

È EN RESUMEN

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

Las interfaces se defnen utilizando la palabra reservada interface. Una defnición de


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

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


66 Lección 2

Esta interface se defne de la siguiente manera:

interface IComparable

int CompareTo(object obj);

}
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

UTILICE el proyecto que guardó en el ejercicio anterior.


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

class Rectangle : Polygon, IComparable


{
public double Length { get; set; }
public double Width { get; set; }
CI

public override void Draw()


{
ET

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

public double GetArea()


{
return Length * Width;
}
Introducción a la programación orientada a objetos 67

public int CompareTo(object obj)


{
if (obj == null)
return 1;

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
}
}

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


static void Main(string[] args)
RO
{
Rectangle rect1 = new Rectangle
{ Length = 10, Width = 20 };
BE

Rectangle rect2 = new Rectangle


{ Length = 100, Width = 200 };

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.

La clase Rectangle deriva se la clase Polygon e implementa la interface IComparable. Una


clase que implementa una interface debe implementar todos los métodos declarados en la
interface.

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

Resumen de la matriz de habilidades


En esta lección aprendió:
• La programación orientada a objetos es una técnica de programación que utiliza
objetos. Los objetos son estructuras de datos auto contenidas que consisten de
propiedades, métodos y eventos. Las propiedades especifcan los datos representados
por el objeto; los métodos especifcan el comportamiento del objeto y los eventos
proporcionan la comunicación entre los objetos.
• Una clase es la plantilla a partir de la cual se crean los objetos individuales.

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

privado limita el acceso dentro de la clase en la cual se defna el campo.


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

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

Complete los espacios en blanco

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


espacios proporcionados.
1. Una __________ es una huella de un objeto.
2. Una clase que no proporciona una implementación complete se debe declarar con la
palabra reservada __________.

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

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


BE

1. Desea restringir el acceso de un método a la clase contenedora o a una clase que se


derive de la clase contenedora. ¿Cuál modifcador de acceso debería utilizar para
utilizar este método?
a. Public
CI

b. Private
c. Protected
d. Internal
ET

2. En una clase defnió un método llamado Render. Este método proporciona


funcionalidad a los archivos Render bitmap en pantalla. Le gustaría que las clases
derivadas sustituyeran esta funcionalidad para soportar la renderización de formatos de
imágenes adicionales. Desea que el método Render de la clase derivada se ejecute aun
si la clase derivada esté casteada como la clase base. ¿Cuál palabra reservada utilizaría
con la defnición del método Render en la clase base?
a. Abstract
b. Virtual
c. New
d. Overrides
Comprender los conceptos básicos de bases de datos 71

3. Defnió una clase AdvMath que defne funcionalidad matemática avanzada. No


desea que la funcionalidad de esta clase se herede a una clase derivada. ¿Cuál palabra
reservada debe utilizar para defnir la clase AdvMath?
a. Sealed
b. Abstract
c. Private
d. Internal
4. Necesita proporcionar la funcionalidad de consulta a varias de sus clases. Cada
algoritmo de clase para consulta será diferente. No todas las clases tienen una relación
“es un” entre sí. ¿Cómo soportaría esta funcionalidad?

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

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


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

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

c. public virtual void Draw()


d. {
e. // código adicional...
f. }
g. }
8. El método Draw en la clase Square debe proporcionar nuevas funcionalidades pero
también oculta la implementación de la clase Polygon del método Draw. ¿Cuál
segmento de código debería elegir?
a. class Square : Polygon
72 Lección 2

{
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

9. Se encuentra creando una nueva clase de nombre Rectangle. Escribe el siguiente


código:
class Rectangle : IComparable
ET

{
public double Length { get; set; }
public double Width { get; set; }

public double GetArea()


{
return Length * Width;
}
Comprender los conceptos básicos de bases de datos 73

public int CompareTo(object obj)


{
// a completarse
}
}

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

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;
}

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


a. void Process(object o)

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

a. public delegate void RectangleHandler(Rectangle rect);


b. También crea una variable del tipo RectangleHandler como
el siguiente:
c. RectangleHandler handler;
ET

14. Más adelante en el programa, necesita agregar un método de nombre DisplayArea a


la lista de invocación de métodos de la variable controladora. La frma del método
DisplayArea corresponde al de la frma del método RectangleHandler. Cualquier
código que escriba no debería afectar ningún código controlador de eventos existente.
¿Cuál de los siguientes códigos debería escribir?
a. Handler = new Rectanglehandler(DisplayArea);
b. Handler = DisplayArea;
c. Handler += DisplayArea;
d. Handler -= DisplayArea;
Comprender los conceptos básicos de bases de datos 75

» Evaluación de destreza

Escenario 2-1: Creación de propiedades

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

ICA
Escenario 2-2: Creación de un Struct

Se encuentra desarrollando un juego que necesita representar la ubicación de un objetivo


en el espacio tridimensional. La ubicación se identifca por los tres valores enteros x, y y
z. Creará miles de estas estructuras de datos en su programa. Necesita una forma efciente

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?.

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

Se encuentra escribiendo un código para la creación y manejo de eventos en su programa.


BE

La clase SampleClass necesita implementar la siguiente interface:

public delegate void SampleDelegate();


CI

public interface ISampleEvents

event SampleDelegate SampleEvent;


ET

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

Desarrollo General de Software

Matriz de Dominio de Objetivos

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

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

desarrollar programas de computadora que resuelven problemas de negocios complejos. Como


desarrollador, participa en el ciclo de vida de desarrollo de aplicaciones. Tiene que conocer las
diferentes fases del ciclo de vida de aplicación y a menudo necesita interactuar con el equipo de
pruebas de software y participar en las pruebas en persona. Necesita tener una comprensión general
ET

de las pruebas de software.


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

ƒ Comprender la Administración del Ciclo de Vida de


una Aplicación
È EN RESUMEN

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

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

software es identifcada. El administrador de un negocio generalmente es la persona que


patrocina el proyecto. Él o ella analizan la necesidad, verifcan cómo el proyecto encaja con
la estrategia global del negocio, organiza la fnanciación e inicializa el proceso de selección
de equipo para el proyecto.
ET

Un administrador del proyecto es probablemente la primera persona contratada por el


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

Comprender el Análisis de Requerimientos


El análisis de requerimientos es el proceso de determinar los requerimientos del negocio detallados para un nuevo
sistema de software.
Desarrollo General de Software 79

El análisis de requerimientos es uno de los pasos más importantes en el ciclo de vida


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

Un analista de negocios es responsable de analizar las necesidades del negocio y convertirlas


en requerimientos que pueden ser ejecutados por el equipo de desarrollo.

Comprender el Proceso de Diseño

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

El proceso de diseño despliega especifcaciones técnicas detalladas que serán utilizadas


por el desarrollo del sistema. La salida del proceso de diseño es un conjunto de modelos
y especifcaciones técnicas que proporcionan la dirección a los desarrolladores y otros

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.

Algunos de los participantes importantes en esta actividad son:


ÁM
www.pdftron.com
• Un arquitecto diseña el proyecto del sistema. Esto incluye identifcar los
componentes y servicios, su comportamiento y cómo interactúan entre sí y con el
mundo exterior.
• Un diseñador de experiencia del usuario crea la experiencia del usuario del sistema.
Los elementos de experiencia del usuario incluyen el diseño de los elementos de la
RO
interfaz de usuario (UI), diseñar la navegación entre varios formularios, pantallas
o páginas, etc.

Comprender el Desarrollo de Software


BE

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.

Esta es la actividad donde los requerimientos son implementados en código funcional


CI

basado en el diseño que fue establecido en la actividad previa. Al fnal de esta actividad,
se tiene una salida concreta en formato de un sistema de software con el cual el usuario
puede interactuar.

Los participantes en el proceso de desarrollo son:


ET

• 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

películas, no es sufciente sólo mostrar videos en el sitio, necesita asegurarse que


hay sufciente contenido para reunir el interés del usuario.

Comprendiendo las Pruebas de Software


La Prueba de Software verifca que la implementación coincide con los requerimientos del sistema.

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

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.

Comprender la Administración de Liberación

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.

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



RO
Administrador de Liberación: el administrador de liberación coordina a varios
equipos y unidades del negocio para garantizar la liberación a tiempo del producto
de software.
• Personal de Operación: Se aseguran que el sistema sea entregado como se
prometió. Esto podría involucrar quemar los DVDs y embarcarlos conforme
; ¿Listo para la
BE

se reciben las órdenes. O podría ser mantener un sistema de Software como un


certificación? Service (SaaS) de forma regular. El personal de operación es también responsable
¿Comprende la de la liberación de cualquier actualización del sistema (con reparadores de errores
administración o nuevas características).
del ciclo de vida • Personal de soporte técnico: Interactúan con clientes y ayudan a resolver sus
CI

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

ƒ Comprender las Pruebas


È EN RESUMEN

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

La prueba de software es un proceso de verifcar que el software funciona como se espera


y cumple todos sus requerimientos técnicos y de negocios. Cuando hay diferencia entre
Desarrollo General de Software 81

lo esperado y el comportamiento actual del sistema, un defecto de software (o “bug”) es


registrado y eventualmente pasado al responsable para repararlo.

Las pruebas de software involucran tanto pruebas funcionales y no funcionales. La


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

Comprender los Métodos de Prueba

ICA
Los métodos de prueba de software son generalmente divididos en pruebas de caja blanca y caja negra.

Tradicionalmente hay dos enfoques en la prueba de software:


• Prueba de caja negra

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

puede sólo ayudar a


encontrar defectos,
de código. Por ejemplo, una prueba de unidad puede probar si un método retorna
no garantiza la el valor correcto. La prueba de unidad es una prueba de caja blanca y a menudo es
ausencia de defectos. hecha por el desarrollador que escribe el código. La prueba de unidad a menudo
El software complejo utiliza una herramienta automatizada que puede simplifcar el desarrollo de casos
ET

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

con un sistema externo. Por ejemplo, si un componente se basa en datos de un


servicio Web externo, la prueba de integración garantiza que el componente está
funcionando correctamente con la aplicación externa.
Tome Nota
• Prueba de sistema: La prueba de sistema es la prueba global del sistema de
Es mucho más efectivo
software. En este punto todos los componentes del sistema implementados están
y menos costoso
funcionando juntos y con cualquier sistema externo.
encontrar defectos
antes que tarde en el • Prueba de aceptación: Este nivel de prueba a menudo es desempeñado por
ciclo de desarrollo de los propios clientes. Generalmente hay dos niveles de pruebas aceptación previa
software. a la liberación amplia del producto: prueba alfa y prueba beta. La prueba Alfa
es desempeñada por un grupo muy limitado de usuarios y es una oportunidad
para dar una vista de cerca al producto a los clientes más importantes y reunir
retroalimentación. Las liberaciones Alfa pueden omitir algunas características y

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

variedad de estructuras de datos y métodos asociados para manipular estas estructuras de


datos. En esta sección aprenderá algunos tipos distintos de estructuras de datos de manera
que está familiarizado con las técnicas generales para la manipulación de estructuras de
datos.
ET

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

La variable numbers entonces actúa como una referencia a la ubicación de memoria


BE

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

También es posible tener arreglos multidimensionales. Un arreglo de dos dimensiones


puede ser visto como una tabla donde cada celda es un elemento del arreglo y puede
ser direccionado utilizando el número de fla y el número de columna al cual pertenece.
Tanto el número de fla y el número de columna son indexados por cero. Por ejemplo, la
ET

expresión table[2, 3] se refere a un ítem en la tercera fla y en la cuarta columna de un


arreglo por el nombre table.

Operaciones Comunes
El arreglo soporta las siguientes operaciones:
• Asignación
• Acceso
Para trabajar con un arreglo, primero asigne la memoria creando e inicializando un arreglo
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.

En el.NET Framework, puede utilizar la clase ArrayList para aproximarse a los


requerimientos de un vector para lograr la homogeneidad y un tamaño fjo. Un ArrayList
ÁM
es un tipo de colección que puede mantener ítems de cualquier tipo de datos y se puede

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

pueden ser de diferentes tipos de datos.

Representación Interna
ET

Con el fn de evitar la reubicación excesiva de espacio de memoria y permitir una


administración sencilla, una cola a menudo es implementada internamente como un
arreglo circular de objetos, como se muestra en la Figura 3-3.

En la Figura 3-3, el índice cabeza apunta a la ubicación 2 en la cola. Ya que la cola es


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

El .NET Framework proporciona una implementación de la estructura de datos de una


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

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

Dequeue: Esta operación remueve el elemento actual en la cabeza de la cola para


apuntar al siguiente elemento en la cola, como se muestra en la Figura 3-3.
• Peek: La operación Peek le permite mirar el ítem actual en la posición de la cabeza
sin removerlo realmente de la cola.
• Contains: Esta operación le permite determinar si existe un ítem en particular en
CI

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

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


existe en la pila.

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.

Algunas otras implementaciones de listas enlazadas pueden ser utilizadas dependiendo de


RO
los requerimientos. En una lista enlazada circular, el último nodo es la lista apuntando de
regreso al primer nodo para crear un círculo. En una lista doblemente enlazada, cada nodo
contiene dos enlaces, como se muestra en la Figura 3-5.
Figura 3-5
BE

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

Un enlace es una referencia de dirección que apunta al siguiente nodo en la secuencia


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

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

ƒ Comprender los Algoritmos de Ordenamiento


È EN RESUMEN

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

Los algoritmos de ordenamiento son algoritmos que ordenan los ítems en una lista en
un cierto orden. Por ejemplo, puede utilizar un algoritmo de ordenamiento para ordenar

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.

El ordenamiento de burbuja funciona comparando dos elementos para verifcar si están


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

Visualicemos el ordenamiento de burbuja con ayuda de un ejemplo. Digamos que desea


ordenar todos los ítems en la siguiente lista en orden ascendente: (20, 30, 10, 40). Los
ítems deberían ser ordenados en orden del más pequeño al más grande. El algoritmo
de ordenamiento de burbuja intenta solucionar este problema en una o más pasadas,
con cada pasada escaneando completamente la lista de ítems. Si el algoritmo encuentra
CI

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

Tabla 3-1 Paso Antes Después Comentarios


Primera pasada del 1. 20, 30, 20, 30, El algoritmo compara los primeros dos elementos
ordenamiento de burbuja 10, 40 10, 40 (20 y 30),y ya que están en el orden correcto, no es
necesario el intercambio.
2. 20, 30, 20, 10, El algoritmo compara los siguientes dos elementos
10, 40 30, 40 (30 y 10),y ya que están fuera de lugar, los elementos
son intercambiados.
3. 20, 10, 20, 10, 30, El algoritmo compara los siguientes dos elementos
30, 40 40 (30 y 40),y ya que están en el orden correcto, no es
necesario el intercambio.
90 Lección 3

Al fnal de la primera pasada, el ordenamiento de burbuja ha desempeñado un intercambio


y hay una posibilidad que los ítems aún no están completamente ordenados. De manera
que el ordenamiento de burbuja da otra pasada a la lista.

Tabla 3-2 Paso Antes Después Comentarios


Primera pasada del 1. 20, 10, 10, 20, El algoritmo compara los primeros dos elementos
ordenamiento de burbuja
30, 40 30, 40 (20 y 10),y como están fuera de lugar, los elementos
son intercambiados.
2. 10, 20, 30, 10, 20, El algoritmo compara los siguientes dos elementos
40 30, 40 (20 y 30),y ya que están en el orden correcto, no es
necesario el intercambio.

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.

Al fnal de la segunda pasada, el ordenamiento de burbuja ha desempeñado un intercambio


y aun no puede garantizar que la lista está completamente ordenada. De manera que el

ER
ordenamiento de burbuja da otra pasada a la lista:

Tabla 3-3 Paso Antes Después Comentarios


Primera pasada del 1. 10, 20, 10, 20, El algoritmo compara los siguientes dos elementos
ordenamiento de burbuja
30, 40
ÁM 30, 40 (10 y 20),ya que están en el orden correcto, no es

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.

Al fnal de la tercera pasada, el ordenamiento de burbuja no realizó ningún intercambio.


BE

Eso garantiza que la lista ahora esta ordenada y el algoritmo puede fnalizar.

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


staticint[] BubbleSort(int[] numbers)
CI

{
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

int temp = numbers[i + 1];


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

swapped = true;
}
}
} while (swapped == true);

ICA
return numbers;
}

Ordenamiento Rápido (QuickSort)

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

El problema ahora se particiona en dos listas más pequeñas, la lista de la izquierda


y la lista de la derecha.
• Ambas listas pueden ser resueltas utilizando la técnica descrita en las viñetas
anteriores.
• Finalmente, unir todas las pequeñas listas ordenadas con el fn de crear la lista
CI

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

3. - 10 20 30 - 40 50 En la lista izquierda, 20 es mayor que


10 y 50 es más grande que 40, por lo
tanto ambos van en la lista derecha.
Nos quedan listas con solo un número,
las cuales por definición están
ordenadas.
4. 10, 20, 30, 40, 50 La lista unida final es la lista ordenada.

El defecto principal del algoritmo descrito podría parecer la memoria adicional requerida
por la creación de listas más pequeñas separadas. Sin embargo, crear listas separadas
no es necesario. Utilizando una técnica ligeramente modifcada, el arreglo puede ser

ICA
particionado, como se muestra en el siguiente código:

staticint Partition (int[] numbers, int left,


int right, intpivotIndex)
{

ER
intpivotValue = numbers[pivotIndex];

// se mueve el elemento pivote al fnal


int temp = numbers[right];
ÁM
numbers[right] = numbers[pivotIndex];

www.pdftron.com
numbers[pivotIndex] = temp;

// newPivot almacena el indice del primer número


// mayor que el pivote
RO
intnewPivot = left;
for (int i = left; i < right; i++)
{
if (numbers[i] <= pivotValue)
BE

{
temp = numbers[newPivot];
numbers[newPivot] = numbers[i];
numbers[i] = temp;
CI

newPivot++;
}
}
ET

//mueve el elemento pivote a su posición //almacenada


temp = numbers[right];
numbers[right] = numbers[newPivot];
numbers[newPivot] = temp;

returnnewPivot;
}

En esta técnica, primero el elemento pivote es movido al fnal del arreglo. Luego todos
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:

staticint[] QuickSort(int[] numbers,


int left, int right)

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

Resumen de matriz de habilidades


En esta lección aprendió:
• La administración del ciclo de vida de aplicación son las distintas actividades que
giran alrededor de un nuevo producto de software desde su comienzo a cuando el
producto de software madura y tal vez se retira.
• La prueba de software es el proceso de verifcar el software contra sus requerimientos.
Las pruebas toman lugar después que la mayoría del trabajo de desarrollo está
completado.

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

Llene los Espacios en Blanco

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


CI

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

siguiente nodo en la secuencia.


7. La operación______agrega un ítem a la cola mientras que la operación ______remueve
un ítem desde una cola.
8. El algoritmo de ordenamiento rápido utiliza las operaciones de ______ y comparación
para ordenar los elementos de una lista en el orden correcto.
9. Un ______ es responsable de analizar las necesidades del negocio y convertirlas en
requerimientos que pueden ser ejecutados por el equipo de desarrollo.
10. Tanto la prueba Alfa y la prueba Beta son parte de las pruebas de ______de un sistema.

ICA
Elección Múltiple

Encierre en un círculo la letra que corresponda a la mejor respuesta.


1. El producto que está desarrollando aún no está terminado, pero le gustaría liberar el

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

10. Está desarrollando un programa que desempeña operaciones de insertar y eliminar


frecuentes en los datos. Su requerimiento también dicta una capacidad para acceder a
registros previos y siguientes cuando el usuario presiona el botón de previo o siguiente.
¿Cuál de las siguientes estructuras de datos se ajustará mejor a sus requerimientos?.
CI

a. Arreglo
b. Lista enlazada circular
c. Lista enlazada
d. Lista doblemente enlazada
ET

11. Está desarrollando un programa que desempeña operaciones de insertar y eliminar


frecuentes en los datos. los datos necesitan ser accedidos como una pila con la
funcionalidad del último que entra es el primero que sale. Su solución debe requerir
tan poca memoria como sea posible. ¿Cuál de las siguientes estructuras de datos se
ajustará mejor a sus requerimientos?.
a. Arreglo
b. Lista enlazada circular
c. Lista enlazada
d. Lista doblemente enlazada
Comprender los conceptos básicos de bases de datos 97

» Evaluación de Competencia

Caso 3-1: Utilizando Arreglos

Está escribiendo un programa que utiliza un arreglo bidimensional. El arreglo tiene cuatro
flas cinco columnas. Necesita imprimir el elemento mayor en cada fla del arreglo. ¿Cómo
escribiría tal programa?.

Proyecto 3-2: Utilizando Colas

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?.

Proyecto 3-4: Utilizando Listas Enlazadas

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

Comprender las Aplicaciones Web

Matriz de Dominio de Objetivos

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


del Objetivo

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

ƒ Comprender el Desarrollo de una Página Web


È EN RESUMEN

Una página Web es un documento que es servido a través de la World Wide Web (WWW) y que se puede mostrar
a través de un navegador Web. Las páginas Web se desarrollan utilizando el Lenguaje de Marcado de Hipertexto
(HTML) y se almacenan en un servidor Web. Los navegadores Web descargan el HTML solicitado del servidor Web
y lo interpretan en la pantalla del usuario.

La World Wide Web (también conocida como WWW o “la Web”) es un sistema de

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

Web es el Lenguaje de Marcado de Hipertexto (HTML). HTML es un lenguaje basado


de forma indistinta en texto que utiliza varias etiquetas de marcado describiendo como el contenido es
pero son en realidad desplegado. HTML permite que imágenes, videos y otros objetos sean referenciados en
diferentes y no deben un archivo para crear páginas Web multimedia. HTML puede incrustar scripts tales como
confundirse entre sí. El JavaScript que afecta el comportamiento de las páginas Web. HTML también puede ser
ET

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.

El propósito de HTML es proporcionar un lenguaje estándar para describir páginas Web de


forma que diferentes navegadores Web pueden comprenderlo y desplegar las páginas Web.
Tome Nota HTML es un lenguaje basado en texto, lo cual signifca que puede escribir y editar paginas
HTML está basado HTML utilizando cualquier editor de texto. Cuando HTML es enviado al navegador Web,
en texto. HTML la mayoría de los navegadores le permiten visualizar el código fuente HTML de la página.
utiliza etiquetas para

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.

Este es un ejemplo de una etiqueta que despliega una imagen:


Tome Nota
Note que el documento <img height=”400px” width=”400px”
RO
HTML no contiene
la imagen en sí. alt=”Mimas Cassini” src=
La etiqueta img
específica la URL de
“http://upload.wikimedia.org/wikipedia/commons/b/bc/Mimas_
la imagen, la cual el
Cassini.jpg”/>
navegador descarga
BE

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

Este es otro ejemplo de una etiqueta HTML:

<a href=”http://en.wikipedia.org/wiki/Mimas_(moon)”>
ET

Saturn’s moon</a>

Aquí, <a> es la etiqueta de anclaje, la cual es utilizada para crear hipervínculos en la


página Web. El atributo href especifca la URL objetivo y el texto dentro de los paréntesis
Tome Nota angulares es el que es mostrado como un enlace.
Esta lección no cubre
todos los elementos Tome los pasos en el siguiente ejercicio para crear un documento HTML.
HTML. Para aprender
más sobre elementos
HTML, busque
“Elementos HTML” en
el MSDN.
102 Lección 4

Æ Trabajar con HTML

PREPÁRESE. Para crear un documento HTML, haga lo siguiente:


1. Abra el Visual Studio. Crear un Nuevo proyecto basado en la plantilla de aplicación web
vacía de ASP.NET. Nombre al proyecto TrabajandoConHTML y nombre la solución Leccion04.
2. Seleccione Proyecto, Agregar Nuevo Ítem, y seleccione la platilla de Pagina HTML. Nombre
el archivo default.htm.
3. Remplace el código por defecto en el archivo HTML con el siguiente código:
<html xmlns=”http://www.w3.org/1999/xhtml”>

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>

4. Seleccione Depurar y después Inicie la Depuración (o presione F5). La páginadefault.htm se


abrirá en un navegador Web. Note que la salida se parece a la figura 4-1, donde puede ver
las etiquetas <img>y<a>en acción.
BE

Figura 4-1
Una página HTML simple
con una imagen y un
CI

hipervínculo.
ET
Comprender las Aplicaciones Web 103

Comprender las Hojas de Estilo en Cascada


Las hojas de estilo en cascada (CSS) le permiten almacenar el estilo e información separada del código HTML.
Esta separación hace más fácil el actualizar la apariencia de su sitio Web. Visual Studio incluye herramientas para
construir y pre visualizar sus hojas de estilo.

CSS es un lenguaje que describe toda la información acerca de mostrar una página
Web. Cuando se interpreta páginas Web en un navegador, HTML especifca lo que será
mostrado. Por ejemplo, HTML puede especifcar que su documento tiene un encabezado
H1 con un texto dado, mientras CSS puede especifcar la fuente y el color que serán
aplicados al encabezado H1.

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 />

<div>Sample DIV text</div>

<div class=”block”>Sample DIV text


BE

with block class</div>

<span class=”block”>Sample SPAN text


CI

with block class</span>

</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.

Æ Trabajar con Archivos CSS


RO
PREPÁRESE. Para escribir el archivo CSS y enlazar a un archivo HTML, haga lo siguiente:
1. Agregue un Nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la
solución Leccion04. Nombre el proyecto ComprendiendoCSS.
BE

2. Seleccione Proyecto y después Agregar nuevo elemento. Seleccione la plantilla de Hoja de


Estilo. Nombre el archivo estilos .css. Remplace el código por defecto en el archivo con el
siguiente código:
body
CI

{
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;
}

3. Seleccione Proyecto, después Agregar nuevo elemento y seleccione la plantilla de Página


HTML. Nombre el archivo default.htm. Remplace el código por defecto en el archivo con el
siguiente código:
<!DOCTYPE html PUBLIC

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>

4. Seleccione Depurar y después Inicie la depuración (o presione F5). La página default.htm se


CI

abrirá en un navegador Web. Note que la salida es similar a la Figura4-2.


El elemento HTML <link>es utilizado para enlazar el archivo CSS con la página HTML:
Tome Nota <link rel=”STYLESHEET”
Cuando el CSS es
ET

type=”text/css” href=”styles.css” />


almacenado en
archivos separados, el El elemento <link> siempre se pone dentro del elemento <head>. El atributo href
navegador del usuario especifca la dirección del archivo CSS a utilizar. Para enlazar múltiples páginas con un
descargará y los archivo CSS, necesitará poner el elemento <link>dentro de cada página HTML.
almacenará localmente.
Aunque pueden ser
Visual Studio incluye un diseñador de estilo integrado que puede ayudarle en el diseño de
utilizados en múltiples
nuevos estilos CSS o para modifcar estilos existentes. Cuando abre un archivo .css, verá
paginas sin ninguna
un Nuevo menú llamado Styles. Puede crear un nuevo estilo seleccionando Styles, Add
necesidad de volver
a descargarlos, esto
Style Rule. También puede modifcar el estilo seleccionado actualmente seleccionando
reduce la transferencia
Styles, Build Style option. Esta opción abre el editor de Modify Style como se muestra en
de datos innecesaria.
la Figura 4-3.
Comprender las Aplicaciones Web 107

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

JavaScript es ejecutado por el navegador Web. El código de JavaScript es interpretado en


lugar de ser compilado, como en el caso de C#.

Todo el código de JavaScript debe ser ubicado dentro del elemento <script>. El elemento
<script> esta generalmente dentro del elemento <head>, aunque no se requiere. Se le
permite tener múltiples elementos <script> dentro de una página. Para ver el JavaScript
en acción, tome los siguientes pasos:

Æ Trabajar con JavaScript

PREPÁRESE. Para comenzar a trabajar con JavaScript, realice las siguientes tareas:

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

message = message + “mas de “;


else if (nameLen < 5)
message = message + “menos de “;
ET

else
message = message + “exactamente “;
message = message + “5 caracteres.”;
alert(message);
</script>
</head>
<body>
</body>
</html>
Comprender las Aplicaciones Web 109

3. Seleccione Depurar y después Inicie la depuración (o presione F5). La página default.htm


se abrirá en un navegador Web. Note que el código de JavaScript le pide que introduzca su
nombre. El siguiente diálogo muestra un mensaje basado en la longitud del nombre introducido,
como se muestra en las Figuras 4-4 y 4-5.

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

script, como se muestra abajo:


<script src=”SampleScript.js”>
</script>
CI

Tome Nota Aquí el archivoSampleScript.js contiene todo el código de JavaScript y el elemento


script enlaza a este archivo utilizando el atributo src. Almacenar el JavaScript en archivos
Aunque todos
externos ofrece muchas ventajas:
los navegadores
modernos soportan el • Mayor facilidad de mantenimiento: Si utiliza el mismo código de JavaScript en
ET

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

Programación del lado del cliente vs. lado del servidor


Si un programa es de lado del cliente o lado del servidor depende de donde se ejecuta el programa al fnal.

La programación del lado del cliente se refere a los programas que se ejecutan
completamente en la computadora local del usuario. Los ejemplos de programas del lado
del cliente son la aplicación de Formularios de Windows y el código de JavaScript que
se ejecuta dentro del navegador Web. Los programas del lado del cliente no consumen
recursos del servidor.

Por otro lado, la programación del lado del servidor se refere a los programas que son

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#.

La infraestructura de ASP.NET tiene dos partes principales:


ET

• Un conjunto de clases e interfaces que permite la comunicación entre el navegador


Web y el servidor Web. Estas clases están organizadas en el espacio de nombres
System.Web.
• Un proceso en tiempo de ejecución, también conocido como el proceso trabajador
de ASP.NET (aspnet_wp.exe), que maneja la solicitud Web para recursos de ASP.
NET.
En un nivel alto, una aplicación Web de ASP.NET es ejecutada a través de una serie de
solicitudes y mensajes de respuesta de HTTP entre los navegadores cliente y los servidores
Web. El proceso ocurre como sigue:
Comprender las Aplicaciones Web 111

1. El usuario solicita un recurso del servidor Web tecleando una URL en el navegador Web. El
navegador envía una solicitud HTTP al servidor Web destino.
2. El servidor Web analiza la solicitud HTTP y busca el proceso capaz de ejecutar la solicitud.
3. El resultado de la solicitud HTTP es retornada al navegador cliente en la forma de una
respuesta HTTP.
4. El navegador lee la respuesta HTTP y la interpreta como una página Web para el usuario.

Este proceso está representado en la Figura 4-6.

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 mayoría de su funcionalidad de la clase System.Web.UI.Page. La clase Page proporciona


algunas propiedades importantes tales como Request, Response, Session y Server.

Ciclo de vida y modelo de evento de una página ASP.NET


Durante su ejecución una página ASP.NET pasa a través de muchas etapas diferentes de procesamiento, cada una de
estas etapas va a través de pasos de procesamiento específcos tales como inicialización, carga, código manejador de
evento en ejecución e interpretación.

Conforme una página se ejecuta, va a través de varias etapas de procesamiento. La página


también dispara algunos eventos con los cuales puede adjuntar un manejador de evento
112 Lección 4

para ejecutar su código personalizado en distintas etapas de procesamiento de la página.


Los desarrolladores de ASP.NET deben tener una buena comprensión del ciclo de vida de
una página de manera que pueden escribir código que es ejecutado exactamente en la etapa
deseada del procesamiento de la página.

La tabla 4.1 enlista las diferentes etapas del ciclo de vida y sus eventos asociados.

Tabla 4-1 Etapa Significado Eventos Asociados


Etapas importantes en Solicitud de página Cuando una solicitud de página es
el ciclo de vida de una
recibida, se inicia el ciclo de vida de la
página ASP.NET
página. En este punto, ASP.NET decide si

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

con una confirmación evento Postback datos, el control de los manejadores


del envío del formulario. de evento son llamados, entonces, los
Ocurre una devolución valores de entrada son validados y la
de datos cuando propiedad IsValid para la clase Page es
la información es establecida.
ET

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

Descarga En esta etapa, la respuesta es enviada Unload


al cliente y se desempeña la limpieza
de la página. Como parte de la limpieza,
las propiedades tales como Request y
Response son descartadas.

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.

Æ Comprender el ciclo de vida de una página ASP.NET


RO
PREPÁRESE. Para ver cuántos eventos diferentes de la clase Page son ejecutados, desempeñe
lo siguiente.
1. Crear un nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la
solución Leccion04. Nombre el proyecto como PageEvents.
2. Seleccione Proyecto, Agregar nuevo elemento. Seleccione la plantilla de Formulario Web.
BE

Nombre el archivo WebForm1.aspx.


3. En la etiqueta HTML para la página (WebForm1.aspx), asegúrese que el atributo
AutoEventWireup para la directiva @Page está establecida como True:
<%@ Page Language=”C#” AutoEventWireup=”true”
CI

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

protected void Page_Load


(object sender, EventArgs e)
{
Response.Write
(“Mensaje desde Page_Load. <br/>”);
}

protected void Page_Init

ICA
(object sender, EventArgs e)
{
Response.Write
(“Mensaje desde Page_Init. <br/>”);

ER
}

protected void Page_PreRender


(object sender, EventArgs e)
ÁM
www.pdftron.com
{
Response.Write
(“Mensaje desde Page_PreRender. <br/>”);
}
RO
protected void Page_PreInit
(object sender, EventArgs e)
BE

{
Response.Write
(“Mensaje desde Page_PreInit. <br/>”);
}
CI

}
}
ET

5. Seleccione Depurar y después Inicie la depuración (o presione F5). La página default.htm se


abrirá en un navegador Web. Se mostrará la salida de la página en la Figura 4-7.
Los caracteres<% y %>son utilizados para incrustar bloques de código en la etiqueta HTML de una página. El
código dentro de estos bloques de código incrustado es ejecutado durante la etapa de interpretación de la página.
En los bloques de código incrustado, la sintaxis <%=expression>es utilizada para resolver una expresión y retornar su
valor en el bloque. Por ejemplo, el siguiente bloque de código:
<i><% = DateTime.Now.ToShortDateString() %></i>

Cuando se ejecuta, visualizará la fecha actual en formato de itálicas:

12/01/2010
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.

La administración de estado es el proceso de administrar el estado para una página Web a


BE

través de viajes. Los valores de las variables y controles colectivamente conforman el estado
de una página Web.

ASP.NET proporciona algunas técnicas para preservar la información de estado a través de


CI

devoluciones de datos de la página. Estas técnicas pueden ser ampliamente categorizadas


como del lado del cliente o del lado del proveedor, dependiendo de donde son consumidos
los recursos.
ET

Administración de estado del lado del cliente


Las técnicas del lado del cliente utilizan código HTML y las capacidades del navegador
Web para almacenar información de estado en la computadora cliente. Las siguientes
técnicas son utilizadas para almacenar información de estado en el lado del cliente:
• Cadenas de consulta: el estado es administrado poniendo los datos en la URL de la
página como una cadena de consulta como un conjunto de pares de valores clave.
Por ejemplo, la siguiente URL incrusta una clave (q) de la cadena de consulta
y el valor par (televisión): http://www.bing.com/search?q=television. Para
recuperar el valor en la clave en una página ASP.NET, utilice la expresión Request.
QueryString[“q”]. Aquí la QueryString es una propiedad del objeto Request.
116 Lección 4

QueryString obtiene la colección de todas las variables de cadena de consulta.


• Cookies: Las Cookies son pequeños paquetes de información que son almacenados
por el navegador Web localmente en la computadora del usuario. Las Cookies son
utilizadas comúnmente para almacenar las preferencias del usuario y contenidos de
carritos de compra y para darles una experiencia de navegación personalizada en
visitas subsecuentes a la página Web. La clase HttpCookie representa una cookie
en su código, el siguiente código le muestra cómo establecer una cookie en una
computadora cliente:
HttpCookie cookie =

new HttpCookie(“Name”, “Bob”);

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”

runat=”server” EnableViewState=”false” />


ET

Puede deshabilitar el estado de vista en el nivel de página estableciendo el atributo


EnableViewState de la directiva de página a false:

<%@ Page EnableViewState=”false” %>

Puede deshabilitar el estado de vista en el nivel de aplicación agregando la siguiente


línea en el archivo web.confg:

<pages enableViewState=”false” />


Comprender las Aplicaciones Web 117

Administración de estado del lado del servidor


La administración de estado del lado del servidor utiliza recursos del servidor para
almacenar la información de estado. Utilizando técnicas del lado del servidor se elimina
la posibilidad de que un usuario tratara de hackear el código del lado del cliente o de leer
los datos de la sesión. Sin embargo, el almacenar y procesar información de la sesión en el
servidor incrementa la carga del servidor y requiere de recursos del servidor adicionales
para servir las páginas Web.

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.

Æ Utilizar el Estado de Sesión


BE

PREPÁRESE. Para utilizar el estado de sesión, haga lo siguiente:


1. Agregue un nuevo proyecto basado en la plantilla de aplicación web vacía de ASP.NET a la
solución Leccion04. Nombre el proyecto UtilizandoEstadoSesion.
2. Seleccione Proyecto, Agregar nuevo elemento. Seleccione la plantilla de Formulario Web.
CI

Nombre el archivo WebForm1.aspx


3. Cambie la etiqueta HTML, del WebForm1.aspx a lo siguiente:

<%@ Page Language=”C#” AutoEventWireup=”true”


ET

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>

<form id=”form1” runat=”server”>

<div>

<asp:Label ID=”Label1” runat=”server”

Text=”Introduzca su nombre:” /><br />

ICA
<asp:TextBox ID=”TextBox1” runat=”server” />

<br /><br />

<asp:Button ID=”Button1” 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

public partial class WebForm1


CI

: System.Web.UI.Page

{
ET

protected void Page_Load

(object sender, EventArgs e)

if (Session[“Name”] != null)

Response.Redirect(“WebForm2.aspx”);
Comprender las Aplicaciones Web 119

protected void Button1_Click

(object sender, EventArgs e)

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:

<%@ Page Language=”C#” AutoEventWireup=”true”


ÁM
CodeBehind=”WebForm2.aspx.cs”

www.pdftron.com
Inherits=”UsingSessionState.WebForm2” %>

<html xmlns=”http://www.w3.org/1999/xhtml”>
RO
<head runat=”server”>

<title></title>

</head>
BE

<body>

<form id=”form1” runat=”server”>


CI

<div>

<asp:Label ID=”Label1” runat=”server” /><br />


ET

<asp:Button ID=”Button1” runat=”server”

Text=”Limpiar Sesión”

onclick=”Button1_Click” />

</div>

</form>

</body>
120 Lección 4

</html>

6. Cambie el código en el archivo de código subyacente (WebForm2.aspx.cs) en el formulario


a lo siguiente:

using System;

namespace UsingSessionState

public partial class WebForm2

ICA
: System.Web.UI.Page

protected void Page_Load(

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

protected void Button1_Click(

object sender, EventArgs e)


CI

Session.Remove(“Name”);

Response.Redirect(“WebForm1.aspx”);
ET

7. Seleccione Depurar y después Inicie la depuración (o presione F5). La páginaWebForm1.


aspxse abrirá en un navegador Web. Vera la página Web mostrada en la Figura 4-8.Introduzca
un nombre y haga clic en el botón enviar. Esta página almacena el nombre introducido en el
estado de sesión.
Comprender las Aplicaciones Web 121

8. Será transferido al WebForm2.aspx mostrado en la Figura 4-9. WebForm2.aspx recupera el


nombre de usuario desde el estado de sesión. En la misma ventana del navegador, de forma
que está dentro de la misma sesión, intente acceder al WebForm1.aspx. Notará que mientras
la sesión contenga una entrada de nombre, usted será re direccionado al WebForm2.aspx.
Presione el botón de Limpiar Sesión. Esto limpia la sesión y usted es transferido al WebForm1.
aspx.
Figura 4-8
La página almacena el
nombre introducido al
estado de sesión

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

ƒ Comprender el IIS Web Hosting


CI

È 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.

Las aplicaciones de ASP.NET deben ser desarrolladas en un servidor Web de Servicios


de Información de Internet (IIS). IIS es una parte integral de los sistemas operativos de
Windows Server y proporciona toda la funcionalidad para hospedar sitios Web.

Implementar una aplicación de ASP.NET no es complicado ya que ASP.NET proporciona


la implementación xcopy. Lo que signifca que todo lo que necesita hacer para implementar
un sitio Web de ASP.NET a un servidor Web es copiar archivos a las ubicaciones correctas.
Puede copiar archivos utilizando el comando xcopy de Windows o utilizando una
aplicación del Protocolo de Transferencia de Archivos (FTP).
122 Lección 4

Comprender los Servicios de información de Internet


Servicios de Información de Internet (IIS) es un servidor Web para hospedar una aplicación Web en el sistema
operativo Windows. Un Servidor Web IIS utiliza conceptos de sitios, aplicaciones y directorios virtuales.

Puede utilizar IIS para hospedar múltiples sitios Web y compartir información con
usuarios a través del Internet o una intranet. IIS utiliza una relación jerárquica entre sitios,
aplicaciones y directorios virtuales como bloque de construcción básico para hospedar
contenido en línea.

IIS puede ser administrado utilizando el IIS Manager tool, el cual es parte del sistema

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.

Creación de directorios virtuales y Sitios Web


CI

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 sitio web es un contenedor de aplicaciones y directorios virtuales y puede ser accedido


utilizando una dirección de un sitio Web. Por ejemplo, la URL www.northwind.com
podría apuntar a un sitio Web que tenga muchos directorios virtuales tales como órdenes
y cuentas, cada uno de los cuales puede ser accedido en combinación con la dirección del
sitio Web tal como www.northwind.com/ordersywww.northwind.com/account.

Un servidor Web nunca expone la dirección física actual y la ubicación de los archivos al
mundo externo. En lugar de eso, utiliza un sistema de alias que mapea a los directorios
físicos. Estos alias también son llamados directorios virtuales. Los directorios virtuales se
han convertido en parte de la URL, como se vio en el ejemplo anterior. Cuando IIS recibe
una solicitud para una tal URL, mapea el directorio virtual a la ubicación física de los
archivos.
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

Implementar Aplicaciones Web


CI

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

ƒ Comprender el desarrollo de Servicios Web


È EN RESUMEN

Un servicio Web es un componente de software que puede ser accedido a través de la red utilizando protocolos de
red estándar tales como HTTP. Los servicios Web son descritos utilizando el Lenguaje de Descripción de Servicios
Web (WSDL).

Los Servicios Web proporcionan una manera para interactuar con objetos de programación
ubicados en computadoras remotas. Lo que hace especial a los servicios Web es que toda

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.

Antes de entrar en detalles de la creación y consumo de servicios Web, nos familiarizaremos


con dos tecnologías clave que hacen posibles los servicios Web:
ÁM
www.pdftron.com
• Protocolo Simple de Acceso a Objetos (SOAP)
• Lenguaje de Descripción de Servicios Web (WSDL)

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

maquina en Internet sin ser bloqueados por algún cortafuegos.

Este es un paquete típico de SOAP enviado desde un cliente a un servicio Web:


ET

<?xml version=”1.0” encoding=”utf-8”?>

<soap:Envelope

xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

xmlns:xsd=http://www.w3.org/2001/XMLSchema

xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/”>

<soap:Body>
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

En el paquete de respuesta, el elemento XML de ToLowerResponse es el resultado de la


invocación del método en el servidor.

WSDL
ET

WSDL es un lenguaje basado en XML para describir servicios Web.

WSDL signifca Lenguaje de Descripción de Servicios Web y proporciona un estándar


por el cual un servicio Web puede decirle al cliente qué tipo de mensajes aceptará y
qué resultados serán retornados. Un archivo WSDL actúa como la interfaz publica de un
servicio Web e incluye la siguiente información:
• Los tipos de datos que puede procesar
• Los métodos que expone
• Las URLs a través de las cuales estos métodos pueden ser accedidos
126 Lección 4

Crear Servicios Web


En esta sección aprenderá como crear y publicar un servicio Web.

En esta sección, aprenderá como crear un servicio Web simple llamado TextWebService
que expone dos métodos, ToLower y ToUpper. Estos métodos respectivamente convierten
una cadena dada a letras minúsculas y mayúsculas. Aunque es simple, este cubre todos
los aspectos de la creación de un servicio Web que puede involucrar una lógica de
procesamiento más compleja.

Æ Creando un Servicio Web

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

2. Seleccione Proyecto, Agregar nuevo elemento desde el menú. Seleccione la plantilla de


CI

Servicio Web como se muestra en la Figura 4-13.Nombre el servicio WebTextWebService.asmx.


3. Cambie el código por defecto para la clase TextWebService en el archivo TextWebService.
asmx.cs como se muestra debajo:

[WebService(Namespace = “http://northwindtraders.com/”)]
ET

[WebServiceBinding(ConformsTo

= WsiProfles.BasicProfle1_1)]

public class TextWebService : System.Web.Services.WebService

[WebMethod]

public string ToUpper(string inputString)


Comprender las Aplicaciones Web 127

return inputString.ToUpper();

[WebMethod]

public string ToLower(string inputString)

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

Servicio Web para crear


un servicio Web
ET
128 Lección 4

Æ Probar un Servicio Web

PREPÁRESE. Para probar un servicio Web, desempeñe las siguientes tareas:


1. Abra el proyecto TextWebService que creó en el ejercicio previo. Seleccione Depurar y
después Inicie la depuración. Un navegador es lanzado mostrando la página de prueba del
servicio Web, como se muestra en la Figura 4-14.

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

Una página de prueba de


un método Web
CI
ET
Comprender las Aplicaciones Web 129

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.

Æ Acceder a un Servicio Web desde una aplicación cliente


BE

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

web vacía de ASP.NET. Nombre el proyecto TextWebServiceClient.

2. Haga clic derecho en el nombre del proyecto en la ventana del Explorador de Soluciones y
seleccione la opción Add Web Reference desde el menú. En el cuadro de diálogo Add Web
Reference, introduzca la URL del servicio creado en el ejercicio previo y presione Enter
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

Tome Nota protected void Button1_Click(


Cuando invoca un object sender, EventArgs e)
método de servicio {
Web, tiene la var webService =
elección de utilizar un
método sincrónico o new textWebService.TextWebService();
asincrónico. Podría toLowerLabel.Text =
desear utilizar el webService.ToLower(TextBox1.Text);
método asincrónico
toUpperLabel.Text =
para incrementar
la sensibilidad de la webService.ToUpper(TextBox1.Text);
aplicación cliente. }
Comprender las Aplicaciones Web 131

6. Seleccione Depurar y después Inicie la depuración para ejecutar la aplicación Web.


Introduzca algún texto de ejemplo y haga clic en el botón Invocar Métodos de Servicio.
Verá los resultados de TextWebService como se muestra en la Figura 4-19.

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

WSDL proporciona un estándar por el cual un servicio Web puede decirle a su


cliente cuales tipos de mensajes aceptará y qué resultados serán retornados.

» Evaluación de Conocimiento
CI

Completar los espacios en blanco

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


ET

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

5. Puede deshabilitar el estado de vista en el nivel de página estableciendo el atributo


_________de la directiva Page a false en la página ASP.NET.
6. El estado de_________ es utilizado para almacenar información que es utilizada
globalmente a lo largo de una aplicación, como opuesto al estado de_________ que
almacena información para una sesión de usuario.
7. Una aplicación Web es accedida utilizando un nombre de _________ en lugar de un
nombre de carpeta física.
8. Debe marcar las clases con el atributo _________ para exponerlos como un servicio
Web.
9. Todos los métodos en una clase de servicio Web, solo los métodos marcados con los

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

un usuario solicita el formulario Web, el formulario necesita hacer alguna inicialización


para cambiar la apariencia del formulario y asignar valores a algunos controles. ¿Dónde
debería poner el código?
a. En el manejador de evento PreInit de la clase Page.
CI

b. En el manejador de evento Init de la clase Page.


c. En el manejador de evento Load de la clase Page.
d. En el manejador de evento PreRender de la clase Page.
ET

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

b. La clase del servicio Web no está marcada con el atributo WebService.


c. El método Convert no está marcado con el atributo WebMethod.
d. Los servicios Web pueden solo exponer métodos y retornar valores de texto.
12. Está trabajando en dos proyectos de Visual Studio. El primer proyecto es un servicio
CI

Web que retorna un objeto DataSet perteneciente al espacio de nombre System.Data. El


segundo proyecto accede al servicio Web creado por el primer proyecto. ¿Cuál proyecto
en este caso requiere una referencia al espacio de nombre de System.Data?
a. El proyecto del Servicio Web.
ET

b. El proyecto cliente que accede al servicio Web.


c. Tanto el proyecto cliente y el proyecto del servicio Web.
d. Ni el proyecto cliente ni el proyecto del servicio Web.
136 Lección 4

» Evaluación de Competencia

Proyecto 4-1: Utilizando JavaScript y HTML

Está desarrollando una página Web que proporciona una interfaz de usuario responsiva.
Visualiza una imagen en la página. Cuando el usuario mueve el ratón sobre la imagen,
la imagen original es remplazada por una nueva imagen. Cuando el ratón sale del área
de la imagen, la imagen original es visualizada nuevamente. Necesita llevar a cabo este
requerimiento utilizando código del lado del cliente de JavaScript y HTML. ¿Cómo
crearía una página Web que funcione como se describe arriba?

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

Proyecto 4-3: Llamando un Servicio Web asincrónicamente


RO
La clase proxy generada por Visual Studio para un servicio Web incluye métodos para
la llamada del servicio Web sincrónicamente así como también asincrónicamente. Por
defecto, la aplicación utiliza el método sincrónico. Si lo prefere la invocación asincrónica,
necesita llamar la versión asincrónica del método. Las versiones asincrónicas no esperan al
BE

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

Proyecto 4-4: Utilizando el estado de sesión

Está desarrollando una porción de un sitio Web que permite a los usuarios introducir su
ET

nombre y dirección de correo electrónico a un boletín informativo por correo electrónico.


Su solución consiste de dos páginas Web. La primera página colecta el nombre de usuario
y dirección de correo electrónico, las agrega al estado de sesión y transfere el control a la
segunda página. La segunda página recupera el nombre y la dirección de correo electrónico
desde el estado de sesión y visualiza un mensaje de confrmación. Necesita escribir código
para estas dos páginas. ¿Qué código escribirá para llevar a cabo este requerimiento?
Lección 5

Comprender las Aplicaciones de Escritorio

Matriz de Dominio de Objetivos

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


del Objetivo

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

ƒ Comprender las aplicaciones de los Windows Forms


È EN RESUMEN

Las aplicaciones de los Windows Forms son aplicaciones cliente inteligentes que consisten de uno o más formularios
que muestran una interfaz visual al usuario. Estas aplicaciones se integran bien con el sistema operativo, utilizan
dispositivos conectados y pueden trabajar ya sea conectado a Internet o no.

Diseñar un Windows Form

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

Æ Crear un Windows Form

PREPÁRESE. Lance el Microsoft Visual Studio.


1. Cree un nuevo proyecto basado en la plantilla de Aplicación para Windows Forms como se
muestra en la Figura 5-2. Nombre el proyecto como WindowsFormsDesign.

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

3. En la vista del Diseñador, seleccione el control Label y utilizando la ventana de Propiedades,


establezca su propiedad Text a una cadena vacía.
4. En la vista del Diseñador, haga doble clic en el control Date Time Picker. Esta acción adjunta
el manejador de evento por defecto para el evento Value Changed del control Date Time
Picker y cambia la vista de Diseñador a Código. Cambie el código por defecto para el
manejador de evento como sigue:
140 Lección 5

Tome Nota private void dateTimePicker1_ValueChanged


En el ejercicio (object sender, EventArgs e)
“Crear un Windows
Form”, utilizamos los {
nombres de control label1.Text =
por defecto. En
formularios complejos dateTimePicker1.Value.ToLongDateString();
con más controles, }
siempre es buena
idea dar nombres más 5. Seleccione Depurar y después Inicie la depuración (o presione F5) para ejecutar el proyecto.
significativos a los En la interfaz de usuario, seleccione una nueva fecha y verifique que la fecha seleccionada
controles. es visualizada en el control Label.

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

Este código es generado automáticamente por el Diseñador de Visual Studio. Encontrará


este código en el archivo de código subyacente del diseñador (Form1.Designer.cs), dentro
de una región de código titulada código generado de Diseñador de Windows Form.

Otra cosa para notar es que la sintaxis para agregar un delegado utiliza el operador+=.
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

Utilizar Herencia Visual


La herencia visual le permite reutilizar la funcionalidad existente y el diseño de Windows Forms.

Uno de los principios esenciales de la programación orientada a objetos es la herencia.


Cuando una clase hereda de una clase base, esta deriva su funcionalidad base de la clase
base. Puede siempre extender la clase derivada para proporcionar funcionalidad adicional
y ser más útil.

Un Windows Form, en esencia, sólo es otra clase y por lo tanto la herencia se aplica
también. Sin embargo, cuando la herencia es aplicada a un Windows form, también causa

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

tecleando su nombre en el cuadro de búsqueda, como se muestra en la Figura 5-4. Nombre


el formulario heredado InheritedForm.cs. La plantilla de Formulario Heredado no está
disponible en las ediciones de Visual Studio Express. Si está utilizando la edición express,
sólo cree un Windows Form regular llamado InheritedForm.cs y proceda al Paso 4.
CI

Figura 5-4
Plantilla de Formulario
heredado
ET
142 Lección 5

3. Haga clic en el botón Agregar. En el cuadro de diálogo de Selector de Herencia, seleccione


el Form1 del espacio de nombres de Windows Forms Design, como se muestra en la Figura
5-5 y haga clic en el botón Aceptar.

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

5. En la vista del Diseñador del InheritedForm, establezca la propiedad Text a “Formulario


Heredado”.

6. En la vista del Diseñador, haga doble clic en InheritedForm. Esta acción agrega un manejador
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(

object sender, EventArgs e)

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]

static void Main()

Application.EnableVisualStyles();

Application

.SetCompatibleTextRenderingDefault(false);

ICA
Application.Run(new InheritedForm());

8. Seleccione Depurar y después Inicie la depuración (o presione F5) para ejecutar el


proyecto. Cuando el InheritedForm es cargado, la fecha seleccionada actualmente

ER
es mostrada en el control label. A diferencia del Form1 creado previamente donde
inicialmente el control label estaba vacío.

El formulario InheritedForm demuestra que tiene toda la funcionalidad del Form1


simplemente heredando el formulario. Cuando cambia el modifcador de acceso de los
ÁM
controles miembro de Form1, label1 y dateTimePicker1, de privado a protegido, será

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.

Comprender las aplicaciones de interfaz de documentos múltiples (MDI)


RO
Las aplicaciones de interfaz de documentos múltiples son aplicaciones donde múltiples ventanas hijo residen bajo
una sola ventana padre.

Las aplicaciones MDI permiten a múltiples ventanas compartir un solo menú y barra de
BE

herramientas de la aplicación. Las aplicaciones MDI a menudo tienen un menú llamado


Ventana que permite a los usuarios administrar múltiples ventanas hijo ofreciendo
características tales como cambiar entre ventanas hijo y organizar ventanas hijo. La Figura
5-6muestra al Microsoft Excel 2010 en modo MDI:
CI

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.

Æ Crear una aplicación MDI

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.

2. Seleccione el control MenuStrip desde el Cuadro de Herramientas y agréguelo al formulario.


Agregue un elemento del menú del nivel superior &Window, y agregue &New Window y
&Arrange en el siguiente nivel. Bajo el menú Arrange, agregue tres opciones, &Cascade,
&Horizontal y &Vertical, como se muestra en la Figura 5-7.
RO
Figura 5-7
Agregando opciones de
menú
BE
CI

3. Para el control MenuStrip, establezca su propiedad MdiWindowListItem al nombre del


ET

menú Ventana (windowToolStripMenuItem por defecto).

4. En el Explorador de Soluciones, haga clic derecho en el proyecto y seleccione Agregar,


Windows Form. Agregar Windows Form con el nombre ChildForm.

5. Haga doble clic en el formulario hijo y agregue el siguiente código para manejar el evento
Load:
private void ChildForm_Load(
object sender, EventArgs e)
{
Text = DateTime.Now.ToString();
}
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);
}

private void verticalToolStripMenuItem_Click(


RO
object sender, EventArgs e)
{
LayoutMdi(MdiLayout.TileVertical);
}
BE

8. Seleccione Depurar y después Inicie la depuración (o presione F5) para ejecutar el


proyecto. Seleccione Ventana, Nueva Ventana para crear múltiples ventanas hijo nuevas.
Cambie entre las ventanas hijo. Note que solo hay una instancia de aplicación en la barra
de tareas de Windows. Ahora utilice las opciones en menú Window, Arrange para ordenar
CI

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

con tres ventanas


hijo ordenadas
horizontalmente
146 Lección 5

Revisemos algunas de las propiedades y métodos importantes utilizadas en este ejercicio.


Primero, para el formulario padre, la propiedad IsMdiContainer está establecida como
true. Esta propiedad indica que el formulario es un contenedor para múltiples formularios
hijo MDI. Correspondientemente, para cada formulario hijo, establece la propiedad
MdiParent para especifcar el formulario contenedor padre.

En seguida, la propiedad MdiWindowListItem del MenuStripes utilizado para indicar


cuál elemento de menú será utilizado para mostrar la lista de ventanas hijo MDI. Cuando
esta propiedad está establecida, el elemento de menú enlistará todas las ventanas hijo y
también le permitirá cambiar entre ventanas hijo. Como resultado de un código en el
; ¿Listo para la método ChildForm_Load, la barra de título para cada formulario muestra la fecha y hora
certificación? del instante cuando el formulario fue cargado.

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

Trabajar con argumentos de la línea de comandos


En esta sección, aprenderá cómo aceptar parámetros de línea de comando dentro de una aplicación de consola.

El siguiente ejercicio crea una aplicación de consola sencilla que acepta el nombre de un
archivo de texto como un argumento de línea de comando y muestra el contenido de ese
archivo.
Comprender las Aplicaciones de Escritorio 147

Æ Crear una aplicación de consola

PREPÁRESE. Lance el Microsoft Visual Studio.


1. Crear un nuevo proyecto basado en la plantilla de Aplicación de Consola como se muestra
en la Figura 5-9. Nombre el proyecto DisplayFile.
Figura 5-9
Plantilla de Aplicación de
Consola

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;

string[] lines = File.ReadAllLines(args[0]);


BE

foreach (string item in lines)


{
Console.WriteLine(item);
}
CI

3. Agregue lo siguiente al archivo utilizando la directiva :


using System.IO;
ET

4. Seleccione Generar y después Generar Solución (o presione F6) para generar el proyecto.

5. Cree un archivo de texto utilizando Visual Studio o el bloc de notas y guárdelo como Sample.
txt en la misma carpeta como el archivo ejecutable (el ejecutable es creado por defecto en
bin\debug folder bajo la carpeta del proyecto).

6. Abra el símbolo del sistema, navegue a la ruta del archivo EXE del proyecto. Ejecute el
siguiente comando:
DisplayFile sample.txt

7. Se mostrará el comando que muestra el contenido del archivo de texto en la ventana de


comandos.
148 Lección 5

8. De forma alternativa, también puede pasar el argumento de la línea de comando desde


dentro del Visual Studio utilizando la ventana de propiedades de proyecto, como se muestra
en la figura 5-10.Para ver la ventana de propiedades del proyecto, seleccione la opción del
menú Propiedades del proyecto DisplayFile.

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

ƒ Comprender los Servicios de Windows


ÁM
www.pdftron.com
È EN RESUMEN

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

Crear un servicio de Windows


Para crear un servicio de Windows en Visual Studio, utilice la plantilla de aplicación de Servicio de Windows. Un
servicio de Windows necesita ser instalado antes de poder ser utilizado.

Todos los servicios de Windows deben derivarse de la clase ServiceBase. Esta clase base
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.

Æ Crear un servicio de Windows


ÁM
www.pdftron.com
PREPÁRESE. Lance el Microsoft Visual Studio.
1. Cree un nuevo proyecto basado en la plantilla de Servicio de Windows. Nombre el
proyecto FirstService, como se muestra en la Figura 5-11.

Figura 5-11
RO
Seleccionar la plantilla de
proyecto de Servicio de
Windows
BE
CI
ET

2. Seleccione la ventana de propiedades para Service1 y establezca las propiedades (Name)


y el ServiceName a “FirstService”.
3. En el Explorador de Soluciones, renombre el archivo Service1.cs a FirstService.cs. Abra
Program.cs y verifique que las referencias a Service1 han sido cambiadas a FirstService.
4. Seleccione las ventanas de propiedades para el servicio y establezca la propiedad Can
Pause And Continue y la propiedad Can Shutdown a True.
150 Lección 5

5. Abra el diseñador para FirstService y agregue un componente EventLog desde el cuadro de


herramientas. El componente EventLog le permite conectarse con los eventlogs.
6. Vea el código para FirstService y modifique el constructor como se muestra a continuación.
En este código, primero crea una fuente de evento con el nombre FirstService. El EventSource
es utilizado para distinguir mensajes generados por una aplicación específica de todos los
mensajes en un event log. Luego, establezca la propiedad Source del componente event
log al nombre del eventsource. La propiedad Log del componente event log, eventLog1, es
utilizado para especificar el event log utilizado para registrar los mensajes:
publicFirstService()
{

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

protected override void OnStop()


{
eventLog1.WriteEntry(
ET

“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

La propiedad Æ Agregar un instalador al servicio de Windows


StartType de la clase
ServiceInstaller indica
cómo y cuándo un PREPÁRESE. Lance el Microsoft Visual Studio.
CI

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

Tome Nota PREPÁRESE. Para instalar un servicio de Windows, haga lo siguiente:


Instalar un servicio
BE

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

necesita asegurarse que ejecuta el installUtil.exe como administrador):


installutil FirstService.exe

4. El servicio de Windows de FirstService ahora está instalado.

La aplicación de servicio de Windows ahora esta almacenada en la base de datos de


servicios de Windows. Anteriormente, cuando agrego un ServiceInstaller para FirstService,
Tome Nota
establece una propiedad StartTypedel componente serviceInstaller1 a Manual. Como
Para desinstalar un resultado, necesitará iniciar manualmente el servicio cuando sea necesario. El siguiente
servicio de Windows, ejercicio demuestra cómo iniciar, pausar, continuar y detener un servicio de Windows.
utilice InstallUtil.exe
con la opción -u.
Comprender las Aplicaciones de Escritorio 153

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 la Figura 5-14. Observa un cuadro de diálogo mostrando el progreso, como se muestra


en la Figura 5-15. Cuando el servicio es iniciado, el estatus del servicio cambia a Iniciado.
3. Expanda el nodo de Visor de Sucesos y seleccione el log de Windows de Aplicación. Podrá
ver un mensaje de First Service diciendo “Iniciando el Servicio”, como se muestra en la
Figura 5-16.
4. Regrese a la lista de Servicios e intente pausar, reanudar o detener el First Service. Revise
de nuevo el event log para verificar que los mensajes apropiados están siendo mostrados.

En los últimos ejercicios vio cómo crear, instalar y utilizar un servicio de Windows.
También aprendió cómo agregar mensajes por medio de programación al even log de
Aplicación de Windows.
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

Llene los espacios en blanco

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


CI

espacios proporcionados.
1. Utilice la propiedad _________________de la clase ServiceInstaller para especifcar
un breve comentario que explica el propósito del servicio.
ET

2. La propiedad _________________ de la clase _________________ indica el tipo de


cuenta bajo el cual el servicio de Windows se ejecutará.
3. La propiedad ________________ de la clase EventLog es utilizada para especifcar el
nombre de la aplicación a utilizar cuando se escribe en un event log.
4. _____________________ le permite reutilizar la funcionalidad y diseño existentes
para formularios de Windows.
5. Las aplicaciones de _____________________ son aplicaciones donde múltiples
ventanas hijo residen bajo una sola ventana padre.
6. Un _________________ es ideal para la creación de aplicaciones de larda ejecución
que se ejecutan en el fondo y no tienen ninguna interfaz de usuario.
156 Lección 5

7. Las _________________ no tienen interfaz de usuario gráfca y utilizan una ventana


de consola de modo texto para interactuar con el usuario.
8. Las aplicaciones _______________ proporcionan su propia funcionalidad de
administración de ventana, mientras que las aplicaciones_______________ se basan
en el sistema operativo para la administración de ventana.
9. Un delegado puede ser enlazado a cualquier método del cual coincide la frma con la
de la_______________________.
10. Los _______________________ pueden ser enlazados a más de un método,
permitiendo notifcaciones de uno a muchos cuando un evento es disparado.

ICA
Opción Múltiple

Encierre en un círculo la letra que corresponda a la mejor respuesta.

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

b. Utilizar el nodo de Servicios en la ventana de Administración de Equipos.


c. Utilizar InstallUtil.exe.
d. Utilizar gacutil.exe.
CI

3. Ha desarrollado un servicio de Windows. Este servicio necesita ejecutarse como un


usuario sin privilegios con el fn de minimizar cualquier riesgo de seguridad. ¿Cuál de
las siguientes cuentas debe utilizar para ejecutar este servicio de Windows?
ET

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

5. Necesita cambiar la visualización y comportamiento de un formulario de Windows de


forma que pueda contener múltiples ventanas hijo. ¿Qué debe hacer¿
a. Establecer la propiedad IsMdiContainer del formulario a true.
b. Establecer la propiedad de MdiParent para todas las ventanas hijo.

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);

7. Está desarrollando un formulario de Windows con una interfaz de documentos


BE

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

Necesita crear un Formulario de Windows similar a uno que creó en el ejercicio


VisualInheritance. Sin embargo, esta vez el requerimiento es que el color del fondo
debe coincidir con el color seleccionado actualmente del escritorio del usuario. ¿Cómo
RO
desarrollaría tal formulario?

Proyecto 5-2: Manejar el Evento Mouse Down

Está desarrollando un juego que permite a los usuarios golpear un área objetivo en un
BE

formulario de Windows con el ratón. Necesita desarrollar un formulario experimental que


muestre las coordenadas X y Y de la ubicación cliqueada por el usuario en la barra de título
del formulario. ¿Cómo debe llevar a cabo esto?
CI

» Evaluación de Competencia

Proyecto 5-3: Trabajar con Entradas de Consola


ET

Está desarrollando un programa que manipula texto. Necesita escribir una aplicación de
consola que acepte texto del usuario y lo convierta a texto en letras mayúsculas. ¿Qué
código necesita escribir para cumplir este requerimiento?

Proyecto 5-4: Utilizar la utilidad Net (net.exe)

La utilidad de línea de comando net.exe viene instalada con Windows. Esta utilidad le
permite desempeñar varios comandos de red, incluyendo el control de los servicios de
Windows. En este ejercicio, utilizará el net.exe para trabajar con el servicio de Windows
creado previamente de First Service. ¿Qué pasos toma con el fn de pausar, detener e iniciar
un servicio de Windows utilizando la utilidad Net?
Lección 6

Comprender las Bases de Datos

Matriz de Dominio de Objetivos

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


del Objetivo

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

Es un desarrollador de software para la Northwind Corporation. Como parte de su trabajo,


interactúa y procesa datos acerca de clientes, productos, proveedores y órdenes. Su trabajo involucra
CI

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

ƒ Comprender los conceptos de bases de datos


relacionales
È EN RESUMEN

Una base de datos relacional es una colección de datos interrelacionados que está basado en el modelo relacional
desarrollado por E.F. Codd. El modelo relación defne entidades de datos distintas, sus atributos y relaciones entre
entidades.

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.

Una base de datos le permite almacenar, administrar y recuperar información de negocios

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.

Otros sistemas de administración de bases de datos están basados en modelos diferentes.


Por ejemplo, el Object DBMS (ODBMS) está basado en el modelo de objeto donde los
datos son almacenados como una colección de objetos. En esta lección. Nos enfocaremos
BE

solamente a las bases de datos relacionales más populares.

Los DBMS relacionales utilizan el lenguaje de consulta estructurado (SQL) para recuperar
y manipular datos. Los sistemas de administración de bases de datos relacionales más
populares proporcionan soporte para la versión estandarizada de SQL, permitiéndole
CI

utilizar sus habilidades a través de distintos sistemas de bases de datos relacionales.

Comprender los conceptos de bases de datos relacionales


ET

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

6. Aplicar el proceso de normalización. En este paso fnal, aplica reglas de normalización


para garantizar que cualquier problema que pudiera afectar la integridad de los
datos está resuelto. Más adelante aprenderá acerca del proceso de normalización .
Después de que ha establecido el propósito de la base de datos, el siguiente conjunto
de pasos (Paso 2 al Paso 5) pueden ser completados como parte del modelado entidad -
relación. El paso fnal de normalización puede ser entonces aplicado a la salida desde el
modelado entidad - relación.
162 Lección 6

Comprender los diagramas Entidad - Relación


Los diagramas Entidad – Relación se utilizan para modelar las entidades, sus atributos y las relaciones entre las
entidades. Los diagramas Entidad - Relación pueden ayudarle a determinar los datos que necesitan ser almacenados
en la base de datos.

El modelado Entidad – Relación es un proceso de modelado para crear el modelo de datos


conceptual de un sistema. Los diagramas Entidad – Relación (ERD) son la herramienta
de modelado gráfco para llevar a cabo el modelado Entidad – Relación. Los bloques de
construcción básicos para un ERD son Entidad, Atributos y Relación.
• Entidad: Una entidad es la construcción de un objeto físico o un concepto.

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

• Un rectángulo representa un conjunto de entidades.


• Una elipse representa un atributo.
• Un diamante representa un conjunto de relaciones.
• Las líneas sólidas enlazan conjuntos de entidades a relaciones y conjuntos de
CI

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?”

El diagrama ER en la Figura 6-2, cuando se mapea a una base de datos relación, se


RO
generan las siguientes tablas:

Clientes
BE

ID Name City
1001 Jane Doe Berlin
1002 John Doe Tokyo
CI

1003 Howard Steel Sydney


ET

Ordenes

OrderID CustomerId OrderDate ShipDate


101 1001 10/1/2010 10/7/2010
102 1002 10/5/2010 10/10/2010
103 1001 10/4/2010 10/10/2010
164 Lección 6

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.

El análisis Entidad – Relación le ayuda a garantizar que ha identifcado los elementos de


información correctos para su base de datos. En la normalización, aplica un conjunto de
reglas de normalización para garantizar que tiene el diseño correcto de base de datos. Esto
es, las columnas pertenecen a las tablas correctas con el fn de garantizar que su base de
datos está libre de cualquier problema indeseado.

ICA
Por ejemplo, como parte del análisis de entidad – relación, puede tener una tabla Book que
tiene las siguientes columnas:

Books

BookId BookName CategoryId CategoryName

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

CategoryName de Negocios será pérdida.


• Anomalía de Update: La anomalía update es una situación donde actualizar un
solo dato requiere que múltiples flas sean actualizadas. Por ejemplo, digamos que
ha decidido cambiar el nombre de categoría de Misterio y Suspenso a solamente
CI

Misterio. Con el diseño de tabla actual, tendrá que cambiar el nombre de la


Tome Nota
categoría para cada libro en esa categoría. También hay el riesgo de que si actualiza
La normalización puede el nombre de la categoría en una tabla pero no en otra, terminará teniendo datos
ayudarle a garantizar inconsistentes en la base de datos.
un diseño de base de
ET

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.

Primera Forma Normal


Con el fn de que una tabla esté en la primera forma normal (1NF), ninguna de las
columnas deberá tener múltiples valores en la misma fla de datos. Por ejemplo, si una
tabla Customers almacena datos como se muestra abajo, entonces la tabla Customers no
está en la 1NF debido a que la columna PhoneNumber está almacenando más de un valor.
Comprender las Bases de Datos 165

Customer

Id FirstName LastName PhoneNumber


1 Jane Doe (503) 555-6874
2 John Doe (509) 555-7969, (509) 555-7970
Tome Nota
3 Howard Steel (604) 555-3392, (604) 555-3393
Una práctica general
consiste en subrayar
el nombre de la
columna(s) de una
tabla que son parte de Para que esta tabla este en la 1NF, necesita dividir la tabla en dos:

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

tendrá entradas duplicadas.

Segunda Forma Normal


ET

Para que una tabla esté en la segunda forma normal (2NF), primero debe cumplir los
requerimientos para 1NF. Además, la 2NF requiere que todas las columnas que no son
clave sean funcionalmente dependientes de toda la clave principal.

Con el fn de comprender la 2NF, primero debe comprender la dependencia funcional.


Tomemos el ejemplo de la tabla Customers de arriba. En la tabla Customers, la columna Id
es la clave principal, ya que identifca de forma única a cada fla. Las columnas FirstName
y LastName no son columnas clave debido a que no son parte de la clave principal.
Tanto FirstName y LastName son funcionalmente dependientes de Id debido a que,
dando un valor de Id, siempre puede encontrar un valor para el FirstName y LastName
correspondiente sin ninguna ambigüedad. No hay una columna que no sea clave en la
166 Lección 6

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.

Tercera Forma Normal


La tercera forma normal (3NF) requiere que 2NF debe cumplirse y que no haya dependencia
RO
funcional entre los atributos que no son clave. En otras palabras, cada atributo que no es
clave debe ser dependiente solo de la clave principal y nada más. Por ejemplo, considere
la siguiente tabla:

Items
BE

ItemId SupplierId ReorderFax


101 100 (514) 555-2955
102 11 (514) 555-9022
CI

103 525 (313) 555-5735

Aquí ItemId es la clave principal. El ReorderFaxes un número de fax para el proveedor y por
lo tanto es funcionalmente dependiente en el SupplierId. Para satisfacer el requerimiento
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

; ¿Listo para la Supplier


certificación?
¿Comprende las SupplierId ReorderFax
bases de los sistemas
100 (514) 555-2955
de administración
de bases de datos 11 (514) 555-9022
relacionales? 525 (313) 555-5735
— USD 6.1

ƒ Comprender los métodos de consulta de bases de

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.

SQL es un estándar ANSI (Instituto Nacional Americano de Estándares), pero diferentes


proveedores de bases de datos han implementado sus propias extensiones al estándar SQL.
CI

La implementación de Microsoft SQL Server de SQL es llamado Transact-SQL (T-SQL).

Hay dos maneras principales para entregar T-SQL a SQL Server. Puede, ya sea utilizar
sentencias ad-hoc que son ejecutadas directamente o utilizar procedimientos almacenados.
ET

Los procedimientos almacenados con una colección de sentencias SQL y de programación


lógica que es almacenada en el servidor de base de datos como objetos nombrados.

Trabajar con consultas de SQL


Las sentencias SELECT, INSERT, UPDATE y DELETE son los cuatro tipos principales de sentencias SQL utilizadas
para manipular datos en SQL Server.

Utilizando consultas ad-hoc SQL es una manera fexible para trabajar con una base de
datos de SQL Server. En esta lección, aprenderá acerca de lo esencial de los cuatro tipos
principales de sentencias de SQL que le ayudan a manipular los datos de SQL Server:
168 Lección 6

• Las sentencias SELECT le permiten recuperar información almacenada en la base


de datos.
• Las declaraciones INSERT le permiten agregar nueva información a la base de
datos.
• Las sentencias UPDATE le permiten modifcar información existente en la base
de datos.
• Las sentencias DELETE le permiten eliminar información de la base de datos.

Conectarse a una base de datos de SQL server


Necesita conectarse a una base de datos de SQL Server antes de que pueda manipular información.

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.

2. En el cuadro de diálogo de Agregar Conexión, navegue al archivo de base de datos de la


base de datos de Northwind (northwnd.mdf), como se muestra en la Figura 6-3.
BE

Figura 6-3
Conectándose a una base
de datos
CI
ET
Comprender las Bases de Datos 169

3. Utilice la Autenticación de Windows como modo de autenticación y presiones el botón


Probar Conexión para asegurarse que puede conectarse a la base de datos. Finalmente,
haga clic en el botón Aceptar para agregar la conexión a la base de datos.
4. Una vez que la conexión a la base de datas es establecida, la base de datos está disponible
como conexión bajo el nodo de Conexiones de Datos en el Explorador de Servidores.
Expanda la base de datos para ver tablas, procedimientos almacenados y otros objetos de
la base de datos, como se muestra en la Figura 6-4.

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

Ejecutar Consultas SQL


Hay muchas maneras disponibles para comunicarse con un SQL Server con el fn de ejecutar sus consultas.

Hay muchas maneras por las cuales puede enviar consultas a un SQL Server. Por ejemplo,
puede utilizar:
• Entorno de Desarrollo Integrado de Visual Studio (IDE)
• Aplicación C#
• SQL QueryAnalyzer
• Utilidad osqlcommandprompt

ICA
Las utilidades de SQL Query Analyzer y osqlcommand-prompt son herramientas
instaladas con SQL Server.

Æ Ejecutar consultas desde Visual Studio

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.

Æ Ejecutar Consultas desde una Aplicación de C#

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.

2. En el Formulario para Windows, agregue un control TextBox, un control Button y un


ÁM
control DataGridView. Establezca la propiedad MultiLine del TextBoxaTrue. Establezca la

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);
}
}

4. Agregue el siguiente método a la clase. Asegúrese de cambiar la cadena de conexión


CI

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

DataTable table = new DataTable();


dataAdapter.Fill(table);
dataGridView1.DataSource = table;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

5. Agregue la siguiente directiva using al código:

ICA
usingSystem.Data;
usingSystem.Data.SqlClient;

6. Seleccione Depurar y después Iniciar Depuración para ejecutar el proyecto. Introduzca


una consulta SQL y haga clic en el control Button. Podrá ver la salida como se muestra en
la Figura 6-7.

ER
Figura 6-7
Ejecutando consultas
desde una aplicación
de C#
ÁM
www.pdftron.com
RO
BE

El código en este ejercicio implementa un método SelectData que inicializa un objeto


SqlDataAdapter y lo utiliza para llenar un DataTable. El DataTable es entonces enlazado
CI

como una fuente de datos para el componente DataGridView. El objeto SqlDataAdapter


actúa como una tubería entre SQL Server y el DataTable para recuperar datos. El método
Fill cambia los datos en el DataTable para que coincidan los datos en la fuente de datos. El
select CommandText es utilizado para identifcar los datos en la fuente de datos.
ET

Seleccionar Datos
La sentencia SELECT es utilizada para recuperar datos desde una o más tablas de la base de datos.

La sentencia SELECT generalmente es de la siguiente forma:

SELECT lista_de_campos

FROM lista_de_tablas
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

From Orders, Customers


RO
Customers.CustomerId es llamado un nombre totalmente califcado, especifcando tanto
el nombre de la tabla como el nombre del campo. Esto es necesario debido a que tanto la
tabla Orders y la Customers incluyen este campo y necesita decirle al SQL Server a cuál
desea referirse.
BE

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

SELECT OrderID, Customers.CustomerId, ContactName

FROM Orders INNER JOIN Customers

ON Orders.CustomerId = Customers.CustomerId

Esta consulta le dice a SQL Server que tome cada fla en la tabla Orders y que empate
todas las flas en la tabla Customers en las cuales el CustomerId de la orden es igual al
CustomerId del cliente. Debido a que CustomerId es único en la tabla Customers, esto es
lo mismo que solo incluir una sola fla para cada orden en los resultados. En este caso, como
resultado tendrá tantas flas como las hay en la tabla Orders.
174 Lección 6

¿Pero y si desea ver solo algunas de las flas en la tabla? Puede utilizar una clausula
WHERE. La cláusula WHERE evalúa a cada fla para una condición y decide si incluirla
o no en los resultados. Por ejemplo:

SELECT *

FROM Orders

WHERE ShipCountry = ‘Canada’


Tome Nota
Aquí la cláusula WHERE mira a cada fla en la tabla Orders para ver si ShipCountry tiene
El delimitador estándar el valor exacto “Canadá”. Si lo tiene, la fla es incluida en los resultados, si no, la fla no es

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

WHERE (ShipCountry = ‘Canada’)


ÁM
www.pdftron.com
AND (OrderDate>= ‘01/01/97’)

AND (OrderDate<= ‘01/31/97’)

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

WHERE (ShipCountry = ‘Canada’)

AND (OrderDate>= ‘01/01/97’)


ET

AND (OrderDate<= ‘01/31/97’)

ORDER BY OrderDate

Puede modifcar el tipo de orden utilizando ya sea la palabra clave ASC (para orden
ascendente) o DESC (para orden descendiente). El tipo de orden por defecto es ascendente.
La siguiente consulta enlista las órdenes más recientes en la parte superior:

SELECT *

FROM Orders
Comprender las Bases de Datos 175

WHERE (ShipCountry = ‘Canada’)

AND (OrderDate>= ‘01/01/97’)

AND (OrderDate<= ‘01/31/97’)

ORDER BY OrderDate DESC

Es muy común para las aplicaciones de negocios el solicitar información agregada o


resumida. Tales requerimientos pueden ser direccionados utilizando la cláusula GROUP
BY y las funciones agregadas.

ICA
Por ejemplo, puede utilizar la siguiente consulta para encontrar a cuáles países está
embarcando más en sus órdenes:

SELECT ShipCountry, COUNT (ShipCountry) AS OrderCount

FROM Orders

ER
GROUP BY ShipCountry

ORDER BY OrderCount DESC


ÁM
www.pdftron.com
Esto mostrará el nombre del país seguido por el número total de órdenes que embarca a
ese país. La cláusula ORDER BY ordena los resultados y ubica los países con más órdenes
en la parte superior de la lista.

Puede pensar en la cláusula GROUP BY como creador de “buckets”, en este caso uno para
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

SET ContactName = ‘Maria Anderson’

WHERE CustomerId = ‘ALFKI’


Tome Nota
ÁM
www.pdftron.com
En una sentencia
UPDATE la cláusula
En esta consulta, la palabra clave SET le dice a SQL Server cuales columnas actualizar y la
SET es requerida y
palabra clave WHERE le dice cuales flas actualizar. En la tabla Customers, el CustomerId
puede ser especificada es una clave principal y únicamente identifca a una sola fla. De manera que esta sentencia
solo una vez. update puede actualizar a lo mucho una fla.
RO
No está limitado a actualizar un solo registro. Si la cláusula WHERE selecciona múltiples
registros, todos los registros serán actualizados:

UPDATE Customers
BE

SET Country = ‘United States’

WHERE Country = ‘USA’


CI

También puede actualizar más de un campo a la vez con la sentencia UPDATE:

UPDATE Customers

SET ContactName = ‘Maria Anderson’,


ET

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:

INSERT INTO [Order Details]

(OrderId, ProductId, UnitPrice, Quantity, Discount)

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:

INSERT INTO [Order Details]

(OrderId, ProductId, UnitPrice, Quantity)


ÁM
www.pdftron.com
VALUES (10249, 2, 19.00, 2)

Esto funciona, aunque no fue especifcado, un valor para el campo Discount. También,
puede reordenar esta lista de campos mientras que reordene la lista de valores para que
RO
coincidan:

INSERT INTO [Order Details]

(ProductId, OrderId, UnitPrice, Quantity)


BE

VALUES (2, 10250, 19.00, 2)

La sentencia INSERT no está limitada a insertar un solo registro. Hay un segundo formato
que inserta los resultados de una sentencia SELECT en una determinada tabla. Por ejemplo,
CI

esa consulta inserta un producto para cada proveedor en la tabla Products:

INSERT INTO Products

(SupplierId, ProductName, CategoryId)


ET

SELECT SupplierId, ‘Almond’, 7

FROM Suppliers

Esto funciona construyendo los resultados de la sentencia SELECT y luego poniendo


cada fla retornada por la sentencia SELECT en una tabla determinada. Por supuesto, las
columnas aun necesitan coincidir apropiadamente.
178 Lección 6

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:

SELECT * INTO CustomersCopy

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

WHERE CustomerId = ‘ALFKI’


ÁM
Sea cuidadoso: si omite la cláusula WHERE, eliminara toda la información de la tabla:

www.pdftron.com
DELETE FROM CustomersCopy

Trabajar con procedimientos almacenados


RO
Un procedimiento almacenado es un conjunto de sentencias SQL que es almacenado en la base de datos. Los
procedimientos almacenados son nombrados y pueden ser utilizados por múltiples aplicaciones.

En contraste con las consultas ad-hoc, los procedimientos almacenados son consultas
BE

almacenadas permanentemente en el SQL Server. En muchas maneras, puede pensar en un


procedimiento almacenado como un SQL equivalente a un método C#.

Los procedimientos almacenados tienen dos benefcios principales, primero, los puede
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

Crear y Ejecutar un procedimiento almacenado


El comando CREATE PROCEDURE puede ser utilizado para crear un nuevo procedimiento almacenado.

Puede utilizar la palabra clave CREATE PROCEDURE de T-SQL para crear un


procedimiento almacenado. Puede ejecutar la sentencia CREATEPROCEDURE desde
cualquier interfaz que le permita introducir y ejecutar T-SQL.
Comprender las Bases de Datos 179

Æ Crear un procedimiento almacenado desde visual studio

PREPÁRESE. Para crear un procedimiento almacenado desde Visual Studio, haga lo siguiente:
1. Abra el Explorador de Servidores y seleccione la base de datos de Northwind. Haga clic
derecho en el nodo de Procedimientos Almacenados y seleccione la opción Agregar Nuevo
Procedimiento Almacenado.

2. En el diseñador de procedimiento almacenado, remplace el texto repetitivo con el siguiente


código:

CREATE PROCEDURE GetCustomersFromFrance

ICA
AS

SELECT * FROM Customers

Where Country = ‘France’

ER
RETURN

3. Guarde el procedimiento almacenado. El procedimiento almacenado ahora es agregado a


la base de datos.
ÁM
4. Para ejecutar un procedimiento almacenado, haga clic en el procedimiento almacenado

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.

Trabajar con procedimientos almacenados parametrizados


BE

Los procedimientos almacenados parametrizados le permiten pasar argumentos de tiempo de ejecución a SQL Server.

La habilidad de pasar parámetros incrementa signifcativamente el poder de los


CI

procedimientos almacenados. El valor del parámetro puede ser proporcionado en tiempo


de ejecución para los procedimientos almacenados.

Considere que desea encontrar las ventas totales para cierto cliente en la base de datos de
Northwind. Debería ser capaz de especifcar el CustomerId en tiempo de ejecución.
ET

Æ Crear un procedimiento almacenado parametrizado

PREPÁRESE. Para crear un procedimiento almacenado parametrizado, haga lo siguiente:


1. Abra el Explorador de Servidores y seleccione la base de datos de Northwind. Haga clic
derecho en el nodo de Procedimientos Almacenados y seleccione la opción Agregar Nuevo
Procedimiento Almacenado.

2. En el diseñador de procedimiento almacenado, remplace el texto repetitivo con el


siguiente código:
180 Lección 6

CREATE PROCEDURE dbo.GetCustomerSales

@CustomerIdchar(5),

@TotalSales money OUTPUT

AS

ICA
SELECT @TotalSales = SUM(Quantity * UnitPrice)

FROM (Customers INNER JOIN Orders

ON Customers.CustomerId = Orders.CustomerId)

ER
INNER JOIN [Order Details]

ON Orders.OrderId = [Order Details].OrderId


ÁM
WHERE Customers.CustomerId = @CustomerId

www.pdftron.com
RETURN

3. Guarde el procedimiento almacenado. El procedimiento almacenado ahora es agregado a


la base de dados.
RO
En este procedimiento almacenado, tanto @CustomerId y @TotalSales son parámetros. @
CustomerId es un parámetro de entrada, debe proporcionar este parámetro cuando ejecuta
el procedimiento almacenado. @TotalSales es un parámetro de salida, retorna un valor del
procedimiento almacenado. Cuando ejecuta este procedimiento almacenado desde Visual
Studio, obtiene un cuadro de diálogo que le pide que introduzca el valor para todos los
BE

parámetros, como se muestra en la Figura 6-9.

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.

No puede, sin embargo, ejecutar un procedimiento almacenado desde el proyecto QueryCS,


ya que el código no puede aceptar parámetros.

Æ Ejecutar procedimientos almacenados parametrizados desde C#

PREPÁRESE. Para ejecutar procedimientos almacenados parametrizados desde C#, desempeñe

ICA
las siguientes tareas:
1. Cree un nuevo proyecto de Aplicación para Windows llamado ParameterizedSP.

2. Ubique dos controles Label (label1 y TotalSalesLabel), un TextBox (CustomerIdTextBox) y


un Button (GetTotalSalesButton) y ordene los controles como se muestra en la Figura 6-10.

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
}

4. Agregue el siguiente método a la clase. Asegúrese de cambiar la cadena de conexión para


que coincida con la ruta local del archivo de la base de datos en su computadora:
private double GetTotalSales(string customerId)
BE

{
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

5. Agregue la siguiente directiva using al código:


usingSystem.Data;
using System.Data.SqlClient;

6. Seleccione Depurar, Iniciar Depuración para ejecutar el proyecto. Introduzca un CustomerId


ET

válido. Podrá ver la salida como se muestra en la Figura 6-10.

Figura 6-10
Ejecutando
procedimientos
almacenados
parametrizados desde una
aplicación de C#
Comprender las Bases de Datos 183

En el código, los parámetros son representados por objetos SqlParameter. El código


funciona estableciendo el valor para el parámetro @CustomerId, ejecutando el objeto
SqlCommand correspondiente al procedimiento almacenado y luego recuperando la
propiedad Value del parámetroTotalSales.
Tome Nota
El código previo tiene las siguientes líneas:
El objeto utilizado con
la sentencia using connection.Open();
debe implementar la command.ExecuteNonQuery();
interfaz de IDisposable.
totalSales = Double.Parse(
command.Parameters[“@TotalSales”]

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

ƒ Comprender los métodos de conexión a bases de


datos
È EN RESUMEN

Las aplicaciones de negocios pueden necesitar trabajar con datos en varios formatos. También puede necesitar trabajar
con datos almacenados dentro de archivos planos, archivos XML y objetos en memoria.

El .NET Framework proporciona clases que son optimizadas para trabajar con archivos

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.

Un stream es un fujo de datos en bruto. Un almacén de respaldo es la fuente o destino


de un stream. Un almacén de respaldo podría ser cualquier cosa tal como un archivo de
ET

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

binario. Las BinaryReader y BinaryWriter le proporcionan una manera sencilla para


manipular los archivos binarios.

En el siguiente ejercicio seleccione las columnas de la tabla Customers y las escribe en un


archivo de texto. Después abre el archivo de texto y visualiza su contenido en la ventana
de Consola.

Æ Leer de y escribir a un archivo de texto

PREPÁRESE. Para leer de y escribir un archivo de texto, haga lo siguiente:

ICA
1. Cree un nuevo proyecto de Aplicación de Consola llamado WorkingWithTextFiles.

2. Agregue el siguiente código a la clase Program. Necesitará corregir la ruta de su base de


datos de Northwind en el código:
static void Main(string[] args)
{

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

// para coincidir con su sustema.


stringconnectionString =
@”Data Source=.\SQLEXPRESS;” +
ET

@”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

static void DisplayTextFile(string fleName)


{
try
{
using (StreamReadersr =
newStreamReader(fleName))
{
string line;
Comprender las Bases de Datos 187

while ((line = sr.ReadLine()) != null)


{
Console.WriteLine(line);
}
}
}
catch (Exception ex)
{

ICA
Console.WriteLine(ex.Message);
}
}

3. Agregue la siguiente directiva using a su código:

ER
usingSystem.Data.SqlClient;
using System.IO;

4. Genere y ejecute el programa, Verifique la carpeta Mis Documentos por el


archivoCustomerList.txt y verifique que los datos del cliente han sido escritos. También
ÁM
verifique la salida en la ventana de Consola contra el contenido del archivo.

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.

Trabajar con XML


BE

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.

La primera línea de un documento XML es la declaración XML:


<?xmlversion=”1.0” encoding=”utf-8”?>

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

Finalmente, un documento XML puede contener comentarios. Los comentarios inician


con los caracteres <!—y terminan con los caracteres-->.

XML puede ser más complejo de lo discutido en esta sección. Pero estas bases son
sufcientes para que comprenda la mayoría de los documentos XML que es probable que
se encuentre hasta que inicie a trabajar con XML a profundidad.

Hay muchas maneras en las cuales puede trabajar con información XML. Las clases para
trabajar con información XML están organizadas en el espacio de nombres de System.
Xml. Esta lección se enfoca en las siguientes clases utilizadas comúnmente:
Comprender las Bases de Datos 189

• XmlReaderyXmlWriter: Estas clases proporcionan una manera rápida, sin


entrar a cache y solo hacia adelante para leer o escribir datos XML.
• XmlDocument: Esta clase es una representación en memoria de datos XML y
permite la navegación y edición del documento XML.
En el siguiente ejercicio utilice la clase XmlReader para leer un archivo XML llamado
Customers.xml de una manera secuencial y solo hacia adelante:

Æ Leer desde un Archivo XML

PREPÁRESE. Para leer desde un archivo XML, haga lo siguiente:

ICA
1. Cree un nuevo proyecto de Aplicación de Consola llamado WorkingWithXmlReader.

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


using (XmlReader reader =
XmlReader.Create(“Customers.xml”))

ER
{
while (reader.Read())
{
ÁM
if (reader.IsStartElement())

www.pdftron.com
{
switch (reader.Name)
{
RO
case “CompanyName”:
if (reader.Read())
{
Console.Write(
BE

“Company Name: {0}, “,


reader.Value);
}
CI

break;
case “Phone”:
if (reader.Read())
ET

{
Console.WriteLine(
“Phone: {0}”, reader.Value);
}
break;
}
}
}
190 Lección 6

3. Necesitará agregar la siguiente directiva using al programa:


usingSystem.Xml;

4. Agregue un nuevo archivo XML llamado Customers.xml al proyecto. Asegúrese que el


archivo XML contiene la siguiente información:
<?xmlversion=”1.0” encoding=”utf-8”?>
<!--CustomerList-->
<Customers>
<Customer Id=”ALFKI”>

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

Trabajar con DataSet


El XML (Lenguaje de Etiquetado Extensible) es un formato basado en texto para la representación de datos
estructurados.
CI

Un DataSet es una representación en memoria de datos relacionales. Justo como una


base de datos, un DataSet puede tener tablas, relaciones y restricciones de integridad
ET

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 DataAdapter actúa como un Puente entre la fuente de datos y el DataSet. El DataAdapter


almacena la conexión de datos y los comandos de datos necesarios para conectarse a la
fuente de datos. El DataAdapter también proporciona comandos para la recuperación de
datos desde la fuente de datos y comandos para la actualización de la fuente de datos con
cualquier cambio.

El .NET Framework proporciona tres tipos de clases DataAdapter para trabajar con

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

Æ Leer un objeto DataSet en memoria

PREPÁRESE. Para leer desde un objeto DataSet en memoria, haga lo siguiente:


1. Cree un nuevo proyecto de Aplicación de Consola llamado WorkingWithDataSet.

2. Remplace el código en la clase Program con el siguiente código. Asegúrese de cambiar la


cadena de conexión para que coincida con la ruta local del archivo de la base de datos en
su computadora:
static void Main(string[] args)
{
192 Lección 6

WorkingWithDataSet();
}

static void WorkingWithDataSet()


{
string cString = @”Data Source=.\SQLEXPRESS;”
+ @”AttachDbFilename=B:\SqlSampleDB\NORTHWND.MDF;”
+ “Integrated Security=True;”
+ “Connect Timeout=30;User Instance=True”;
SqlConnection northwindConnection =

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);

DataSet customerOrders = new DataSet();


customerAdapter.Fill(
RO
customerOrders, “Customers”);
ordersAdapter.Fill(
customerOrders, “Orders”);

DataRelation relation =
BE

customerOrders.Relations.Add(“CustomerOrders”,
customerOrders.Tables[“Customers”]
.Columns[“CustomerID”],
customerOrders.Tables[“Orders”]
.Columns[“CustomerID”]);
CI

foreach (DataRow customerRow in


customerOrders.Tables[“Customers”].Rows)
{
ET

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

Tome Nota 3. Necesitará agregar la siguiente directiva using al programa:


Un DataSet puede leer usingSystem.Data;
y escribir datos como
usingSystem.Data.SqlClient;
documentos XML. Para
escribir datos como 4. Seleccione Proyecto, posteriormente configure como Startup Project para hacer que el
XML, utilice el método proyecto sea el inicial para esta solución.
WriteXmlde la clase
DataSet. Para leer un 5. Seleccione Depurar y después Iniciar Depuración (o presione F5) para ejecutar el programa.
documento de datos Notará que la ventana de consola enlista todos los clientes de la tabla Customers. Cada
XML, puede utilizar el CustomerID es seguido por el OrderID correspondiente a ese cliente.
método ReadXml de la
clase DataSet. El código en este ejercicio primero crea un DataSet con dos objetos DataTable, Customers

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

Llene los espacios en blanco


ÁM
www.pdftron.com
Complete los siguientes enunciados escribiendo la palabra o palabras correctas en los
espacios proporcionados.
1. Con el fn de que una tabla esté en la _________________, ninguna de las
columnas debe tener valores múltiples en la misma fla de datos.
RO
2. La _______________requiere que todas las columnas que no son clave sean
funcionalmente dependientes de toda la clave principal.
3. La _______________requiere que no haya dependencia funcional entre los atributos
que no son clave.
BE

4. Los bloques de construcción básicos para un diagrama entidad - relación son


_______________, _______________ y_______________.
5. La cláusula _______________en una sentencia SELECT evalúa cada fla para una
condición y decide si incluirlos o no en el conjunto de resultados.
CI

6. El objeto utilizado con la sentencia using debe implementar la interfaz_______________.


7. La sentencia _______________de T-SQL puede ser utilizada para crear un
procedimiento almacenado.
ET

8. En el proceso de _______________, aplica un conjunto de reglas para garantizar que


su diseño de base de datos ayuda con la integridad de datos y es fácil de administrar
en el futuro.
9. Encuentra clases para trabajar con streams y almacenes de respaldo en el espacio de
nombres de _______________.
10. El formato ____________ es una representación de datos jerárquica.
Comprender los conceptos básicos de bases de datos 195

Opción Múltiple

Encierre en un círculo la letra que corresponda a la mejor respuesta.


1. Su aplicación necesita almacenar la imagen del producto hacia un archivo en disco. Le
gustaría minimizar el tamaño del archivo de disco. ¿Cuál de los objetos debe utilizar
para escribir el archivo?
a. FileStream
b. StreamWriter
c. BinaryWriter
d. XmlWriter

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

SET Region = ‘EastAsia’

5. Prueba la consulta en una base de datos de prueba y encuentra que se afectan más
registros de lo esperado. Necesita corregir la sentencia SQL. ¿Qué debe hacer?
a. Agregar una clausula WHERE a la sentencia UPDATE.
b. Agregar una clausula SET adicional a la sentencia UPDATE.
c. Agregar una clausula GROUP BY a la sentencia UPDATE.
d. Agregar una clausula HAVING a la sentencia UPDATE.
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

siguientes situaciones no es un buen candidato para la implantación con procedimientos


almacenados en su aplicación?
a. Recuperar la lista de todos los clientes en la base de datos
b. Recuperar la lista de todas las órdenes para un cliente en particular
CI

c. Insertar una nueva orden en la tabla Orders


d. Hacer consultas Ad-hoc por el administrador de la base de dato
ET

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’)

12. Su aplicación incluye un objeto SqlDataAdapter llamado SqlDataAdapter que se

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

Proyecto 6-1: Crear un Diagrama Entidad - relación

Una compañía tiene un número de empleados. Cada empleado puede ser asignado a uno
o más proyectos. Un proyecto puede tener uno o más empleados trabajando en él. Dibuje
un diagrama entidad - relación para esta situación.

Proyecto 6-2: Crear un Procedimiento Almacenado

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

Está convirtiendo un diagrama entidad - relación en tablas. Obtiene la siguiente tabla:


ÁM
www.pdftron.com
Books

BookId BookName CategoryId CategoryName


1 Cocinando Sano 1001 Cocina
RO
2 Profecía 1002 Misterio y Suspenso
3 Cambio 1003 Negocios
4 La Confesión 1002 Misterio y Suspenso
BE

Necesita aplicar las reglas de normalización para garantizar la integridad de datos. ¿Cómo
garantizaría que la tabla Books está en la tercera forma normal?

Proyecto 6-4: Crear y Manejar Eventos


CI

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?

Você também pode gostar