Академический Документы
Профессиональный Документы
Культура Документы
REVISIN TCNICA Mtro. Francisco Salazar Universidad Autnoma de Nuevo Len, Mxico Mtro. Csar Tello Univesidad Autnoma de Nuevo Len, Mxico
Datos de catalogacin bibliogrfica RAMREZ, JOS FELIPE. Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005 PEARSON EDUCACIN, Mxico, 2007 rea: Ingeniera y Computacin ISBN: 978-970-26-0912-4 Formato: 18.5 23.5 cm Pginas: 648
Editor: Pablo Miguel Guerrero Rosas e-mail: pablo.guerrero@pearsoned.com Editor de Desarrollo: Bernardino Gutirrez Hernndez Supervisor de Produccin: Jos D. Hernndez Garduo PRIMERA EDICIN, 2007 D.R. 2007 por Pearson Educacin de Mxico, S.A. de C.V. Atlacomulco 500-5to. piso Col. Industrial Atoto 53519, Naucalpan de Jurez, Edo. de Mxico E-mail: editorial.universidades@pearsoned.com Cmara Nacional de la Industria Editorial Mexicana. Reg. Nm. 1031. Prentice Hall es una marca registrada de Pearson Educacin de Mxico, S.A. de C.V. Reservados todos los derechos. Ni la totalidad ni parte de esta publicacin pueden reproducirse, registrarse o transmitirse, por un sistema de recuperacin de informacin, en ninguna forma ni por ningn medio, sea electrnico, mecnico, fotoqumico, magntico o electroptico, por fotocopia, grabacin o cualquier otro, sin permiso previo por escrito del editor. El prstamo, alquiler o cualquier otra forma de cesin de uso de este ejemplar requerir tambin la autorizacin del editor o de sus representantes. ISBN 10: 970-26-0912-7 ISBN 13: 978-970-26-0912-4 Impreso en Mxico. Printed in Mexico 1 2 3 4 5 6 7 8 9 0 - 10 09 08 07
CONTENIDO
Prlogo Agradecimientos Como utilizar este libro Parte 1 Plataforma .NET versin 2005 Captulo 1 Arquitectura de la plataforma .NET Definicin de la plataforma .NET Capas principales de la plataforma .NET Capa de lenguajes de .NET Lenguajes .NET .NET Framework Impacto de .NET Framework en los sistemas operativos Ventajas que brinda la infraestructura de .NET Convivencia de .NET y COM Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 2 .NET como multiplataforma de desarrollo Determinacin de la plataforma .NET requerida Productos de plataforma .NET Desarrollo de aplicaciones en .NET usando SDK Tecnologas cubiertas en este libro vii xv xvii 1 3 5 7 9 10 11 27 28 29 31 32 33 34 35 37 39 49 53
vi
Contenido
Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 3 Tcnicas de desarrollo con Visual Studio 2005 Fundamentos de desarrollo con Visual Studio Elementos de sintaxis en Visual Basic Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Parte 2 Fundamentos de programacin en Visual Basic Captulo 4 Variables, arreglos y tipos de datos Variables Conversin de datos Acceso a datos Value type y Reference type Strong Typing Manejo elemental de variables Estructuras y enumeraciones Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 5 Espacios de nombres y desarrollo de libreras Espacios de nombres (namespaces) Uso de espacios de nombres Creacin de namespaces propios Alias para los espacios de nombres Independencia de los ensamblados Referencias Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 6 Manejo de operadores Operadores aritmticos Operadores de asignacin
55 56 56 58 59 61 67 92 93 93 94 95 97 99 105 107 109 112 133 135 136 136 138 139 141 148 149 150 151 151 170 171 171 173 175 177 178
Contenido
vii
Operadores comparativos Operadores lgicos Prioridad entre operadores Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 7 Estructuras de decisin y control Estructuras de decisin Estructuras de control Estructuras envolventes y anidadas Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 8 Manejo estructurado de excepciones Errores y Excepciones Manejo estructurado de excepciones Try...Catch...Finally Filtrado de excepciones Lanzamiento de excepciones propias Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Parte 3 Programacin orientada a objetos Captulo 9 Fundamentos de la programacin orientada a objetos Trminos bsicos de POO Elementos esenciales de los objetos que permiten su programacin Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 10 Clases, mtodos y propiedades Definicin de una clase Definicin de propiedades
180 185 189 200 201 201 203 205 207 211 215 227 228 228 230 231 233 234 235 241 246 249 250 250 252 253 255 257 265 275 276 276 278 279 281 281
viii
Contenido
Creacin de bibliotecas de clases (libreras) Condiciones para la utilizacin de las bibliotecas de clases Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 11 Herencia y polimorfismo Herencia Estatutos auxiliares para el manejo de herencia y polimorfismo Polimorfismo Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Parte 4 Interfaces Windows/Web y Servicios Web XML Captulo 12 Desarrollo de aplicaciones Windows Interfaz de usuario Desarrollo de interfaces basadas en objetos Jerarqua de clases relacionadas con controles Clasificacin de los controles Enfoque (Focus) Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 13 Desarrollo de aplicaciones Web con ASP.NET Motivos del auge de las aplicaciones Web Requerimientos para el desarrollo de ASP.NET Procesamiento de pginas Web en .NET Caractersticas de ASP.NET Elementos de una pgina Web ASP.NET Controles comunes en aplicaciones Web Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo
283 284 307 308 308 310 311 313 323 325 335 336 336 338 339 341 344 345 349 355 363 392 393 394 396 397 399 400 402 403 410 419 439 440 441 443
Contenido
ix
Captulo 14 Servicios Web XML Servicios Web XML Infraestructura de operacin de los Servicios Web Elementos para la creacin de un Servicio Web XML Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Parte 5 Manejo de bases de datos con ADO.NET Captulo 15 Manejo de bases de datos con ADO.NET ADO.NET Historia del acceso a los almacenes de datos Formas de trabajo con bases de datos en .NET Proveedores de datos de .NET Framework Modelo de objetos de ADO.NET Cmo realizar la conexin Command DataReader Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 16 Manejo de bases de datos desde aplicaciones Windows Modelo de objetos DataSet Alternativas para poblar de datos un DataSet DataAdapter DataSet Mapa mental del captulo Terminologa Preguntas Examen rpido del captulo Captulo 17 Manejo de bases de datos desde aplicaciones Web Data Source Controls y Data Bound Controls Mapa mental del captulo Terminologa
445 447 453 454 463 464 464 466 467 469 471 472 477 481 491 496 503 506 521 522 523 525
527 529 534 535 538 562 563 564 566 567 569 596 597
Contenido
PRLOGO
Este libro est compuesto por partes seleccionadas del curso de certificacin Aprenda Practicando CAP-Dev 2005, cdigo 2015: Aprenda Practicando Visual Basic 2005 y Visual Studio 2005 (www.aprendapracticando.com). Originalmente el curso se llamaba Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005, pero Visual Studio 2005 result ser un invitado con ganas de protagonizar. La herramienta es tan poderosa que muchas de las prcticas no requeran codificacin por parte del desarrollador, de tal forma que daba lo mismo que el programa estuviera en Visual Basic, C# o J#; al final, el desarrollador ni se enteraba de la programacin tras bambalinas. Entonces ya no era Visual Basic usando Visual Studio, sino Visual Studio usando Visual Basic; de ah el cambio de nombre. El libro est dirigido a dos tipos de profesionales: (a) para el codificador minucioso que quiere entender los pormenores del lenguaje, las clases, sus miembros, las palabras reservadas y las estructuras que permiten la creacin casi artesanal de los programas; es decir, el profesional cuya curiosidad lo ha convertido en conocedor profundo del funcionamiento de las cosas, y (b) para el desarrollador profesional de alto rendimiento que casi siempre dispone de menos tiempo del que necesita para generar los resultados que las empresas le exigen, que no puede detenerse en los pormenores del lenguaje y que prefiere el uso de herramientas visuales y poderosas para crear soluciones efectivas en el menor tiempo posible. El objetivo de este libro es formar codificadores minuciosos y convertirlos en desarrolladores profesionales de alto rendimiento. Se buscan individuos que representen lo mejor de los dos mundos. Pero el propsito del libro no es tan simple como la frase formar desarrolladores minuciosos pero efectivos. Sera algo demasiado simple. Vamos ms all. Creo firmemente que el mundo en que crecemos encuentra muchas maneras sutiles de volverse ms complejo conforme se globaliza. Queremos hacer de nuestra vida un cortometraje feliz en donde todo transcurre tan rpido que nos olvidamos de que los planes de vida a largo plazo tambin existen. Al or las noticias del da me lamento al darme cuenta de que la violencia y la deshonestidad forman un conjunto de aproximaciones sucesivas hacia un futuro que no quiero. Creo que el origen de todos los problemas es la gente que anhela mucho y acta poco; creo que entre el anhelo personal y la accin que produce resultados hay abismos enormes, y la gente quiere tender puentes rpidos y cmodos para ir de un punto a otro. A veces la materia
xiv
Prlogo
prima para esos puentes son acciones delictivas y prcticas ilegales, siempre disponibles y a la mano, que lo enrarecen todo y terminan quitando ms de lo que dan. Si no eres de las personas fciles de seducir por el lado oscuro de la fuerza, sino que buscas caminos lcitos y honestos para tender los puentes, te darss cuenta de que resulta difcil, costoso, complejo y cansado. Este libro es mi pequea contribucin para quien desea dedicarse profesionalmente a la lcita y honesta actividad del desarrollo de aplicaciones. A quien desee llenar su cabeza de conocimientos para despus comercializar sus habilidades y construir sus propios puentes, este libro lo iniciar de manera perfecta en el camino profesional del desarrollo en Visual Basic, utilizando la herramienta lder en la construccin de aplicaciones empresariales, as como la ms demandada por los empleadores: Visual Studio. Dominar todos los temas de este libro garantiza la capacidad para el trabajo productivo con tecnologas Microsoft, cosa que ya ha sido un puente para tantos. Como dice Mario Benedetti: Para cruzarlo o para no cruzarlo, ah est el puente.
AGRADECIMIENTOS
Los agradecimientos van, como siempre, para los indispensables en mi vida. Para Adriana, mi compaera vital, y para Sara, por ser la lucecita que ilumina mis senderos. A toda mi familia en general, por estar ah generacin tras generacin, demostrando que se puede ser lcito y honesto, y obtener los anhelos, uno a la vez. A mis compaeros Vernica Lpez, Delia Briones, Rolando Martnez, Gustavo Valds y Rey Manuel, por transformar algo simplemente soportable en algo disfrutable; a Paco Salazar, Jorge Hernndez, Magda Garza, Paco Guevara, Heriberto Gonzlez y todos los que creen que Aprenda Practicando est avanzando gracias a la calidad de los productos y su filosofa. A Vctor Manuel Ortega, que seguro llegar a mucho en su vida: gracias por la revisin lnea a lnea de los programas. Como siempre, mi agradecimiento especial a Isela Martnez por el delicado esmero que hace de un texto opaco un texto con algo de brillo. Siempre es bueno que los libros tengan un ngel de la guarda. Monterrey, Nuevo Len, 2006.
Este libro es una herramienta de aprendizaje dirigida a profesionales con especialidad en computacin e informtica, de ah que analice desde elementos de programacin hasta el manejo de bases de datos. El contenido est diseado para que el lector, en un periodo de cuatro a seis meses, aprenda a programar en Visual Basic y utilizar Visual Studio 2005 en forma intensiva. Se espera que, al final, el lector sea capaz de implementar sistemas de informacin con manejo de bases de datos utilizando SQL Server y en interfaz de consola, Windows y Web. De forma autodidacta y con una dedicacin de tiempo completo a la realizacin de los ejercicios del libro se puede aprender todo en dos meses. La configuracin ideal de hardware para lograr las metas de aprendizaje de este libro es la siguiente: a) Un equipo de ltima generacin con Windows XP Professional (o superior) con Service Pack 2 instalado, b) Internet Information Server 5.5 o superior instalado y funcionando, c) .NET Framework 2.0 Redistributable Package, d) .NET Framework SDK 2.0, e) Visual Studio 2005 Standard Edition en ingls y f) SQL Server 2000/2005 o superior. Los nmeros sugieren la secuencia de instalacin. Se recomienda que la cuenta con la que ingrese al sistema tenga privilegios de administrador y que forme parte del grupo de usuarios Debugger Users. Tambin puede cubrirse la totalidad de los temas tomando el curso 2015 Programacin en Microsoft Visual Basic 2005 y Visual Studio 2005, y 2016 Acceso a datos usando Microsoft Visual Basic 2005 y Visual Studio 2005, en algn centro autorizado Aprenda Practi-
xviii
cando. En el curso contar con un equipo personal especialmente configurado para el aprendizaje de los temas y con la gua de un instructor certificado CAP-Dev, quien le asesorar en temas del curso adems de orientarle con respecto a la forma en que puede emplear los conocimientos en casos reales que se encuentre desarrollando.
apvbvsxx.ppt
xix
Figuras. Cada captulo contiene figuras que complementan grficamente los temas tratados; a veces una imagen dice ms que mil palabras. Lo nuevo en Visual Studio 2005. Visual Studio 2005 presenta nuevas capacidades y herramientas de productividad. La seccin Lo nuevo explica detalladamente cada una de estas adiciones. Ejercicios detallados, con explicaciones lnea por lnea y ejecucin guiada. La mayora de los captulos presenta ejercicios que permiten comprobar la teora estudiada. Los ejercicios se desarrollan paso a paso y se complementan con cdigo. Se incluye tambin una ejecucin guiada, que explica lo que cada lnea de cdigo hace y los resultados que se obtienen. Mapa mental. Cada captulo incluye un mapa mental que acta como resumen de los temas del captulo. Tambin es til en el aprendizaje en grupo, para que aquellos que se atrasen en el seguimiento de los temas puedan ponerse al da. Generalmente basta con analizar el mapa mental y repasar en el captulo los trminos clave que contiene. Terminologa. .NET introduce muchos conceptos nuevos que es necesario tener en mente. Cada captulo tiene su propio ndice de trminos, lo que permite su rpida localizacin en el texto del captulo. Preguntas. Al final de cada captulo se incluye una serie de preguntas; si el lector las contesta correctamente, podr tener la certeza de haber aprendido los conocimientos presentados en el captulo. Algunas preguntas requieren anlisis, ms all de la simple consulta, lo que despierta el razonamiento de la tcnica que se est aprendiendo. Examen rpido. Es la evaluacin rpida que se debe resolver despus de haber estudiado los temas y resuelto los ejercicios. Si entendi los objetivos de estudio y la terminologa, llev a cabo los ejercicios y las prcticas individuales, y respondi a las preguntas, es seguro que resuelva la evaluacin correctamente, con conocimiento de causa respecto a todo. Partimos del concepto de que las personas son diferentes: cada individuo tiene su forma particular de aprender: algunos leyendo un resumen, otros por medio de un video, algunos leyendo, otros contestando preguntas, otros con la prctica, algunos ms siendo cuestiona-
xx
dos... Tratamos de brindar la mayor gama de herramientas con el fin de que cada quien aprenda como quiera; lo importante es que lo haga.
Estrategias de uso
Para el autodidacta
La persona autodidacta es la que toma el aprendizaje en sus manos; no depende de las explicaciones de nadie y por lo tanto tiene control total de su propio proceso de aprendizaje. A ese tipo de lector le sugerimos esto: 1. Si desea aprender slo algunos temas, considere las partes del libro como temas. No caiga en la tentacin de tomar en cuenta slo algunos de los captulos de una parte, dado que estn estructurados en una secuencia funcional. Si ya conoce .NET, puede saltarse captulos dentro de un tema si ya los domina. Una manera de evaluar si est en condiciones que le permitan saltar captulos es la siguiente: trate de contestar las evaluaciones rpidas del captulo. Si responde correctamente a la mayora de las preguntas, puede omitir la lectura del captulo. Decididos los temas que le interesan, lea de manera secuencial cada captulo del tema: a) Lea con detenimiento los objetivos del captulo para que tenga presente que eso es lo que hay que dominar al concluirlo. b) Si interrumpe la lectura de un captulo, cada vez que reinicie la lectura lea de nuevo los objetivos. Es muy importante que los tenga presentes. c) Revise los videos en el momento en que los seale el texto. d) Realice los ejercicios en el momento en que los encuentra en el texto. e) Responda el examen rpidamente; si no contesta correctamente la mayora de las preguntas, vuelva a revisar el captulo hasta que quede satisfecho. 4. Si aprueba satisfactoriamente el examen rpido, intente desarrollar las prcticas individuales. Si ya entendi el contenido del captulo, slo es cuestin de tiempo y dedicacin. Le sugerimos que pruebe los cuestionarios y juegos en lnea que se encuentran en www. aprendapracticando.com para comprobar el grado de experiencia que ha adquirido.
2.
3.
5.
xxi
Al iniciar un tema
1. El instructor/facilitador deber dominar el tema a instruir; previo a la instruccin, deber responder a las preguntas, realizar los ejercicios, realizar las prcticas individuales y responder a la perfeccin el examen rpido. Los equipos en los que se pretendan demostrar los ejercicios debern estar configurados con los requerimientos mnimos que aparecen en la primera parte de esta seccin. Las presentaciones profesionales en Power Point estn disponibles en el sitio Web de Aprenda Practicando; descargue las versiones ms actualizadas antes de cada curso. Antes de revisar una parte del libro, explique la importancia del aprendizaje del tema y genere inters por l; sin inters no hay aprendizaje. Lo ideal, para demostrar que la tecnologa estudiada es til, es citar su experiencia personal en el uso de estas herramientas de desarrollo. Tambin esto contribuye a aumentar el inters en su exposicin.
2. 3.
4. 5.
2. 3.
4.
5. 6. 7.
8.
xxii
9. 10.
11.
12.
13.
En caso de detectar un problema comn, es importante comentar con el grupo el problema y la solucin. Al concluir la realizacin de los ejercicios, el instructor/facilitador comentar las experiencias ms relevantes que haya notado; repasar por ltima vez los objetivos del captulo y comentar cmo fue que se cubrieron. Al finalizar los ejercicios, el instructor/facilitador pedir al grupo que conteste el examen lo ms rpido posible, de manera individual. Se darn tres minutos para contestar; despus, en voz alta plantear cada una de las preguntas y revisar qu contest el grupo. Despus de escuchar las diferentes posturas, ofrecer la respuesta correcta y dar sus razones. Los exmenes son una herramienta de aprendizaje ms, no una oportunidad para el premio o el castigo. El instructor/facilitador podr encargar las prcticas individuales como trabajo de refuerzo del conocimiento, ya sea para su desarrollo en sesin, o para que las personas desarrollen las prcticas en casa. De ser posible, motive a los participantes a comprobar sus conocimientos en los diferentes cuestionarios y juegos en lnea que se encuentran en: www.aprendapracticando.com.
Certificacin CAP-Dev
Aprenda Practicando ha desarrollado la primera certificacin en castellano relacionada con la tecnologa Microsoft .NET. El objetivo es que el personal certificado sea capaz de desarrollar aplicaciones multicapa, orientadas a objetos, con pleno acceso a bases de datos de alto rendimiento, utilizando para ello la herramienta Visual Studio a nivel profesional. CAP-Dev 2005 (Certificacin Aprenda Practicando .NET Developer) se compone de los siguientes cursos:
xxiii
Solicite sus cursos en los centros autorizados Aprenda Practicando o regstrese a ellos en la pgina www.AprendaPracticando.com Conforme las versiones de los productos de Microsoft van evolucionando, la certificacin y los cursos se actualizan de inmediato.
Captulos:
1 Arquitectura de la plataforma .NET 2 .NET como multiplataforma de desarrollo 3 Tcnicas de desarrollo con Visual Studio 2005
Parte 1
Plataforma .NET versin 2005
En esta parte del libro se estudian los componentes y particularidades de la plataforma de desarrollo Microsoft .NET, en su versin 2005. Desde la perspectiva terica se analizan los conceptos que permiten entender a profunidad cmo funciona la plataforma Microsoft .NET. Adems, se describen las caractersticas de los productos .NET; este conocimiento es necesario para afrontar las responsabilidades del desarrollador, pues le ayuda a responder la pregunta Qu compro y qu instalo? En el aspecto prctico, se trata de forma general lo que Visual Studio 2005 y los lenguajes soportados por .NET Framework versin 2.0 pueden hacer. Esta obra tiene como finalidad el desarrollo profesional del lector, quien a travs del aprendizaje slido de .NET podr aplicar estos conocimientos y crecer gracias a las capacidades que obtendr. Las posibilidades de productividad son muchas, as como las oportunidades de desarrollo utilizando .NET; lo nico que falta es que el lector se decida a aprovechar las posibilidades y recoger el fruto de su trabajo profesional basado en el conocimiento slido.
Otras herramientas:
1. 2. 3. 4. 5. .NET Framework 2.0 Configuration SDK Command Prompt ILDASM.EXE VBC.EXE IIS Services
CAPTULO
Contenido
Definicin de la plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capas principales de la plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capa de lenguajes de .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CLS (Common Language Specification) . . . . . . . . . . . . . . . . . . . . . . . . . Lenguajes .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capa de servicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Biblioteca de clases base de .NET Framework (BCL) . . . . . . . . . . . . . . . Independencia de la biblioteca de clases y los lenguajes . . . . . . . . . . . CLR (Common Language Runtime) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compilador para generar cdigo intermedio . . . . . . . . . . . . . . . . . . . . Global Assembly Cache (GAC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anlisis de las entradas del Cach global para ensamblado (GAC, Global Assembly Cache) . . . . . . . . . . . . . . . . . . . . . . . . . . . .NET PE (.NET Portable Executable) versus PE/COFF . . . . . . . . . . . . . . . Identificacin de diferencias en programas ejecutables, usando el desensamblador de .NET (ildasm.exe) . . . . . . . . . . . . Compiladores JIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Impacto de .NET Framework en los sistemas operativos . . . . . . . . . . . . . . . . Modificacin al cargador de ejecutables . . . . . . . . . . . . . . . . . . . . . . . Registro de biblioteca de clases base . . . . . . . . . . . . . . . . . . . . . . . . . . Prerrequisitos del sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . Ventajas que brinda la infraestructura de .NET . . . . . . . . . . . . . . . . . . . . . . . Convivencia de .NET y COM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 7 9 9 10 11 11 12 15 16 17 19 20 21 23 24 27 27 27 28 28 29 31 32 33 34
NOTA sta es la versin profesional del libro Aprenda Practicando Visual Basic.NET; los archivos complementarios mencionados en el mismo se encuentran en la pgina www.Aprenda Practicando.com. El temario de este texto es cubierto en su totalidad en el curso 2015 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005, perteneciente a la nica certificacin .NET en espaol, CAP-DEV (Certificacin Aprenda Practicando .NET Developer).
El infierno de los DLL. Falta de interoperabilidad con otras plataformas. Incapacidad para el manejo de esquema orientado a objetos. Manejo deficiente de errores. Incapacidad para utilizar Internet como medio eficiente de comunicacin. Desaprovechamiento de la experiencia ganada como consecuencia del manejo de
otros lenguajes.
Incapacidad para el desarrollo de aplicaciones que aprovechen arquitecturas
de 64 bits. Beneficios que proporciona .NET produce los siguientes beneficios: En resumen, trabajar con la plataforma .NET
Integracin de aplicaciones multi-lenguaje. Homologacin de las capacidades de los lenguajes. Disponibilidad de una biblioteca de clases comn para los lenguajes. Arquitectura abierta a nuevos lenguajes. Desarrollo simplificado. Implementacin simple. Mejor soporte de componentes. Interoperacin con Internet. Interoperacin con dispositivos mviles. Rentabilidad. Seguridad. Fcil implementacin (Copy Deployment). Permite el desarrollo de aplicaciones de 64 bits.
Uno de los mayores retos implicados en el aprendizaje de cualquier lenguaje .NET es entender la forma en que esta plataforma trabaja. Por otro lado, existen muchos tecnicismos ligados a esta tecnologa que es necesario conocer. Es recomendable entonces consultar el glosario de trminos de .NET disponible en el sitio Web de Microsoft: eso puede ayudarle a reconocer los trminos; para entenderlos cabalmente, lea este libro.
La capa de lenguajes est integrada por la CLS (Especificacin comn para lenguajes, Common Language Specification) y los lenguajes de programacin compatibles con ella. La CLS es una especificacin abierta de Microsoft que los lenguajes deben cumplir para ser considerados .NET. A la fecha Microsoft ha publicado cinco lenguajes y sus compiladores: Visual Basic, C#, C++, Visual J# y JScript. Otros fabricantes pueden implementar sus propios lenguajes .NET siempre y cuando respeten los lineamientos CLS y proporcionen los compiladores para generar el cdigo intermedio reconocido por .NET. . NET Framework (Infraestructura y servicios). .NET Framework es la capa compuesta por el ncleo de servicios y recursos de .NET, que incluye los compiladores, la biblioteca de clases comn para todos los lenguajes y los servicios que convierten el cdigo fuente en cdigo mquina para los diversos sistemas operativos a travs del uso de cdigo intermedio. .NET Framework se compone de los siguientes elementos: capa de servicios, BCL y CLR. Capa de servicios (Services). La capa de servicios se compone de aquellos servicios que permiten la intercomunicacin entre los programas desarrollados en un lenguaje .NET y el resto de los elementos de .NET Framework, con el fin de generar comportamientos a travs del dilogo con el sistema operativo. Existen dos principales: a) Windows Application Services, que dan soporte a las aplicaciones de interfaz grfica estilo Windows y a las de consola en su dilogo con .NET Framework y el sistema operativo; b) ASP.NET Application Services, que apoya a las aplicaciones de interfaz grfica basadas en la Web, servicios Web XML y aplicaciones de cmputo mvil en su dilogo con .NET Framework y el sistema operativo, a travs del motor de servicios Web. En plataforma Microsoft este motor de servicios Web se llama Internet Information Server (IIS). Biblioteca de clases base (BCL/Base Class Library). La Biblioteca de clases base (BCL/Base Class Library) est constituida por un conjunto de bibliotecas de clase que ponen a disposicin de los programas un conjunto de funciones jerrquicamente organizadas, que podrn ser utilizadas como funciones nativas de manera no dedicada por todos los lenguajes de .NET. Motor comn de ejecucin (CLR/Common Language Runtime). El Motor comn de ejecucin (CLR/ Common Language Runtime) es la plataforma comn de ejecucin de los programas desarrollados en cualquier lenguaje .NET. CLR agrupa compiladores de lnea de comando que permiten la creacin de cdigo intermedio, libre de ambigedades, al que se conoce como ensamblado (assembly); contiene adems los compiladores JIT, Just in Time Compilers, que se encargan de generar cdigo mquina a partir de los en-
samblados. CLR se encarga de la gestin de errores, la administracin de recursos y el dilogo con el sistema operativo en tiempo de ejecucin. A todo lo que requiere de la intervencin de CLR para funcionar se le da el calificativo de administrado (managed). Soporte operativo. La capa de soporte operativo es la compuesta por las herramientas que se integran al sistema operativo al momento de instalar .NET Framework en un equipo. Con esta operacin, el sistema operativo se modifica para poder interpretar y ejecutar aplicaciones .NET de forma nativa. Esta capa permite que el sistema operativo responda a indicaciones de accin emitidas por CLR en tiempo de ejecucin.
NOTA Microsoft ha denominado de diferentes formas a los productos y lenguajes que componen la tecnologa .NET: en la versin 1.0 de .NET Framework los lenguajes eran Visual Basic.NET, Visual C#.NET y Managed C++, mientras que el entorno integrado de desarrollo se conoca como Visual Studio.NET 2002. Por ser productos nuevos, exista la necesidad de diferenciarlos de las propuestas anteriores; incluso internamente en la compaa se penalizaba a quien osara referirse a Visual Basic.NET como Visual Basic 7. En la versin 1.1 de .NET Framework, los lenguajes pasaron a ser Visual Basic.NET, Visual C# y Managed C++, y se trabajaba con Visual Studio.NET 2003. Ahora, en la versin 2.0 de .NET Framework, las versiones anteriores de los lenguajes resultan anacrnicas, por lo que se conocen como Visual Basic, C# y C++. Se elimina tambin el .NET en Visual Studio; el nombre de la ltima versin queda entones como Visual Studio 2005.
Cualquier desarrollador experimentado puede aventurarse a desarrollar su propio lenguaje de programacin basado en .NET y proponerlo al mercado. Basta con desarrollar las herramientas necesarias para el trabajo con el lenguaje, incluyendo el compilador y el analizador (parser) del mismo. El nico requisito es que debe cumplir con todas las reglas definidas en la CLS. Capacidades multi-lenguaje de .NET. Dado que todos los lenguajes de .NET cumplen con CLS, su programacin es bastante similar. A continuacin ejemplificamos los efectos de esta especificacin mediante el tpico programa HolaMundo que muestra un mensaje. El programa HolaMundo en C# sera el siguiente:
10
HolaMundo.cs
1 2 3 4 5 6 8 9 using system; class HolaMundo { static void Main() { Console.WriteLine(Hola Mundo); } }
Vea cmo el cdigo es sorprendentemente parecido. Todos los lenguajes en .NET comparten el mismo origen (CLS), y difieren solamente en la forma estructural de la codificacin, determinada por el estilo particular del lenguaje.
NOTA La empresa japonesa Fujitsu enfrent un problema comn para muchas empresas grandes: gran parte de sus desarrollos estn en COBOL. Cmo cambiar a la plataforma .NET sin sacrificar la inversin en desarrollo que ya se tiene? La solucin que adoptaron fue generar un COBOL que cumple con CLS; una especie de COBOL.NET. Este antecedente muestra que las posibilidades son inmensas y la oportunidad de implementar nuevos lenguajes nunca haba sido tan atractiva. Lo ideal para mucha gente sera disponer de poderosos lenguajes de programacin en su lengua nativa, por ejemplo, en espaol. Alguien se anima?
Adems de proponer una arquitectura que facilita la creacin de lenguajes, la CLS proporciona interoperabilidad entre los mismos. En virtud de que todos los lenguajes .NET cumplen con una misma especificacin, en una solucin o aplicacin pueden coexistir programas desarrollados en diferentes lenguajes sin crear problemas de compatibilidad entre ellos.
Lenguajes .NET
La definicin de lenguaje .NET es simple: todo aquel lenguaje de programacin y sus herramientas de anlisis y compilacin que cumplan con la CLS.
11
Los lenguajes .NET requieren someterse a un proceso de compilacin, y el resultado de la compilacin debe ser un programa intermedio, que llamamos ensamblado (assembly); los ensamblados pueden ejecutarse slo en colaboracin con el motor de ejecucin de .NET (CLR). A todo programa que se ejecuta en colaboracin con el Motor comn de ejecucin (CLR) se le da el calificativo de administrado (managed), por lo cual, a los lenguajes de .NET tambin se les conoce como lenguajes administrados (managed languages). En esencia, son administrados aquellos elementos ejecutados por el motor comn de ejecucin (en lugar de ser ejecutados directamente por el sistema operativo). Al ser administrados, los elementos disponen de servicios propios del motor comn de ejecucin como la recoleccin de basura (garbage collection), verificacin de tipos en tiempo de ejecucin (runtime type checking), administracin de la memoria (memory management) y soporte de seguridad (security support), entre otros.
.NET Framework
Capa de servicios
La capa de servicios se encarga de proporcionar los medios de comunicacin de datos entre lenguajes y herramientas de desarrollo, y los elementos internos de .NET que se encargan de transformar los desarrollos en aprovechamiento de recursos a travs de lenguaje mquina, es decir, el .NET Framework. La capa de servicios est integrada por dos tipos fundamentales: ASP.NET Application Services y Windows Application Services. Estos servicios son en realidad modelos de programacin que permiten la intercomunicacin entre la interfaz y el ncleo de la plataforma .NET. Cualquier lenguaje es til para programar y darse a entender para cualquiera de los servicios; la diferencia estriba en que ASP.NET Application Services est dirigido a los desarrollos en ambiente Web (Internet, Intranet y Computacin mvil), mientras que Windows Application Services est dirigido a los desarrollos en ambiente Windows (aplicaciones de escritorio y Cliente/Servidor).
12
dad determinada.
Otra definicin clsica indica que un objeto es una instancia de una clase. Una clase es la definicin formal de un objeto; es como una plantilla que especifica
los datos que un objeto puede manejar para identificarse, definirse y producir resultados; la clase tambin especifica los procesos que es capaz de realizar un objeto (comportamiento) y los resultados que proporciona. Al proceso de derivar un objeto a partir de una clase se conoce como instanciacin. Los objetos tienen propiedades, mtodos y eventos. Los mtodos son las acciones predefinidas que es posible llevar a cabo a travs de un objeto. Para utilizar un mtodo es necesario instanciar un objeto generarlo a partir de una clase; un mtodo siempre es referido a travs de un objeto. Existen clases, interfaces y tipos de valor que cumplen con CLS y permiten el acceso a la funcionalidad de BCL sin necesidad de ser instanciados previamente; para diferenciarlos de los que s requieren instanciacin, se conocen como types.
Con esto en mente, es fcil concluir que los programas desarrollados en .NET tienen como finalidad poner a trabajar, por medio de las estructuras del lenguaje, a los types y a los objetos generados a partir de clases. La biblioteca de clases base de .NET Framework integra una gran cantidad de clases, y cada una de ellas ofrece una determinada funcionalidad que puede ser integrada a las aplicaciones: algunas permiten crear objetos que desarrollan clculos matemticos o trigonomtricos, otras permiten definir objetos que permiten la realizacin de grficos, otras ms permiten crear objetos a travs de los cuales es posible manipular bases de datos, etctera. Es muy difcil manejar y clasificar una cantidad tal de clases. Generalmente, las clases se almacenan en libreras de vnculos dinmicos (DLL) que agrupan clases afines. La BCL se compone de ms de 150 archivos DLL, en los cuales se encuentran diseminadas las clases que componen la biblioteca de clases base. Espacios de nombres (Namespaces). Tratar de encontrar libreras por nombre de archivo fsico es bastante problemtico. Las clases, como son tantas, se han categorizado y
13
agrupado de manera lgica y jerrquica de acuerdo con su funcionalidad. A dichos grupos de clases se les conoce como Espacios de nombres (Namespaces).
NOTA La forma ms fcil de explorar la jerarqua de clases de .NET Framework es mediante la ayuda electrnica del producto. Tambin est disponible una versin impresa, a travs de Microsoft Press, a un precio no muy accesible para todos. Recomendamos el uso de los medios electrnicos, ya que ahorran rboles, son ms rpidos y van incluidos en el precio del producto.
Un programa puede contener objetos y emplear types; tanto los objetos como los types derivan de clases que indistintamente estn contenidas en libreras (DLL) de .NET, o bien en clases desarrolladas por el usuario. Las clases que dan origen a los objetos y types utilizadas en un programa en .NET no necesariamente estn contenidas en los mismos archivos de libreras, pero al momento de programar eso es irrelevante para el desarrollador. Disponibilidad de las clases: referencia y declaracin de libreras. Para poder hacer uso de una clase, es necesario especificar previamente en qu librera debe buscarse. Esto implica referir el recurso fsico y referir el recurso lgico. En otras palabras, hay que definir qu librera se requiere (referencia fsica) y qu espacio de nombre la refiere (referencia lgica). Para la referencia fsica es necesario que, al compilar, se establezca la referencia a la librera (DLL) requerida. Para la referencia lgica, dependiendo del lenguaje en el que se est codificando, se emplean instrucciones declarativas de espacios de nombre, tales como import, using, include, etctera, para que el programa pueda navegar sin problemas en la jerarqua de clases contenidas en la librera. La instruccin a utilizar vara en funcin al lenguaje que se est utilizando. Instanciacin de objetos. Una vez declaradas las libreras se dispone de las clases contenidas en ellas. A partir de las clases, es posible generar objetos (instanciar), y una vez que se cuenta con los objetos, es posible hacer uso de sus mtodos para realizar alguna tarea determinada. Cdigo type safe. Cuando los mtodos de los objetos y los types utilizados por el programa son reconocidos por la plataforma .NET (como consecuencia de que todas las libreras estn correctamente referidas) se dice que el programa es type safe. Un programa no es type safe cuando en l se utilizan clases contenidas en la biblioteca de clases de .NET Framework, pero no se ha referido la librera especfica en la cual se debe buscar la clase, o bien, cuando no se han declarado los espacios de nombres que faciliten la ubicacin de la clase buscada dentro de la jerarqua.
14
Jerarquas de clases superiores. Existen dos grandes espacios de nombres, System y Microsoft, que a su vez tienen subdivisiones tales que las clases se organizan de manera jerrquica con base en su funcionalidad. En virtud de que casi todas las clases de .NET Framework pertenecen de una u otra forma a cualquiera de estas dos jerarquas, se les llama jerarquas de clases superiores. La organizacin de clases a travs de espacios de nombres es lgica; .NET Framework se encarga de saber en todo momento qu librera o componente fsico est asociado con un determinado espacio de nombres. Realmente, especificar el espacio de nombres System implica tener acceso a una librera que fsicamente se llama Mscorlib.dll, y que se encuentra en algn lugar de su equipo. Como puede ver, es ms sencillo hacer referencia a la librera a travs del espacio de nombres que mediante una ruta de archivo fsico. Con los anteriores elementos es posible definir a la biblioteca de clases de .NET Framework como una coleccin de clases incluidas en el ambiente de desarrollo .NET, disponibles para todos los lenguajes .NET y organizadas en espacios de nombres que permiten realizar tareas diversas a travs del uso de objetos y types. .NET Framework proporciona un sinfn de recursos para desarrollar aplicaciones; basta con encontrar dnde estn esos recursos. Al desarrollar en .NET es indispensable saber qu mtodos y types utilizar, en qu clase se encuentran y qu espacios de nombres permiten disponer de dichas clases. Si la funcionalidad requerida no est en ninguna de las clases de BCL, entonces ser necesario desarrollar las propias.
15
Adems, todos los lenguajes tienen el soporte de un mismo entorno integrado de desarrollo, llamado Visual Studio, con el cual es posible codificar al mismo tiempo mltiples proyectos en varios lenguajes. Realizar esto antes de .NET era impensable. El desarrollador deba aprender las palabras reservadas de cada uno de los lenguajes que aprendiera. Cada lenguaje posea su propia biblioteca de clases (Class Foundation), sus propias jerarquas y su propia sintaxis de invocacin. La experiencia que se ganaba con un lenguaje no serva de mucho al intentar desarrollar en otro; adems, cada lenguaje tena su propia herramienta de desarrollo: el programador consuma todo su tiempo en aprender a usar las herramientas de desarrollo y las diferencias en los lenguajes, y le quedaba muy poco tiempo para ocuparse de los problemas reales de programacin, como entender la lgica de negocios. La plataforma .NET reduce la curva de aprendizaje y favorece el desempeo de los equipos de desarrollo, ya que la especializacin puede darse ahora en la solucin de los proble-
16
mas especficos mismos, y no en las herramientas de desarrollo para resolverlos; con ello se aumenta la rentabilidad de los programadores y el retorno de la inversin en programas y capacitacin.
Clases y objetos
NOTA Los tiempos en los que se compilan y ejecutan los programas en .NET constituyen el rasgo ms caracterstico de la nueva plataforma, pues representan una enorme diferencia con respecto a las versiones anteriores del producto, por lo cual se analizan con mayor detalle ms adelante.
A partir de los anterior, podemos definir al CLR como el motor de ejecucin de cdigo administrado que provee una infraestructura de compilacin y ejecucin que abstrae y coloca en un plano subyacente las diferencias de plataformas de hardware en donde un programa es ejecutado. La definicin anterior es compleja; el concepto mismo del CLR lo es. De manera simplificada podemos decir que el CLR se encarga de administrar la compilacin y ejecucin de
17
los programas en .NET, con el fin de que puedan aprovechar la biblioteca de clases y los servicios de .NET Framework.
NOTA No se sienta mal si tarda un poco en entender cmo trabaja el CLR: Piense que es el ncleo de la nueva plataforma de desarrollo de Microsoft y que dicha compaa tard aos en disearlo.
18
cin relativa al programa y su entorno como tipos de datos, versin del programa, referencias externas a libreras, etctera. La diferencia entre un ejecutable .NET y uno que no lo es radica en la existencia del metadatos. Cuando un ejecutable se compila para plataforma .NET, y por tanto posee metadatos, se considera un programa con cdigo administrado (managed code). Cdigo administrado/managed code. Es importante mencionar que si su computadora no tiene instalado el .NET Framework no podr llamar a ejecucin a los ejecutables de .NET, pues en tal caso no tienen instalado el CLR, y ste es indispensable para acceder a metadatos. Puede decirse que existe un contrato de cooperacin entre el ejecutable y el CLR. El calificativo administrado (managed) puede aplicarse a todo lo que se ejecuta bajo un contrato de cooperacin con el CLR, y que sin ste, no funciona. Diversos nombres de los ensamblados. Los ejecutables que se obtienen despus de compilar el cdigo fuente son conocidos de varias formas: el cdigo administrado tambin se conoce como ensamblado (assembly), MSIL (Microsoft Intermediate Language), IL (Intermediate Language) o cdigo ntermedio. El cdigo intermedio es aquel que no es cdigo nativo an, ya que slo ha sido sometido a la fase de anlisis del proceso de compilacin. El cdigo intermedio es independiente de la plataforma en la que se ejecute y del lenguaje en el cual fue escrito el cdigo fuente que le dio origen; eso garantiza la portabilidad de las aplicaciones, hacindolas universales y multiplataforma. El trmino que ms se est utilizando es el de ensamblado. Por definicin, un ensamblado es una coleccin de funcionalidad, control de versiones e implementacin que acta como la unidad bsica de ejecucin para el .NET Framework. FIGURA 1.3 Tiempos de compilacin en .NET
19
Manifiesto. Por poseer metadatos, los ensamblados siempre son autodescriptivos. Cada ensamblado posee un manifiesto (assembly manifest), que es donde se almacenan los metadatos. El manifiesto es parte integral del ensamblado mismo, y en l se almacena la siguiente informacin:
Identidad del ensamblado (Public Key Token). Referencia de los archivos que el ensamblado requiere para ser implementado. Types y otros recursos utilizados por el ensamblado. Dependencias con otros ensamblados. Permisos requeridos para ejecutar el ensamblado.
Gracias a la existencia de los manifiestos se hace innecesario guardar informacin en el registro de Windows, pues todo lo que se necesita saber se encuentra en el manifiesto del ensamblado. Copy deployment. Todo lo que necesita un ejecutable para trabajar se encuentra declarado en el ensamblado; es por ello que un programa ejecutable en .NET trabajar con solo ser copiado a otro equipo .NET. No hay que hacer instalaciones complejas o instalar componentes; slo se copia el ensamblado. A esto se le ha dado el nombre de implementacin por copia (Copy Deployment). Esto, por supuesto, si el equipo donde se copia posee la plataforma .NET, y en consecuencia, el CLR.
20
En el GAC se encuentran las referencias lgicas de los componentes que, junto con la referencia fsica que especificamos al momento de compilar, evita la utilizacin accidental de un recurso. Puede haber dos componentes compartidos del mismo nombre fsico, pero un programa sabr siempre cul es el que debe utilizar. Administrador de GAC. Existe una herramienta de .NET Framework, llamada gacutil. exe, que permite administrar el registro de componentes compartidos en el GAC. Dependiendo de lo que se quiera hacer, gacutil.exe permite listar los componentes registrados en GAC, registrar un nuevo componente compartido o eliminar uno previamente registrado.
Ejercicio 1.1
Anlisis de las entradas del Cach global para ensamblado (GAC, Global Assembly Cache)
Se utilizar el administrador de GAC para conocer cules son los componentes .NET disponibles. Esta prctica asume que se tiene instalado .NET Framework 2.0 SDK, English version. 1. Abra el Panel de control y seleccione Herramientas administrativas .NET Framework 2.0 Configuration. Se despliega la herramienta de configuracin de .NET Framework 2.0. 2. En el panel de la izquierda haga clic en el nodo My Computer; en el panel de la derecha aparecer el vnculo Manage the Assembly Cache (Global Assembly Cache).
21
3. Haga clic en el vnculo View List of Assemblies in the Assembly Cache. 4. Existe una columna llamada Locale, y no todos los ensamblados tienen el mismo valor en dicha columna, qu cree que signifique eso?
5. Existe una columna llamada Public Key Token, que contiene una clave GUID (Identificador global nico, Global Unique Identifier), para qu cree que sirva dicha clave?
22
Lo que s se modifica es el cargador de programas (program loader); es decir, la parte del sistema operativo que se encarga de reconocer a un programa ejecutable y de ejecutar las acciones. Archivo PE. Un ejecutable de Windows (Windows executable), sea EXE o DLL, debe poseer un formato llamado PE Format (Portable Executable Format), que es un derivado del Microsoft Common Object File Format (COFF). A los programas ejecutables, por cumplir con la especificacin PE, se les ha dado a llamar tambin Archivos PE. Tanto PE como COFF estn claramente especificados y disponibles pblicamente, de tal forma que todos los desarrolladores cuyas aplicaciones generen ejecutables puedan utilizarlos para incluir en ellas los elementos que permitirn a los programas generados ser reconocidos como tales. Cualquier compilador o aplicacin que desee generar ejecutables de Windows debe cumplir con la especificacin PE/COFF. Un programa ejecutable contiene dos secciones: la seccin de encabezados PE/COFF (PE/COFF Headers) y la seccin de imagen nativa del programa (Native Image Section). La seccin de encabezados PE/COFF indica al sistema operativo cmo est compuesto el programa y cmo debe ser ejecutado; la seccin de imagen nativa se encarga de contener al programa en s, as como los recursos que lo componen, usando para ello subsecciones bastante conocidas para los que han desarrollado compiladores, como lo son .data, .rdata, .rsrc, y .text. Archivo .NET PE. Un archivo PE de .NET es ms complejo pues contiene dos secciones ms: la seccin de encabezados CLR (CLR Header Section) y la seccin de datos CLR (CLR Data Section). El encabezado CLR almacena informacin que identifica al programa como ejecutable de .NET para que como tal sea tratado por el cargador de programas. Por otro lado, la seccin de datos CLR contiene metadatos y el cdigo intermedio, lo que determina la forma en que el programa ser ejecutado. Como puede ver, las secciones del archivo PE permanecen. Si usted no tiene instalado .NET Framework, el cargador de programas de Windows encontrar secciones no reconocidas (encabezado CLR y datos CLR), y no sabr qu hacer con ellas. Como no fueron reconocidas dichas secciones y el cdigo ejecutable de .NET no es cdigo nativo, el programa generar un error. Slo teniendo .NET Framework instalado ser posible reconocer las nuevas secciones del ejecutable, que ordenarn la compilacin JIT de la informacin contenida en datos CLR.
23
Desensamblador de ensamblados. .NET Framework posee una herramienta de lnea de comando para desensamblar los archivos ejecutables, llamada ildasm.exe. Con ella es posible comprobar si un programa es o no .NET, mediante la ejecucin del siguiente comando:
ildasm/TEXT
NombreEjecutable/HEADER
Donde NombreEjecutable es el nombre del ejecutable a analizar. La especificacin /TEXT provoca que la salida sea a consola, y /HEADER provoca que aparezcan en el resultado todos los encabezados del ejecutable. Slo si las definiciones muestran que el programa posee encabezados CLR, el programa es .NET.
Ejercicio 1.2
Identificacin de diferencias en programas ejecutables, usando el desensamblador de .NET (ildasm.exe)
Desensamblar dos ejecutables para determinar cul de los dos es un ejecutable .NET. 1. Abra el directorio APVBNETVS\Cap01; se ser su directorio de trabajo. 2. En ese directorio hay dos programas: HolaMundoA.exe y HolaMundoB.exe. Los dos hacen lo mismo, pero slo uno de ellos es un .NET PE. 3. Ejecute el desensamblador de .NET Framework (ILDASM.EXE), que se encuentra en el directorio base de .NET (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727). 4. Seleccione Inicio Todos los programas Microsoft .NET Framework SDK v2.0 SDK Command Prompt.
24
6. Es muy evidente cul de los dos archivos no contiene un ejecutable .NET, dado que no puede ser desensamblado. 7. Edite el archivo b.txt y busque la seccin Metadata Version. Qu ensambles externos se mandan llamar desde este programa?
Compiladores JIT
CLR en tiempo de ejecucin. El ejecutable generado por los compiladores de .NET no est en cdigo nativo, y, por tanto, su ejecucin no implica que el equipo en el que es ejecutado realice alguna accin. Al correr un ejecutable en un equipo con .NET Framework, el cargador de programas del sistema operativo busca en el programa el encabezado CLR y los datos CLR; si estas secciones existen quiere decir que se trata de un ensamblado (.NET PE), y procede a darle un tratamiento considerado consecuente. De no ser as, procede a ejecutar el programa considerndolo como archivo PE de Windows. Si se trata de un .NET PE, el CLR identifica si ya ha sido ejecutado previamente en dicho equipo. En caso de que sea la primera vez que se ejecuta en el equipo, el CLR detecta que el ensamblado no es cdigo nativo, y procede a generar cdigo nativo a travs de compiladores que actan en tiempo de ejecucin, a los cuales se les llama compiladores Justo a tiempo (compilador JIT / Just In Time Compiler). Slo para aclarar el punto: los compiladores JIT trabajan sobre ensamblados, no sobre cdigo fuente.
25
El compilador JIT evala el ensamblado, la disponibilidad de los types utilizados por el ensamblado y los recursos disponibles del sistema en que se est ejecutando el ensamblado. A partir de ese anlisis, genera el cdigo nativo aplicable al equipo y procede a ejecutarlo. Los compiladores JIT son los que realizan la fase de sntesis de la compilacin, transformando el cdigo intermedio que se encuentra en la seccin de datos CLR en su equivalente a cdigo nativo de la mquina, considerando la plataforma de la misma y la disponibilidad de recursos. NOTA
El hecho de que se realice la compilacin JIT la primera vez que se ejecuta un programa ejecutable en .NET, hace que el proceso sea ms lento. Algunos programadores se decepcionan con .NET, pues argumentan que es ms lento que las plataformas de desarrollo anteriores; quiz sea ms lento la primera vez, pero la segunda vez que lo ejecute, el CLR detecta que ya existe cdigo nativo creado, por lo que no procede a la compilacin JIT, y por tanto se puede ver la velocidad real a la que el programa se ejecutar.
Gracias al CLR los programas ejecutables de .NET son altamente portables. Quien determina la diferencia del cdigo nativo que ha de ejecutarse en una determinada plataforma es el CLR y no el ejecutable. Si un mismo ensamblado es ejecutado en dos equipos distintos, uno con mucha memoria y varios procesadores, y otro con poca memoria y un solo procesador, el CLR a travs del compilador JIT generar el cdigo nativo apropiado para tomar ventaja de todos los recursos disponibles. Vea las posibilidades: se puede tener una versin de .NET Framework en un equipo basado en UNIX, otro en Linux y una versin compacta de .NET Framework en un telfono celular o en un PDA como la Palm Pilot. El mismo ensamblado puede ser ejecutado en todas las plataformas, y es el CLR a travs del compilador JIT el que genera el cdigo nativo y la funcionalidad disponible para cada una de las plataformas mencionadas. Poco importa tambin en qu lenguaje estaba desarrollado el cdigo fuente que dio origen al ejecutable: despus de compilarlo, todo es IL.
NOTA
Resulta adecuado el nombre que se le da al ejecutable que generan los compiladores de .NET, cdigo intermedio (IL), ya que lo generado es un cdigo entre el cdigo fuente y el cdigo nativo. Los programadores de Java encontrarn la semejanza rpidamente: el IL sera como el Bytecode, mientras que el CLR sera como el Java Virtual Machine. Slo un lenguaje de .NET permite (por el momento) la compilacin directa a casi cdigo nativo: C++.
26
No tener instalado el .NET Framework en una mquina tambin afecta al momento de ejecucin, ya que el equipo no sabr cmo interpretar el ejecutable, adems de no ser posible transformar el IL en cdigo nativo, por la ausencia de CLR. En ese contexto y dicho de otra forma, su programa nunca podra producir a partir del ensamblado la secuencia de nmeros binarios que provoquen una respuesta en su computadora. NOTA
En octubre de 2000, Microsoft propuso a la ECMA (Asociacin Europea de Fabricantes de Computadoras, European Computer Manufacturers Association), encargada de la estandarizacin de sistemas de informacin y comunicacin, un subconjunto funcional del CLR, denominado CLI (Infraestructura de lenguaje comn, Common Language Infraestructure) para que fuera aprobado como estndar de desarrollo junto con el lenguaje C#. En diciembre de 2001 se ratific por ECMA (ECMA-335), por lo cual cualquier plataforma de sistema operativo que as lo desee podr disponer de su propio subconjunto de CLR, haciendo posible que las aplicaciones desarrolladas en .NET puedan ser ejecutadas en dichas plataformas sin modificar el cdigo.
Microsoft ha puesto a disposicin de todos un producto base denominado .NET Framework Redistributable Package en su sitio Web corporativo. Al instalarlo en su equipo ya es posible ejecutar aplicaciones desarrolladas en plataforma .NET. Tambin lo est incluyendo en los Service Pack de sus sistemas operativos, y seguramente todos los sistemas operativos con versiones OEM lo incluirn. FIGURA 1.5 Proceso de ejecucin .NET
Inicio
Se encontr imagen?
Si
No
Es imagen vigente?
Fin
27
Ensamblador de .NET. Existen tambin herramientas de .NET Framework que permiten realizar la fase de sntesis de la compilacin, adems del compilador JIT. El programa ilasm.exe es el ensamblador de .NET Framework; su funcin consiste en transformar un programa en cdigo intermedio (MSIL) en archivo .NET PE. Para aquellos que deseen desarrollar un lenguaje .NET, esta herramienta es muy importante. Slo tendrn que preocuparse por generar un compilador que traduzca el cdigo fuente a MSIL; es decir, que se encargue de realizar la fase de anlisis. La fase de sntesis podr ser desarrollada por el ensamblador de .NET. Tambin es posible desensamblar un archivo .NET PE, a travs de la herramienta de .NET Framework llamada ildasm.exe. Tanto ilasm.exe como ildasm.exe estn disponibles desde la lnea de comandos del sistema operativo.
28
.NET sigue teniendo entradas en el Registro de Windows, ya que es el mecanismo optimizado que los sistemas operativos Windows entienden mejor; sin embargo, los desarrollos en .NET que usted realice no estarn basados en componentes, sino en ensamblados. De esa forma, el ncleo de .NET puede mantener manejo binario y registrado en los equipos locales a travs de componentes, mientras que las aplicaciones que usted desarrolle en .NET ya no sern basadas en componentes, y se comunicarn a travs de protocolos abiertos; en cierta forma, se aprovecha lo mejor de la tecnologa disponible. A medida que los sistemas operativos comiencen a reconocer elementos .NET, la tecnologa basada en componentes desaparecer, aunque eso puede llevar tiempo.
ya que los ensamblados, en coordinacin con el CLR, se encargan del manejo inteligente de los componentes de una aplicacin. La capa de presentacin y la de reglas de negocio que propone DNA pueden modificarse drsticamente, ya que el procesamiento y la interfaz de usuario pueden dividirse la carga de trabajo entre servidor y cliente de manera flexible. Se podrn generar programas portables (IL) que facilitarn el desarrollo de aplicaciones empresariales distribuidas en diversas plataformas de sistema operativo con slo instalar el CLI en ellas. El desarrollo de aplicaciones nunca haba sido tan diverso: se pueden desarrollar aplicaciones de escritorio y Cliente/Servidor a travs de formularios de Windows (Windows Forms). Tambin es posible desarrollar aplicaciones de consola (Console Applications), y
29
aplicaciones Web (Web Forms) que tendrn una interfaz ms rica y funcional, adems de ser ms fciles de elaborar para el desarrollador porque tendrn una lgica ms depurada. Podrn desarrollarse servicios para los nuevos sistemas operativos de Windows, incluyendo las versiones de 64 bits, con lo que se puede fortalecer la plataforma BackEnd. Con la introduccin de los Servicios Web XML (XML Web Services), ya no se vender software, sino que se vender el servicio que el software preste, mediante un esquema de suscripciones. Disponer de la funcionalidad de un programa ser tan fcil como enlazarnos a una liga en Internet; no se requerirn inversiones fuertes por compra de software, sino el pago bajo y peridico por el acceso a un servicio. La piratera se reducir, como efecto secundario. Los equipos de desarrolladores que estaban divididos por su especialidad en determinadas herramientas de desarrollo podrn colaborar de manera coordinada. Los programadores de C++, C#, Visual Basic y Java podrn contribuir con partes de una misma solucin, con la certeza de que el trabajo que realicen coexistir con el trabajo del otro sin incompatibilidades. Cada programador aprovecha la experiencia que ya tiene, y escoge de .NET el lenguaje que ms le favorezca. .NET coexiste con aplicaciones pasadas. Toda la inversin realizada en desarrollo de aplicaciones basadas en COM sigue siendo til; se puede convertir un componente COM en uno .NET, y viceversa. Se desarrollar computacin mvil como nunca antes, como consecuencia de las facilidades proporcionadas por el CLR, que gestionar por nosotros las caractersticas de cada dispositivo.
En el captulo siguiente podr instalar todo lo que necesita para desarrollar en plataforma .NET, y comprobar a travs de aplicaciones de consola gran parte de lo que se explica en este captulo. NOTA
Si conoce la estructura de un lenguaje .NET y el uso de las clases de .NET Framework, ya puede desarrollar aplicaciones. Visual Studio no es necesario para desarrollar. Por supuesto, ayuda enormemente, pero en caso de que no disponga de dicho software, puede editar el cdigo en cualquier editor de textos, como el Bloc de Notas (NotePad.exe), compilar su programa y ejecutarlo.
30
El exportador de libreras (Type Library Exporter) est representado por el programa tlbexp.exe, que se encarga de generar, a partir de un ensamblado, una librera con la cual los componentes COM puedan interactuar. El importador de libreras (Type Library Importer) es la contraparte, ya que a partir de un componente COM, se genera un componente con el cual .NET pueda interactuar. Est representado por el programa tlbimp.exe.
31
MAPA
32
TERMINOLOGA
Administracin de la memoria, 11 Administrado, 8, 11, 18 Administrador de GAC, 20 Application Programming Interface, 15 Archivo(s) .NET PE, 22 PE, 22 ASP.NET Application Services, 7, 11 Assembly, 7, 11, 17 manifest, 19 Base Class Library (BCL), 7, 12 BCL, 7, 12 Biblioteca de clases base (BCL), 7, 12 C#, 9 Cach global para ensamblado, 19 Capa de lenguajes, 7 de servicios, 7, 11 de soporte operativo, 8 Cargador de programas, 22 Clase, 12 CLR, 7, 16 Data Section, 22 Header Section, 22 CLS, 7, 9 Cdigo, 17 administrado, 18 fuente, 17 COFF, 22 Common Language Runtime, 7, 16 Specification (CLS), 7, 9 Compilacin, 17 en dos fases, 16 Compilador(es), 17 JIT, 7, 24 Copy Development, 6, 19 Desensamblador de ensamblados, 23 DLL, 12 DNA, Windows, 28 Ejecutable, 17 de Windows, 22 Ensamblado, 7, 11, 17 Espacios de nombres, 12-3 Especificacin comn para lenguajes, 7, 9 Eventos, 12 Exportador de libreras, 30 GAC, 19 gacutil.exe, 20 Garbage collection, 11 Global Assembly Cache, 19 IIS, 7 IL, 18 ilasm.exe, 27 ildasm.exe, 23, 27 Implementacin por copia, 19 Importador de libreras, 30 Instanciacin (de objetos), 12, 13 Instrucciones declarativas de espacios de nombre, 13 Interfaces, 12 Intermediate Language, 18 Intermedio, 18 Internet Information Server (IIS), 7 Jerarquas de clases superiores, 14 JIT, compiladores, 7, 24 Just in Time Compilers, 7, 24 Lenguaje(s) administrados, 11 .NET, 10 Libreras de vnculos dinmicos (DLL), 12 Managed, 8, 11, 18 code, 18 languages, 11 Manifiesto, 19 Memory management, 11 Metadatos, 17 Mtodos, 12 Microsoft Common Object File Format (COFF), 22 Intermediate Language (MSIL), 18 Motor comn de ejecucin (CLR), 7, 16 MSIL, 18 Multilenguaje, ambiente, 9 Namespaces, 12-3 Native Image Section, 22 .NET lenguaje, 10 proceso de ejecucin, 26 .NET Framework, 7 Redistributable Package, 26 .NET PE (Portable Executable), 21 archivo, 22 Objeto, 12 PE /COFF Headers, 22 archivos, 22 format, 22 Plataforma .NET, 5 Portable Executable Format, 22 Proceso de ejecucin .NET, 26 Program loader, 22 Propiedades, 12 Public Key Token, 19 Recoleccin de basura, 11
33
Referencia fsica, 13 lgica, 13 y declaracin de libreras, 13 Runtime type checking, 11 Seccin de datos CLR, 22 de encabezados CLR, 22
PE/COFF, 22 de imagen nativa del programa, 22 Security support, 11 Servicios Web XML, 29 Soporte de seguridad, 11 Source code, 17 Tiempo
de compilacin, 16 de ejecucin, 16 Tipos de valor, 12 tlbexp.exe, 30 tlbimp.exe, 30 Type Library Exporter, 30 Importer, 30 Types, 12, 19 safe code, 13
vbc.exe, 17 Verificacin de tipos en tiempo de ejecucin, 11 Windows Application Services, 7, 11 DNA, 28 executable, 22 XML Web Service, 29
PREGUNTAS
1.1 Cules son las capas principales de la plataforma .NET y qu funcin cumple cada una? 1.2 Cmo es el proceso de compilacin de las aplicaciones desarrolladas en .NET y cules son los momentos en los que se desarrolla? 1.3 Cules son las diferencias entre los ejecutables de .NET y los ejecutables Windows comunes? 1.4 Cules son las ventajas que aporta .NET a los ambientes de desarrollo? 1.5 De qu forma se da la convivencia de .NET con los antiguos esquemas basados en COM?
34
EXAMEN
CAPTULO
35
36
Contenido
Determinacin de la plataforma .NET requerida . . . . . . . . . . . . . . . . . . . . . . Propsito de usar .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de aplicaciones posibles en .NET . . . . . . . . . . . . . . . . . . . . . . . . . Interaccin con bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alcance operativo de la plataforma . . . . . . . . . . . . . . . . . . . . . . . . . . . Tecnologa de bus y procesador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Productos de plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .NET Framework 2.0 Redistributable Package . . . . . . . . . . . . . . . . . . . . .NET Framework 2.0 SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .NET Compact Framework 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visual Studio 2005 Express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Seleccin del producto adecuado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Consideraciones respecto del idioma de los productos . . . . . . . . . . . . . Comprobacin del funcionamiento de la plataforma .NET . . . . . . . . . Determinacin de los productos .NET a instalar en un escenario de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Desarrollo de aplicaciones en .NET usando SDK . . . . . . . . . . . . . . . . . . . . . . Compilacin de programas desde lnea de comandos . . . . . . . . . . . . . Aplicaciones de consola (Console Applications) . . . . . . . . . . . . . . . . . . Aplicaciones Windows (Windows Applications) . . . . . . . . . . . . . . . . . . Aplicaciones Web (Web Applications) . . . . . . . . . . . . . . . . . . . . . . . . . . Desarrollo y compilacin de un programa desde la lnea de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tecnologas cubiertas en este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 37 37 38 38 39 39 40 41 42 44 45 45 46 46 47 49 49 49 50 50 51 53 55 56 56 58
37
El captulo anterior incluy una gran cantidad de trminos nuevos relacionados con el nuevo entorno de desarrollo .NET; ste trata de comprobar si todo aquello es cierto. Para pasar de las palabras a los hechos, usted comprobar la forma en que funciona la plataforma de desarrollo .NET a travs de programas sencillos escritos en Visual Basic.NET. Este captulo es particularmente importante para quienes tienen bajo su responsabilidad decidir la migracin a .NET de entornos de desarrollo anteriores, pues se aclaran cules son los nuevos productos que .NET coloca en el mercado, sus requerimientos de hardware y software, as como lo que es necesario hacer para ejecutar aplicaciones desarrolladas en esta plataforma. Veremos que .NET es una multiplataforma de desarrollo, ya que proporciona herramientas de desarrollo para crear varios tipos de aplicaciones en distintos lenguajes y para diferentes tipos de dispositivos.
38
1. Aplicaciones de consola ( Console Applications). Son aquellas aplicaciones textuales que reciben y muestran datos en el intrprete de comandos. 2. Aplicaciones Windows (Windows Applications/Windows Forms). Son las aplicaciones que tienen interfaz grfica basada en Windows. 3. Aplicaciones Web ( Web Applications/Web Forms / XML Web Services). Son aquellas que utilizan para su ejecucin un navegador Web como Internet Explorer. La interfaz Web puede tener interaccin con el usuario en un modelo peticin-respuesta, basado en Cliente/Servidor. 4. Servicios Web XML (XML Web Services). Son mdulos de funcionalidad distribuida de aplicacin a aplicacin que utilizan como transporte protocolos estndares de Internet, como HTTP y SOAP. 5. Aplicaciones de cmputo mvil ( Mobile Applications). Son aplicaciones que se ejecutarn en dispositivos de cmputo mvil, como los PDA (Personal Data Assistant) y otros dispositivos inteligentes (smart devices). Funcionan en coordinacin con .NET Compact Framework, y son codificados mediante lenguajes de marcacin.
39
2. Servidor. Es cuando la plataforma .NET se utilizar para aplicaciones compartidas o distribuidas, generalmente aplicaciones Windows y Web, con manejo de base de datos basadas en servidor, como SQL Server y Oracle, de orientacin multiusuario.
40
ii. Visual C# 2005 Express Edition iii. Visual C++ Express Edition iv. Visual J# 2005 Express Edition Cada uno de ellos tiene distintos requerimientos, capacidades y, desde luego, costos.
41
tion Services (IIS) version 5.0 o posterior. Para proporcionar las capacidades de ASP.NET se sugiere IIS con los ltimos parches de seguridad, antes de instalar .NET Framework. ASP.NET slo es aceptado por las siguientes plataformas: Microsoft Windows 2000 Professional (Service Pack 3 o superior recomendado), Microsoft Windows 2000 Server (Service Pack 3 o superior recomendado), Microsoft Windows XP Professional y Microsoft Windows Server 2003. En su versin para 64 bits, se deber descargar el archivo NetFx64.exe e instalar en Windows Server 2003, Datacenter x64 Edition; Windows Server 2003, Enterprise x64 Edition; Windows Server 2003, Standard x64 Edition; o Windows XP 64-bit. A medida que las versiones se actualicen, seguramente los requerimientos sern mayores.
42
sarrollo con SDK es mucho mayor que utilizando herramientas grficas de desarrollo. Opte por SDK slo si no quiere gastar y dispone de mucho tiempo. Requerimientos. Para disponer de la versin 2.0 de .NET Framework SDK, en su versin para 32 bits, deber descargar de la Web el archivo setup.exe (354 MB). Lo podr instalar en Windows 2000 con Service Pack 3 o posterior, Windows Server 2003 y Windows XP con Service Pack 2 o posterior. En su versin para 64 bits, se deber descargar el archivo setup.exe (337.8 MB) e instalar en Windows Server 2003, Datacenter x64 Edition; Windows Server 2003, Enterprise x64 Edition; Windows Server 2003, Standard x64 Edition y Windows XP 64-bit. Aunque el archivo a descargar tiene el mismo nombre, debe descargarse la versin adecuada a la plataforma operativa. Es necesaria la instalacin de .NET Framework 2.0 Redistributable Package, para poder instalar .NET Framework 2.0 SDK. NOTA
Por el momento .NET Framework SDK es gratuito y probablemente siga as. La razn es muy sencilla: por sus caractersticas particulares, la competencia directa de la plataforma .NET es Java. Para desarrollar en Java, desde hace mucho tiempo usted puede descargar el JDK (Java Development Kit) de forma gratuita; por tanto, ponerle precio a .NET Framework SDK sera darle ventaja a la competencia, por el momento Microsoft no puede darse ese lujo.
43
Entorno Integrado de Desarrollo .NET. IDE / Integrated Development Environment. Es el producto de plataforma .NET que permite desarrollar en un ambiente grfico e integrado totalmente a .NET Framework; Visual Studio 2005 es la herramienta de desarrollo asistido ms sofisticada de la historia: incluye editores con ayuda contextual, diseadores grficos de aplicaciones, asistentes de desarrollo, generadores de cdigo, etctera. Visual Studio 2005 instala automticamente .NET Framework 2.0 Redistributable Package y .NET Fremework 2.0 SDK, por lo que no es necesario instalarlas previamente. En Visual Studio 2005 puede desarrollarse de manera visual cualquier tipo de aplicacin admitida por .NET, incluyendo las aplicaciones de computacin mvil. Se puede elegir, desde la misma plataforma, mltiples lenguajes .NET para desarrollar mdulos que coexistan dentro de una misma aplicacin. Adems, Visual Studio 2005 se integra con SQL Server 2005 para facilitar el acceso de datos desde las aplicaciones .NET que se desarrollan. La utilizacin de Visual Studio 2005 se recomienda cuando se dispone de un equipo robusto para el desarrollo, cuando se tiene la necesidad de desarrollar de forma rpida y efectiva varios tipos de aplicaciones, cuando existe la posibilidad de interaccin multi-lenguaje para el desarrollo de aplicaciones profesionales con acceso a recursos de bases de datos. La desventaja es el costo de la herramienta (el caso de desarrolladores profesionales, se justifica). Existen varias versiones de Visual Studio 2005. La ms elemental es la Standard Edition, que est orientada a los desarrolladores individuales profesionales; el kit Tools for the Microsoft Office System es la versin de Visual Studio 2005 para la integracin de aplicaciones con la suite Microsoft Office; la Professional Edition permite los desarrollos individuales profesionales de alto desempeo, con funcionamiento multicapa; el ms especializado de los productos es Team System, que incluye herramientas para el desarrollo de aplicaciones de alto desempeo. sta es ideal para equipos de desarrollo profesionales. Obviamente, entre ms especializada la edicin, mayor es su costo. Requerimientos de Visual Studio 2005. Si tiene la versin 2005 de Visual Studio Standard Edition, que fue la que utilizamos para este libro, deber disponer de 2 GB de espacio en el disco duro, lo cual es un requerimiento importante. Se requiere tener instalado el MDAC 9 o posterior, bsicamente porque es el que permite los accesos a SQL Server 2005. Los sistemas operativos en los que podr instalar Visual Studio 2005 son Windows 2000 con Service Pack 4 o posterior, Windows XP con Service Pack 2 o posterior y Windows 2003 Server o posterior. En caso de querer desarrollar en plataforma Web, se debe tener la versin profesional de Windows 2000 y XP, ya que son los que proveen IIS. Se debe contar, adems, con Internet Explorer 6.0 o posterior.
44
Para otras versiones de Visual Studio 2005, consulte las especificaciones tcnicas en el sitio de Microsoft.
> Lo nuevo
En Visual Studio 2005 se tienen varias configuraciones predefinidas. Al iniciar por primera vez el uso de la herramienta se solicita el tipo de configuracin que el desarrollador prefiere utilizar. En caso de este libro seleccionamos las preferencias para un desarrollador en Visual Studio (General Development Settings). Esto determina las herramientas activas y visibles por omisin, las teclas de atajo y la distribucin de los mens. Todas las modificaciones que hagamos pueden ser guardadas a travs de la opcin Tools Import and Export Settings. En otras palabras, si tenemos que desarrollar en un equipo distinto al que utilizamos regularmente, podemos llevarnos la configuracin de nuestras preferencias.
45
Los dispositivos que han de ejecutar aplicaciones basadas en el .NET Compact Framework deben aceptar el .NET Compact Framework runtime (Motor de ejecucin de .NET Compact Framework). El motor de ejecucin requiere como mnimo Windows CE .NET o Windows Mobile 2003 software for Pocket PCs. Los dispositivos debern contar con Windows Mobile Software for Pocket PC 2003, Windows Mobile 5.0 for Pocket PC and Smartphone, Windows CE .NET 5.0 o superiores.
46
47
Lo verdaderamente importante que debemos comprobar es si ya disponemos de un nuevo entorno de desarrollo de aplicaciones basadas en .NET, con toda la funcionalidad del .NET Framework y CLR. Para hacerlo es necesario que haya instalado cualquiera de los productos de desarrollo; es decir, que haya instalado el .NET Framework 2.0 SDK o Visual Studio 2005. NOTA
En su equipo ya debe estar instalado el software que requiere para trabajar. Se trabajar desde lnea de comandos para mejorar el entendimiento de la plataforma; posteriormente se trabajar con Visual Studio 2005 para mayor rapidez. Se debe tener instalado en su equipo Microsoft .NET Framework 2.0 SDK y adems Visual Studio 2005. El uso de una u otra plataforma se determinar por la didctica del tema que se est tratando.
Ejercicio 2.1
Determinacin de los productos .NET a instalar en un escenario de trabajo En el presente ejercicio aprender a determinar la cantidad y los tipos de productos que es necesario instalar en un escenario real. Se tiene un escenario compuesto como sigue:
Las aplicaciones de una empresa se encuentran en una distribucin multicapa, de la siguiente manera. Se tienen tres servidores; uno de ellos es el servidor de bases de datos que da servicio de almacenamiento de datos a las aplicaciones y objetos de negocios y trabaja
48
sobre Windows Server 2003, Datacenter x64 Edition. Otro de los servidores es de aplicaciones y hospeda todos los objetos de lgica de negocio, as como las aplicaciones de escritorio basadas en interfaz Windows; trabaja sobre Windows Server 2003, Enterprise x64 Edition. El ltimo es el servidor Web, que consume datos y funcionalidad de los otros dos servidores; trabaja en un equipo Windows 2003 Server. Se tienen dos aplicaciones principales, construidas en casa, SIO (Sistema Integral de Operaciones), que proporciona todo el control de los procesos de produccin. Por lo complejo de las interfases, se decidi que fuera una aplicacin Windows Forms. La otra aplicacin importante es SICOM (Sistema de Comercializacin), que proporciona informacin y pronsticos de ventas, as como informacin relevante para la administracin financiera del negocio. Como la informacin puede ser consultada tanto dentro como fuera de la empresa, se decidi que fuera un desarrollo Web. Esta aplicacin est desarrollndose como prueba de concepto, por lo que fue instalada en el servidor menos fuerte; por el momento, se ha dado un plazo de cuatro meses de prueba y, si es til, se desarrollar con mayor calidad y potencia. Por el momento slo tres usuarios utilizan SIO. Por otro lado, dos personas utilizan SICOM; uno de ellos es el director general, que puede enlazarse desde su equipo, cuando est en la empresa, o desde su PDA, cuando anda fuera de ella. Se tienen dos desarrolladores en la empresa: uno que se encarga del desarrollo y mantenimiento de SIO, y otro que se ocupa del desarrollo y mantenimiento de SICOM. Los tiempos de desarrollo asignados son muy estrechos, pues SIO es crtica y compleja, mientras que SICOM es un poco ms sencilla, y como se dijo, es prueba de concepto. Qu cantidad de cada producto es necesaria para dar soporte a la operacin de la empresa? Cuide el mayor aprovechamiento de los recursos de cmputo y el menor costo. Producto .NET Framework 2.0 Redistributable Package (x86) .NET Framework 2.0 Redistributable Package (x64) .NET Framework 2.0 SDK (x86) .NET Framework 2.0 SDK (x64) Visual Studio 2005 Visual Web Developer 2005 Express Edition Visual Basic 2005 Express Edition .NET Compact Framework 2.0 FIN DEL EJERCICIO* Cantidad
49
El programa vbc.exe es el compilador de Visual Basic.NET. Al someter a compilacin al programa NombreCdigoFuente.vb, se generar de inmediato un ensamblado de nombre NombreCdigoFuente.exe. Observe cmo es necesario especificar la extensin del archivo que contiene el cdigo fuente. Hay ocasiones en que los programas hacen uso de clases que pertenecen a la biblioteca de clases de .NET Framework, por lo que es necesario establecer referencias que permitan a los programas saber en qu archivos se encuentran las clases que utilizamos. Para ello recurrimos a la especificacin /r:. Suponga que un programa requiere clases que se encuentran en una librera de nombre System.dll. La sintaxis sera la siguiente:
vbc NombreCdigoFuente.vb /r:System.dll
Si se requieren varias libreras, podemos separarlas por comas (sin dejar espacio entre una y otra) o repetir la especificacin /r:. Si adems de System.dll, requerimos System. Drawing.dll, sta sera la sintaxis:
vbc NombreCdigoFuente.vb /r:System.dll,System.Drawing.dll o vbc NombreCdigoFuente.vb /r:System.dll /r:System.Drawing.dll
Las diferentes especificaciones que se utilizan para compilar archivos en Visual Basic.NET se irn revisando conforme los ejemplos lo vayan requiriendo.
50
La secuencia de desarrollo de este tipo de aplicaciones es la siguiente: 1. Se abre una sesin de comando (MS-DOS). 2. Con un editor de texto se edita el programa (con extensin vb). 3. Se compila el programa sin olvidar establecer las referencias con las libreras de .NET que se requieren para la funcionalidad propuesta por el mismo. 4. Se ejecuta el programa.
51
Otra forma, aunque no definitiva, es comprobar la existencia del directorio \inetpub, en la unidad donde se aloja el sistema operativo. Dicho directorio es el directorio de Servicios Web. No es definitiva porque puede existir el directorio pero no disponerse de los Servicios Web XML. Dentro del directorio de Servicios Web XML se encuentra el directorio raz de aplicaciones Web, llamado \inetpub\wwwroot; todo lo que se encuentre en dicho directorio o en algn directorio contenido en l ser tratado como sitio Web, y, por tanto, .NET Framework aplicar los procesos de compilacin y ejecucin de aplicaciones Web de manera automtica. Estos temas se tratan a mayor detalle cuando se estudia ASP.NET. La secuencia de desarrollo de aplicaciones Web es la siguiente: 1. Se abre una sesin de comando (MS-DOS). 2. Con un editor de texto, se edita el programa (extensin aspx). 3. Se copia el archivo a un directorio que de manera fsica o virtual se encuentre dentro del directorio de Servicios Web. 4. Se ejecuta el programa abrindolo desde el navegador (Internet Explorer, por ejemplo), utilizando el protocolo http. Como pudo comprobar, Visual Basic.NET es el mismo lenguaje para todos los programas; lo que difiere es la interfaz, la forma de compilar y la plataforma de ejecucin. Aprenda Visual Basic.NET para todos los tipos de aplicaciones.
Ejercicio 2.2
Desarrollo y compilacin de un programa desde la lnea de comandos En el presente ejercicio aprender a desarrollar un programa de consola utilizando SDK y comprobar el funcionamiento de .NET Framework en su equipo. 1. Con cualquier editor de texto simple, edite el programa HolaMundo.vb (que reside en el directorio C:\APVBNETVS\Cap02, que ser nuestro directorio de trabajo).
52
Codificacin de HolaMundo.vb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 Imports Imports Imports Imports System System.Drawing System.Windows.Forms Microsoft.VisualBasic
Module HolaMundoB Dim frmHola As New Form() Dim lblMensaje As New Label() Dim WithEvents btnAceptar As New Button() Sub Estado() frmHola.ClientSize = New Size(200, 100) frmHola.Name = "frmHola" frmHola.StartPosition = FormStartPosition.CenterScreen frmHola.Text = "Hola Mundo" lblMensaje.Location = New Point(16, 16) lblMensaje.BorderStyle = BorderStyle.Fixed3D lblMensaje.Name = "lblMensaje" lblMensaje.Size = New Size(150, 20) lblMensaje.Text = "" btnAceptar.Location = New Point(16, 50) btnAceptar.Name = "btnAceptar" btnAceptar.Size = New Size(150, 32) btnAceptar.Text = "Haz clic" frmHola.Controls.Add(lblMensaje) frmHola.Controls.Add(btnAceptar) End Sub
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceptar.Click lblMensaje.Text = "Hola Mundo" End Sub Sub Main() Estado() frmHola.ShowDialog() End sub End Module
53
2. Seleccione Inicio Todos los programas - Microsoft .NET Framework SDK v2.0 SDK Command Prompt. 3. En la ventana de comandos, traslade el control al directorio de trabajo.
cd \APVBNETVS\Cap02
5. Ejecute el programa.
HolaMundo
6. Si el programa funciona, habr comprobado que puede desarrollar aplicaciones Windows sin contar con una herramienta de desarrollo grfico. FIN DEL EJERCICIO *
Son tiles otras versiones, superiores o ms robustas, del sistema operativo, de Internet Explorer, Internet Information Server y MDAC.
54
Se puede comprobar si IIS est instalado y funcionando, si desde el Internet Explorer se obtiene respuesta al abrir la pgina http://localhost. Para simplificar el texto, se tienen las siguientes equivalencias: Si se hace referencia a: Windows / Sistema Operativo Internet Explorer MDAC .NET Framework Estamos hablando de: Windows XP Professional, con Service Pack 2 en espaol. Internet Explorer 6.0 o posterior, en espaol. MDAC 2.8 o posterior. Plataforma .NET Framework, compuesta por .NET Framework 2.0 Redistributable Package y .NET Framework 2.0 SDK, en sus versiones en espaol. SQL Server 2005, en ingls. Visual Studio 2005, en ingls. Visual Basic.NET 2005 Visual C# 2005 Managed C++ 2005 ASP.NET 2.0 ADO.NET 2.0
55
MAPA
56
TERMINOLOGA
Ambiente de produccin, 40 Aplicaciones de cmputo mvil, 38 de consola, 38, 49 Web, 38, 50 Windows, 38, 50 Cliente, 38 Console Applications, 38 Controles de computacin mvil, 44 Dispositivos inteligentes, 38 dotnetfx.exe, 40 IDE, 43 Integrated Development Environment (IDE), 43 Kit de desarrollo de software de .NET Framework, 41 Managed Providers, 38 Mobile Applications, 38 .NET Compact Framework, 38, 44 .NET Framework 2.0 Redistributable Package, 40 Software Development Kit, 41 NetFx64.exe, 41 ODBC, 38 OLEDB, 38 PDA, 38 Personal Data Assistant (PDA), 38 Proveedores de datos genricos ODBC u OLEDB, 38 .NET nativos, 38 Servicios Web XML, 38 Servidor, 39 setup.exe (32 bits), 42 setup.exe (64 bits), 42 Smart devices, 38 vbc.exe, 49 Visual Studio 2005, 43 Express Edition, 45 Web Applications, 38, 50 Web Forms, 38 Windows Applications, 38, 50 Forms, 38 XML Web Services, 38
PREGUNTAS
2.1 Cules son los factores a determinar antes de seleccionar un producto de desarrollo .NET? 2.2 En qu casos se recomienda utilizar Visual Studio 2005? 2.3 Suponiendo que su trabajo consista en desarrollar, cul es el producto .NET que mejor satisface sus necesidades?
57
Notas:
58
EXAMEN
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta. 1. Es el producto de plataforma .NET ideal cuando se desea slo ejecutar aplicaciones: a) .NET Framework 2.0 Redistributable Package b) Visual Studio 2005 c) .NET Framework 2.0 SDK 2. Es el producto de plataforma .NET ideal para desarrollar aplicaciones sin usar herramientas grficas: a) .NET Framework 2.0 Redistributable Package b) .NET Compact Framework c) .NET Framework 2.0 SDK 3. Permite la ejecucin de aplicaciones .NET en dispositivos inteligentes: a) Visual Studio 2005 b) .NET Framework 2.0 SDK c) .NET Compact Framework 4. No es un tipo de aplicacin .NET: a) Aplicacin de consola b) Aplicacin Web c) Aplicacin batch 5. Es el compilador de Visual Basic: a) VB b) VBC c) JITVB
Parte 2: Coloque en la lnea la letra F si el enunciado es falso y V si es verdadero. 6. 7. 8. 9. Visual Studio Standard puede instalarse en Windows 98. Los programas desarrollados en .NET no se pueden ejecutar en Windows 95. Es necesario instalar .NET Framework Redistributable Package para poder instalar Visual Studio 2005. Ejecutar ASP requiere que los programas se encuentren en la raz de aplicaciones Web, o alguno de sus directorios. 10. Es posible desarrollar aplicaciones robustas utilizando las versiones Express de Visual Studio 2005.
CAPTULO
59
60
Contenido
Fundamentos de desarrollo con Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . Soluciones y proyectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Recomendaciones para la creacin de proyectos y soluciones en desarrollos colaborativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de aplicaciones en Visual Studio . . . . . . . . . . . . . . . . . . . . . . Elementos de sintaxis en Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de una aplicacin de Consola en Visual Basic usando Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de una solucin en blanco . . . . . . . . . . . . . . . . Adicin de un proyecto a una solucin . . . . . . . . . . . . . Herramientas de Text Editor . . . . . . . . . . . . . . . . . . . . . . Colocacin de nmeros de lnea en Text Editor . . . . . . . Intellisense y deteccin dinmica de errores . . . . . . . . . Modificacin de cdigo usando Text Editor . . . . . . . . . . Generacin de una solucin en Visual Studio . . . . . . . . Depuracin de una solucin . . . . . . . . . . . . . . . . . . . . . . Creacin de una aplicacin Windows en Visual Basic con Visual Studio, trabajando varios proyectos en una solucin . . . Generacin de una aplicacin Windows . . . . . . . . . . . . . Fijacin de una herramienta en el espacio de trabajo . . Adicin de objetos de interfaz en tiempo de diseo . . . Navegacin entre documentos de una solucin . . . . . . . Cmo guardar documentos en una solucin . . . . . . . . . Establecimiento del proyecto de inicio para una solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de una aplicacin Web en Visual Basic con Visual Studio, trabajando varios proyectos en una solucin . . . . . . . . . Creacin de un directorio virtual para un sitio Web . . . Creacin de una aplicacin Web ASP.NET . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 61 63 65 67 68 68 69 72 73 74 77 78 78 78 79 80 81 83 84 84 86 86 88 92 93 93 94
61
62
Es importante mencionar que algunos proyectos muy especiales no generan ensamblados, como los de setup, pero constituyen una minora. Un proyecto puede formar parte de varias soluciones, por lo que es posible organizar por mdulos una aplicacin y, al mismo tiempo, se puede tener una solucin maestra que englobe a todos los proyectos. Subdividir es una prctica recomendable, ya que al momento de estar desarrollando y solicitar la compilacin de los programas, se compilarn todos los proyectos de la solucin. Esto puede convertirse en un problema en el caso de aplicaciones grandes: en primera instancia, porque pueden ser muchos los proyectos a compilar, lo que tomar mucho tiempo; en segunda, porque en los proyectos grandes intervienen varios programadores, y es posible tener que lidiar con proyectos que ya funcionaban pero que ahora estn presentando errores, que se tendrn que corregir antes de que el programa pueda ser compilado correctamente. Las soluciones deben planearse cuidadosamente con todo el equipo de desarrolladores. Que una solucin integre a todos los proyectos de otra solucin no implica que una solucin est dentro de otra. Eso permite que cada persona cree las soluciones que requiera sin afectar el trabajo de otros ni perjudicar la integracin de software que se da por la unin de proyectos. Es importante notar que en una misma solucin pueden coexistir proyectos escritos en diferentes lenguajes .NET; sin embargo, un proyecto puede tener cdigo fuente en un solo lenguaje.
63
> Lo nuevo
En Visual Studio 2005 se tienen las siguientes prestaciones relativas a los proyectos y las soluciones. Es posible crear proyectos temporales (temporary projects) que no requieren guardarse con el fin de hacer pruebas sin necesidad de crear proyectos y soluciones. Tambin es posible crear proyectos autnomos (stand-alone projects): cuando una solucin slo se compone de un proyecto, no es necesario hacer la gestin de la solucin, aunque de todas formas se genere. Para la organizacin del trabajo ya es posible crear directorios o carpetas de solucin, en los cuales es posible clasificar los archivos involucrados en la solucin. Tambin podemos administrar todos los recursos de un proyecto a travs de Project Designer, y es posible referir archivos EXE como orgenes de clases, y no slo archivos DLL.
64
3. Se debe tener una solucin por cada mdulo y una solucin por cada submdulo, si fuera pertinente. 4. Cada solucin debe tener un responsable. 5. Los desarrollos de los submdulos se agregan al mdulo slo despus de ser probados. 6. Todas las libreras de uso comn deben ser administradas por un responsable, aun cuando no sea quien las desarrolle. Debe haber una solucin para el manejo de las libreras de uso comn. 7. Slo el responsable de la solucin que contiene las libreras de uso comn puede autorizar las modificaciones a las libreras; al autorizar una modificacin deber comunicar la actualizacin a todos los equipos de trabajo. 8. Se debe tener una solucin que integre todos los recursos y programas que componen la aplicacin, pero no se trabaja sobre ella. En esta solucin slo se integran los recursos que ya han sido probados a nivel mdulo. 9. La solucin que integra toda la aplicacin es la que se compilar finalmente para generar una versin para entregar.
65
> Lo nuevo
En Visual Studio 2005 la pgina de inicio fue rediseada totalmente. Ahora las cuatro secciones (Open an existing project, Getting Started, Headlines y News) aparecen en una sola pgina.
3
FIGURA 3.3 Start Page
En Start Page se selecciona File New Project (o se oprime la combinacin de teclas Control-Mays-N). Aparecer la ventana New Project, que permite seleccionar el lenguaje a utilizar, as como el tipo de proyecto que se desea construir.
66
Al proporcionar los datos del proyecto a agregar, automticamente se crea una solucin con el mismo nombre. La desventaja de esta modalidad es que en aplicaciones grandes nunca un proyecto y una solucin se denominan de la misma forma, ya que la solucin es un concepto global mientras que un proyecto es especfico. Cuando la creacin de un proyecto motiva la creacin automtica de una solucin homnima, Visual Studio entiende que la solucin se compone de un solo proyecto, a lo que se llama proyecto autnomo (stand-alone project); en este tipo de proyecto no se da mucha relevancia al concepto de solucin dentro del entorno integrado de desarrollo. Es indispensable saber qu lenguaje .NET se utilizar para el desarrollo (Project Type); decidido esto, es necesario conocer el tipo de aplicacin deseada (Templates). Las plantillas o templates permiten predeterminar los recursos iniciales de la aplicacin. Visual Studio preguntar dnde se desea guardar la aplicacin (Location) y con qu nombre (Name). Los archivos fuente que usted genere se encontrarn en el directorio que especifique. Se generar un archivo que mantendr la referencia de todos los archivos involucrados en la solucin y tendr la extensin sln. Es posible que la solucin tenga un nombre distinto al del proyecto, por lo que se podr denominar especficamente (Solution Name).
> Lo nuevo
En Visual Studio 2005 la organizacin es ms eficiente, dado que todos los recursos de una solucin estn en la misma ubicacin. La versin 2003 almacenaba los archivos del proyecto en el directorio que nosotros especificbamos, pero colocaba el archivo de solucin (SLN) en Mis documentos/Proyectos de Visual Studio, lo que creaba problemas en equipos en donde trabajaban diversos usuarios. Ahora la solucin y los proyectos se almacenan en el mismo directorio.
67
68
Ejercicio 3.1
Creacin de una aplicacin de Consola en Visual Basic usando Visual Studio Desarrollar una aplicacin de consola, que al presionar INTRO muestre un mensaje Hola Mundo.
3. En la seccin Project Type seleccione Other Project Types Visual Studio Solutions, porque trabajar con soluciones de Visual Studio. 4. En la seccin Templates seleccione Blank Solution. Al seleccionar el tipo de proyecto, Visual Studio se encargar de generar un contenedor de proyectos que podr ser compilado para producir una aplicacin. 5. En el cuadro de texto Name coloque el nombre de la solucin, Ejercicios; en el cuadro de lista Location especifique la ruta en la que se han de almacenar los archivos fsicos
69
que componen la solucin. Escriba la ruta del directorio de trabajo del libro, que es
C:\APVBNETVS.
6. Vea cmo la casilla de verificacin Create directory for solution est marcada de forma predeterminada. Esto es recomendable para que la solucin se organice mejor dentro del medio de almacenamiento. Haga clic en Ok para que se genere la solucin llamada Ejercicios. 7. Al aceptar los cambios, se generar un directorio llamado Ejercicios en el directorio de trabajo. En dicho directorio existir un archivo denominado Ejercicios.sln, que almacenar las referencias a los proyectos que componen la aplicacin.
10. Seleccione en Solution Explorer el nodo Solution Ejercicios y despliegue el men contextual (haga clic en el botn derecho del ratn). Seleccione la opcin Add New Project. 11. Aparecer la ventana New Project.
70
12. En la seccin Project Type seleccione Visual Basic - Windows, porque desarrollar una aplicacin de consola utilizando Visual Basic; recuerde que los proyectos de consola se ejecutan utilizando el servicio Windows Application Services, aunque no sean interfaces grficas; de ah que se traten como aplicaciones Windows. 13. En la seccin Templates seleccione Console Application. Al seleccionar el tipo de proyecto, Visual Studio se encargar de proporcionar de forma automtica todos los elementos tpicos de una aplicacin de consola, incluyendo archivos de cdigo fuente, datos y configuraciones pertinentes. 14. En el cuadro de texto Name coloque el nombre del proyecto, que debe ser HolaMundoCon; en el cuadro de lista Location especifique la ruta en la que se han de almacenar los archivos fsicos a desarrollar. Escriba la ruta del directorio de trabajo de la solucin, que es C:\APVBNETVS\Ejercicios.
15. Haga clic en Ok, con lo cual se generar dentro del directorio de trabajo de la solucin un directorio llamado HolaMundoCon. En dicho directorio se encontrar el archivo de cdigo fuente del programa de Consola (.VB) y el archivo del proyecto (.VBPROJ) que concentrar las referencias de los archivos fsicos involucrados en este ltimo. Se generan tambin directorios de trabajo: en \Bin se colocarn los ensamblados que se generen cuando se realice la compilacin del proyecto; en \My Project se almacenarn archivos de configuracin y especificaciones tiles para la compilacin del proyecto, y en \obj se colocarn archivos temporales involucrados en el proceso de compilacin y depuracin.
71
16. Al haber especificado como Template una Console Application, Visual Studio genera de forma automtica los archivos y referencias comunes para una aplicacin de consola. El componente principal ser un programa de cdigo fuente llamado Module1.vb, que es un mdulo en Visual Basic. 17. Document Window es el espacio principal de trabajo en Visual Studio, en donde la mayora de las herramientas se ubicarn en tiempo de diseo. En Document Window aparecer Text Editor, que es el editor de texto simple donde se podr modificar el cdigo de Module1.vb. 18. En este momento Solution Explorer debe mostrar todos los elementos fsicos que componen la solucin, y en Document Window se tendr a Text Editor modificando el cdigo de Module1.vb.
72
20. Text Editor es una fascinante herramienta de edicin de cdigo, dadas todas las prestaciones que ofrece, como las siguientes: a ) Barra de seleccin de documentos. En la parte superior de Text Editor aparecer una barra que mostrar las pestaas (Tabs) para seleccionar el documento con el que deseemos trabajar. b ) Tabs. Llamadas tambin pestaas de seleccin, identifican y permiten seleccionar los documentos abiertos con los que se puede trabajar. A los documentos que se encuentran abiertos y en la barra de seleccin de documentos, se les llama documentos activos. c ) Selector de documentos activos. Dado que se pueden tener tantos documentos activos que se llene la barra de seleccin de documentos, hacer clic en el Selector de documentos activos (flecha ) permite ver los documentos activos en forma de men para seleccionarlos. d ) Cerrado de documentos. Si se desea quitar un documento de los documentos activos, simplemente se debe seleccionar el documento a cerrar y hacer clic en el icono de cerrado de documentos. e ) Delimitadores de branching. Es la capacidad de Text Editor de mostrar de forma visible los alcances de los bloques principales de cdigo (branching). Como se puede observar, al inicio de un procedimiento, mdulo o clase, en las lneas delimitadoras de branching aparecen smbolos () y (+); stos permiten visualizar y
73
ocultar el cdigo delimitado, con lo que podemos hacer ms clara la codificacin mostrando slo aquellas partes del cdigo que realmente nos interesa observar. f ) Complementacin automtica de cdigo. Es la capacidad de Text Editor de agregar de forma automtica lneas de cdigo que por regla de lenguaje deben escribirse. Esto simplifica el proceso de codificacin, adems de que evita errores por omisin de cdigo. g ) Coloring. Es la capacidad de Text Editor de diferenciar por colores los elementos del cdigo. Generalmente las palabras reservadas estarn en azul, los identificadores y operadores en negro, y los comentarios en verde. Esto es til sobre todo cuando no estamos seguros de estar escribiendo correctamente las palabras reservadas. Si no aparecen en azul, es porque no estn bien escritas. h ) Divisores de procedimientos. los procedimientos en el cdigo. Son las delimitaciones horizontales que separan
i ) Divisor de paneles de edicin. Si se arrastra el icono Divisor de paneles de edicin, podr dividirse el espacio de edicin de Text Editor en mitades. En cada una de ellas podr desplazarse, ver y editar diferentes partes del cdigo. Esto es especialmente til en programas muy extensos, donde a veces es necesario comparar porciones de cdigo ubicadas en distintas partes del archivo. j ) Selector de elementos. Se trata de un combo que muestra los diferentes mdulos y elementos globales de una aplicacin. En caso de que el programa posea muchos elementos globales, este combo permite ir directamente a la parte de cdigo que interesa, sin tener que navegar entre las lneas de cdigo para buscar. k ) Selector de miembros. Trabaja de la misma forma que Selector de elementos, slo que a un nivel ms bajo. Permite seleccionar un miembro de un elemento global. l ) Intellisense. Capacidad a travs de la cual Text Editor propone los objetos y miembros ms comunes conforme se escribe el cdigo.
74
tana Options. Seleccione el nodo Text Editor Basic General, en la seccin Display marque la casilla de verificacin Line Numbers y haga clic en Ok.
Esto se deber escribir en varios tiempos. Primero escriba Console.. Al llegar al punto, aparecer un men dinmico que propone los elementos del lenguaje que concuerdan con el cdigo que se comenz a escribir para que el desarrollador complete el enunciado con la ayuda de Visual Studio. Esto simplifica el proceso de codificacin y evita errores de sintaxis. A esta funcionalidad se le llama Intellisense. En la parte baja del men dinmico Intellisense hay dos pestaas: Common y All. Dado que los elementos de un objeto pueden ser muchos, Visual Studio permite ver los ms comunes, o bien todos. De manera predeterminada muestra los ms comunes, lo cual es muy prctico. De la lista de elementos que aparece, es posible seleccionar con el ratn, con las flechas de direccin o por concordancia con lo escrito. Slo en caso de que lo que busque no se encuentre en Common, recurra a All.
75
3
Siga escribiendo hasta Console.WriteL. La informacin que hemos escrito permite una concordancia exacta con un elemento del men, mismo que se selecciona.
Para ahorrarnos esfuerzo y dado que ya est seleccionado el cdigo que pretendemos escribir, basta con poner el carcter que seguira, en caso de escribir nosotros el cdigo. En este caso sera un parntesis ( . Escriba un parntesis derecho y vea cmo Intellisense complementa el cdigo de forma automtica, desapareciendo el men correspondiente.
76
Se recomienda ampliamente el uso de Intellisense, dado que se ha demostrado que reduce en gran medida los errores de sintaxis. Siga escribiendo la lnea de cdigo, y vea cmo aparece una ayuda interactiva de llenado de los elementos. En este caso, la ayuda indica que si se escribe WriteLine(), lo que obtendramos sera un terminador de lnea. La ayuda interactiva indica 18 formas de utilizar WriteLine, dado el polimorfismo con que el objeto fue programado. Utilizando los iconos de la ayuda interactiva, busque la alternativa 14 de 18, para que vea la forma en que se utiliza WriteLine con un String.
En este punto ya debi haber escrito la lnea de ejemplo por completo. 24. Modifique la lnea, de tal forma que escriba Console con doble s, a fin de causar un error. Vea cmo al introducir una lnea que presenta errores de sintaxis, Visual Studio le seala la falta al estilo de Microsoft Word, subrayando el error en color azul. Si se colo-
77
ca sobre la parte del cdigo que presenta el error, podr darse cuenta que Visual Studio le informa el mensaje del error que se est provocando. Esto ayuda a reducir el tiempo de desarrollo, dado que no hace falta compilar y probar para saber que algo fallar.
3
25. Corrija la lnea para que ya no genere errores.
Codificacin de HolaMundoCon
1 2 3 4 5 6 7 8 9 Module Module1 Sub Main() Console.Write(Presione INTRO) Console.ReadLine() Console.WriteLine(Hola mundo.) End Sub End Module
27. Realmente usted slo tuvo que agregar las lneas 4, 5 y 6, que muestran un mensaje, esperan que se oprima una tecla y muestran otro mensaje, respectivamente.
78
79
Ejercicio 3.2
Creacin de una aplicacin Windows en Visual Basic con Visual Studio, trabajando varios proyectos en una solucin
Desarrollar una aplicacin Windows tal que al hacer clic en un botn muestre un mensaje Hola Mundo. 1. En este ejercicio trabajar con la solucin creada en el ejercicio anterior.
4. En Project Types seleccione el nodo Visual Basic - Windows. En Templates seleccione Windows Applications. En Name especifique el nombre del proyecto, que ser HolaMundoWin, y se almacenar en el directorio de trabajo de la solucin. Haga clic en Ok. 5. En Document Window aparecer una herramienta llamada Form Designer, que permite el diseo de interfaces de forma grfica y dinmica. 6. En la barra de mens seleccione View Toolbox (Ctrl-Alt-X). Aparecer la herramienta Toolbox, que muestra de forma clasificada los controles grficos disponibles para una aplicacin Windows.
80
7. Los controles son enlaces grficos que permiten acceder a las clases de .NET Framework para la elaboracin de interfaces grficas; a travs de los controles es posible agregar objetos de interaccin en una interfaz. Visual Studio se encarga de agregar el cdigo necesario para la integracin en los programas. 8. Observe cmo Toolbox no permanece en su lugar por mucho tiempo.
Modo fijo
Si el Icono de ocultacin automtica aparece en modo fijo, hacer clic sobre l pondr a la herramienta en modo de ocultacin automtica; si aparece en modo ocultacin automtica, hacer clic sobre l pondr a la herramienta en modo fijo. 11. En caso de que Toolbox est en modo de ocultacin automtica, cambie su estado a modo fijo. La interfaz deber quedar de la siguiente manera:
81
15. Arrastre el control Label, que se encuentra en el Toolbox, y colquelo debajo del botn que acaba de agregar en el punto anterior.
82
16. En los puntos anteriores se agreg un objeto en modo insercin y uno en modo arrastre. 17. Acomdelos de tal forma que queden distribuidos de la siguiente manera (slo arrstrelos; no haga doble clic sobre ellos):
18. Seleccione el objeto Label1 que se agreg a la interfaz. Para ello, haga un clic sobre l una vez. 19. Cada elemento en la interfaz es un objeto y, en tal carcter, posee propiedades que determinan su apariencia y sus capacidades de comportamiento. La herramienta Properties permite modificar los valores de las propiedades de los objetos. En la barra de mens seleccione View - Properties Windows (u oprima la tecla F4) para ver las propiedades del objeto seleccionado.
Label1,
21. En la ventana Propiedades, en el combo superior aparecer el nombre del objeto que se modificar, as como la clase en la que est basada. Busque la propiedad (Name) y cam-
83
bie el nombre Label1 por lblResultado. Presione Intro. El nombre habr cambiado en el combo superior de la ventana Properties, lo que indica que el cambio ha sido aceptado. 22. Para agregar funcionalidad al programa es necesario especificarle el comportamiento que deseamos tenga como respuesta a la interaccin con el usuario. Para ello debemos codificar procedimientos de evento, que son bloques de cdigo que se ejecutarn cuando el usuario o el programa interacten de cierta manera con la aplicacin. 23. Deseamos que al hacer clic en el botn se coloque el texto Hola Mundo en el objeto lblResultado. Para ello debemos codificar el procedimiento que responda al evento Click del botn. 24. Haga doble clic en el botn que agreg a la interfaz. Automticamente aparece el procedimiento precodificado que se ha de ejecutar al momento de hacer clic (Click) en el botn (Button1) (de ah que el procedimiento se llame Button1_Click). Vea cmo el editor queda listo para codificar lo que debe suceder cuando se haga clic en el botn en tiempo de ejecucin. 25. Dentro del procedimiento deber agregar una lnea que especifique que al hacer clic en el botn, se cambiar la propiedad Text del objeto lblRespuesta a Hola Mundo. El cdigo debe lucir como sigue:
Codificacin de HolaMundoWin
27. En este ejemplo aparecen cuatro documentos o herramientas que pueden ser seleccionadas en la Barra de seleccin de documentos. Cada documento se activa, al hacer clic sobre la pestaa correspondiente, en Document Window, la herramienta utilizada por el documento para su edicin. Form1.vb y Module1.vb, por ser cdigo fuente, aparecern utilizando Text Editor, mientras que Form1.vb [Design] se mostrar usando Form Designer. Por otro lado, Start Page aparecer como un navegador de pginas Web intrnseco de Visual Studio, dado que es una pgina Web.
84
28. Seleccione alternativamente las distintas pestaas y vea el comportamiento de Visual Studio. Si desea cerrar alguno de los documentos abiertos, basta hacer clic en el Tab y posteriormente en la cruz que aparece en el extremo izquierdo de la Barra de seleccin de documentos.
85
34. Para hacer que nuestro nuevo proyecto de aplicacin Windows sea el proyecto de inicio, seleccione el nodo HolaMundoWin en el Solution Explorer. Invoque el men de contexto y seleccione Set as StartUp Project. De esa forma el proyecto de Windows ser nuestro proyecto de inicio. 35. En nuestro caso, como la aplicacin Windows contiene slo un formulario Windows, establecer nuestro proyecto como proyecto de inicio provoca que el nico formulario sea el objeto de inicio. Si nuestra aplicacin tuviera ms de un formulario Windows sera necesario especificar cul de ellos es el objeto de inicio. 36. Un objeto de inicio es el elemento de un proyecto que ser el primero en mostrarse en la interfaz.
37. Generar una solucin permite que los elementos de todos los proyectos de una solucin sean compilados, generando los ensamblados correspondientes. En este caso, generar la solucin implicara la compilacin de los dos proyectos que hemos desarrollado. 38. Guarde la solucin y genrela, para comprobar que no haya problemas con el trabajo realizado. Si aparece el siguiente resultado es que todo fue bien (vea cmo se han construido dos ensamblados (EXE) uno por cada proyecto de la solucin):
86
39. Si no hubo problemas, depure la aplicacin (tecla F5). Se depurar el proyecto de inicio; es decir, la aplicacin Windows. 40. Al aparecer la interfaz en tiempo de ejecucin, haga clic en el botn, y vea cmo el texto de la etiqueta cambia. En ese caso, la aplicacin funcion adecuadamente. 41. Guarde su aplicacin y cirrela. FIN DEL EJERCICIO*
Ejercicio 3.3
Creacin de una aplicacin Web en Visual Basic con Visual Studio, trabajando varios proyectos en una solucin Desarrollar una aplicacin Web tal que, al hacer clic en un botn, muestre el mensaje Hola Mundo.
87
5. Expanda el rbol Servicios de Internet Information Server hasta que localice el nodo Sitio Web Predeterminado. 6. Estando en ese nodo, despliegue el men contextual y seleccione la opcin de men Nuevo Directorio virtual.
7. Aparecer el Asistente para crear un directorio virtual. Haga clic en Siguiente en la pantalla inicial. Cuando el asistente pregunte por el alias de su sitio, escriba APVBNETVS y haga clic en Siguiente. 8. Como directorio de contenido del sitio Web, seleccione o escriba la ruta del directorio que acaba de crear (C:\APVBNETVS\HolaMundoWeb) y haga clic en Siguiente. 9. Deje los permisos tal como estn. Haga clic en Siguiente y luego en Finalizar. 10. Se habr creado un sitio llamado APVBNETVS. 11. Ubique el nodo APVBNETVS en el rbol de servicios de Servicios de Internet Information Server y seleccinelo. En el panel de la derecha podr observar que no hay elementos disponibles en dicho sitio. Cierre el programa Servicios de Internet Information Server.
88
13. En Templates seleccione ASP.NET Web Site. En Location haga clic en el botn Browse; se desplegar la ventana Choose Location, que permite seleccionar una ruta fsica del sistema operativo (si est codificando en \InetPub\wwwroot) o un directorio virtual. 14. Seleccione en el panel derecho el origen Local IIS para indicar que el desarrollo se trabajar en un directorio virtual dentro de la mquina. Al seleccionar Local IIS, aparecern en organizacin de rbol de nodos todos los sitios registrados. Seleccione su sitio APVBNETVS. Haga clic en Open para aceptar.
89
15. Se generar el sitio Web ASP.NET. La pgina principal sobre la que se estar trabajando es Default.aspx; las pginas pueden trabajarse en modo de diseo (Design) y en modo codificacin (Source). La forma de alternar entre uno y otro modo es seleccionando las pestaas que aparecen en la parte inferior de Document Window. Al estar en Design, se puede utilizar Toolbox para integrar objetos en la interfaz. En modo Source es necesario agregar las etiquetas en el lugar indicado.
90
16. Cambie a modo de diseo (Design) y utilizando Toolbox (CTRL-ALT-X), agregue un Button y un Label. 17. Seleccione el objeto Label1 y asigne en la propiedad Name, el mismo nombre que asign en Windows: lblResultado. 18. Haga doble clic en el botn que agreg a la interfaz. Aparecer el procedimiento de evento que se ejecutar al momento de hacer clic en el botn. Codifique lo siguiente en el procedimiento Button1_Click:
Codificacin de HolaMundoWeb
19. Seleccione el nodo http://localhost/APVBNETVS en el Solution Explorer y establzcalo como proyecto de inicio.
91
20. Vuelva a generar la solucin (Ctrl-Mays-B) y, si no hay problemas en la generacin, depure la aplicacin (tecla F5). Debe funcionar igual que la aplicacin Windows: al hacer clic en el botn, el mensaje de la etiqueta debe cambiar. 21. En este ejercicio comprobamos que el desarrollo Windows y Web realizado desde Visual Studio es prcticamente idntico. 22. Finalmente nuestro proyecto quedara como sigue.
23. En cualquier momento puede llamar a edicin cualquier elemento de la solucin. Dependiendo del tipo de archivo que se trate, Visual Studio invocar Text Editor, Form Designer, Web Form Designer o lo que sea pertinente. 24. En Solution Explorer haga doble clic en el nodo HolaMundoCon Module1.vb, luego haga doble clic en HolaMundoWin Form1.vb; haga clic en http://localhost/ APVBNETVS/ - Default.aspx, y finalmente haga clic en http://localhost/APVBNETVS/ - Default.aspx Default.aspx.vb. Vea cmo se comporta Visual Studio. 25. Guarde su aplicacin y cirrela. FIN DEL EJERCICIO*
92
MAPA
93
TERMINOLOGA
Barra de seleccin de documentos, 72, 83 Bloque de cdigo, 67 Categoras de controles, 81 Desarrollos colaborativos, 63 Directorio virtual, 86 Document Window, 71 Guin bajo (_), 67 Intellisense, 74 Internet Information Server, 86 Modo fijo, 80 Mdulo de ocultacin automtica, 80 Objeto de inicio, 84 Pestaa de seleccin, 83 Project Type, 66, 68, 70 Properties, 82 Proyectos, 61 Selector de documentos activos, 72 de elementos, 73 de miembros, 73 sln, 66 Solucin(es), 61 Solution Explorer, 69 Start Page, 65 Startup object, 84 Tab, 83 Tabs, 72 Templates, 66, 68, 70 Text Editor, 71-2 Toolbox, 79
PREGUNTAS
3.1 Cules son las recomendaciones generales de organizacin de soluciones y proyectos en Visual Studio? 3.2 Cules son los elementos bsicos de sintaxis del lenguaje Visual Basic? 3.3 Cules son las principales diferencias entre los proyectos de Consola, Windows y Web? 3.4 Para qu sirve Solution Explorer? 3.5 Para qu sirve Toolbox? 3.6 Cules son las principales caractersticas de Text Editor?
94
EXAMEN
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta. 1. Es el nivel ms alto de organizacin de trabajo en Visual Studio: a) Proyecto b) Solucin c) Ensamblado 2. Son colecciones de archivos fuente que producen un ensamblado al momento de ser compilados: a) Proyecto b) Solucin c) Paquete 3. Herramienta que nos permite ver los elementos que componen una solucin, en forma de rbol de nodos: a) Solution Explorer b) Solution Viewer c) Start Page
4. Es la capacidad de Text Editor para proponer objetos y miembros, al momento de editar el cdigo: a) Intellisense b) Coloring c) Tooltip interactive 5. Consiste en tratar de compilar todos los programas y elementos asociados a un proyecto o solucin para la generacin de ensamblados. a) Build b) Compile c) Debug Parte 2: Coloque en la lnea la letra F si el enunciado es falso, y V si es verdadero. 6. 7. 8. 9. 10. Visual Basic es sensible al uso de maysculas y minsculas. Text Editor y Document Window son, en esencia, lo mismo. La ocultacin automtica est disponible slo en Text Editor y Toolbox. Para probar la aplicacin Web es necesario tener instalado y funcionando IIS. Las plantillas (templates) permiten predefinir recursos disponibles durante la creacin de una aplicacin.
Captulos:
4 Variables, arreglos y tipos de datos 5 Espacios de nombres y desarrollo de libreras 6 Manejo de operadores 7 Estructuras de decisin y control 8 Manejo estructurado de excepciones
Parte 2
Fundamentos de programacin en Visual Basic
En esta parte del libro se analizan los fundamentos de la programacin en lenguaje Visual Basic. Utilizando al mximo las herramientas de Visual Studio 2005, se estudia el manejo de las variables de memoria, as como las estructuras de decisin y control desde las cuales se realizar el consumo de las clases de la biblioteca de .NET Framework (BCL). Finalmente, aprender a implementar esquemas de manejo estructurado de excepciones con el fin de controlar, mediante programacin, las acciones procedentes en caso de que se tengan problemas en tiempo de ejecucin. Nuestra reflexin es la siguiente: la discusin si Java es mejor que .NET es irrelevante. Lo importante no es el lenguaje de programacin que escogemos para trabajar, sino lo que podemos hacer con el lenguaje. Un excelente lenguaje en manos de alguien que no tiene nada que decir es una herramienta mal aprovechada. Preocpese por tener un objetivo valioso a alcanzar, y luego emplee representaciones abstractas de datos e instrucciones precisas para desarrollar programas que cumplan de forma ptima con el objetivo planteado.
CAPTULO
97
98
Contenido
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de datos en Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversin de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversin implcita (Casting) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversin explcita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversin por mtodo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acceso a datos Value type y Reference type . . . . . . . . . . . . . . . . . . . . . . . . . Capacidades de los tipos valor y referencia . . . . . . . . . . . . . . . . . . . . . Naturaleza de tipo de los datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ByVal y ByRef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Strong Typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Option Explicit [On/Off] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Option Strict [On/Off] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Demostracin del alcance de las variables y la forma en que preservan valores (I) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manejo elemental de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Declaracin de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Valores por omisin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Demostracin de la declaracin de variables y constantes, y la realizacin de conversiones . . . . . . . . . . . . . . . . . . . . . . . . . Construccin de un solo proyecto . . . . . . . . . . . . . . . . . . Origen de las variables: clases y estructuras . . . . . . . . . . . . . . . . . . . . . Alcance de las variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accesibilidad de las variables (accesibility) . . . . . . . . . . . . . . . . . . . . . . Demostracin del alcance de las variables y la forma en que preservan valores (II) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arreglos unidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arreglos multidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arreglos escalonados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprobacin del uso de arreglos unidimensionales, multidimensionales y escalonados . . . . . . . . . . . . . . . . . . . . . . . Estructuras y enumeraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enumeraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 100 102 105 106 106 107 107 107 108 108 109 109 109 110 112 112 113 113 114 114 115 117 118 119 120 121 125 126 127 128 129 133 133 134 135 136 136 138
99
El mundo de la computacin es, en ltima instancia, un mundo de datos. Los principales objetivos de toda aplicacin son procesar datos para transformarlos en informacin, hacerlos llegar en la cantidad y la forma precisas a las personas indicadas (y autorizadas), y almacenarlos de manera eficiente. No es asunto menor entender los datos y la forma en que se comportan. Una ineficiente seleccin de la forma en que se manejan los datos puede acarrear errores y mal desempeo de la aplicacin. Es importante recordar tambin que los lenguajes de programacin son estructuras simblicas que permiten hacer uso de los dispositivos y recursos de una computadora. Uno de los componentes ms importantes de una computadora es la memoria de acceso aleatorio (RAM/Random Access Memory). La RAM es indispensable para una computadora debido a que los programas y datos deben residir en ella para que puedan ser tomados de ah por el procesador; nada puede ser procesado por una computadora si no est antes en la memoria. Dicho de otra manera, el procesador no habla con nadie ms que con la RAM. Ahora bien, la memoria se encuentra seccionada en posiciones de memoria, cada una de las cuales tiene un identificador interno (que a veces nos es revelado en forma de nmero hexadecimal cuando Windows causa un volcado de memoria). La memoria puede ser utilizada por el sistema operativo para que todos los programas funcionen; puede un programador disponer de posiciones de memoria? Por supuesto que s: a travs de las variables de memoria. El presente captulo analiza la forma en que es necesario codificar el almacenamiento de valores en memoria en Visual Basic, de forma que los procesos puedan utilizarla eficientemente.
Variables
Una variable de memoria es la referencia lgica a una posicin fsica de memoria RAM. Por medio de las variables es posible almacenar valores en la memoria, asignarles un nombre determinado y disponer del valor almacenado cuando se requiera. Estos valores almacenados estarn disponibles en tanto que no liberemos la memoria, ya sea por medio de programacin o como resultado de haber cerrado la sesin de programa donde fueron definidos. Por supuesto, apagar la mquina produce el cierre de todos los programas y, por tanto, la prdida de los valores almacenados en las variables.
100
na el tratamiento interno que tendr el valor y la cantidad en bytes que consumir en memoria, entre otras cosas.
Alcance (scope). Es el atributo que define el cdigo dentro de un programa en que una
variable puede ser utilizada sin utilizar calificador; es el estado de existencia y la persistencia del valor de la variable en tiempo de ejecucin.
Accesibilidad (accessibility). Es el permiso que se proporciona al cdigo para leer la
Identificadores
Se le llama identificador (identifier) al nombre lgico de un elemento de programacin por medio del cual puede ser referido. Las variables, al igual que los procedimientos, las clases, las estructuras y otros elementos poseen un identificador; a travs de l, dichos elementos son utilizables de manera programtica. Reglas de composicin de los identificadores. con las siguientes reglas: Los identificadores deben cumplir
101
Deben iniciar con un carcter alfabtico o guin bajo ( _ ). Pueden contener slo caracteres alfabticos, dgitos decimales o guiones bajos. Si se inician con un guin bajo, deben contener al menos un dgito decimal o un carc-
ter alfabtico.
No pueden contener espacios intermedios.
Reglas no escritas de composicin de los identificadores. Existen otras reglas no forzosas, pero que le pueden ser de mucha ayuda:
Se sugiere que un identificador sea ilustrativo; es decir, debe indicar claramente su con-
tenido. Por ejemplo, si una de sus variables sirve para almacenar en memoria la edad de una persona, su variable puede llamarse Edad o X; sin embargo, Edad es un nombre ms til, pues proporciona una mejor idea del valor que contiene, mientras que X puede ser cualquier cosa.
Dado que una variable puede ser utilizada repetidamente dentro de un programa, es
Producto
ms prctico emplear nombres cortos. Entre Nombre y NombreDelClienteQueAdquiere lo ms recomendable es emplear la primera opcin.
Ventas
Use el guin bajo slo si es necesario hacerlo. Recuerde que el guin bajo es el conti-
nuador de lnea del lenguaje y puede crearse confusin innecesaria. Prefiera Mensuales a Ventas_Mensuales.
las palabras que compongan el identificador (Pascal casing), con el fin de aumentar la legibilidad. VentasMensuales es recomendable; ventasmensuales no.
Evite en lo posible el uso de conjunciones. Use VentasMensuales, no VentasDelMes. Evite el uso de abreviaturas. Use VentasMensuales, no VtsM.
En lo que respecta al uso de maysculas, minsculas y prefijos para la denominacin de variables en Visual Basic, se consideran algunos estilos que constituyen convencionalismos internacionalmente reconocidos. Aunque Visual Basic permite formar los identificadores como le plazca, es mejor seguir las reglas que todos los desarrolladores del mundo parecen estar siguiendo. Pascal casing. El estilo Pascal casing consiste en usar mayscula al principio del nombre y al inicio de cada una las palabras que compongan el identificador. ste es el estilo ms utilizado en Visual Basic; por ejemplo, VentasMensuales.
102
Camel casing. El estilo Camel casing se caracteriza por colocar en mayscula la primera letra de cada palabra de un identificador, excepto la primera. Por ejemplo, ventas Mensuales. Este estilo est muy difundido entre los programadores de C# o Java. Se recomienda utilizar este estilo:
Al denominar parmetros; si el parmetro se compone de una sola palabra, toda la pa-
labra va en minscula.
En elementos de alcance privado, como campos y variables.
Notacin hngara (Hungarian notation). La Notacin hngara se caracteriza por colocar un prefijo a las variables para indicar su tipo o funcin. A decir de Microsoft, este estilo est cayendo en desuso, por lo cual sugerimos evitarlo. Por ejemplo, intVentasMensuales, da a entender que se trata de un dato Integer. NOTA
Evitar la notacin hngara es la recomendacin de Microsoft. En realidad, la notacin hngara sigue siendo utilizada mucho por la comunidad de desarrollo, e incluso en el sitio de Microsoft encontramos muchos ejemplos con dicha notacin. Utilizar la notacin hngara ser a fin de cuentas una decisin del equipo de desarrollo, y no afecta la funcionalidad de las aplicaciones.
Este apartado presenta recomendaciones que puede o no seguir. En cualquier caso, lo importante no es el estilo que elija usar, sino que todos los miembros de un equipo de desarrollo lo compartan y utilicen de manera consistente.
103
el contenido de la variable. Esto implica la necesidad de definir qu tipo de valor almacenar la variable para saber qu es posible hacer con ella. Adems de determinar el tratamiento interno del valor, el tipo de dato (datatype) define la cantidad en bytes que consumir en memoria y las operaciones que se podrn realizar con el mismo. Se conoce como dominio el conjunto de valores vlidos para un dato. Por ejemplo, el dominio de un dato que almacenar un nmero de mes, consiste en los nmeros enteros del 1 al 12. Cuando el dominio est relacionado con el tipo de dato, se le llama dominio de tipo; por ejemplo, en el caso del tipo de dato Byte, el dominio ser de nmeros enteros del 0 al 255. Todo en Visual Basic es un objeto, y todo objeto tiene un determinado tipo, lo que se conoce como type. Se tienen dos clases de types en el lenguaje:
Types que forman parte del lenguaje, llamados types intrnsecos. Types de usuario, llamados tambin user-defined types, que son clases, estructuras, in-
terfaces y otros elementos que no forman parte de .NET Framework. Cada type tiene un nombre, que es el identificador a travs del cual se invoca la funcionalidad desde el cdigo fuente en un determinado lenguaje. El nombre del type puede ser ms corto en un lenguaje que en .NET Framework. Por ejemplo, para Visual Basic la referencia Integer es equivalente a referir el type System.Int32 de .NET Framework, que es ms complejo. Todos los lenguajes tienen acceso a la misma biblioteca de clases, lo que vara la implementacin que cada lenguaje requiere para llegar a System.Int32 (Visual Basic, Integer; C#, int; C++, int o long; JScript, int). Adems de nombre, los types tambin poseen un tamao, que representa su el consumo en bytes. Esto es importante dado que la memoria RAM es siempre limitada. Los types intrnsecos pueden ser clases, estructuras e interfaces preconstruidas en .NET Framework, que ayudan a estandarizar el manejo de valores de datos o a producir comportamientos. En ese sentido, Integer es un type que representa un valor, mientras que WriteLine es un type, en el sentido de que es un mtodo de una clase de BCL que no debe ser instanciada para funcionar.
104
Rango de valores (dominio de tipo) True o False De 0 a 255 (sin signo) Caracteres UNICODE De enero 1, 0001 a diciembre 31, 9999 a) +/-79,228,162,514,264,337, 593,543,950,335 sin punto decimal; b) +/-7.9228162514264337593543950335 con 28 posiciones despus del punto decimal; c) el mayor nmero menor a cero representable es: +/-0.0000000000000000000000000001 a) -1.79769313486231E+308 a -4.94065645841247E-324 para valores negativos; b) 4.94065645841247E-324 a 1.79769313486231E+308 para valores positivos De -2,147,483,648 a 2,147,483,647 De -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 De -32,768 a 32,767 a) -3.402823E+38 a -1.401298E-45 para nmeros negativos; b) 1.401298E-45 a 3.402823E+38 para valores positivos De 0 a aproximadamente dos mil millones de caracteres Unicode
Double
System.Double (estructura)
8 bytes
String
System.String (clase)
Depende de la plataforma
Se consideran tipos de dato numrico los siguientes: Byte, Double, Integer, Long, Short y Single. Se consideran tipos de dato no numrico los siguientes: Boolean, Date, Decimal, Object y String. Aunque Decimal almacena nmeros, el manejo que hace del punto flotante complica su manejo; Object, por su parte, puede asumir cualquier valor.
105
Algunas recomendaciones pertinentes con respecto a la definicin de tipos de datos son las siguientes:
Determine cuidadosamente el tipo de dato ms adecuado para una variable, de forma que
las operaciones a realizar con los valores no produzcan conflictos de tipos. Si, por ejemplo, va a realizar operaciones de alta precisin, el tipo de datos Integer no le servir.
Utilice el tipo de datos que consuma slo la cantidad de memoria necesaria. Si va a al-
macenar la edad de una persona, escoja Byte porque consume menos memoria que, por ejemplo, Integer.
Use, en lo posible, tipos de datos numricos, pues son los que ms eficientemente ma-
neja la computadora.
En trminos de tiempo de procesamiento, el tipo de dato ms eficiente, indiscutiblemen-
versin de tipos de datos en tiempo de ejecucin entre tipos de datos compatibles. Es preferible que usted mismo haga las conversiones; aunque es ms cmodo dejar que el lenguaje lo haga, usted pierde el control de su programa y, en caso de que se presenten problemas, ser ms difcil determinar en dnde se encuentran.
Sea previsor y acte en concordancia con respecto a las posibilidades de que un dato, y
especialmente uno de tipo numrico, pueda exceder los dominios de tipo al ser manipulado. Considere el siguiente ejemplo: un programador elige un tipo Integer partiendo del razonamiento matemtico de que la suma de dos nmeros enteros siempre es un nmero entero. Sin embargo, si se suma 2,000,000,000 ms 2,000,000,000, el resultado exceder el lmite del dominio de tipo. En este caso, el programador debi haber elegido Long, el tipo de dato en que puede convertirse la suma de dos Integer. En ocasiones los problemas originados por esta situacin (numeric overflow), se presentan despus de haber utilizado la aplicacin durante mucho tiempo.
Conversin de datos
En muchas ocasiones requerir realizar conversiones de tipos de datos, y principalmente del tipo String a otros. Se conoce como conversin de datos a cambiar el tipo de dato de un valor por otro. Existen tres formas de conversin de datos en Visual Basic.
106
Conversin explcita
La conversin explcita consiste en aplicar funciones especficas mediante cdigo para realizar la conversin. Se utiliza principalmente para convertir tipos String/Char a otros. La conversin explcita puede hacerse mediante funciones especficas y funciones genricas. Las principales funciones especficas utilizadas son las siguientes:
Funcin CBool(Expresin) CByte(Expresin) CChar(Expresin) CDate(Expresin) CDbl(Expresin) CDec(Expresin) CInt(Expresin) CLng(Expresin) CObj(Expresin) CShort(Expresin) CStr(Expresin) Consecuencia Convierte Expresin a Boolean. Convierte Expresin a Byte. Convierte Expresin a Char. Convierte Expresin a Date. Convierte Expresin a Double. Convierte Expresin a Decimal. Convierte Expresin a Integer. Convierte Expresin a Long. Convierte Expresin a Object. Convierte Expresin a Short. Convierte Expresin a String.
NombreTipoDato)
Donde Expresin es la expresin a convertir, y NombreTipoDato es el nombre del tipo de dato al que se desea convertir la expresin. Por ejemplo:
CType(4, Integer)
107
En este caso, se declara una variable llamada Edad, de tipo Integer, a la cual se le asigna el valor 30. Despus se declara una variable llamada EdadTexto que tomar la representacin String de la variable Edad; es decir, 30.
Visual Basic, como todo lenguaje de programacin, permite el uso de la memoria de la mquina a travs de las variables. Es posible acceder a los datos almacenados en las variables mediante dos tipos de acceso: tipos de valor (value type) y tipos de referencia (reference type). Dependiendo de la forma en que se tenga acceso a los valores almacenados, el consumo de memoria puede variar.
108
Los tipos de datos Boolean, Char y Date. Todas las estructuras, incluyendo aquellas que se conforman de elementos reference type.
ByVal y ByRef
Cuando los datos son pasados como argumentos a funciones y procedimientos, es posible especificar el tipo de acceso que se desea tener. Para ello eso se utilizan las palabras reservadas ByVal y ByRef. Si se utiliza ByVal, se le est especificando al procedimiento o funcin que utilice su propia versin del dato y que mantenga intacto su el valor original. Si se utiliza ByRef, se le est especificando al procedimiento o funcin que utilice la misma posicin de memoria que el dato original, por lo que las modificaciones realizadas al argumento afectan a ese dato. Es importante considerar que el uso de naturaleza del dato no se imponga.
ByVal
ByRef
Cuando sus procedimientos o funciones sean de uso genrico para varios objetos o datos, se recomienda ampliamente utilizar ByVal, a fin de que se realicen operaciones de la manera ms segura posible.
109
Strong Typing
Antes de Visual Basic, el lenguaje haba sido muy permisivo con los programadores; obviaba muchas cosas y les permita no ser formales con la tcnica, lo que a largo plazo siempre causaba problemas. Si no se declaraban las variables, si no se especificaban los tipos de datos o si no se planeaban las conversiones, Visual Basic lo haca de manera automtica. Eso provocaba que los errores de fondo fueran difciles de encontrar, ya que el universo de cosas que podan estar equivocadas exceda nuestro conocimiento dado que no todo estaba bajo nuestro control. Resultaba pattico pasar horas revisando un programa en busca de un error de lgica o algoritmo, para descubrir finalmente que el verdadero problema era un error de dedo que Visual Basic haba arreglado por nosotros sin que nos diramos cuenta. Para evitar esas penosas situaciones, existen dos estatutos que se agregan antes de cualquier cosa en el cdigo y que aseguran que la codificacin siga una tcnica formal, de tipo strong typing; es decir, donde todos los datos estn asociados de manera explcita y no ambigua a un tipo determinado.
110
Ejercicio 4.1
Demostracin del alcance de las variables y la forma en que preservan valores (I)
En este ejercicio se comprobar la forma en que funcionan los alcances de variables en Visual Basic y la forma en que podemos aprovechar su manejo para preservar valores en memoria con eficiencia. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado ValRef. 3. Edite el programa de tal forma que aparezca como sigue:
Codificacin de ValRef-Module1.vb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Option Explicit On Option Strict On Module Module1 Sub Main() Dim Texto As String = Texto Original Console.WriteLine(Texto) Valor(Texto) Console.WriteLine(Texto) Referencia(Texto) Console.WriteLine(Texto) Console.Write(Pulse INTRO para continuar) Console.ReadLine() End Sub Sub Valor(ByVal Texto As String) Texto = Texto Valor Console.WriteLine(< & Texto & >) End Sub Sub Referencia(ByRef Texto As String) Texto = Texto Referencia Console.WriteLine(< & Texto & >) End Sub End Module
111
Ejecucin guiada de
ValRef Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (oprima las teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (Oprima F5). 5. Este programa es type safe, dado que todas las variables debern declararse antes de ser utilizadas (Option Explicit) y las conversiones tienen que hacerse de forma explcita (Option Strict). 6. El programa declara una variable de memoria, llamada Texto, que se ver sometida a modificaciones en su contenido (lnea 7); de inicio, se le asigna un valor de Texto original, mismo que es mostrado en la consola (lnea 8). La variable ser proporcionada como argumento a dos procedimientos, uno de los cuales tratar el dato como valor (lneas 17 a la 20), y otro como referencia (lneas 22 a la 25). 7. Uso del dato como tipo valor. En la lnea 9 se proporciona la variable como argumento de un procedimiento llamado Valor; dicho procedimiento recibe el valor y le da tratamiento como tipo valor. En la lnea 18 se modifica el valor de Texto, por Texto Valor, y se muestran los efectos del cambio en la lnea 19. Despus de ejecutar Valor(), se muestra el contenido de la variable Texto (lnea 10); es posible observar que, aunque se modific el valor de la variable en el procedimiento, el valor original no se modific en lo absoluto. Esto se debe a que el dato fue manejado como tipo valor, lo que provoca que el argumento genere su propia copia del dato, dejando al dato original intacto. 8. Uso del dato como tipo referencia. En la lnea 11 se proporciona la variable como argumento de un procedimiento llamado Referencia; dicho procedimiento recibe el valor y le da tratamiento como tipo referencia. En la lnea 23 se modifica el valor de Texto, por Texto Referencia, y se muestran los efectos del cambio en la lnea 24. Despus de ejecutar Referencia, se muestra el contenido de la variable Texto (lnea 12); es posible notar que el valor original se modific. Esto se debe a que el dato fue manejado como tipo referencia, lo que provoca que el argumento no genere su propia copia del dato, sino que utilice para el manejo de informacin la misma posicin de memoria que el valor original.
112
Donde Identificador es el nombre que se desea asignar a la variable, y TipoDato es el tipo de dato que corresponde al valor que almacenaremos en la variable. En .NET es posible asignar un valor al momento de la declaracin (ValorInicial).
NOTA
La expresin almacenar valores en las variables de memoria es una expresin en sentido figurado: los valores no se almacenan en las variables sino en posiciones fsicas de la RAM, y las variables son slo el medio a travs del cual se tiene acceso a dichas posiciones de memoria. Cuando se dice que almacenamos valores en las variables, nos referimos a que almacenamos valores en una posicin fsica de memoria, que es referida por el identificador de la variable.
113
La especificacin del tipo de dato a travs de la palabra reservada As es opcional; si se omite la especificacin de tipo de dato, la variable se declara automticamente bajo el tipo Object. Esta declaracin automtica garantiza que no se utilice una variable que no ha sido declarada; sin embargo, es la alternativa ms ineficiente, ya el CLR tendr que invertir tiempo constantemente en determinar qu tipo de valor es el que est almacenado en la variable. A continuacin se muestran ejemplos de declaracin de variables:
1 2 3 4 5 6 Dim Dim Dim Dim Dim Dim Edad Edad As Edad As Edad As Nombre, Nombre,
La lnea 1 declara una variable Object. La lnea 2 declara una variable Integer. La 3 es exactamente igual a la lnea 2, ya que Integer es la referencia a System.Int32. La lnea 4, adems de declarar la variable, le asigna un valor de inicio. La lnea 5 demuestra que se pueden declarar varias variables de un mismo tipo, separando los identificadores con comas. La lnea 6 demuestra que Dim acepta la declaracin de dos o ms variables de un mismo tipo, y de dos o ms tipos.
Constantes
Se conoce como constantes a las variables que slo cambiarn su valor una vez en su tiempo de vida. Para definirlos se utiliza la siguiente sintaxis.
Const
Donde Identificador es el identificador de la constante, TipoDato es el tipo de dato que tendr la constante y ValorInicial es el valor que tendr la constante durante todo su tiempo de vida. Por ejemplo:
Const PI As Single = 3.1416
Literales
Si se menciona un nmero 4, no tenemos suficiente informacin para saber si el nmero es Byte, Integer, Double, Decimal, dado que 4 puede ser de cualquiera de esos tipos. Lo mismo ocurrira con A, dado que no sabramos si se trata de un dato String o Char.
114
Se tienen literales que permiten definir un valor, liberndolo de las ambigedades de tipo que pudiera tener. Las literales son las siguientes:
Type Boolean Char Decimal Double Integer Long Short Single String Literal True False C D R I L S F Ejemplo de uso True False AC 3.1416D 3.1416R 10I 10L 10S 3.14F A
Ejercicio 4.2
Demostracin de la declaracin de variables, constantes, y la realizacin de conversiones
En este ejercicio se utilizar una aplicacin de consola para comprobar la declaracin y uso de variables en un proceso.
115
1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado AreaRectangulo. 3. Edite el programa de tal forma que aparezca como sigue.
Codificacin de AreaRectangulo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Module Module1
- Module1.vb
Sub Main() Const Titulo As String = - Rectngulo - Dim Base As Integer Dim Altura As Single = 0 Dim Resultado As Single, Entrada As String Console.WriteLine(Titulo) Console.Write(Base: ) Entrada = Console.ReadLine() Base = CInt(Entrada) Console.Write(Altura: ) Entrada = Console.ReadLine() Altura = CType(Entrada, Single) Resultado = (Base * Altura) Console.WriteLine(Resultado: & Resultado.ToString()) End Sub End Module
116
6. Seleccione en Solution Explorer el proyecto; para ello coloque el puntero sobre el nombre del proyecto AreaRectangulo, haga clic con el botn derecho del ratn para desplegar el men contextual y seleccione Build.
7. Vea en Output cmo se procesa solamente el proyecto recin desarrollado. Cuando su proyecto ya no presente errores, podr construirse la solucin, y ejecutarse con confianza.
Module1.vb
8. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solucin (oprima las teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (F5). 9. La lnea 4 declara una constante, a la cual se le asigna como valor el mensaje que ha de aparecer como encabezado del programa (lnea 9); en la lnea 5 se muestra una declaracin de variable en su forma ms sencilla; en la lnea 6 se comprueba que es posible asignar un valor inicial al momento de la declaracin; en la lnea 7 se comprueba la posibilidad de declarar mltiples variables de mltiples tipos en una misma lnea (aunque esta prctica no se recomienda porque podra hacer perder claridad al cdigo). 10. En la lnea 9 se muestra el ttulo del programa en la consola, en la 10 se muestra el mensaje que pregunta la base del rectngulo y en la 11 se asigna a la variable Entrada el valor que el usuario ingresa desde la consola. 11. Como el dato se recibe en formato String desde la consola, la lnea 12 se encarga de convertirlo en Integer, utilizando para ello la funcin especfica CInt; el resultado es asignado a la variable Base. La misma mecnica se seguir para preguntar y convertir
117
la altura del rectngulo, con la diferencia de que se utilizar para la conversin la funcin genrica CType. 12. La lnea 17 calcula el rea del rectngulo, asignando el valor a la variable Resultado. Como Resultado es de tipo Single, posee de forma intrnseca el mtodo ToString, que es utilizado en la lnea 18 para mostrar los resultados. 13. Todas las conversiones que realizamos en este programa pudieron haberse obviado, dado que el programa no es type safe; es decir, el CLR hubiera realizado la conversin cast en caso de que nosotros no la hubiramos llevado a cabo de manera explcita. 14. Proporcione un valor de 10 para la base y 15 para la altura, y vea los resultados. Si todo ocurri como se esperaba, la salida ser la siguiente:
Entrada - Rectngulo Base: 10 Altura: 15 Resultado: 150
Sabemos que una clase es la definicin formal de un tipo de objeto. Un objeto es la instancia de una clase; ste puede contener informacin y comportamiento. En el caso de los datos almacenados en memoria a travs de un objeto, stos pueden estar disponibles al usuario mediante referencias. Uno hace referencia al objeto, y el objeto hace referencia a una posicin de memoria en donde se encuentra el dato; esa intermediacin que realiza el objeto para llegar al dato consume recursos de almacenamiento temporal en la computadora (lo que se conoce como heap allocation). Este tipo de variables exigen ms recursos, pero ofrecen mayor funcionalidad.
Una estructura (structure) es muy similar a una clase, en el sentido de que puede almacenar datos y mtodos; la diferencia con respecto a una variable basada en una clase es que la variable basada en estructura contiene de manera directa los datos definidos en la estructura; esto elimina la necesidad de una intermediacin entre la variable y el dato, por lo que no se consumen recursos adicionales de la computadora en el rea de almacenamiento temporal.
En la tabla que muestra los tipos de datos disponibles en Visual Basic se hace referencia a la estructura o la clase en la que se basan.
118
El hecho de que las variables tengan su origen en una estructura o clase les proporciona una funcionalidad extendida y extensible, que hace de las variables un elemento del lenguaje con vida propia.
El alcance de bloque se presenta cuando la variable est disponible slo en el bloque de cdigo en el que est declarada. El alcance de bloque es el ms estrecho, en el sentido de que la variable tiene la menor vigencia posible. Cmo se define: declarando la variable dentro de un bloque de cdigo.
119
El alcance de procedimiento se presenta cuando la variable est disponible slo para el procedimiento en el que est declarada. Cuando las variables pueden ser utilizadas slo dentro del procedimiento que las declara, reciben el nombre de variables locales. Cmo se define: declarando la variable dentro de un procedimiento, pero no dentro de un bloque; se recomienda declarar al inicio del procedimiento, antes de cualquier bloque de cdigo. El alcance de mdulo se presenta cuando la variable est disponible para todos los procedimientos de un determinado mdulo, clase o estructura en la que est declarada. Cmo se define: declarando la variable dentro del captulo, clase o estructura, antes de declarar cualquier procedimiento.
nombres se presenta cuando la variable est disponible para todos los mdulos, clases o estructuras contenidas en un espacio de nombres. Este alcance es el de mayor amplitud. Cmo se define: declarando una variable a nivel mdulo, con accesibilidad Friend o Public (que se ver ms adelante).
Shadowing
Existe la posibilidad de que en un mismo programa existan dos variables con el mismo nombre; esto puede parecer contradictorio, ya que se haba expresado que cada variable debe tener un identificador nico. Ya con el conocimiento que hemos adquirido, podemos decir que dos variables no pueden compartir el mismo identificador si tienen el mismo alcance. En resumen, pueden existir variables homnimas si se declaran con diferente alcance; en ese sentido, podemos declarar una variable variableZ a nivel mdulo, y una variable variableZ dentro de un procedimiento, lo cual no causar problemas al momento de compilar, pero s se podr generar un procesamiento particular en tiempo de ejecucin. El hecho de que dos variables tengan el mismo identificador no causa problema para Visual Basic siempre y cuando tengan alcances distintos; el programa utilizar para el procesamiento de datos aquella variable con alcance ms estrecho; a este comportamiento se le da el nombre de shadowing. Los valores de variables con el mismo nombre y distinto alcance sern mantenidos en tiempo de ejecucin, a fin de utilizar el valor de menor alcance segn se requiera en el programa.
120
Conocidas como variables pblicas. Se proporciona acceso pblico a la variable; es decir, no hay restricciones de uso de la variable cuando se define como pblica. Slo se puede definir a nivel captulo, espacio de nombres o archivo fsico; nunca a nivel procedimiento. Conocidas como variables protegidas. Se proporciona acceso protegido a la variable; es decir, pueden ser utilizadas slo por la clase en que se declar la variable, o en aquellas clases derivadas de sta. Slo se puede definir a nivel clase, nunca a nivel procedimiento.
Protected.
Friend.
Se proporciona acceso que asume confianza hacia el usuario (de ah lo amistoso); pueden ser utilizadas por el programa que la declara, y por todos aquellos que se encuentren en el mismo ensamblado. Slo se puede definir a nivel captulo, espacio de nombres o archivo fsico; nunca a nivel procedimiento. Se proporciona la unin de restricciones de
Protected
Protected Friend.
Friend.
y de
Private.
Conocidas como variables privadas. Se proporciona acceso privado a una variable. Slo estn disponibles para el alcance en el que fueron declaradas. Slo se puede definir a nivel captulo, espacio de nombres, o archivo fsico; nunca a nivel procedimiento.
Static.
Conocidas como variables estticas. Permite incrementar la persistencia del valor de las variables, manteniendo el ltimo valor que haya asumido aun despus de la terminacin del procedimiento que la declar. Slo se puede definir a nivel procedimiento. No se pueden declarar variables estticas en los procedimientos de una estructura; slo se aceptan para los procedimientos de clases. Static es muy similar a una variable Public pero se diferencian por el lugar en donde se declaran. En cierta forma, las variables Static seran como variables pblicas declaradas en los procedimientos.
Shared.
Conocidas como variables compartidas. Indica que la variable no est asociada con la instancia de una clase o estructura determinada. Se puede acceder a una variable compartida a travs de un calificador anteponiendo al nombre de la variable el nombre de la clase en donde se declar inicialmente, ms un punto separador. Slo se puede definir a nivel captulo, espacio de nombres o archivo fsico; nunca a nivel pro-
121
cedimiento. Las variables compartidas (shared variables) identifican una sola unidad de almacenamiento, sin importar cuntas instancias de la clase que la declara hayan sido creadas. Cuando una variable no es definida como compartida, se conoce como variable de instancia (instance variable), y cada instancia mantiene la referencia de su propio valor. Este tipo de variables es especialmente til para trasladar valores de un formulario a otro, en aplicaciones de formularios mltiples, ya que no basta con que las variables sean pblicas.
ReadOnly.
Si no se especifica alguna opcin de accesibilidad, las variables sern variables de instancia y privadas (instance variable, private). En caso de que se desee asignar alguna opcin de accesibilidad, la especificacin pasa a ser el estatuto de declaracin y puede sustituir a Dim. Por ejemplo:
Static Dim Edad As Integer
Es lo mismo que:
Static Edad As Integer
4
NOTA
En el caso de la accesibilidad es importante tener en cuenta la accesibilidad del objeto contenedor de la variable (objeto que contiene a otro objeto). Se puede proporcionar permiso a nivel procedimiento, pero si no se tiene permiso para disponer del captulo, clase o estructura que contiene el procedimiento mencionado, no ser posible llegar nunca a l.
Ejercicio 4.3
Demostracin del alcance de las variables y la forma en que preservan valores (II) En este ejercicio se comprobar la forma en que funcionan los alcances de variables en Visual Basic y la forma en que podemos aprovechar su manejo para preservar valores en memoria con eficiencia. 1. Abra la solucin Ejercicios, que debe encontrarse en (archivo de extensin sln). 3. Edite el programa de tal forma que aparezca como sigue:
C:\APVBNETVS\Ejercicios
122
Codificacin de Alcance
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 Option Explicit On Option Strict On
- Module1.vb
Module Module1 Dim Texto1 As String = Alcance mdulo Sub Main() Console.WriteLine(Texto1) Dim Texto2 As String = Alcance procedimiento If Texto2 <> Then Console.WriteLine(Texto2) Dim Texto3 As String = Alcance block Console.WriteLine(Texto3) End If Procedimiento1() Procedimiento1() Procedimiento1() Procedimiento2() Console.WriteLine( ) Console.Write(Pulse INTRO para continuar) Console.ReadLine() End Sub Sub Procedimiento1() Static Texto4 As String Texto4 = Valor + & Texto4 Dim Texto5 As String = Texto 5 Console.WriteLine(Procedimiento 1 ) Console.WriteLine(Texto 1: & Texto1) Console.WriteLine(Texto 4: & Texto4) Console.WriteLine() End Sub Sub Procedimiento2() Console.WriteLine(Procedimiento 2 ) If Texto1 <> Then Dim Texto1 As String = Shadow Console.WriteLine(Texto 1: & Texto1) End If Console.WriteLine(Texto 1: & Texto1) Console.WriteLine() End Sub End Module
123
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solucin (oprima las teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (Oprima F5). 5. Este programa es type safe, dado que todas las variables debern declararse antes de ser utilizadas (Option Explicit) y las conversiones tienen que hacerse de forma explcita (Option Strict) (lneas 1 y 2). 6. Se declaran variables con diferente alcance en las lneas 5, 9 y 12. En la lnea 5 se declara la variable Texto1; sta tiene un alcance a nivel mdulo, debido a que se declara dentro del mdulo, fuera de cualquier procedimiento.
Main(), Procedimiento1()
Esta variable podr ser utilizada por todos los procedimientos del mdulo, es decir, y Procedimiento2(); esto se comprueba en la lneas 8 y 29, pues se despliega en la consola una variable no definida en esos procedimientos. En la lnea 9 se declara la variable Texto2, que tiene un alcance a nivel procedimiento, por estar declarada dentro de un procedimiento especfico, pero fuera de un bloque de cdigo; por esa razn se trata de una variable local. Esta variable estar disponible slo para Main(), pero no para otros procedimientos.
En la lnea 12 se declara la variable Texto3, que tiene un alcance a nivel bloque de cdigo y estar disponible desde que se declara (lnea 12) hasta que se encuentre el estatuto que marca el final del bloque de cdigo (en este caso End If, en la lnea 14). Si se trata de utilizar la variable Texto3 despus de la lnea 14, pensando que es una variable local (de alcance a nivel procedimiento), nuestro programa generar error, ya que la variable slo existe declarada para el bloque en que se declara. 7. Comprobacin de la variable esttica. En la lnea 15 se manda ejecutar Procedimiento1(); en dicho procedimiento se define una variable esttica llamada Texto4 (lnea 25). Esta variable tendr un tiempo de vida que excede el tiempo de vida del procedimiento que la declara, ya que por ser esttica, mantendr los valores en memoria aun despus de concluida la ejecucin del procedimiento. En la lnea 26 se asigna a Texto4 la constante String Valor + que se concatenar con el valor que tenga la misma Texto4; en virtud de que la variable es esttica, el valor que va adoptando se comporta como un acumulador, que nunca pierde el valor que tena, obtenido de procesamientos anteriores.
124
Las lneas 16 y 17 mandan ejecutar Procedimiento1(), a fin de que se compruebe que efectivamente la variable mantiene su valor al correr de las mltiples ejecuciones del procedimiento. 8. Comprobacin de shadowing. Ya vimos que en la lnea 5, Texto1 se defini con un alcance a nivel mdulo y, al momento de declarar la variable, se le asign el valor Alcance mdulo. En Procedimiento2(), se vuelve a definir la variable Texto1 (lnea 37) y se le asigna al momento de declaracin el valor Shadow. 9. a) Qu alcance tiene la variable Texto1, declarada en la lnea 37?
Como podr darse cuenta, el programa no genera conflicto con la doble declaracin de la variable; simplemente utiliza aquella que tenga menor alcance. Si todo ocurri como se esperaba, la salida ser la siguiente:
Alcance mdulo Alcance procedimiento Alcance block Procedimiento 1 Texto 1: Alcance mdulo Texto 4: Valor + Procedimiento 1 Texto 1: Alcance mdulo Texto 4: Valor + Valor + Procedimiento 1 Texto 1: Alcance mdulo Texto 4: Valor + Valor + Valor + Procedimiento 2 Texto 1: Shadow Texto 1: Alcance mdulo Pulse INTRO para continuar
125
10. Modifique la lnea 21, sustituyendo el estatuto de declaracin Static por Dim. Ejecute el programa nuevamente, y explique qu sucede:
Arreglos
Se conoce como arreglos (arrays) tambin llamados matrices en algunos casos a un conjunto de posiciones en memoria que son referidas por un mismo identificador. Se accede a un dato almacenado en una posicin de memoria dentro de un arreglo a travs de un subndice, que es la posicin secuencial de cada elemento dentro de la coleccin. Los subndices, como en todos los lenguajes de .NET, son de base cero; es decir, inician en cero. En Visual Basic, los arreglos tienen un tratamiento de colecciones, por lo cual los subndices siempre se especifican entre parntesis. Las colecciones son conjuntos de objetos lgicamente relacionados, diferenciados por un subndice. En su calidad de colecciones, pueden ser explorados con la instruccin For taxis es la siguiente:
For Each Each, cuya sin-
Next
Donde Elemento es la variable de trabajo en donde se almacenar el elemento (TipoDato), que de no especificarse asumir el mismo tipo de dato que tengan los elementos de la coleccin. Coleccin es la coleccin de objetos que podrn ser ledos de forma secuencial utilizando For Each. BloqueCodigo es el bloque de cdigo que se ejecutar de forma iterativa para cada elemento de la coleccin explorado. Al encontrar Next, el proceso iterativo comienza nuevamente; es posible interrumpir el ciclo en cualquier momento utilizando Exit For.
126
Arreglos unidimensionales
Los arreglos unidimensionales se conocen simplemente como arreglos, y requieren de un slo subndice para tener acceso a un elemento del arreglo. La forma de declarar un arreglo en Visual Basic es la siguiente.
Dim Arreglo(MximoSubndice) As TipoDato
Donde Arreglo es el identificador del arreglo; su denominacin sigue las mismas reglas que las variables. MximoSubndice es el nmero mayor de subndice del arreglo y TipoDato es el tipo de dato de los elementos del arreglo. Por ejemplo:
Dim VentaMensual(11) As Integer
En este caso se tiene un arreglo de 12 posiciones (0 a 11), donde los elementos son de tipo Integer. En caso de que no se especifique un nmero determinado de elementos, el arreglo ser de un nmero indeterminado de elementos.
Dim VentaMensual() As Integer
A este tipo de arreglos se les llama arreglos unidimensionales, pues nicamente es necesario especificar un subndice para tener acceso a una de sus posiciones en memoria. Tambin es posible asignar valores al momento de declarar un arreglo. En ese caso no se deber especificar nmero de elementos, ya que ste se calcular automticamente considerando el nmero de valores que se especifiquen entre llaves ({ }), separados por comas (,). La sintaxis correspondiente es la siguiente:
Dim
Donde Arreglo es el nombre del arreglo, TipoDato es el tipo de dato de los elementos y SerieValores es la serie de valores que asumirn los elementos; los valores debern estar separados por comas. Por ejemplo:
Dim Numeros() As Integer = {10,20,40,100}
127
Arreglos multidimensionales
Se conoce como arreglo multidimensional a un conjunto de posiciones en memoria que son referidas por un solo identificador a travs de dos o ms subndices. Al nmero de subndices que es necesario especificar para tener acceso a una posicin de memoria de un arreglo se le llama dimensionalidad (dimensionality) o rango (rank); Visual Basic acepta hasta 32 dimensiones. A los arreglos de dos dimensiones (dimensionalidad 2), que son los multidimensionales ms utilizados, se les da el nombre de arreglos rectangulares. La sintaxis para definirlos es la siguiente:
Dim Arreglo(MS1,MS2,...,MSn) As TipoDato
Donde Arreglo es el identificador del arreglo; su denominacin sigue las mismas reglas que las variables. MS1 es el nmero mayor de subndice para la dimensin 1, MS2 es el nmero mayor de subndice para la dimensin 2, y as hasta definir todas las dimensiones. TipoDato es el tipo de dato de los elementos del arreglo. Por ejemplo:
Dim VentaTrim(2,3) As Integer
En este caso se tiene un arreglo de 12 posiciones (de 0 a 2, 3 posiciones; de 0 a 3, 4 posiciones; 3 posiciones 4 posiciones=12), donde los elementos son de tipo Integer. En caso de que no se especifique un nmero determinado de elementos, el arreglo ser de un nmero indeterminado de elementos.
Dim VentaTrim(,) As Integer
A este tipo de arreglos se les llama arreglos multidimensionales, pues es necesario especificar un subndice para tener acceso a una posicin en memoria del arreglo. Tambin es posible asignar valores al momento de declarar un arreglo. En ese caso no se deber especificar nmero de elementos, ya que el nmero de elementos se calcular automticamente considerando el nmero de valores que se especifiquen entre llaves ({ }), separados por comas (,). Cada llave constituye la serie de valores para una dimensin. La sintaxis sera la siguiente.
Dim
Donde Arreglo es el nombre del arreglo, TipoDato es el tipo de dato de los elementos, y SerieValores1 y SerieValores2 es la serie de valores que asumirn los elementos; los valores debern estar separados por comas.
128
Ejemplo.
Dim VentaTrim(,) As Integer = {{1000,20000,10000,5000}, _ {2000,30000,15000,2000}}
Arreglos escalonados
Se conoce como arreglos escalonados (jagged arrays) a un arreglo que almacena arreglos. La sintaxis para su definicin sera la siguiente.
Dim
Arreglo()() As TipoDato
Donde Arreglo es el identificador del arreglo; su denominacin sigue las mismas reglas que las variables. Dependiendo el nmero de arreglos que se desee incluir, se debern agregar pares de parntesis despus del nombre de variable. TipoDato es el tipo de dato que tienen los elementos en los arreglos. Por ejemplo:
Dim Numeros()() As Byte
En este caso se tiene un arreglo que almacenar dos arreglos, donde los elementos son de tipo Byte. Tambin es posible asignar valores al momento de declarar un arreglo. En ese caso, los valores son definiciones de arreglos.
Dim
Donde Arreglo es el nombre del arreglo, TipoDato es el tipo de dato de los elementos, y Arreglo1 y Arreglo2 son arreglos con elementos que son TipoDato; los arreglos debern estar separados por comas. Por ejemplo:
Dim Numeros()() As Byte = { Byte(){10,15,12,11}, _ Byte() {40,50,60} }
129
En este caso, Numeros(0)(3) tendr el valor de 11. Estaramos extrayendo, del arreglo 0, el elemento 3. El primer subndice indica el nmero de arreglo del que se trata, mientras que el segundo indica el o los subndices del elemento que queremos extraer. Un arreglo escalonado puede contener arreglos unidimensionales o multidimensionales. Los arreglos escalonados no son lo mismo que los arreglos multidimensionales; estos ltimos pueden llegar a consumir cantidades muy grandes de memoria. Por ejemplo, si se quiere almacenar en un arreglo el nmero de identificacin de 1000 empleados y 5 nmeros de categoras de empleados, un arreglo multidimensional ocupara 1000 5 posiciones de memoria, es decir, 5000; un arreglo escalonado, por el contrario, requerira slo 1000 5, es decir, 1005. Si el arreglo fuera de datos Long (8 bytes), la diferencia en consumo de memoria sera de 31,960, que podra implicar un ahorro muy importante. Algo que es importante tomar en cuenta es que los arreglos escalonados no forman parte de CLS, por lo que trabajarn adecuadamente slo en implementaciones Microsoft, y no en otras plataformas que implementen considerando CLS como base.
Ejercicio 4.4
Comprobacin del uso de arreglos unidimensionales, multidimensionales y escalonados En este ejercicio se comprobar la forma en que funcionan los alcances de variables en Visual Basic y la forma en que podemos aprovechar su manejo para preservar valores en memoria con eficiencia. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado Arreglos. 3. Edite el programa de tal forma que aparezca como sigue:
130
Codificacin de Arreglos
- Module1.vb
1 2 3 4 5 6 7 8 9 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
Option Explicit On Option Strict On Module Module1 Sub Main() Dim i As Integer Console.WriteLine(Arreglo unidimensional 1:) Dim Uni1() As Integer = {22, 49, 20, 40} For Each i In Uni1 Console.WriteLine(i) Next Console.WriteLine(Arreglo unidimensional 2:) Dim Uni2() As Integer = {55, 66, 77} For Each i In Uni2 Console.WriteLine(i) Next Console.WriteLine(Arreglo Dim Multi(,) As Integer = Console.WriteLine( _ String.Format(Fila 0: Multi(0, 1))) Console.WriteLine( _ String.Format(Fila 1: Multi(1, 1))) Console.WriteLine( _ String.Format(Fila 2: Multi(2, 1))) multidimensional:) {{92, 49}, {44, 20}, {10, 48}} {0},{1} , Multi(0, 0),
Console.WriteLine(Arreglo escalonado:) Console.WriteLine(Arreglo 1, posicin 2) Dim Esca()() As Integer = {Uni1, Uni2} Console.WriteLine(Esca(1)(2)) Console.Write(Presione INTRO) Console.ReadLine() End Sub End Module
131
Module1.vb
4. Construya la solucin (Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (oprima F5). 5. En la lnea 10 se declara un arreglo unidimensional, llamado Uni1, y al mismo tiempo que se declara se le asignan valores a las posiciones de memoria del arreglo. Se trata de un arreglo de cuatro posiciones de memoria, por lo que sus subndices irn de 0 a 3. 22 49 20 40
4
En la lnea 11 se inicia una estructura For Each que permitir hacer una lectura de los valores almacenados en el arreglo. La estructura utilizar la variable i, que es de tipo Integer, para trabajar cada uno de los elementos del arreglo Uni1. La estructura For Each comenzar una lectura secuencial de todos los elementos, desde el subndice 0 hasta el 3; i asumir el valor del elemento que se est leyendo en el momento, por lo que trabajar con i es como estar trabajando con el elemento del arreglo. La lnea 12 provoca que se vea en la consola el contenido de cada una de las posiciones en memoria. La lnea 16 declara un arreglo unidimensional de tres posiciones, llamado Uni2, que ser utilizado junto con Uni1 ms adelante. El proceso para el mostrado de contenido se repite con Uni2. Sus valores son los siguientes: 55 66 77 6. En la lnea 22 se declara un arreglo multidimensional, llamado Multi, constituido por dos dimensiones. Se asignan valores al momento de la declaracin, que nos indican que el arreglo ser de dos columnas y tres filas. Vea cmo el nmero de series de valores de-
132
termina el nmero de filas, mientras que el nmero de elementos de cada serie de valores determina el nmero de columnas: 92 44 10 49 20 48
Las lneas de la 23 a la 28 se encargan de mostrar los valores que componen cada fila. Para ello nos apoyamos de la funcin String.Format, que hace una sustitucin directa de parmetros. Vea cmo funciona:
String.Format(Primer valor {0} segundo valor {1}, 10, 20)
Los parmetros se incluyen con base 0, y deber proporcionarse una serie de valores separados por comas despus del String que queremos construir. El primer valor de la serie toma la primera posicin ({0}), el segundo la segunda ({1}), y as sucesivamente. Los subndices en los arreglos indican la fila y la columna, considerando una base cero. 7. La lnea 32 define un arreglo escalonado, llamado Esca, que almacena los arreglos Uni1 y Uni2: 22 49 20 40 La lnea 33 muestra, del segundo arreglo almacenado (subndice 1), el tercer elemento almacenado (subndice 2). Entre los primeros parntesis ir el subndice del arreglo escalonado; es decir, permite seleccionar al arreglo a inspeccionar. En los siguientes parntesis se coloca el subndice (o subndices) del arreglo seleccionado. A diferencia de un arreglo multidimensional, en donde todas las filas tienen igual nmero de columnas, en un arreglo escalonado la forma y dimensiones dependen de los arreglos almacenados. 55 66 77
133
8. Vea el siguiente ejemplo y coloque las referencias que hacen falta. a) Para utilizar Uni1 b) Para utilizar Uni2 c) Para utilizar Multi d) Para utilizar Esca 49 =
Uni1(1)
Estructuras y enumeraciones
Estructuras
Las estructuras (structures) son la implementacin de estructuras de datos definidos por el usuario en Visual Basic. Las estructuras son elementos value type y pueden contener datos y comportamientos. Son muy parecidas a las clases, con la diferencia que estas ltimas son reference type. La forma de implementar estructuras se identifica de acuerdo con la siguiente sintaxis:
Structure
NombreEstructura
Elementos
End Structure
134
donde NombreEstructura es el nombre de la estructura en cuestin, y Elementos podrn ser variables, funciones, procedimientos y eventos asociados a aqulla. Por ejemplo:
Structure NombreCompleto Public Nombre As String Public ApellidoPaterno As String Public ApellidoMaterno As String Function End Structure
En este caso se declar una estructura que almacena el nombre y los apellidos de una persona. Las variables que componen la estructura tienen acceso pblico, a fin de ser utilizadas de forma abierta. En caso de que se tengan en una estructura variables que se utilicen slo dentro de la estructura misma, la accesibilidad deber variarse.
Enumeraciones
Las enumeraciones (enumerations) son colecciones de valores constantes, nominados con el fin de limitar un dominio determinado. Son muy tiles para evitar el uso de valores no vlidos para elementos clasificados, como podran ser colores, categoras, estados, etctera. La forma de implementar enumeraciones se realiza de acuerdo con la siguiente sintaxis:
Enum
NombreEnumeracin Elementos
End Enum
Donde NombreEnumeracin es el nombre de la enumeracin, y Elementos podrn ser las constantes permitidas. A las constantes se les puede asignar o no un valor de inicio. Por ejemplo:
Enum Estado Activo Inactivo End Structure
En este caso se declar una enumeracin que permite el uso de las referencias Estado.Activo y Estado.Inactivo como valores vlidos. Pudo haber sido tambin de la siguiente forma:
Enum Estado Activo = A Inactivo = I End Structure
135
MAPA
136
TERMINOLOGA
Accesabilidad, 100, 120 Accessibility, 100, 120 Alcance, 100, 118 de bloque, 118 de espacio de nombres, 119 de mdulo, 119 de procedimiento, 119 Arrays, 125 Arreglo(s), 125 dimensional, 127 escalonados, 128 unidimensionales, 126 As, 113 Block scope, 118 Bloque(s) condicionales, 118 de cdigo, 118 no condicionales, 118 Boolean, 104 ByRef, 108 Byte, 104 ByVal, 108 Camel casing, 102 Casting, 106 Char, 104 Code block, 118 Colecciones, 125 Constantes, 113 Conversin de datos, 104 explcita, 106 implcita, 106 por mtodo, 107 Datatype, 100, 103 Date, 104 Decimal, 104 Dim, 112 Dimensionalidad, 127 Dimensionality, 127 Dominio, 103 Double, 104 Enum, 134 Enumeraciones, 134 Enumerations, 134 Estructura, 117, 133 Friend, 120 Hungarian notation, 102 Identificador, 100 Identifier, 100 Instance variable, 121 Instruccin de declaracin (Dim), 112 Integer, 104 Jagged arrays, 128 Lifetime, 100 Literales, 113 Long, 104 Matrices, 125 Module scope, 119 Namespace scope, 119 Narrowing, 106 Notacin hngara, 102 Option Explicit, 109 Strict, 109 Pascal casing, 101 Private, 120 Procedure scope, 119 Programas de tipo de datos asegurados, 109 reforzados, 109 Protected, 120 Friend, 120 Public, 120 Rango, 127 Rank, 127 ReadOnly, 121 Reference type, 107 Scope, 100, 118 Shadowing, 119 Shared, 120 Short, 104 Single, 104 Static, 120 String, 104 Strong type, 109 typing, 109 Structure(s), 117, 133 Subndice, 125 Tiempo de vida, 100 Tipo de dato, 100, 103 no numrico, 104 numrico, 104 Tipos de referencia, 107 de valor, 107 Type safe, 109 Value type, 107 Variable(s) basadas en clase (intermediacin requerida), 117 basadas en estructura(sin intermediacin requerida), 117 compartidas, 120 de instancia, 121 de memoria, 99 de solo lectura, 121 estticas, 120 privadas, 120 protegidas, 120 pblicas, 120 Widening, 106
PREGUNTAS
4.1 Qu son las variables y cules son sus principales caractersticas? 4.2 Qu son los arreglos y de qu tipos hay? 4.3 Explique la diferencia entre Value Type y Reference Type. 4.4 Cmo se puede lograr que un programa sea strong typing? 4.5 Qu tipos de datos acepta .NET? Enumrelos y proponga un ejemplo de un dato de la vida real que encaje dentro del dominio de tipo.
137
Notas:
138
EXAMEN
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
1. Es la referencia lgica a una posicin fsica de la memoria RAM: a) Estructura b) Variable c) Tipo de dato 2. Es el estatuto que ayuda a que el cdigo sea type safe: a) Option Explicit b) Option Strict c) Option Compare 3. Es el atributo que define la cantidad de cdigo en que una variable puede ser utilizada sin invocar su calificador: a) Alcance b) Accesibilidad c) Tiempo de vida 4. Es el permiso que se proporciona al cdigo para poder leer y escribir en una variable: a) Alcance b) Accesibilidad c) Tiempo de vida 5. Es el comportamiento que da preferencia a la variable de alcance ms estrecho: a) Selecting b) Scoping c) Shadowing
CAPTULO
utilizarlos.
1. Conocer qu son los espacios de nombres. 2. Sabr cules son los espacios de nombres ms utilizados en .NET. 3. Se familiarizar con el manejo de los nombres calificados para in-
vocar espacios de nombres. 4. Aprender a importar espacios de nombres en un programa. 5. Aprender a crear espacios de nombres definidos por el usuario y se familiarizar con la forma en que se utilizan en forma de libreras. 6. Aprender el uso de alias de espacios de nombres.
139
140
Contenido
Espacios de nombres (namespaces) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nomenclatura para los espacios de nombres . . . . . . . . . . . . . . . . . . . . Microsoft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de namespaces propios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alias para los espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Independencia de los ensamblados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin y consumo de una librera (DLL) basada en un espacio de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de una librera DLL . . . . . . . . . . . . . . . . . . . . . Revisin de todos los elementos asociados a un proyecto, usando Solution Explorer . . . . . . . . . . . . . . . . Establecimiento de una referencia a una librera desde Solution Explorer . . . . . . . . . . . . . . . . . . . . . . . . . Consumo de una librera programticamente . . . . . . . . Utilizacin del depurador (Debug) de Visual Studio y la ejecucin lnea a lnea basada en puntos de interrupcin (breakpoints) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Establecimiento de un punto de interrupcin (breakpoint) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejecucin lnea por lnea (Code Stepping) . . . . . . . . . . . Modificacin de programas en tiempo de ejecucin . . . Puntos de interrupcin condicionales . . . . . . . . . . . . . . . Habilitacin e inhabilitacin de puntos de interrupcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eliminacin de los puntos de interrupcin (breakpoint) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizacin de Command Window . . . . . . . . . . . . . . . . . . . . . . . . Escritura de comandos de Visual Studio usando Command Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de herramientas avanzadas para la depuracin . . . . . . . . . Apilado de herramientas en Visual Studio . . . . . . . . . . . Ventanas de variables (variable windows) . . . . . . . . . . . Ventanas de inspeccin de cdigo . . . . . . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 143 143 144 148 149 150 151 151 153 153 154 155 156
157 158 158 159 160 161 161 162 162 165 165 166 168 170 171 171 173
141
142
Tener muchos archivos fsicos de libreras constituye una ventaja, pues implica que el lenguaje ya contiene muchas funciones que no ser necesario programar; por otro lado, plantea un problema, pues encontrar tantos archivos no resulta prctico. NOTA
Las libreras de vnculos dinmicos que conforman el .NET Framework cumplen con todas las especificaciones de .NET y, por tanto, son ensamblados; aclaramos esto para que no intente llevar estos archivos DLL a otro sistema y registrarlos, pensando que funcionarn: si no tiene instalado .NET Framework no lo harn porque son ensamblados y, por tanto, son cdigo administrado que requiere la presencia del CLR.
Buscando la simplificacin, Microsoft cre un sistema lgico que permite organizar y categorizar las clases disponibles en las libreras que componen el .NET Framework, basndose en un concepto: los espacios de nombres (namespaces). Los espacios de nombres proporcionan una estructura que organiza y simplifica la referencia a las clases a travs del .NET Framework, y no slo Microsoft Visual Basic puede usar los espacios de nombres; tambin pueden hacerlo el resto de los lenguajes .NET, ya que realmente conviven con el CLR. Es muy importante sealar que los espacios de nombres no tienen nada que ver con la herencia entre las clases. Los espacios de nombres slo estn relacionados con la identificacin de clases, y no con la jerarqua madre-hija de stas. Ciertamente, los espacios de nombres sugieren una jerarqua, pero sta no tiene nada que ver con la herencia entre clases; realmente se trata de un agrupamiento basado en funcionalidad. Quienes desarrollan basndose en la tecnologa COM estn conscientes de que los espacios de nombres son la evolucin lgica de los identificadores ProgID. Un espacio de nombres es dos cosas: a) un convencionalismo de nomenclatura y b) un esquema lgico de organizacin de clases de .NET Framework. Los espacios de nombres organizan colecciones de clases y eliminan la ambigedad al momento de hacer referencias a ellas. Un mismo espacio de nombres puede hacer referencia a diferentes archivos DLL que contengan clases de funcionalidad similar. Los espacios de nombres parten de dos grandes grupos: System y Microsoft. A partir de ah se generan subgrupos especiales, de acuerdo con la funcionalidad.
143
Microsoft
El espacio de nombre Microsoft y todas sus dependencias ayudan a integrar las tecnologas Microsoft a los desarrollos. Adems integra los elementos principales de los nuevos lenguajes de Microsoft.
Espacio de nombre (Namespace) Microsoft.SqlServer.Server Microsoft.Csharp Microsoft.Jscript Microsoft.VisualBasic Microsoft.VisualBasic.FileIO Microsoft.Win32 Utilidad Contiene clases que permiten integrar CLR en Microsoft SQL Server y su motor de ejecucin. Contiene clases que dan soporte a la compilacin y generacin de cdigo usando C#. Contiene clases que apoyan a la compilacin y generacin de cdigo usando Jscript. Contiene clases que apoyan a la compilacin y generacin de cdigo usando Visual Basic. Contiene tipos que dan soporte al manejo del sistema de archivos usando Visual Basic. Provee dos tipos de clases: aquellas que manejan eventos iniciados por el sistema operativo y las que manipulan el registro del sistema (Windows Registry).
144
System
El espacio de nombre System y todas sus dependencias contienen las clases fundamentales de la plataforma .NET. En esta jerarqua se encuentran las clases base para definir valores, referencias, tipos de datos, eventos y manejadores de eventos; adems contienen los elementos para la declaracin de interfaces, atributos, excepciones de procesos, etctera. Tambin se incluyen en ella todas las clases que hacen de los lenguajes de .NET herramientas de propsito general, dado que se encuentran clases de graficacin, acceso a datos, telecomunicaciones, criptografa, matemticas, etctera.
Nombre del espacio de nombre (Namespace) System.Collections
Utilidad Contiene interfaces y clases que definen varias colecciones de objetos, como lists, queues, arreglos de bits, hashtables y diccionarios. Contiene interfases y clases que definen colecciones genricas, que permiten a los usuarios crear colecciones strong type que proveen mejor tipo de seguridad y desempeo. Contiene los tipos que proveen el modelo de programacin para manejo de datos de configuracin. Contiene clases que constituyen la mayor parte de la arquitectura de ADO.NET. La arquitectura de ADO.NET permite el acceso y manipulacin eficiente de bases de datos de diversas tecnologas (SQL Server, Acces, Oracle, ODBC, OLEDB, etctera). Contiene clases compartidas por los proveedores de datos de .NET Framework. Un proveedor de datos de .NET Framework, describe una coleccin de clases usadas para acceder orgenes de datos, como bases de datos, en el espacio administrado. Contiene clases que pueden ser usadas para generar typed-datasets personalizados. Contiene clases que el proveedor de datos para ODBC de .NET Framework encapsula. Contiene clases que el proveedor de datos para OLE DB de .NET Framework encapsula. Contiene clases que el proveedor de datos para Oracle de .NET Framework encapsula. Contiene clases que apoyan funcionalidad especfica de SQL Server. Complementa a System.Data.SqlClient, sobre todo en el manejo integrado de SQL Server 2005 y CLR.
System.Collections.Generic
System.Configuration
System.Data
System.Data.Common
145
System.Data.SqlClient
Contiene clases que el proveedor de datos para SQL Server de .NET Framework encapsula. Describe una coleccin de clases que pueden ser usadas para acceder a una base de datos en SQL Server CE para dispositivos Windows CE-based en el espacio administrado. Contiene clases para tipos de datos nativos en SQL Server. Estas clases proveen una alternativa ms rpida que otros tipos de datos. Ayuda a prevenir errores de conversin que puedan derivar en prdida de precisin. Provee de clases que permiten interactuar con los procesos del sistema, logs de eventos, desempeo de contadores. Tambin provee clases que permiten buscar errores en la aplicacin y rastrear la ejecucin de cdigo. Provee acceso sencillo al Active Directory. Provee un modelo abstracto de alto nivel para la manipulacin de las tareas de servicio del directorio de Microsoft Active Directory. Provee acceso a la funcionalidad de grficos bsicos GDI+. Contiene clases que extienden la interfaz de usuario en tiempo de diseo. Provee funcionalidad grfica avanzada (bidimensional y vectores). Incluye paletas de gradientes, la clase Matrix (usadas para definir transformaciones geogrficas) y la clase GraphicsPath. Provee de servicios de impresin de grficos. Provee funcionalidad de tipografa GDI+ avanzada. Permite a los usuarios crear una coleccin de fuentes. Contiene clases que definen informacin relacionada con la cultura, incluyendo lenguajes, el pas/regin, el calendario en uso, el formato de fechas, moneda, nmeros y el orden de cadenas. Indispensable su uso si se desarrollan aplicaciones de alcance internacional.
System.Data.SqlServerCE
System.Data.SqlTypes
System.Diagnostics
System.DirectoryServices System.DirectoryServices.ActiveDirectory
System.Drawing.Printing System.Drawing.Text
System.Globalization
146
System.IO
Contiene tipos que permiten lectura sincrnica y asincrnica de flujos de datos y archivos. Contiene clases que proveen compresin y descompresin bsica de flujos de datos. Contiene clases para el control y uso de puertos. Provee clases que permiten la conexin, monitoreo y administracin de mensajes de colas en la red para enviar y recibir mensajes. Proveen una interfaz de programacin para los principales protocolos usados en redes actuales. Contiene clases para la configuracin programtica de System.Net. Contiene clases usadas para enviar correos electrnicos a un servidor SMTP (Simple Mail Transfer Protocol). Permite representar encabezados MIME (Multipurpose Internet Mail Exchange). Provee acceso a datos de trfico de datos, informacin de direcciones de red y notificaciones de cambios de direcciones de la computadora local. Tambin contiene clases para implementar Ping. Provee una implementacin de interfaces Windos Sockets(Winsock), para ayudar a los desarrolladores que necesitan control de acceso a la red. Provee de clases e interfaces que permiten a desarrolladores crear y configurar aplicaciones distribuidas. Provee de una estructura subyacente del sistema de seguridad de .NET Framework, incluyendo clases base para permisos. Provee servicios criptogrficos. Incluye codificacin y descodificacin segura de datos, as como muchas otras operaciones, como hashing, generacin de nmeros aleatorios, y autentificacin de mensajes. Contiene lenguaje de implementacin del certificado Authenticode X.509 v.3. Contiene clases que apoyan la creacin y validacin de firmas digitales XML.
System.Net
System.Net.Configuration System.Net.Mail
System.Net.Mime System.Net.NetworkInformation
System.Net.Sockets
System.Runtime.Remoting
System.Security
System.Security.Cryptography
System.Security.Cryptography.X509Certificates System.Security.Cryptography.Xml
147
System.Text
Contiene clases para la representacin y conversin de sistemas textuales, como ASCII, Unicode, UTF-7 y UTF-8. Contiene clases que proveen acceso al motor de expresiones regulares de .NET Framework. Provee clases e interfaces que habilitan programacin multitarea. Provee de un componente temporizador, que permite disparar un evento en intervalo especfico. Contiene clases que permiten al cdigo participar en transacciones. Provee clases e interfaces que habilitan el modelo de peticin respuesta para ambientes Web, basados en el protocolo HTTP, adems del manejo de cookies. Contiene clases que son usadas para configurar ASP.NET. Contiene las capacidades principales, incluyendo autentificacin y manejo de errores, requerido para construir aplicaciones mviles ASP.NET. Provee clases e interfaces que habilitan el almacenamiento de datos desde un cliente especfico en una aplicacin Web en el servidor. Provee clases e interfaces que permiten crear interfaces de usuario en ambiente Web. Contiene clases que permiten crear elementos grficos de interfaz de usuario en una aplicacin Web. Contiene clases para crear aplicaciones basadas en Windows para aprovechar las caractersticas de la interfaz grfica disponibles en el sistema operativo de Microsoft Windows. Provee soporte de procesamiento XML. Contiene clases que son usadas para serializar documentos en formato XML.
System.Transactions System.Web
System.Web.Configuration System.Web.Mobile
System.Web.SessionState
System.Web.UI System.Web.UI.WebControls
System.Windows.Forms
System.Xml System.Xml.Serialization
148
No son todos los espacios de nombres; la mayora tiene niveles jerrquicos de mayor profundidad que sera imposible tratar en este texto. Utilice la tabla como punto de partida para buscar ms informacin. En la ayuda de Visual Studio puede buscar .NET Framework Class Library, y de ah seleccionar un tema que le interese.
Las aplicaciones desarrolladas en .NET pueden disponer de todas las clases y objetos del .NET Framework, es decir, todos los recursos de .NET Framework; lo nico que hay que hacer es referirlos adecuadamente. Si se desea hacer uso de cualquier clase de BCL es necesario proporcionar el nombre preciso de sta. Una forma en que se pueden referir los recursos de BCL es a travs de lo que se conoce como nombres calificados (fully qualified name), que son la especificacin textual de la jerarqua de espacios de nombres que permite ubicar una clase o type (Namespace.Clase.Type). Es posible utilizar todas las clases disponibles de .NET Framework a travs de sus nombres calificados, pero eso no es del todo prctico pues en ocasiones stos pueden ser bastante largos (System.Runtime.Remoting.Channels.Http, por ejemplo). Una forma de obviar la escritura del nombre calificado completo es importando los espacios de nombres. Para ello se utiliza la instruccin Imports. Basta con que coloque lo siguiente al principio de su programa:
Imports
EspacioNombre
Donde EspacioNombre es la parte del nombre calificado que desea obviar al momento de programar. En Visual Basic se puede incluir hasta el nombre de la clase de BCL, con lo que el cdigo puede llegar a simplificarse bastante. Puede darse el caso de que en dos o ms ensamblados se repita el nombre de clases, referencias o mtodos; en ese caso, la ambigedad debe eliminarse a travs de nombres calificados, los cuales permiten definir el origen de los recursos referidos.
149
Los siguientes dos programas funcionaran de la misma forma: Sin uso de instruccin Imports:
Module Module1 Sub Main() System.Console.Write(Presione INTRO) system.Console.ReadLine() System.Console.WriteLine(Hola mundo.) End Sub End Module
Contaminacin de espacios de nombres y colisiones de nombre. Como puede apreciar, los espacios de nombres permiten obviar la jerarqua de clases que permite tener acceso a una clase o a un mtodo (type). Puede darse el caso, principalmente cuando un equipo de desarrollo trabaja sobre un mismo proyecto, de que dos o ms programadores denominen a un mtodo de la misma forma; cuando se da esa repeticin de nombres de mtodos en diferentes jerarquas, se dice que estamos ante contaminacin de espacios de nombres (namespace pollution). Si, existiendo contaminacin de nombres, en un mismo programa se tratan de utilizar mtodos homnimos, CLR es incapaz de diferenciarlos, por lo que se presenta el fenmeno de colisin de nombres (name collisions). Las colisiones de nombres se resuelven utilizando nombres calificados, mientras que la contaminacin de espacios de nombres se evita mediante una planeacin minuciosa del proyecto de desarrollo, adems de utilizar mtodos estructurados de desarrollo.
150
Es posible agregar espacios de nombres adicionales a los contenidos de origen en .NET Framework; los pasos para hacerlo son los siguientes: 1. Desarrollar el cdigo de una librera (programa de extensin de Microsoft Visual Basic), delimitando el contenido de la librera a travs del estatuto Namespace. 2. Compilar el cdigo de la librera como tipo library, con lo cual no se generara un archivo ejecutable (EXE), sino una librera de vnculos dinmicos (DLL). 3. Para hacer uso de la funcionalidad de una librera, es necesario hacer referencia a ella; eso se puede hacer desde Visual Studio (si se trata de una aplicacin Windows o Web, a travs de la opcin de men Project Add Reference...), o en tiempo de compilacin si se trata de una aplicacin de consola y no se utiliza Visual Studio. 4. Es opcional utilizar nombres calificados una vez que se establece la referencia. La sintaxis para crear un espacio de nombres es la siguiente:
Namespace
End Namespace
Donde EspacioNombre es el nombre a travs del cual se referirn los elementos contenidos en espacio de nombres que se genera. Una cosa importante a tomar en cuenta es que para crear una jerarqua dentro de un espacio de nombres es posible anidarlos, por lo cual una declaracin Namespace puede estar definida dentro de otra, creando el efecto EspacioNombre1.EspacioNombre2.Type.
151
Esto es posible si asignamos un alias al espacio de nombres. Un alias de importacin es la equivalencia en nombre que le damos a un espacio de nombres al momento de importarlo. Vea la sintaxis para establecer un alias de espacio de nombres:
Imports
Alias = EspacioNombres
Donde EspacioNombres ser el nombre del espacio de nombres que ser referido a travs de Alias.
Referencias
Una referencia puede definirse como la especificacin de enlazado entre un programa y una librera, en donde la librera pone su funcionalidad a disposicin del programa hasta donde la accesibilidad lo permite.
152
Las referencias pueden establecerse fcilmente desde Visual Studio. Lo primero que hay que saber es que cada proyecto tiene sus propias referencias. Al crear un proyecto desde Visual Studio, la herramienta establece las referencias ms usuales para el tipo de aplicacin. En el Solution Explorer pueden observarse claramente, ya que bajo el nodo de un proyecto siempre hay un nodo References. Si se requiere hacer una nueva referencia, es necesario colocarse sobre el nodo References del proyecto al que se desea agregar la referencia, y seleccionar Add Reference desde el men contextual. Con esto aparecer la ventana Add Reference.
La ventana muestra varias fichas. En la ficha .NET podrn seleccionarse las libreras de .NET Framework o aquellas que se registren en GAC utilizando nombres fuertes (strong names). En la ficha COM se pueden seleccionar aquellas libreras COM que se desee utilizar, dado que la plataforma .NET les da soporte. En la ficha Projects es posible seleccionar los proyectos .NET que sean de tipo Library (DLL), de los cuales se pueden consumir clases expuestas. En la ficha Browse pueden examinarse los archivos que se encuentran en el equipo, con el fin de seleccionar algn DLL. La ficha Recent permite invocar las libreras de reciente uso o creacin, a fin de encontrarlas sin buscar en todos lados.
153
En cualquiera de las fichas es posible seleccionar los componentes seleccionando la librera a referir y haciendo clic en el botn Ok, a fin de que las referencias queden establecidas.
Ejercicio 5.1
Creacin y consumo de una librera (DLL) basada en un espacio de nombres En este ejercicio se comprobar la forma en que funcionan los alcances de variables en Visual Basic, y la manera en que podemos aprovechar su manejo para preservar valores en memoria con eficiencia. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln).
Codificacin de
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
MisUtilerias - Continuar.vb
Imports System.Console Namespace Funciones Public Class Continuar Public Shared Sub EsperaINTRO() WriteLine() WriteLine(Pulse INTRO para continuar) ReadLine() End Sub End Class End Namespace
4. Esta librera generar el archivo MisUtilerias.DLL. Posee un espacio de nombres denominado Funciones, que a su vez contiene una clase llamada Continuar que tiene defi-
154
nido un mtodo llamado EsperarINTRO. El mtodo se encarga de mostrar un mensaje y esperar a que se pulse INTRO para continuar. Como lo recordar, hemos estado utilizando cdigo similar en los ltimos ejercicios, por lo que en ste constituye una manera de automatizar esa labor tan comn. 5. Es muy importante notar que la clase es pblica (Public) dado que le daremos un uso de librera, y deseamos que sea utilizable por cualquier proyecto (incluso aquellos que no pertenecen a la solucin). Tambin es importante ver que el mtodo es pblico y compartido (Shared), lo que indica que est disponible para uso externo a la clase. 6. Construya el nuevo proyecto que cre y guarde todos los archivos de la solucin (oprima las teclas Ctrl-Mays-S). 7. Compruebe que al generar el proyecto se haya creado una librera Busque en la siguiente ruta:
C:\APVBNETVS\Ejercicios\MisUtilerias\bin\Debug DLL
en su equipo.
Revisin de todos los elementos asociados a un proyecto, por medio de Solution Explorer
8. Agregue a su solucin un proyecto Windows Console Application, llamado meUtilerias. 9.
Consu-
Seleccione en Solution Explorer el proyecto ConsumeUtilerias. Haga clic en el botn Show All Files de la barra de herramientas de Solution Explorer. Con ello aparecern elementos que hasta el momento no haba visto. Vea el rbol jerrquico de recursos asociados a su proyecto. El que nos interesa ms en estos momentos es el nodo References; haga clic en dicho nodo con el fin de ver qu contiene.
155
10. Al seleccionar un Template al momento de crear un proyecto en Visual Studio, la herramienta sabe qu espacios de nombres son los ms comunes para el tipo de proyecto, y procede a establecer referencias con las libreras correspondientes. Eso nos libera del trabajo de establecer referencias que son obvias, dado un tipo de archivo. Como podemos comprobar, nuestra librera MisUtilerias no se encuentra dentro de las referencias, por lo que no podramos utilizar su funcionalidad en nuestro programa.
12. Vea cmo al agregar la referencia, Solution Explorer actualiza el rbol de elementos del proyecto, incluyendo nuestra librera.
156
Codificacin de ConsumeLibrera
1 2 3 4 5 6 7 8 9 10 11 Imports System.Console Imports MisUtilerias.Funciones Module Module1
Module1.vb
Sub Main() WriteLine(Mensaje desde el programa) Continuar.EsperaINTRO() End Sub End Module
14. Vea cmo al editar las lneas de importacin de espacios de nombres, ya tenamos disponible nuestro espacio de nombres en Intellisense.
157
15. Se importa el nombre de la librera y el espacio de nombres (lnea 2). Ya en el cdigo, slo es necesario invocar el nombre de la clase y el type (lnea 8). Podramos haber simplificado an ms, incluyendo la clase en el Imports.
Module1.vb
16. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (oprima Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (oprima F5). 17. Si todo sali bien, el programa debe producir el siguiente resultado:
Mensaje desde el programa Pulse INTRO para continuar
18. Con este pequeo ejemplo ya comprob cmo se generan bibliotecas de clases en .NET y cmo se consumen desde otros proyectos. FIN DEL EJERCICIO *
Ejercicio 5.2
Utilizacin del depurador (Debug) de Visual Studio y la ejecucin lnea a lnea basada en puntos de interrupcin (breakpoints) Se agregarn puntos de interrupcin a una aplicacin, y se revisarn las opciones de ejecucin lnea a lnea usando Visual Studio.
158
1. Usando Visual Studio, abra la solucin Ejercicios. 2. En el Solution Explorer encuentre el nodo correspondiente a ConsumeLibreria Module1.vb. Haga doble clic en dicho nodo para editar el cdigo. Establezca el proyecto como proyecto de inicio (StartUp Project).
6.
Al lanzar a ejecucin una aplicacin (oprimiendo la tecla F5), se entra en modo debug, que es un estado de ejecucin en donde Visual Studio provee todas las herramientas para la depuracin de aplicaciones en tiempo de ejecucin. Seleccione repetidamente Debug Step Over (F10), hasta terminar la ejecucin del programa. La ejecucin continuar en modo lnea a lnea. Al encontrar un llamado a un recurso externo al programa (clases, libreras, funciones, etctera), las tomar como una sola lnea; es decir, no profundizar en lo que pasa dentro del recurso externo al programa. Las lneas que se vayan ejecutando aparecern resaltadas en amarillo.
7.
159
8.
Ejecute nuevamente la aplicacin (oprima F5). Seleccione repetidamente Debug Step Into (F11), hasta terminar la ejecucin del programa. La ejecucin continuar en modo lnea a lnea. Al encontrar un llamado a un recurso externo al programa (clases, libreras, funciones, etctera), realizar tambin una inspeccin lnea a lnea de dichos recursos. Las lneas que se vayan ejecutando aparecern resaltadas en amarillo. Ejecute nuevamente la aplicacin (oprima F5). Seleccione repetidamente Debug Step Into (F11), hasta llegar a las lneas de cdigo de la librera de MisUtilerias. Seleccione Debug Step Out (Mays-F11) para terminar de ver el contenido de la librera y continuar con la ejecucin en el programa que mand llamar la librera. En cualquier momento, cuando se est en tiempo de depuracin, se puede continuar la ejecucin normalmente (Continue), detener momentneamente la ejecucin (Break All) o terminar la depuracin (Stop Debugging).
9.
10.
11. Ejecute nuevamente la aplicacin (F5). Al llegar al punto de interrupcin, contine la ejecucin con Step Over (F10). Al llegar a la lnea 7, que despliega Mensaje desde el programa, cambie en ese momento el mensaje por Mensaje editado en tiempo de depuracin. Siga ejecutando con Step Over. Compruebe en la consola que se ha escrito el nuevo mensaje, lo que indica que tom como buenos nuestros cambios realizados en
160
tiempo de depuracin. A esta capacidad de Visual Studio se le denomina Edit and Continue, y slo est disponible si el archivo est en vista de cdigo fuente (source view).
16. Aparecer la ventana Breakpoint Condition, en donde se podr especificar la condicin que provocar que el punto de interrupcin detenga la depuracin. Especifique que si el dato proporcionado es menor o igual a cero se detenga la depuracin (CInt(Entrada)<=0).
161
17. Inicie la depuracin de la solucin (oprima F5). Cuando el programa le pregunte la base, proporcione el nmero 10. Proporcione una altura de 15 y vea cmo el programa no detiene la depuracin en ningn momento. 18. Inicie nuevamente la depuracin de la solucin (oprima F5). Cuando el programa le pregunte la base, proporcione el nmero 0. Al cumplirse la condicin, el programa se detiene.
162
macin que debe responder afirmativamente en caso de que desee eliminar los puntos de interrupcin. 24. Elimine todos los puntos de interrupcin que tiene su programa. 25. Guarde todos los cambios en la solucin. FIN DEL EJERCICIO*
Ejercicio 5.3
Utilizacin de Command Window En este ejercicio se comprobar el uso de Command Window para la ejecucin de comandos de Visual Studio en forma textual. 1. Usando Visual Studio, abra la solucin Ejercicios. 2. En el Solution Explorer encuentre el nodo correspondiente a Alcance Module1.vb. Haga doble clic en dicho nodo para editar el cdigo. 3. Establezca el proyecto como proyecto de inicio (StartUp Project).
163
6. Esta ventana es la lnea de comandos de Visual Studio. Al escribir un comando y presionar Intro, ste se ingresa a Visual Studio y se ejecuta. Los comandos son muy parecidos a las opciones que tendramos que seleccionar en el men; por ejemplo, la opcin File Close tiene su comando equivalente, que es File.Close. Para simplificar an ms, algunos comandos poseen alias de comando (command alias), que permiten reducir la escritura de comandos. Por ejemplo, Close es el alias de File.Close. En otras palabras, escribir Close en Command Window es lo mismo que seleccionar en el men File Close. El proceso se simplifica an ms dado que Command Window tiene Intellisense, y adems nos permite definir nuestros propios comandos. Si es rpido con los dedos, presionar Ctrl-Alt-A, Close es equivalente a seleccionar la opcin File Close. La ms importante contribucin de Command Window es permitir la ejecucin de comandos que no aparecen en ninguna opcin de men en Visual Studio. 7. stos son algunos de los comandos ms usuales que cuentan con un alias predeterminado en Visual Studio.
Command Name Add New Project Alias Autos window Breakpoints window Call Stack window Clear All Clear Bookmarks Close Close All Documents Command mode Command Window Mark Mode Cut Line Delete Line Disassembly window Evaluate Statement Exit F1Help Format Selection Full Screen Go To Go to Brace Immediate Mode Insert File as Text List Call Stack List Disassembly List Members List Memory Float format List Threads Locals window
Alias AddProj Alias Autos bl CallStack cls ClearBook Close CloseAll cmd mark LineCut LineDel disasm eval Exit Help format FullScreen GotoLn GotoBrace immed InsertFile kb u ListMembers df ~ Locals
Complete Name File.AddNewProject Tools.Alias Debug.Autos Debug.Breakpoints Debug.CallStack Edit.ClearAll Edit.ClearBookmarks File.Close Window.CloseAllDocuments View.CommandWindow Tools.CommandWindowMarkMode Edit.LineCut Edit.LineDelete Debug.Disassembly Debug.EvaluateStatement File.Exit Help.F1Help Edit.FormatSelection View.FullScreen Edit.GoTo Edit.GotoBrace Tools.ImmediateMode Edit.InsertFileAsText Debug.ListCallStack Debug.ListDisassembly Edit.ListMembers Debug.ListMemory/Format:Float Debug.ListThreads Debug.Locals
164
Make Lower Case Make Uppercase Memory window Memory Window 2 Memory Window 3 Memory Window 4 New File New Project Next Bookmark Open File Open Project Parameter Information Previous Bookmark Print Print File Properties Window Quick Watch Redo Registers window Run to Cursor Save All Save As Save Selected Items Script Only View Shell ShowWebBrowser Start Step Into Step Out Step Over Stop Stop Find In Files Swap Anchor Tabify Selection Tasklist window Threads window Tile Horizontally Tile Vertically Toggle Bookmark Toggle Breakpoint Toggle Word Wrap Toolbox window Undo Untabify Selection View Code View Designer Watch window
Lcase Ucase Memory Memory1 Memory2 Memory3 Memory4 nf np NewProj NextBook of Open op ParamInfo PrevBook ? print props ?? redo registers rtc SaveAll SaveAs save ScriptOnly shell nav navigate g t pr p q StopFind SwapAnchor tabify TaskList Threads TileH TileV ToggleBook bp WordWrap toolbox undo Untabify code designer Watch
Edit.MakeLowercase Edit.MakeUppercase Debug.Memory1 Debug.Memory2 Debug.Memory3 Debug.Memory4 File.NewFile File.NewProject Edit.NextBookmark File.OpenFile File.OpenProject Edit.ParameterInfo Edit.PreviousBookmark Debug.Print File.Print View.PropertiesWindow Debug.Quickwatch Edit.Redo Debug.Registers Debug.RunToCursor File.SaveAll File.SaveSelectedItemsAs File.SaveSelectedItems View.ShowScriptOnly Tools.Shell View.ShowWebBrowser Debug.Start Debug.StepInto Debug.StepOut Debug.StepOver Debug.StopDebugging Edit.FindInFiles /stop Edit.SwapAnchor Edit.TabifySelection View.TaskList Debug.Threads Window.TileHorizontally Window.TileVertically Edit.ToggleBookmark Debug.ToggleBreakPoint Edit.ToggleWordWrap View.Toolbox Edit.Undo Edit.UntabifySelection View.ViewCode View.ViewDesigner Debug.WatchN
165
8. La mayora de los comandos puede inferirse fcilmente. Slo piense cmo estn localizables en los mens. Por ejemplo, para iniciar la depuracin de una solucin la opcin de men es Debug Start Debugging; el comando es Debug.Start, lo cual es bastante obvio. Aproveche Intellisense en Command Window para descubrir los comandos que le interesan. 9. En Command Window escriba los siguientes comandos:
>GotoLn 7 >Debug.ToggleBreakpoint >Debug.Start >Debug.StepOver >Debug.StepOver >Debug.StepOver >Debug.StopDebugging >Debug.DeleteAllBreakpoints
10. Lo que hicimos fue ir a la lnea 7 del cdigo, establecer un punto de interrupcin, iniciar la depuracin, ejecutar tres lneas, lnea por lnea, y detener la depuracin. En el caso de comandos que se repiten, podemos ahorrarnos la escritura consultando la historia de comandos de Command Window (oprimiendo la tecla de direccin hacia arriba). FIN DEL EJERCICIO*
Ejercicio 5.4
Uso de herramientas avanzadas para la depuracin
5
Se agregarn puntos de interrupcin a una aplicacin y se revisarn las opciones de ejecucin lnea a lnea, usando Visual Studio. 1. Usando Visual Studio, abra la solucin Ejercicios. 2. En el Solution Explorer encuentre el nodo correspondiente a Alcance Module1.vb. Haga doble clic en dicho nodo para editar el cdigo. Establezca el proyecto como proyecto de inicio (StartUp Project).
4. Inicie la depuracin de la solucin (tecla F5). 5. En tiempo de depuracin aparecen dos herramientas principales: Auto y Command Window. En realidad son muchas ms herramientas, slo que no estn visibles por el momento. Como podr comprobar, en tiempo de depuracin Command Window comparte su espacio con otras herramientas: Call Stack, Breakpoints, Immediate Window y Output.
166
6. Por otro lado, Autos comparte su espacio con otras herramientas: Locals y Watch 1.
7. Cuando hay varias herramientas apiladas en un mismo espacio en Visual Studio, cada una constituye una ficha de seleccin horizontal (Tabs). La forma de seleccionar alguna de las herramientas es haciendo clic sobre la ficha. En caso de que las herramientas estn en modo de ocultacin automtica, lo que usted ver sern las pestaas de seleccin vertical de las fichas; cumplen con la misma funcionalidad que las horizontales, slo que se distribuirn en los extremos laterales de Visual Studio.
167
11. Vea cmo se muestran dos variables. Al llegar a Sub Main() detecta que el procedimiento tiene una variable llamada Texto2, que an no toma valor. La variable Texto1, aunque no forma parte del procedimiento, se muestra porque est disponible dado que tiene alcance de mdulo. En otras palabras, es una variable utilizada por las lneas anteriores a la actual. 12. Seleccione la pestaa Locals. Esta herramienta slo mostrar las variables locales del alcance en que se encuentra la lnea de cdigo que actualmente se est ejecutando. Dada la lnea en la que nos encontramos, slo aparecer la variable Texto2.
13. Seleccione Watch 1. Esta herramienta permite agregar variables y expresiones que deseamos saber cunto valen en todo momento. Esta herramienta no carga variables automticamente, por lo que hay que especificarle qu queremos que muestre. 14. La ventana Quick Watch (oprima las teclas Ctrl-Alt-Q) funciona de forma parecida a Watch, con la diferencia de que puede mostrar slo el contenido de una variable o expresin en un momento dado. Por ejemplo, si queremos saber qu valor tiene la variable Texto4 en este momento, presionamos las teclas Ctrl-Alt-Q, con lo que aparecer Quick Watch. Coloque en Expression Texto4 y haga clic en Reevaluate. Con ello se mostrar el contenido de la variable. En nuestro caso, Texto4 no est dentro del alcance en donde nos encontramos, por lo cual se reporta como no declarada.
168
15. Si estando en Quick Watch hacemos clic en Add Watch, la variable que evaluamos se agregar a Watch.
17. En nuestro caso, muestra que actualmente nos encontramos en la lnea 37, en el Procedimiento2() que fue llamado en la lnea 18 por el procedimiento Main(). Saber de dnde nace la ejecucin de un procedimiento ayuda a resolver el origen de los problemas, en caso de que se presenten. Resulta interesante ver que Call Stack revisa el origen de los procedimientos hasta llegar al ensamblado (Alcance.exe), dando informacin del proyecto (Alcance), el programa (Module1) y finalmente el procedimiento.
169
18. Seleccione Breakpoints, que sirve para mostrar todos los puntos de interrupcin y su estado. Con esta herramienta podemos saber la lnea en que se encuentran, si estn activos o no, si les aplican condiciones y en qu casos detendrn la depuracin. En nuestro caso aparece el nico punto de interrupcin que agregamos.
19. Seleccione Immediate Window, que sirve para evaluar expresiones y variables de una forma programtica y a peticin. 20. Para desplegar valores podemos utilizar el comando Print, con su alias ? 21. Escriba en Immediate Window la siguientes instrucciones:
? Texto1 Debug.StepInto ? Texto1
22. Lo que hicimos fue mostrar el contenido de Text1. Luego provocamos que la depuracin avanzara en modo Step Into, con lo cual la variable adquiri valor; se volvi a mostrar el contenido de la variable Texto1 y pudimos comprobar el nuevo valor de la variable. 23. Detenga la depuracin, elimine todos los puntos de interrupcin y guarde su solucin. FIN DEL EJERCICIO*
170
MAPA
171
TERMINOLOGA
Alias de importacin, 151 Aplicacin, 141 Autos, 166 Breakpoint, 158 Code steping, 158 Edit and continue, 160 Ejecucin lnea por lnea, 158 Espacio de nombres, 141 Extensibilidad, 141 Fully qualified name, 148 Imports, 148 Locals, 166 Namespace, 141 Nombres calificados, 148 fuertes, 152 Punto(s) de interrupcin, 158 condicionales, 160 Quick Watch, 166 References, 152 Referencia, 151 Strong names, 152 Variable windows, 166 Watch, 166
PREGUNTAS
5.1 Cules son los espacios de nombres principales de BCL? 5.2 Qu funcin tiene el estatuto Import? 5.3 Qu beneficio deriva de programar libreras? 5.4 Mencione los espacios de nombres que cree usted que contengan la funcionalidad necesaria para dar soporte a sus aplicaciones profesionales.
172
Notas:
173
EXAMEN
CAPTULO
Manejo de operadores
Objetivos: Aprender el manejo de los operadores aritmticos, de asignacin, de comparacin y lgicos, con todas sus variantes. 1. Reconocer los operadores aritmticos y la forma en que se emplean. 2. Sabr qu son los operadores de asignacin y de asignacin incluyente, y cmo se manejan. 3. Se familiarizar con los operadores comparativos y cmo se manejan. 4. Aprender a manejar los operadores Is y Like, para llevar a cabo comparaciones complejas de datos String. 5. Entender qu son los operadores lgicos y los operadores lgicos de circuito corto, y cmo se manejan. 6. Comprender cul es la prioridad de ejecucin de los operadores, y cmo se maneja sta utilizando parntesis.
175
176
Contenido
Operadores aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de asignacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Expresin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de asignacin incluyente . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores comparativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Consideraciones relativas al cdigo ASCII . . . . . . . . . . . . . . . . . . . . . . . Option Compare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores Is, IsNot y TypeOf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operador Like . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores lgicos de circuito corto . . . . . . . . . . . . . . . . . . . . . . . . . . Tabla de comportamiento de operadores lgicos . . . . . . . . . . . . . . . . . Prioridad entre operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de parntesis para otorgar preferencia de ejecucin . . . . . . . . . . Utilizacin general de operadores de Visual Basic . . . . . . . . . . . Comentarios en bloques de cdigo . . . . . . . . . . . . . . . . Uso de Clipboard Ring . . . . . . . . . . . . . . . . . . . . . . . . . . Seleccin basada en bloques de cdigo (Block Selection) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de operadores de asignacin incluyente y operadores de circuito corto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 178 178 179 180 181 182 183 183 185 187 188 189 190 191 192 193 195 196 200 201 201 203
177
Sabemos que el procesador constituye el corazn de un sistema de computacin: ah es donde esencialmente se lleva a cabo el procesamiento de la informacin en forma de operaciones aritmticas y lgicas. Los operadores son los elementos de que se vale un lenguaje de programacin para la transformacin de expresiones mediante clculos o comparaciones; son elementales en el sentido de que nada se calcula y nada se decide sin su presencia. Ya sabemos qu tipos de datos admite .NET y cmo se definen; el presente captulo explica que no slo es importante declarar y almacenar datos, sino manipularlos de tal forma que a partir de ellos se genere informacin nueva. sta es la esencia del cmputo.
Operadores aritmticos
Quin no conoce los operadores aritmticos? Debido a que forman parte de la educacin bsica difcilmente podramos agregar algo que no se sepa con respecto a ellos. Quiz lo nuevo sea la forma en que Visual Basic utiliza los operadores aritmticos. No obstante lo obvio del tema, para no ser omisos definiremos a los operadores aritmticos como los smbolos que producen, a partir de dos expresiones numricas conocidas, una nueva expresin numrica, como resultado de la aplicacin de un clculo aritmtico entre aqullas. El lenguaje dispone de los siguientes operadores aritmticos bsicos:
+ * / \ Mod ^ Suma (concatenacin) Resta Multiplicacin Divisin Divisin entera Mdulo Exponenciacin Suma expresiones numricas. Concatena expresiones de tipo String. Representa la diferencia entre dos nmeros o especifica la condicin negativa de uno. Multiplica dos nmeros. Divide un nmero entre otro. Divide un nmero entre otro, dando un resultado necesariamente entero. Divide un nmero entre otro, dando como resultado el residuo. Sirve para elevar un nmero a una determinada potencia; un nmero puede ser negativo si el
exponente es un entero.
178
La forma en que se resuelven este tipo de operadores es la siguiente: Resultado = Expresin1 Operador Expresin2 Donde Expresin1, Expresin2 y Resultado son siempre datos numricos; Operador es el operador aritmtico utilizado. Se debe tomar en cuenta que Resultado puede no ser del mismo tipo que las expresiones; por ejemplo, la suma de dos Integer, 2,000,000,000 y 2,000,000,000, no es Integer, y la divisin de un Integer 3, entre 2, no dar un nmero Integer. NOTA
En el caso de los datos de tipo String, es posible utilizar el operador de suma, que se encarga de concatenar o unir las expresiones. Para evitar la ambigedad del operador +, Visual Basic acepta el uso del smbolo & para concatenacin de expresiones String. En realidad, la concatenacin no se considera una operacin aritmtica.
Operadores de asignacin
Los operadores de asignacin son los que permiten asignar un valor a una variable o propiedad. El ejemplo clsico de este tipo de operadores es el signo de igual (=). Variable = Valor donde Variable es una variable o propiedad que puede recibir valores, y Valor, una expresin vlida para el tipo de dato de Variable.
Expresin
Aunque puede resultar obvio, una expresin es un valor, existente o derivado: es expresin existente si corresponde a una literal vlida para un determinado tipo de dato, o una variable que la contenga; es expresin derivada, cuando es el resultado de someter varios valores existentes, sean stos variables o literales, a la accin de operadores. Vea los siguientes ejemplos de expresiones: 4 A 4+5 3=2 A & B Existente. Valor numrico 4 Existente. Valor String A Derivado. Valor numrico 9 Derivado. Valor lgico False, pues 3 y 2 no son iguales Derivado. Valor de concatenacin String AB
179
x += 1 x = 1 x *= 4 x ^= 2
180
Operadores comparativos
Los operadores comparativos permiten comparar expresiones, una en relacin con otra, para dar como resultado un valor de falso (False), verdadero (True) o nulo (Null), dependiendo de si la comparacin es una verdad o no. Hasta el momento no hemos tratado los valores nulos; los valores nulos son la ausencia de valor alguno, y su utilidad es para aplicaciones especficas en donde la afectacin de un valor es importante. La siguiente tabla presenta los operadores comparativos que Visual Basic maneja:
Operador < (Menor que) <= (Menor o igual que) > (Mayor que) >= (Mayor o igual que) = (Igual a) <> (Distinto de) Verdadero si expresin1 < expresin2 expresin1 <= expresin2 expresin1 > expresin2 expresin1 >= expresin2 expresin1 = expresin2 expresin1 <> expresin2 Falso si expresin1 >= expresin2 expresin1 > expresin2 expresin1 <= expresin2 expresin1 < expresin2 expresin1 <> expresin2 expresin1 = expresin2 Nulo si expresin1 o expresin2
= Null
expresin1 o expresin2
= Null
expresin1 o expresin2
= Null
expresin1 o expresin2
= Null
La forma en que se resuelven este tipo de operadores es la siguiente: Resultado = Expresin1 Operador Expresin2 Expresin1 y Expresin2 pueden ser cualquier tipo de expresiones comparables entre s. Resultado ser siempre lgico (True, False), o nulo (Null). Operador es el operador utilizado para la comparacin.
181
Tome en cuenta que las letras maysculas, para efectos de comparacin, tienen un valor en cdigo ASCII menor a las minsculas; por tanto, son menores. Adicionalmente, la A es menor que la Z.
Algunas personas, sobre todo aquellas que no tienen su teclado configurado adecuadamente, saben que presionando la tecla ALT y las correspondientes del teclado numrico a un cdigo ASCII, ste aparecer. Para ello es necesario que el teclado nu-
182
mrico est activado (teniendo el BLOQ NUM / NUM LOCK activado). Por ejemplo:
Alt + 64
equivale a teclear
Visual Basic, por otro lado, tiene funciones que permiten obtener la representacin simblica de un cdigo ASCII, as como el cdigo ASCII a partir de una representacin simblica. Las funciones que lo permiten son Chr( ) y Asc( ), respectivamente. Estas funciones emplean la siguiente sintaxis:
Chr(CdigoASCII ) Asc(Caracter)
Por ejemplo:
Chr(64) Asc(@) @ 64
Option Compare
Uno de los conceptos importantes relacionado con la comparacin de datos (especficamente de los de tipo String), es su sensibilidad al uso de maysculas y minsculas. Se dice que un esquema de comparacin es case-sensitive cuando una comparacin es sensible a la diferencia entre maysculas y minsculas (A a). Se dice que un esquema de comparacin es non case-sensitive, cuando una comparacin no lo es (A = a). En el caso de Visual Basic, podemos especificar de qu manera queremos que nuestros programas se comporten respecto de las comparaciones. Para ello, utilizamos el estatuto Option Compare. Su sintaxis es la siguiente:
Option Compare [Text / Binary]
Si se especifica Option Compare Text, las comparaciones se realizarn bajo el esquema insensible al uso de maysculas y minsculas; si se especifica Option Compare Binary, las comparaciones se realizarn bajo el esquema sensible.
Option Compare
debe especificarse al inicio de los programas, antes de cualquier lnea de cdigo. Si se omite la especificacin, el esquema de comparacin ser sensible (Binary).
183
devolver verdadero (True) si las variables comparadas refieren a la misma posicin de memoria, y falso (False) si refieren a posiciones distintas de memoria.
En ocasiones, lo que se desea saber es si un objeto no refiere la misma posicin que otro. Anteriormente, la tarea se deba realizar combinando los operadores Not e Is, de la siguiente forma:
If Not Objeto1 Is Objeto2 Then WriteLine(Diferentes)
Dado que esta expresin es poco natural en su lectura, Visual Basic incluye el operador IsNot, que devuelve True en caso de que dos objetos no refieran a la misma posicin de memoria. La lnea de cdigo quedara como sigue:
If Objeto1 IsNot Objeto2 Then WriteLine(Diferentes)
En ocasiones la comparacin no se realiza entre un objeto y otro, sino entre un objeto y un type. Visual Basic incluye un operador denominado TypeOf... Is, que devuelve verdadero en caso de que un objeto sea de un tipo determinado. Por ejemplo, si deseamos saber si la variable X es de tipo Integer, tendramos que especificar lo siguiente:
If (TypeOf X Is Integer) Then WriteLine(X es Integer)
Operador Like
El operador Like compara dos expresiones String, no en trminos de igualdad, sino en trminos de cumplimiento de un patrn determinado. Este operador es especialmente til cuando se verifica si una cadena de caracteres compuesta obedece a un formato predefinido. Imagine un cdigo de producto que siempre sea de tres letras, un guin y cuatro nmeros; en tal caso se tienen dos opciones: utilizar Like
184
o desarrollar una rutina que analice carcter por carcter la expresin y sus posiciones. Sobra decir que utilizar Like es mucho ms efectivo. La forma en que se resuelve este operador es la siguiente: Resultado = Expresin1 Like Expresin2 Expresin1 debe ser una expresin de tipo String; Expresin2 es un patrn String que se pretende reconocer como existente en Expresin1. Resultado siempre es lgico (True, False).
Like retornar verdadero (True) si el patrn a buscar es reconocido dentro del dato String
base de la comparacin, y falso (False) en caso de que no se reconozca. El patrn a buscar, llamado patrn nominado, es una literal conformada por caracteres especiales que representan el contenido de caracteres a buscar; a continuacin una tabla que muestra dichos caracteres y su significado.
Significado Cualquier carcter Varios caracteres o ninguno Cualquier dgito (0-9) Cualquier carcter de la lista Cualquier carcter que no est en la lista
Devuelve True Devuelve True Devuelve True Devuelve True Devuelve False Devuelve True Devuelve True Devuelve True Devuelve False Devuelve True Devuelve True
185
Recomendamos utilizar los patrones para determinar la validez de formatos mixtos de datos; por ejemplo, claves de cuatro letras y tres nmeros. Si lo que va a evaluar son formatos ms estndar, como nmeros o fechas, recomendamos otras funciones ms sofisticadas como IsNumeric() o IsDate().
Operadores lgicos
Los operadores lgicos son aquellos que sirven para unir o negar condiciones, produciendo un valor lgico. Los operadores lgicos bsicos son:
Not Niega el resultado de una condicin. Revierte el valor; si la condicin que afecta es
True
And Cuando de entre dos condiciones las dos deben ser True para que en su conjunto
la expresin sea True. (Con todas las condiciones True, devolver True).
Or Cuando de entre dos condiciones, al menos una debe ser True para que en su con-
junto la expresin sea True. (Con al menos una condicin True, devolver True.)
Xor Cuando entre dos condiciones, al menos una cumple por True, pero no las dos.
La forma en que se resuelven este tipo de operadores es la siguiente: Resultado = [Expresin1] Operador Expresin2 Expresin1 y Expresin2 son expresiones de tipo lgico. En el caso de Not, Expresin1 no se debe poner, ya que el operador acta sobre una sola expresin. Resultado ser siempre lgico (True, False). Cuando una expresin lgica se compone de una sola comparacin, se dice que es una expresin lgica simple debido a que se resolver en slo un tiempo; si involucra dos o ms comparaciones, o la utilizacin de un operador lgico, se dice que es una expresin lgica compuesta, debido a que la expresin lgica deber resolverse en dos o ms tiempos (se resuelve la comparacin y luego se resuelve dentro del contexto en que se encuentra). Una expresin lgica compuesta siempre se compone de expresiones lgicas simples, afectadas por operadores lgicos que las obligan a resolverse como una sola expresin lgica.
186
Ejemplos:
Not True Not False Not A = B A = B And 1 > 0.5 A = B Or 1 > 0.5
Es False, porque es lo contrario a True. Es True, porque es lo contrario a False. Es True, porque A = B es False, pero negado es True. Es False, porque no todas las condiciones son True. Es True, porque al menos una condicin es True.
En caso de tenerse ms de dos condiciones conjuntas, entra en operacin lo que se conoce como preferencia, que consiste en determinar el orden en que las condiciones u operaciones se han de resolver. Por ejemplo:
A = B OR 1 > 0.5 AND 2 >= 2 AND S > s
es False. Las condiciones se resuelven de izquierda a derecha. Vea la explicacin en la figura 6.1: FIGURA 6.1 Resolucin de una expresin con mltiples condiciones
Primero se resuelven las condiciones de comparacin. Una vez resueltas las condiciones de comparacin, se sigue el orden de izquierda a de-
recha: se resuelve la primera condicin de tipo lgico; el resultado de sta forma parte de la siguiente condicin, y as hasta terminar.
La expresin inicia siendo una expresin lgica compuesta, formada por cuatro expre-
siones lgicas simples, que con la ayuda de tres operadores lgicos se ven obligadas a resolverse como una sola expresin lgica que termina con un valor False.
187
En donde las condiciones encerradas en los parntesis de mayor profundidad se resuelven primero. Si usted agrega de manera explcita parntesis en las condiciones, les asignar preferencia. Por ejemplo, cambiemos un poco el orden del ejemplo anterior y veamos qu sucede:
S > s Or 2 >= 2 And 1 > 0.5 And A = B
De acuerdo a lo que vimos, se resolvera la primera condicin con la segunda (False Or True, se resuelve como True), el resultado se resolvera con la tercera (True And True, devuelve True), y el resultado se resolvera con la cuarta (True And False, devuelve False). El resultado de lo ltimo que se resolvi fue False. Cmo cambiaramos la condicin, mediante el uso de parntesis, para que el resultado fuera verdadero? A continuacin una solucin:
(S < s OR ( 2 >= 2 AND 1 > 0.5 And A = B))
De esta forma forzamos que en primera instancia se resuelva el parntesis de mayor profundidad, que contiene la segunda, tercera y cuarta expresiones (True And True And False, devuelve False), el resultado se resuelve con la primera condicin, por ser el parntesis de mayor profundidad que sigue (True Or False, devuelve True). Una regla es que siempre debe cerrar los parntesis que abra. Una inadecuada colocacin de condiciones puede arrojar resultados errneos; le recomendamos que aunque de forma predefinida existe una preferencia, usted determine claramente cul desea, utilizando parntesis cuando tenga ms de una condicin por resolver.
188
Se denominan operadores lgicos de circuito corto (short- circuiting), aquellos que son capaces de determinar la necesidad de continuar evaluando condiciones posteriores a las primeras. Son dos:
AndAlso
Procesa comparaciones lgicas de circuito corto, de tipo And; produce False a la primera expresin False que se encuentra, y concluye con la resolucin de expresiones.
OrElse
Procesa comparaciones lgicas de circuito corto, de tipo Or; produce True a la primera expresin True que se encuentra, y concluye con la resolucin de expresiones.
Operador And And And And Or Or Or Or Xor Xor Xor Xor AndAlso AndAlso AndAlso AndAlso OrElse OrElse OrElse OrElse
Si Expresin1 es True True False False True True False False True True False False True True False False True True False False
Y Expresin2 es True False True False True False True False True False True False True False Ni siquiera se evala Ni siquiera se evala Ni siquiera se evala Ni siquiera se evala True False
Resultado True False False False True True True False False True True False True False False False True True True False
189
No podemos resolver la expresin que implica el operador comparativo (>), si antes no resolvemos las expresiones que involucran el operador de suma (+). El procesador no resuelve operaciones a nivel abstracto. Cuando hay expresiones que contienen operadores de ms de una categora (aritmticos, de comparacin y lgicos), se resuelven en este orden: 1. Las expresiones que tienen operadores aritmticos. 2. Las expresiones que tienen operadores de comparacin. 3. Las expresiones que involucran operadores lgicos. Esto tiene sentido si tomamos en cuenta que la materia prima para los operadores aritmticos son generalmente expresiones numricas o expresiones String, y con ellos se genera una nueva expresin numrica o expresin String. Los operadores de comparacin, por su parte, tienen como materia prima dos expresiones numricas o expresiones String, y con ellos se determina un valor lgico. Por ltimo, los operadores lgicos permiten generar una expresin lgica de dos expresiones lgicas. Los operadores de comparacin tienen la misma prioridad; es decir, se evalan de izquierda a derecha en el orden en que aparecen. Los operadores se evalan en el siguiente orden de prioridad: Aritmticos
Exponenciacin (^) Negatividad de expresin () Multiplicacin y divisin (*, /) Divisin de enteros (\) Mdulo aritmtico (Mod) Adicin y sustraccin (+, )
190
Comparacin Igualdad (=) Desigualdad (<>) Menor que (<) Mayor que (>) Menor o igual que (<=) Mayor o igual que (>=)
Cuando hay multiplicacin y divisin en la misma expresin, cada operacin se evala a medida que aparece, de izquierda a derecha. Del mismo modo, cuando se presentan adiciones y sustracciones en una misma expresin, cada operacin se evala tal como aparecen de izquierda a derecha.
191
No olvide que por ms larga que parezca una expresin, todos los operadores actan sobre dos expresiones, y de dos en dos, hasta dejar una sola expresin final que podr ser asignada a una variable o propiedad, o utilizada por algn estatuto o funcin.
Ejercicio 6.1
Utilizacin general de operadores de Visual Basic En este ejercicio se utilizar una aplicacin de consola para comprobar la declaracin y uso de variables en un proceso. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Operadores.
Codificacin de Operadores
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Module Module1
- Module1.vb
Sub Main() Dim Numero1 As Integer = 5 Dim Numero2 As Single = 2 Dim Texto1 As String = Visual Dim Texto2 As String = Basic.NET Console.WriteLine(Numero1) Console.WriteLine(Numero2) Console.WriteLine(Numero1 + Numero2) Console.WriteLine(Numero1 Numero2) Console.WriteLine(Numero1 * Numero2) Console.WriteLine(Numero1 / Numero2) Console.WriteLine(Numero1 \ Numero2) Console.WriteLine(Numero1 Mod Numero2) Console.WriteLine(Texto1 Is Texto2) Console.WriteLine(Texto1 IsNot Texto2) Console.WriteLine(Texto1 + Texto2) Console.WriteLine(Texto1.Trim() + Texto2.Trim()) Console.WriteLine(Texto1.Trim() + + Texto2.Trim()) Console.WriteLine(Pulse INTRO para continuar) Console.ReadLine() End Sub End Module
192
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 5. Los resultados son simples resoluciones de operadores que no requieren explicacin. Lo nico novedoso es el uso del mtodo Trim del objeto String, que se encarga de eliminar los espacios adicionales en el texto. Los resultados deben ser los siguientes:
5 2 7 3 10 2.5 2 1 False True Visual Basic.NET VisualBasic.NET Visual Basic.NET Pulse INTRO para continuar
193
9. Marque nuevamente las lneas de la 8 a la 20, que se encuentran comentadas. 10. Seleccione Edit Advanced Uncomment Selection, o presione la secuencia de teclas Ctrl-K, Ctrl-U. Los apstrofos debieron desaparecer.
194
12. Se oprime la combinacin de teclas Ctrl-C o Ctrl-X para copiar o mover el contenido seleccionado al portapapeles del equipo, que es la memoria temporal de trabajo en el ambiente Windows. Una vez que se tiene algo en el portapapeles, se puede pegar su contenido en un lugar determinado, oprimiendo Ctrl-V. Existe la creencia generalizada de que slo se mantiene en el portapapeles lo ltimo que se copia. 13. Realice, utilizando Ctrl-X y Ctrl-V, los siguientes cambios: mueva la lnea 9 justo antes de la lnea 8, y ponga la lnea 17 inmediatamente antes de la 16. Ponga atencin a cmo lo hace. 14. Seguramente seleccion la lnea 9 de manera completa, oprimi Ctrl-X, se coloc al inicio de la lnea 8 y oprimi Ctrl -V. Despus seleccion la lnea 17 de manera completa, oprimi Ctrl -X, se coloc al inicio de la lnea 16 y oprimi Ctrl -V. Es correcto? 15. El portapapeles realmente almacena hasta las ltimas 20 cosas que haya copiado o colocado en l, y pueden ser extradas utilizando Ctrl-Mays-V. Al reunirse 20 contenidos en portapapeles y tratar de agregar uno ms, el contenido ms antiguo se pierde y el nuevo contenido toma la primera posicin de recuperacin. El portapapeles tiene una organizacin de recuperacin LIFO (Last In, First Out / ltimas entradas, primeras salidas), que da lugar a lo que se conoce como circuito del portapapeles o Clipboard Ring. 16. Hay que deshacer los cambios que realiz, es decir, regresar las lneas 8 y 17 originales a su lugar. Para ello utilizaremos el circuito del portapapeles. 17. Seleccione completamente la que ahora es la lnea 16. Oprima Ctrl-X. Con ello el portapapeles tiene almacenados los siguientes valores:
1: Console.WriteLine(Texto1 IsNot Texto2) ...
18. Seleccione completamente la que ahora es la lnea 8. Oprima Ctrl-X. Con ello el portapapeles tiene almacenados los siguientes valores:
1: Console.WriteLine(Numero2) 2: Console.WriteLine(Texto1 IsNot Texto2) ...
19. Vaya a la que ahora es la lnea 9 y oprima Ctrl-Mays-V una vez. Visual Studio retornar lo que se tenga en la posicin 1, que es lo ltimo que colocamos en el portapapeles. 20. Vaya a la que ahora es la lnea 17 y oprima Ctrl-Mays-V dos veces. Visual Studio retornar en la primera ocasin la posicin uno, y en la segunda la posicin dos. Vea cmo se sustituye automticamente lo que est retornndose del portapapeles.
195
21. Imagine las posibilidades de almacenar en el portapapeles los nombres de las variables de uso ms comn en un proceso, y estarlas invocando de manera rpida en nuestra edicin.
196
26. Oprima las teclas Ctrl-X para enviar el contenido al portapapeles, con lo cual se eliminan las referencias del cdigo. 27. Vaya al inicio del programa, y antes de cualquier otra lnea agregue la siguiente:
Imports System.Console
28. Construya la solucin (teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). FIN DEL EJERCICIO *
Ejercicio 6.2
Uso de operadores de asignacin incluyente y operadores de circuito corto En este ejercicio se utilizar una aplicacin de consola para comprobar los operadores de asignacin incluyente, as como los operadores de circuito corto. El programa solicita tres nmeros entre 1 y 10. A travs de asignacin incluyente se acumularn los valores capturados, y mediante los operadores de circuito corto se har ms eficiente un proceso, detectndose de entre los nmeros capturados alguno que sea primo. Recuerde que un nmero primo es aquel que se divide slo entre 1 y entre s mismo; en el rango de nuestro ejemplo, los nicos nmeros primos son 1, 2, 3 y 7. En este ejercicio se utilizar una aplicacin de consola para comprobar la declaracin y uso de variables en un proceso. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado Primos. 3. Edite el programa de tal forma que aparezca como sigue:
197
Codificacin de Primos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 Option Explicit On Option Strict On Module Module1 Sub Main() Dim Dim Dim Dim N1 As N2 As N3 As Total
- Module1.vb
Console.WriteLine( Suma de 3 nmeros -) Console.WriteLine( Slo capture enteros del 1 al 10) Console.Write(Nmero 1 de 3:) N1 = CInt(Console.ReadLine()) Console.Write(Nmero 2 de 3:) N2 = CInt(Console.ReadLine()) Console.Write(Nmero 3 de 3:) N3 = CInt(Console.ReadLine()) Total += N1 Total += N2 Total += N3 If ((N1 = 1 OrElse N1 = 2 OrElse N1 = 3 OrElse N1 = 7) OrElse _ (N2 = 1 OrElse N2 = 2 OrElse N2 = 3 OrElse N2 = 7) OrElse _ (N3 = 1 OrElse N3 = 2 OrElse N3 = 3 OrElse N3 = 7)) Then Console.WriteLine(Al menos uno de los nmeros es primo) Else Console.WriteLine(Ninguno de los nmeros es primo) End If Console.WriteLine(Total: & CType(Total, String)) Console.WriteLine(Pulse INTRO para continuar) Console.ReadLine() End Sub End Module
198
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solucin (CTRL-MAYS-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 5. El programa declara las variables de trabajo de la lnea 5 a la 8. 6. Es importante que est consciente de cmo estamos haciendo la conversin de datos, tanto al momento de recibir los valores de consola, como al mostrarlos, dado que nuestro programa es type safe. 7. Capture como datos de entrada los nmeros 4, 6, 8. La lnea 22 ejecuta una asignacin incluyente basada en suma; Total += N1, es igual que haber escrito Total = Total + N1. En este caso, N1 vale cero porque no se le especific valor al momento de ser declarada. Despus de la lnea 22, Total vale 0 + 4; es decir, 4; despus de la lnea 23, vale 4 + 6, es decir 10, y despus de la lnea 24, vale 10 + 8, es decir 18. Las lneas 26, 27 y 28 realmente son una sola lnea de cdigo. Se estar evaluando si N1 es alguno de los nmeros primos posibles del 1 al 10. Si N1 es igual a 1, o igual a 2, o igual a 3, o si es igual a 7, la primera expresin es True. La misma comparacin se realiza con N2 y con N3. Internamente, con los nmeros que se proporcionaron, las operaciones se resolveran de la siguiente manera:
if ((False OrElse False OrElse False OrElse False) OrElse _ (False OrElse False OrElse False OrElse False) OrElse _ (False OrElse False OrElse False OrElse False))
Por tanto, el programa tendra una salida falsa, reportando que ninguno de los nmeros tecleados es primo. Si todo ocurri como se esperaba, la salida ser la siguiente:
Suma de 3 nmeros Slo capture enteros del 1 al 10 Nmero 1 de 3:4
199
Nmero 2 de 3:6 Nmero 3 de 3:8 Ninguno de los nmeros es primo Total:18 Pulse INTRO para continuar
8. Ahora ejecute el ensamblado, capturando los nmeros 3, 6, 8. Si N1 es igual a 1, o igual a 2, o igual a 3, o si es igual a 7, la primera expresin es True. La misma comparacin se realiza con N2 y con N3. Internamente, con los nmeros que se proporcionaron, las operaciones se resolveran de la siguiente manera:
If ((False OrElse False OrElse True OrElse False) OrElse
(False OrElse False OrElse False OrElse False) OrElse (False OrElse False OrElse False OrElse False))
Como puede observar, la forma en que se resuelve la condicin es mucho ms simple debido a que los operadores de circuito corto. La primera condicin se resuelve por True, debido a que con Or, ante la presencia de al menos un True, todo es True. Ya no se sigue evaluando ms condiciones. Si todo ocurri como se esperaba, la salida ser la siguiente:
Suma de 3 nmeros Slo capture enteros del 1 al 10 Nmero 1 de 3:3 Nmero 2 de 3:6 Nmero 3 de 3:8 Al menos uno de los nmeros es primo Total:17 Pulse INTRO para continuar
200
MAPA
201
TERMINOLOGA
And, 185 AndAlso, 188 Clipboard Ring, 193 Comment Selection, 192 Distinto de (<>), 180 Divisin (/), 177 entera (\), 177 Exponenciacin (^), 177 Expresin, 178 Igual a (=), 178, 180 Is, 183 IsNot, 183 Like, 183 Mayor o igual que (>=), 180 Mayor que (>), 180 Menor o igual que (<=), 180 Menor que (<), 180 Mdulo, 177 Multiplicacin (*), 177 Not, 185 Operadores, 177 aritmticos, 177 comparativos, 180 de asignacin, 178 incluyente, 179 lgicos, 185 de circuito corto, 188 Option compare, 182 Or, 185 OrElse, 188 Resta (-), 177 Short-circuiting, 188 Suma (+), 177 TypeOf, 183 Xor, 185
PREGUNTAS
6.1 Cules son los operadores aritmticos, para qu sirven y cul es su precedencia? 6.2 Cules son los operadores de asignacin, para qu sirven y cul es su precedencia? 6.3 Cules son los operadores comparativos, para qu sirven y cul es su precedencia? 6.4 Cules son los operadores lgicos, para qu sirven y cul es su precedencia? 6.5 Por qu son importantes las reglas de precedencia? 6.6 Cules son las ventajas de los operadores de circuito corto con respecto a los operadores lgicos? 6.7 Cules son las ventajas de los operadores de asignacin incluyente con respecto a los operadores aritmticos?
202
Notas:
203
EXAMEN
8. 9. 10.
CAPTULO
205
206
Contenido
Estructuras de decisin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estatuto If Then Else (condicional) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Select Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estructuras de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . For Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Do Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estructuras envolventes y anidadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reglas para el anidado de estructuras . . . . . . . . . . . . . . . . . . . . . . . . . Uso de estructuras de decisin . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de For Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adicin de tareas a Task List . . . . . . . . . . . . . . . . . . . . . . Adicin de comentarios de tarea a un programa . . . . . . Identificacin de errores en estructuras anidadas . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 208 210 211 211 212 214 215 215 217 218 223 225 226 227 228 228 230
207
La industria de la computacin ha prosperado enormemente desde sus inicios. La razn es muy sencilla: las computadoras son tiles para las empresas y los individuos. Todos sabemos que las organizaciones llevan a cabo actividades, y deben hacerlo en un tiempo determinado, con una precisin determinada y utilizando una cantidad de recursos determinados. Calcular lo que cuesta desarrollar las actividades como procesar una orden de compra o mantener actualizado un inventario implica calcular los costos de operacin de la organizacin. Para ser ms precisos, podemos decir que una actividad est formada por procesos especficos, a los que llamamos transacciones, y que dichas transacciones tienen un costo que puede reducirse mejorando los procesos implicados. Una de las grandes ventajas de la computacin es la automatizacin de procesos, que permite desarrollar las actividades de las organizaciones de la manera ms rpida y precisa posible, realizando de manera automtica aquellas partes de la actividad que pueden ser programadas. La automatizacin reduce los costos de operacin, pues las transacciones pueden desarrollarse de manera ms barata. Imagina lo que costara a las aerolneas mantener el control de las reservaciones si no dispusieran de sistemas computarizados? Automatizar una actividad es costoso, pero el ahorro que se tiene con la suma de los ahorros por cada transaccin realizada nos lleva a recuperar la inversin aplicada al desarrollo de sistemas. Del dinero que la automatizacin ayuda a ahorrar a las organizaciones recibimos el sueldo muchos desarrolladores; la programacin seria no es un pasatiempo: es un trabajo que debemos mantener siempre rentable. Actualmente, los programas de cmputo realizan las tareas repetitivas que antes hacamos manualmente, agregndoles rapidez y exactitud, y reduciendo los costos. Gracias a esto, las personas disponen de tiempo para realizar otras tareas no automatizadas, lo que permite un mejor aprovechamiento de los recursos humanos. En materia de informtica, las transacciones se ejecutan a travs de secuencias de lneas de cdigo. Como desarrolladores debemos ser capaces de instruir a la computadora para que realice las transacciones correctamente y decida correctamente el curso de las actividades a partir de los datos de entrada. Adems, debemos estructurar el cdigo para la realizacin de tareas repetitivas evitando duplicar cdigo de manera innecesaria.
Estructuras de decisin
Las estructuras de decisin son estructuras del lenguaje que permiten decidir qu lneas de cdigo se han de ejecutar, dependiendo de una condicin determinada.
208
If
Donde If es el inicio de la estructura de decisin, ExpresinLgica es la expresin de tipo Boolean que determina la ejecucin de Instruccin, que en este caso puede constar de slo una sola instruccin, por ejemplo:
Slo en caso de que ExpresinLgica derive en un valor de True, Instruccin ser ejecutada; es decir, esta sintaxis de If produce la ejecucin slo en el caso afirmativo de la condicin. Esta forma de If es muy til para asignar valores a las variables en caso de que una condicin se cumpla. Un bloque de cdigo es un conjunto de lneas de cdigo que tienen su propio alcance de ejecucin y que est siempre delimitado. Si la ejecucin de un bloque de cdigo depende del cumplimiento de una condicin, es necesario que se delimite la estructura de decisin; el bloque de cdigo ser entonces todo lo que se encuentre entre el estatuto If y el estatuto End If.
If
End If
Donde If es el inicio de la estructura de decisin, End If es el fin de la estructura de decisin, y todas las Instrucciones que se encuentran entre el inicio y el fin constituyen el bloque de cdigo que es controlado por la condicional. ExpresinLgica es la expresin de tipo Boolean que determina la ejecucin de Instrucciones, que en este caso puede constar de una sola instruccin o de muchas.
209
Slo en caso de que ExpresinLgica derive en un valor de True, Instrucciones ser ejecutada; esta sintaxis de If controla slo la ejecucin en el sentido afirmativo de la condicin. Por ejemplo:
If Precio < CreditoDisponible Then Cargo = Aprobado CreditoDisponible -= Precio End If
If es un estatuto de bloque, por lo que si inicia un bloque tendr que concluirse apropiadamente. Un error muy comn es abrir estructuras de decisin pero no cerrarlas; para evitarlo, es muy til organizar el cdigo dando a las lneas de inicio y fin de la estructura de decisin una alineacin tabulada distinta a la del bloque de cdigo controlado por dicha estructura. Vea los ejemplos: If y End If nunca tienen el mismo margen izquierdo que el bloque de cdigo que controlan. No trate de ser original al respecto, pues con ello slo lograr que la gente se d cuenta que es un programador novato y poco organizado.
Es posible hacer que If controle al mismo tiempo la ejecucin en el sentido afirmativo y en el sentido negativo, a travs de la especificacin Else. Vea la sintaxis:
If
Else End If
Donde If es el inicio de la estructura de decisin, End If es el fin de la estructura de decisin, y todas las Instrucciones que se encuentran entre el inicio y el fin constituyen el bloque de cdigo controlado por la condicional. El bloque de cdigo del estatuto est dividido en dos bloques menores: uno que se ejecutar slo si ExpresinLgica es True (InstruccionesAfirmativo) y otro que se ejecutar slo si ExpresinLgica es False (InstruccionesNegativo). Por ejemplo:
If Precio < CreditoDisponible Then Cargo = Aprobado CreditoDisponible -= Precio Else Cargo = Denegado End If
210
Donde ExpresinLgica es la expresin de tipo Boolean que determina ejecucin de InstruccionesAfirmativo o InstruccionesNegativo. Esta sintaxis de If controla la ejecucin en el sentido afirmativo o en el sentido negativo de la condicin. Como puede intuirlo, siempre se ejecutar algo.
Select Case
Select Case es una estructura de decisin que permite ejecutar procesos mutuamente excluyentes en funcin de comparaciones realizadas sobre un mismo valor de referencia. Su sintaxis es la siguiente: Select Case ExpresinAEvaluar Case {Condicin | Else}
Instrucciones
End Select
Donde ExpresinAEvaluar es una expresin de cualquier tipo que ser tomada como referencia. Condicin sirve para especificar una condicin relacionada con ExpresinAEvaluar que, en caso de presentarse, disparar la ejecucin de Instrucciones. Se va construyendo un rbol de decisin basado en ExpresinAEvaluar. Se pueden agregar tantas sentencias Case como se deseen; incluso es posible anidar las estructuras Select Case. Si al momento de evaluar Condicin, un determinado valor de ExpresinAEvaluar cumple en dos casos, se ejecutar para el primero que se encuentre. Case Else se aplica cuando el valor de ExpresinAEvaluar no cumple para ninguno de los casos anteriores dentro de la estructura. Para entender cmo funciona este estatuto, imagnese la siguiente situacin hipottica: Una compaa tiene 35 categoras de empleados; cada categora tiene un ingreso determinado y las categoras de nmero ms alto son las de mayor ingreso; existe una relacin directamente proporcional entre categora y sueldo. Se acaba de autorizar un aumento de sueldo general en la compaa, de acuerdo con las siguientes polticas: el personal de alto nivel (categora superior a 19) no tendr aumento; las categoras 18, 17 y 14 recibirn el 15% de aumento; de la categora 8 a la 13, recibirn el 10% de aumento, a excepcin de la categora 10, que es la categora ms rezagada con respecto al salario: sta recibir el 25%. Al resto del personal se le dar un 5% de aumento.
211
Es importante notar que todas las condiciones giran alrededor de la expresin a evaluar (en nuestro ejemplo, Categoria): si no hacen uso de dicha expresin, no son consideradas. Usted podra agregar como instruccin una condicin Case que se resuelva True, pero que no involucre a Categoria; en ese caso, el cdigo dependiente de dicho Case nunca se ejecutar.
Estructuras de control
Son estructuras de control, llamadas tambin bucles, aquellos elementos del lenguaje que permiten la ejecucin de una o ms lneas de cdigo de manera repetida. Mediante las estructuras de control se puede repetir la ejecucin de lneas de cdigo:
Un determinado nmero de veces Hasta que una condicin sea verdadera (True) Mientras que una condicin sea falsa (False) Una vez por cada elemento de una coleccin
A continuacin, podr analizar los elementos del lenguaje que permiten codificar cada una de estas variantes.
For Next
For Next repite la ejecucin de un bloque de cdigo un nmero determinado y conocido de veces. For Next se apoya en una variable que recibe el nombre de contador, que se incrementa o reduce de valor, en intervalos tambin regulares y conocidos. Su sintaxis es la siguiente:
212
To
ValorMximo
[Step
Incremento]
Donde Variable es una variable de memoria de tipo entero que permitir controlar las repeticiones del proceso. ValorInicial es el valor inicial a partir del cual el incremento o decremento se llevar a cabo. ValorMximo es el valor al cual el contador podr llegar. Incremento es la constante entera que marcar la cantidad de incremento o decremento que sufrir Variable en cada repeticin del proceso. Vea los siguientes ejemplos:
Cuenta del 1 al 10 For i = 1 To 10 Console.WriteLine(i) Next i Serie del 5 For i = 0 To 50 Step 5 Console.WriteLine(i) Next i Decremento del 10 al 1 For i = 10 To 1 Step 1 Console.WriteLine(i) Next i
Si se omite la especificacin Step, se da a Incremento el valor de 1 positivo; si Incremento es negativo, se habla de un decremento en trminos reales. Una instruccin que puede ser til en el caso de utilizar For Next es Exit For, que interrumpe la ejecucin del For como si ya hubiese cumplido todas las repeticiones exigidas.
While
While ejecuta un bloque de cdigo un nmero infinito de veces mientras una condicin al inicio del bloque se cumpla (True). Su sintaxis es la siguiente:
While ExpresinLgica Instrucciones End While
213
Por ejemplo:
Dim Prueba As Byte = 0 While Prueba < 255 Console.WriteLine(Prueba) Prueba += 1 End While
Donde ExpresinLgica es un valor de tipo Boolean (True/False), casi siempre una comparacin que de ser verdadera al inicio del ciclo de ejecucin provoca la ejecucin de Instrucciones. Como recordar, el tipo de datos Byte puede almacenar valores desde 0 a 255, exclusivamente; en nuestro ejemplo, While ejecutar un incremento de 1 para la variable Prueba mientras sea menor a 255. Si dejramos que el ciclo fuera ms all de 255, el programa generara un error, pues es imposible que una variable de tipo Byte asuma un valor fuera de su rango. Al igual que For Next, While tiene una sentencia para interrumpir en cualquier momento el proceso: Exit While. Una de las formas ms tiles de While es el ciclo infinito, en donde ninguna operacin o variable dentro del proceso influye en la condicin que gobierna la estructura. Simple y llanamente, se proporciona el valor de True como ExpresinLgica y no hay forma que deje de ejecutarse el ciclo.
While True
Instrucciones
End While
Por ejemplo:
While True Console.WriteLine(Qu nmero estoy pensando) If Console.ReadLine() = 8 Then Console.WriteLine(Efectivamente: 8) Exit While End If End While
214
En este caso, es indispensable que especifique en su programa alguna condicin para ejecutar Exit While ya que, de otra manera, nunca concluir su ejecucin. En el ejemplo que pusimos, mientras no teclee 8, el programa seguir pidiendo nmeros. NOTA
Puede ser que su programa tenga un detalle que impida ejecutar Exit While en un ciclo infinito; recuerde que siempre puede detener la ejecucin de un proceso presionando la combinacin de teclas Ctrl-Intro o Esc.
Do Loop
Do Loop ejecuta un bloque de cdigo un nmero infinito de veces, hasta que una condicin se cumpla (True). Esta instruccin brinda ms flexibilidad que While, en el sentido de que se puede controlar la evaluacin de las condiciones al inicio o al final de la estructura. Usando Do Loop se pueden crear estructuras que se ejecuten al menos una vez, de una forma ms sencilla que utilizando While. Su sintaxis es la siguiente:
Evaluacin al inicio Do {While/Until} ExpresinLgica Instrucciones Loop Evaluacin al final Do Instrucciones Loop {While/Until} ExpresinLgica
donde ExpresinLgica es un valor de tipo Boolean (True/False), que casi siempre es una comparacin. Instrucciones son las instrucciones que se controlan en el bucle. Si se utiliza Do con While (mientras), el ciclo se repite hasta que ExpresinLgica sea falsa. Si se utiliza Do con Until (hasta), el ciclo se repite hasta que la condicin sea verdadera. Slo se puede implementar While o Until, pero no ambas. Tambin tiene que decidir si la evaluacin de las condiciones es al inicio o al final de la estructura, pero no ambas. Por ejemplo:
215
i = 0 Do While i <= LimiteMaximo WriteLine(i) i += 1 Loop i = 0 Do Until i > LimiteMaximo WriteLine(i) i += 1 Loop i = 0 Do WriteLine(i) i += 1 Loop While i <= LimiteMaximo i = 0 Do WriteLine(i) i += 1 Loop Until i > LimiteMaximo
Do.
abra.
Se recomienda programar de tal manera que las estructuras que se abran se cierren lo
ms pronto posible.
216
La ltima estructura en abrirse debe ser la primera en cerrarse. En el caso de estructuras, las variables de tipo entero se resuelven de manera ms rpi-
da que cualquier otro tipo de dato. Los problemas ms comunes relacionados con las estructuras anidadas (y su solucin) son:
No terminar lo que se inicia.
Problema If Condicin Then Instrucciones Solucin If Condicin Then Instrucciones End If
217
Ejercicio 7.1
Uso de estructuras de decisin En este ejercicio se utilizar una aplicacin de consola para comprobar las estructuras de decisin. Se parte del supuesto que usted indicar al programa cunto cuesta un producto que desea comprar, as como el tipo de membresa que tiene en la tienda donde desea comprarlo. A cada tipo de membresa se le aplica un determinado descuento que ser informado por el programa. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado Descuento. 3. Edite el programa de tal forma que aparezca como sigue: Codificacin de Descuento
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Option Explicit On Option Strict On Imports System.Console Module Module1 Sub Main() Dim Precio As Double Dim FactorDesc As Decimal Write (Precio del producto:) Precio = CDbl(ReadLine()) If Precio = 0 Then WriteLine(Nada que calcular) Else WriteLine(Membresa:) WriteLine(1.- Diamante) WriteLine(2.- Premium) WriteLine(3.- Clsica) Write(Qu membresa tiene?:) FactorDesc = CDec(ReadLine()) Select Case FactorDesc Case Is = 1 FactorDesc = 0.2D Case Is = 2 FactorDesc = 0.16D Case Is = 3 FactorDesc = 0.1D - Module1.vb
218
32 33 34 35 36 37 38 39 40 41 42 43 44
Case Else FactorDesc = 0 End Select Write(Precio para usted:) WriteLine(Precio - (Precio * FactorDesc)) End If Write(Presione INTRO para continuar) ReadLine() End Sub End Module
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 5. Las lneas 1 y 2 hacen de este programa un programa type safe. En las lneas 10 y 11 se declaran las variables de trabajo. 6. Cuando el programa solicite el precio (lneas 13 y 14), proporcione el valor 0. Vea en el cdigo cmo se utiliza CDbl(), para hacer de lo capturado un dato Double, y evitar errores, dado que el programa es type safe y no permite conversiones tipo cast (lnea 14). En la lnea 16 vemos la primera estructura de decisin del programa, que controla la ejecucin del programa en el sentido afirmativo y en el sentido negativo. En el sentido afirmativo, se ejecutar el bloque de cdigo que va de la lnea posterior al inicio de la estructura (lnea 9), hasta la lnea anterior al Else o End If (lnea 17), que dan por concluido el bloque. En el sentido negativo, se ejecutar el bloque de cdigo que va de la lnea posterior al Else (lnea 19), hasta la lnea anterior al End If (lnea36), que da por concluido el bloque. Como se proporcion el valor de cero, la condicin que gobierna la ejecucin del If se cumple en el sentido afirmativo (Precio = 0 es True), y al encontrar el Else, pasa a ejecutar la lnea 30; vea que el bloque en el sentido negativo es ignorado completamente.
219
7. Ejecute la aplicacin nuevamente. Cuando le solicite el precio, proporcione el valor 2000. Cuando le solicite el tipo de membresa, proporcione el valor 2. Como se proporcion el valor 2000, la condicin que gobierna la ejecucin del If se cumple en el sentido negativo (Precio = 0 es False), y se procede a ejecutar el bloque en el sentido negativo. En la lnea 24 se recibe el valor 2, que es asignado a FactorDesc; en la lnea 25 se especifica FactorDesc como valor de referencia para las comparaciones Select Case que se encuentran en las lneas 26, 28 y 30; en caso de que no se cumpla ninguna de las anteriores, se ejecuta la lnea 32. Como el valor de FactorDesc es 2 (Is = 2), se procede a ejecutar el bloque de cdigo correspondiente al cumplimiento de esa condicin; en otras palabras, se ejecuta la lnea 29. Vea cmo se agrega la literal D al valor para indicarle al programa que el valor es Decimal (de lo contrario podra asumirse otro tipo de dato, y ante la imposibilidad de conversiones cast, se producira un error). Tambin se podra haber resuelto el problema utilizando la funcin CDec(). Concluida la ejecucin del bloque de cdigo correspondiente a la condicin que se cumpli, se enva el control del programa a la lnea posterior a la terminacin de la estructura (End Select); es decir, se ejecuta la lnea 35 y hacia adelante, para desplegar el precio despus de aplicar el factor de descuento que corresponde al tipo de membresa seleccionada. Si todo ocurri como se esperaba, la salida ser la siguiente:
Precio del producto: 2000 Membresa: 1.- Diamante 2.- Premium 3.- Clsica Qu membresa tiene?: 2 Precio para usted: 1680 Presione INTRO para continuar
Si hubiramos especificado un tipo de membresa que no fuera 1, 2 o 3, el programa hubiera ejecutado la lnea 32, que corresponde a la condicin Case Else; es decir, la que corresponde a cuando ninguna de las otras condiciones se cumple.
220
Ejercicio 7.2
Uso de For Next En este ejercicio se utilizar una aplicacin de consola para comprobar el funcionamiento de For Next. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado Repite. 3. Edite el programa de tal forma que aparezca como sigue:
Codificacin de Repite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Option Explicit On Option Strict On Imports System.Console
- Module1.vb
Module Module1 Sub Main() Dim LimiteMaximo As Integer = 4 Dim LimiteMinimo As Integer = 0 Dim i As Integer WriteLine(Mostrando con For Next incremental) For i = LimiteMinimo To LimiteMaximo WriteLine(i) Next i WriteLine(Muestra usando For Next invertido) For i = LimiteMaximo To LimiteMinimo Step 1 WriteLine(i) Next i WriteLine(Mostrando con While) i = 0 While i <= LimiteMaximo
221
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
WriteLine(i) i += 1 End While WriteLine(Muestra usando Do Loop inicial While) i = 0 Do While i <= LimiteMaximo WriteLine(i) i += 1 Loop WriteLine(Muestra usando Do Loop inicial Until) i = 0 Do Until i > LimiteMaximo WriteLine(i) i += 1 Loop WriteLine(Muestra usando Do Loop final While) i = 0 Do WriteLine(i) i += 1 Loop While i <= LimiteMaximo WriteLine(Muestra usando Do Loop final Until) i = 0 Do WriteLine(i) i += 1 Loop Until i > LimiteMaximo Write(Presione INTRO para continuar) ReadLine() End Sub End Module
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (F5).
222
5. En las lneas 10 a la 12 se declaran variables de trabajo que ayudarn a visualizar de una mejor forma el funcionamiento de los bucles. Todas las estructuras hacen lo mismo, con las siguientes particularidades: a)
For Next
b) Todas las dems estructuras deben apoyarse en un contador implementado manualmente (i +=1), que en caso de olvidarse puede provocar un ciclo infinito. c) Las estructuras Until se ejecutan hasta que se cumple por primera vez la condicin. d) Las estructuras While se ejecutan mientras la condicin sigue siendo verdadera. Si todo transcurri bien, la pantalla mostrar lo siguiente:
Mostrando con For Next incremental 0 1 2 3 4 Muestra usando For Next invertido 4 3 2 1 0 Mostrando con While 0 1 2 3 4 Muestra usando Do Loop inicial While 0 1 2 3 4 Muestra usando Do Loop inicial Until 0 1 2 3 4 Muestra usando Do Loop final While 0 1 2 3
223
6. Modifique las asignaciones de las lneas 25, 32, 39, 46 y 53. En lugar de asignar 0, asigne 10. Se proporciona ese valor porque no es vlido para las condicionales While y Until del programa. Compruebe cmo las estructuras con evaluacin al final se ejecutan al menos una vez. Si todo transcurri bien, la pantalla mostrar lo siguiente:
Mostrando con For Next incremental 0 1 2 3 4 Muestra usando For Next invertido 4 3 2 1 0 Mostrando con While Muestra usando Do Loop inicial While Muestra usando Do Loop inicial Until Muestra usando Do Loop final While 10 Muestra usando Do Loop final Until 10 Presione INTRO para continuar
224
tienen significado para Visual Studio, y que producen un registro en Task List. Estos comentarios de tarea son: TODO, para sealar cosas por hacer; HACK, para anotar recordatorios de cosas relacionadas con el desarrollo; y UNDONE, para deshacer cosas que temporalmente se colocaron pero que hay que eliminar antes de liberar el programa en produccin. 9. Para ver Task List es necesario seleccionar la opcin View Task List (oprima las teclas CTRL-\, CTRL-T). Con ello aparecer la ventana Task List. FIGURA 7.1 Task List
10.
En Task List seleccione en el cuadro de lista Categories la categora User Tasks. Haga clic en el icono Create Task User. Se agregar una tarea de forma automtica.
11. En descripcin escriba Enviar por correo electrnico a un amigo. En la misma lnea de la tarea, haga clic en la columna de prioridad, con lo que aparecern las diferentes prioridades que se pueden asignar a una tarea.
225
> Lo nuevo
En Visual Studio 2005 Task List permite desplegar varias lneas de texto en cada fila, el ordenamiento basado en una o varias columnas, y cambiar la posicin de las columnas de acuerdo con los gustos del desarrollador.
13. Agregar un comentario reconocido por Visual Studio (TODO / HACK / UNDONE) agrega un registro a Task List, en donde se especifica el archivo y la lnea en la que se realiz la anotacin.
14. En Task List haga doble clic sobre el comentario que acaba de agregar y vea cmo el control del programa se traslada a donde se encuentra el comentario. 15. Guarde todos los cambios en su solucin.
226
Ejercicio 5.1
Identificacin de errores en estructuras anidadas En este ejercicio analizar el cdigo que se proporciona, y explicar cules son los errores que se presentan (si los hay). Si no hay problemas, indquelo en su respuesta.
1) If Edad > 18 Then If Registro = True Then Autorizacion = True End If
3) For i = 1 to 10 x *= i If x > 30 Then Console.WriteLine(Lmite de treinta o ms) Exit For Next i End If
227
MAPA
228
TERMINOLOGA
Bloque de cdigo, 208 Bucles, 211 Case Else, 210 Do Loop, 214 Else, 209 Estatuto condicional, 208 Estructura(s) anidada, 215 de control, 211 de decisin, 207 envolvente, 215 Exit Do, 215 For, 212 While, 213 ExpresinLgica, 208 For Next, 211 If, 208 Instrucciones, 208 Select Case, 210 Step, 212 Task List, 223 While, 212
PREGUNTAS
7.1 Cules son las estructuras de decisin ms importantes y cul es la sintaxis de cada una de ellas? Cules son las estructuras de control ms importantes y cul es la sintaxis de cada una de ellas? En qu casos es ms recomendable utilizar Do
Loop
7.2
7.3 7.4
que While?
229
Notas:
230
EXAMEN
7. 8. 9. 10.
CAPTULO
231
232
Contenido
Errores y Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manejo estructurado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Try...Catch...Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloque Try . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloque Catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloque Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clase System.Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de Try Catch Finally y de las propiedades de la clase System. Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Despliegue de errores en tiempo de diseo usando Error List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Calificadores de excepcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objeto Err . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lanzamiento de excepciones propias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lanzamiento de excepciones definidas por el usuario . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 234 235 235 235 236 236 237 240 241 241 242 242 243 246 246 249 250 250 252
233
Un buen programador no es el que conoce todas las estructuras y funciones del lenguaje, sino aquel que garantiza la solucin de los problemas a travs de los programas que desarrolla. El desarrollo de aplicaciones, como toda actividad humana, es perfectible. Usted no debe preocuparse si sus programas presentan problemas en la primera compilacin: resulta totalmente normal que un programa falle. Lo que no es normal es que desconozcamos cmo manejar las fallas de una manera lgica y estructurada que nos ayude a reducir el nmero de problemas hasta lmites aceptables. La psicologa indica que la madurez de una persona se mide por su capacidad de solucionar por s misma sus propios problemas. Esta afirmacin general se aplica al caso particular del desarrollo de programas: es un programador maduro el que sabe resolver problemas.
Errores y Excepciones
Los errores son acciones u omisiones relacionadas con el proceso de desarrollo que producen comportamientos inesperados en el programa resultante. Por otro lado, existe un concepto denominado excepcin, que es una violacin a las reglas sintcticas o de alcance de un lenguaje de programacin. Las excepciones pueden ser excepciones de software, si estn relacionadas con una mala aplicacin del lenguaje, o con la asignacin de valores fuera de dominio a propiedades o argumentos; tambin pueden ser excepciones de hardware, cuando su origen tiene que ver con la falla o saturacin de un dispositivo fsico: el programa puede estar correcto, pero cmo escribir informacin en un disco que est lleno, por ejemplo? Una excepcin siempre es un error, debido a que el resultado obtenido no es el deseado, pero un error no siempre es una excepcin; las excepciones por lo general interrumpen la ejecucin de un programa, mientras que los errores pueden pasar desapercibidos para el compilador del lenguaje. Si un desarrollador entendi mal las especificaciones de un programa una frmula aritmtica, por ejemplo, es probable que codifique correctamente una frmula que no es correcta; el programa no reportar errores en tiempo de compilacin o ejecucin, pero sin duda alguna generar resultados equivocados. El programa se compilar sin problemas, no tendr excepciones, pero s generar errores. Se concluye entonces que los errores tienen un universo ms amplio de manifestaciones; las excepciones, en cambio, tienen un campo ms reducido: el del uso inadecuado del lenguaje, manejo inadecuado de dominios o problemas de hardware.
234
En trminos llanos, hay que temerle ms a los errores que a las excepciones, ya que las excepciones son un aspecto totalmente manejable en Visual Basic. NOTA
Visual Studio brinda una excelente asistencia durante el proceso de desarrollo para reducir el nmero de fallas en los programas. Prcticamente se anticipa al programador en la deteccin de las excepciones; las nicas excepciones que ocurren en tiempo de ejecucin son aquellas relacionadas con la asignacin de valores inadecuados o fuera de rango a variables, argumentos, o propiedades. Las dems son detectadas en el editor de cdigo (excepto algunas excepciones de hardware, que es posible detectar slo hasta el momento de ejecucin).
del cdigo.
Las estructuras para el manejo de excepciones se pueden anidar, ofreciendo mayor con-
235
Try...Catch...Finally
Se puede implementar el manejo estructurado de excepciones a travs del estatuto ...Catch...Finally.
Bloque para el manejo estructurado de excepciones
8
Try-
Su sintaxis es la siguiente:
Try
Bloque Try
stas son las particularidades del bloque Try
... End Try:
Delimita el rea de cdigo en donde puede suceder una excepcin. El cdigo escrito dentro del bloque Try se considera cdigo protegido. Si ocurre una excepcin, el proceso se transfiere al bloque Catch, que contendr el c-
Try.
Bloque Catch
Si una excepcin sucede en el bloque Try, la ejecucin de dicho programa se suspende y contina al principio del bloque Catch. Estos bloques son una serie de estatutos que comienzan con la palabra reservada Catch, seguida de un tipo determinado y reconocido de excepcin, as como la accin que deber realizarse en caso de que la excepcin sea detectada. Estas son las particularidades del bloque Catch:
236
Se puede utilizar uno o varios bloques Catch para manejar las excepciones. Se recomienda manejar de manera separada las excepciones que provoquen acciones
propias excepciones.
Se puede utilizar el estatuto When para comparar una excepcin que ocurre con aquellas
reconocidas por .NET Framework, utilizando para ello el nmero nico de excepcin.
Bloque Finally
El bloque Finally se ejecuta despus del bloque Try, en caso de que no ocurran excepciones, o despus del bloque Catch correspondiente, en caso de que s haya sucedido una excepcin.
Finally,
Este bloque es opcional en su definicin, pero no en su ejecucin; si se define un bloque ste se ejecutar siempre.
El uso ms comn de Finally es liberar objetos o cerrar archivos despus de que una excepcin ha sucedido. En cierta forma, es lo mismo declarar Finally que escribir cdigo fuera de Try. Aunque Finally es opcional, recomendamos su utilizacin pues aclara el cdigo y permite la implantacin de un manejo verdaderamente estructurado: primero a) se define qu se hace, luego, b) se define qu hacer si hay excepciones, y finalmente, c) se define qu ocurre despus, hayan ocurrido o no excepciones. Si en el cdigo protegido por Try no ocurren excepciones, el control del programa hace caso omiso del bloque Catch, para pasar directamente a la ejecucin de Finally.
Clase System.Exception
Visual Basic maneja las excepciones a travs de la clase System.Exception. Recuerde que en Visual Basic todo es objeto, incluyendo una excepcin que es capturada. Una sintaxis comn de Catch es la siguiente:
Catch
VariableExcepcin As
System.Exception
En caso de que ocurra una excepcin en el bloque de cdigo protegido, el control del programa pasa a la lnea Catch, se capturar la excepcin y se almacenar en una instancia de la clase System.Exception que se declara en la misma lnea Catch.
237
En nuestro ejemplo, VariableExcepcin sera la variable objeto en donde estara almacenada la informacin del problema ocurrido. En su calidad de objeto, VariableExcepcin tendra las propiedades y los mtodos de la clase que le dio origen, es decir, System.Exception. Algunas de las propiedades ms relevantes de System.Exception son las siguientes:
Propiedad Message StackTrace Descripcin Contiene la informacin de lo que caus la excepcin. Antecedente de ejecucin; muestra primeramente la lnea que caus el error (en su formato interno de ejecucin), sigue con el procedimiento, captulo y otros datos si los hubiere. Esto permite ubicar, en el contexto modular del programa, a la excepcin. Contiene el nombre de la aplicacin u objeto que origin la excepcin. Puede tratarse incluso de la librera de .NET Framework que es llamada a ejecucin y que causa la excepcin. El hecho de que una excepcin se presente puede dar lugar a otras excepciones (por ejemplo, declarar mal una variable puede provocar excepciones al utilizar dicha variable). En caso de que se presenten excepciones anidadas, mostrar las excepciones que se presentaron en orden de aparicin. Muestra el nombre calificado de la excepcin, el mensaje, el anidamiento de excepciones y el antecedente de ejecucin.
Source
InnerException
ToString
Ejercicio 8.1
Uso de Try Catch Finally y de las propiedades de la clase System.Exception En este ejercicio se proteger un cdigo determinado utilizando Try... Catch... El programa solicita dos nmeros (un dividendo y un divisor), y a partir de ah intentar una divisin. Deliberadamente se causar una excepcin al tratar de dividir entre cero (lo cual, como sabemos, es imposible). 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en (archivo de extensin sln).
C:\APVBNETVS\Ejercicios
Finally...
Agregue a su solucin un proyecto Windows Console Application, llamado Excepciones1. Edite el programa de tal forma que aparezca como sigue:
238
Codificacin de Excepciones1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 Option Explicit On Option Strict On Imports System.Console Module Module1 Sub Main()
Module1.vb
Try WriteLine(Prueba de manejo de Excepciones) Dim N1, N2, Resultado As Decimal Write(Dame el dividendo:) N1 = CDec(ReadLine()) Write(Dame el divisor:) N2 = CDec(ReadLine()) Resultado = N1 / N2 WriteLine(Resultado: & Resultado.ToString) Catch eProblema As Exception WriteLine(> Origen:) WriteLine(eProblema.Source) WriteLine(> Mensaje:) WriteLine(eProblema.Message) WriteLine(> Antecedente de ejecucin:) WriteLine(eProblema.StackTrace) WriteLine(> Texto completo:) WriteLine(eProblema.ToString) Finally Write(Pulse INTRO para continuar) ReadLine() End Try End Sub End Module
Module1.vb
Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (F5).
239
5.
Cuando se protege un bloque de cdigo y ste no causa excepciones, se ejecutan los bloques Try y Finally, pero no Catch (este ltimo se ejecuta slo en el caso de excepciones). La lnea 12 declara todas las variables que vamos a utilizar en nuestro programa. La lnea 14 preguntar el nmero que actuar como dividendo (N1) y la lnea 16 el que actuar como divisor (N2). La lnea 17 es la que intenta la divisin (N1/N2), asignando el resultado a la variable Resultado.
6.
Proporcione el valor 10 como dividendo y 5 como divisor. En nuestro ejemplo, dividir 10 entre 5 no causa ningn problema, y por tanto, el programa trasladar el control de la ejecucin de la lnea 18 (bloque Try) a la 28 (bloque Finally); las lneas intermedias, que corresponden al bloque Catch, son ignoradas.
7.
Ejecute la aplicacin nuevamente, pero proporcione el valor 10 como dividendo y 0 como divisor. Cuando intenta resolver la lnea 14, el programa determina que eso no es posible, y genera una excepcin. Al detectar que una excepcin ha ocurrido, el control del programa se trasladar al bloque Catch, en la lnea 19. La excepcin que es capturada se almacenar como un objeto basado en System.Exception (declarada en la misma lnea Catch). En nuestro caso, el objeto se llama eProblema.
Las lneas 21, 23, 25 y 27 muestran algunas propiedades importantes del objeto eProblema que nos ayudarn a entender qu excepcin est ocurriendo y dnde. Despus de ejecutar el cdigo del bloque Catch, el programa ejecutar el bloque de cdigo Finally. Si todo ocurri como se esperaba, la salida ser la siguiente:
Prueba de manejo de Excepciones Dame el dividendo:10 Dame el divisor:0 > Origen: mscorlib > Mensaje: Attempted to divide by zero. > Antecedente de ejecucin: at System.Decimal.FCallDivide(Decimal& result, Decimal d1, Decimal d2) at System.Decimal.Divide(Decimal d1, Decimal d2) at Excepciones1.Module1.Main() in C:\APVBNETVS\Ejercicios\ Excepciones1\Module 1.vb:line 17 > Texto completo: System.DivideByZeroException: Attempted to divide by zero. at System.Decimal.FCallDivide(Decimal& result, Decimal d1, Decimal d2) at System.Decimal.Divide(Decimal d1, Decimal d2) at Excepciones1.Module1.Main() in C:\APVBNETVS\Ejercicios\ Excepciones1\Module 1.vb:line 17 Pulse INTRO para continuar
240
241
13. En Error List se muestran los errores que contiene el programa, el archivo fsico donde se encuentran los problemas y la lnea de cdigo en se encuentra (la lnea, la columna y el proyecto al que pertenece). En la parte superior aparecen fichas en las que se puede seleccionar lo que queremos ver, sean errores (errors), alertas (warnings) o mensajes (messages). En nuestro caso slo tenemos dos errores, que son reportados en Error List. 14. Error List mostrar los errores de toda la solucin, por lo que es especialmente til cuando modificamos libreras. De esta forma podemos percibir los efectos que tendrn nuestras modificaciones en otros programas que las consumen. 15. Si se hace doble clic en un error, Visual Studio trasladar el control a la posicin en donde se encontr el mismo, lo que facilita enormemente la navegacin en el cdigo. 16. Haga doble clic en el error 2. Compruebe que se ha trasladado a la lnea y la posicin en donde se encontr el error. 17. Modifique la lnea 12 de su cdigo, y corrija el nombre de la variable que est ocasionando el problema. Cambie N3 por N1. 18. Guarde los cambios realizados en su solucin. FIN DEL EJERCICIO*
Filtrado de excepciones
Visual Basic proporciona mucha flexibilidad en el manejo de excepciones: posibilita tener rutinas genricas, o bien, atender las excepciones de manera particular. Tambin es posible seguir utilizando el objeto Err, que se utilizaba en versiones anteriores de Visual Basic.
Calificadores de excepcin
Los calificadores de excepcin son los nombres reconocidos internamente por .NET para cada una de las excepciones que pueden ocurrir. Generalmente, el calificador de excepcin proporciona una muy clara idea de lo que est sucediendo. En el caso del ejercicio 08.01, el calificador fue el siguiente: System.DivideByZeroException. A alguien le queda duda de que se trata de una excepcin determinada por la clase System, que tiene que ver con una divisin entre cero? Las excepciones que existen pueden ser muchas; hay dos formas de conocerlas: que sucedan (lo que no es muy recomendable), o bien, revisando la ayuda de Visual Basic, en donde cada clase lista las excepciones que pueden ocurrir en el uso de los objetos basados en ellas. Por ejemplo, la clase System tiene las siguientes excepciones importantes, entre otras:
242
Cada clase tendr las suyas y habr que investigarlas de manera particular. NOTA
El editor de cdigo de Visual Studio, al realizar la declaracin Catch, sugiere a travs de IntelliSense las excepciones vlidas para lo que est desarrollando.
Objeto Err
Visual Basic sigue proporcionando el objeto Err, utilizado en versiones pasadas de Visual Basic, con la limitacin de que no se puede implementar el manejo estructurado de excepciones (Structured Exception Handling) usando Try... Catch... Finally..., y el manejo de errores (Error Handling) usando On Error, de manera simultnea. El objeto Err s puede utilizarse en el manejo estructurado de excepciones. Esto es muy til cuando se desea trabajar con nmeros de error en lugar de calificadores de excepcin, utilizando la propiedad Number.
243
Ejercicio 8.2
Filtrado de excepciones
En este ejercicio se proteger un cdigo determinado, utilizando Try... Catch... FiEl programa solicita dos nmeros (un dividendo y un divisor) y a partir de ah se intentar una divisin. Como sabemos, no se puede dividir un nmero entre cero. Difiere del ejercicio anterior en que en ste no se manejarn las excepciones de manera genrica, sino particularmente, a travs del filtrado de excepciones.
nally....
Deliberadamente se causar una excepcin al tratar de dividir entre cero, o proporcionando un valor que no es numrico. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado ciones2. 3. Edite el programa de tal forma que aparezca como sigue:
Excep-
Codificacin de Excepciones2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Option Explicit On Option Strict Off Imports System.Console Module Module1
Module1.vb
Sub Main() Dim Satisfactorio As Boolean = True Try WriteLine(Prueba de manejo de Excepciones) Dim N1, N2, Resultado As Byte Write(Dame el dividendo:) N1 = ReadLine() Write(Dame el divisor:) N2 = ReadLine() Resultado = N1 / N2 WriteLine(Resultado: & Resultado.ToString) Catch eProblema As System.DivideByZeroException WriteLine(>>>>>>> Se trat de dividir entre cero)
244
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
WriteLine(Error: & Err.Number.ToString) Satisfactorio = False Catch eProblema As System.InvalidCastException WriteLine(>>>>>>> La conversin cast no es posible) WriteLine(Error: & Err.Number.ToString) Satisfactorio = False Catch When Err.Number = 6 WriteLine(>>>>>>> Manejo fuera de lmite (Overflow)) Satisfactorio = False Finally If Satisfactorio Then WriteLine(Programa sin problemas) Else WriteLine(Programa con problemas.) End If End Try Write(Pulse INTRO para continuar) ReadLine() End Sub End Module
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (F5). 5. Es importante tomar en cuenta que este programa no es type safe dado que tiene la indicacin Option Strict Off (lnea 2); esto porque intentaremos conversiones tipo cast. Tambin es importante ver que las variables de trabajo son de tipo Byte (lnea 12) y, por tanto, admiten slo un dominio 0 a 255 sin signo. 6. Proporcione el valor 10 como dividendo y 0 como divisor. 7. Si colocamos el cero como divisor, al querer resolver la lnea 17, el programa determina que eso no es posible y genera una excepcin. La excepcin es de tipo DivideByZeroException, por lo que el control del programa se trasladar al bloque Catch que, de manera particular, hace referencia a dicho tipo de excepcin. El control del programa ir al bloque Catch que refiere el tipo de excepcin DivideByZeroException en la lnea 19. Se ejecutarn las lneas 20, 21 y 22, y luego se proceder a ejecutar el bloque Finally. Se ejecuta el bloque Catch que corresponde.
245
La lnea 21 muestra el nmero de error del que se trata, utilizando para ello la propiedad Number del objeto Err, que tambin funciona en Visual Basic (en forma mejorada). La lnea 20 muestra un mensaje particular para la excepcin de la que se trata; ste es el mayor beneficio de filtrar los errores, ya que si se tienen excepciones diferentes, es lgico que se necesiten acciones diferentes para manejarlas. El manejo genrico de excepciones trata a todas por igual, lo que resta precisin a la funcin de depuracin de programas. El control del programa, agotado el bloque Catch particular para la excepcin que se provoc, seguir en el bloque Finally. Es importante ver cmo la lnea 9 declara una variable de tipo Boolean (Satisfactorio), que nos servir para saber si el proceso fue satisfactorio (True) o si present excepciones (False). Inicialmente se considera que el proceso es satisfactorio (True). En caso de que suceda alguna excepcin, se cambiar el valor de Satisfactorio a False; con dicho valor le daremos flexibilidad al cdigo del bloque Finally; anteriormente, Finally no diferenciaba si el programa haba causado excepcin o no. Nosotros le damos esa funcionalidad con la variable de apoyo, colocando un condicional que ejecute cierto cdigo si present excepciones, y otro bloque de cdigo distinto si no las caus. Si todo ocurri como se esperaba, la salida ser la siguiente:
Prueba de manejo de Excepciones Dame el dividendo:10 Dame el divisor:0 >>>>>>> Manejo fuera de lmite (Overflow) Programa con problemas. Pulse INTRO para continuar
8. Ejecute la aplicacin nuevamente (tecla F5), proporcione el valor 10 como dividendo y A como divisor. Vea cmo el programa diferencia entre los tipos de excepciones que pueden ser causadas en un proceso. Al detectar que no es posible hacer la conversin tipo cast del valor A a su equivalente Byte, se causa el error. Si todo ocurri como se esperaba, la salida ser la siguiente:
Prueba de manejo de Excepciones Dame el dividendo:10 Dame el divisor:A >>>>>>> La conversin cast no es posible Error:13 Programa con problemas. Pulse INTRO para continuar
246
9. Ejecute la aplicacin nuevamente (tecla F5) y proporcione el valor 1000. Vea cmo el programa diferencia entre los tipos de excepciones que pueden ser causadas en un proceso. Al detectar que 1000 excede el lmite de tipo Byte, se genera la excepcin. Si todo ocurri como se esperaba, la salida ser la siguiente.
Prueba de manejo de Excepciones Dame el dividendo:1000 >>>>>>> Manejo fuera de lmite (Overflow) Programa con problemas. Pulse INTRO para continuar
Ejercicio 8.3
Lanzamiento de excepciones definidas por el usuario En este ejercicio se proteger un cdigo determinado, utilizando Try... Catch... Finally.... El programa solicita dos nmeros (un dividendo y un divisor) y a partir de ah se intentar una divisin. Como sabemos, no se puede dividir un nmero entre cero. Este ejemplo se diferencia de los anteriores en que nos anticiparemos para lanzar una excepcin antes de que el programa lo haga.
247
Deliberadamente se causar una excepcin al tratar de dividir entre cero, y se capturar la excepcin antes de que se realice la divisin (cuando anteriormente se manifestaba la excepcin). 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado ciones3. 3. Edite el programa de tal forma que aparezca como sigue:
Excep-
Codificacin de Excepciones3
Module1.vb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Module Module1 Sub Main() Try WriteLine(Prueba de manejo de Excepciones) Dim N1, N2, Resultado As Decimal Write(Dame el dividendo:) N1 = CDec(ReadLine()) Write(Dame el divisor:) N2 = CDec(ReadLine()) If N2 = 0 Then Throw New Exception(Divisor no puede ser cero) End If Resultado = N1 / N2 WriteLine(Resultado: & Resultado.ToString) Catch eProblema As Exception WriteLine(> Problema: & eProblema.Message) Finally Write(Pulse INTRO para continuar) ReadLine() End Try End Sub End Module
248
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 5. Proporcione el valor 10 como dividendo y 0 como divisor. Al intentar resolver la lnea 20, el programa determinara que eso no es posible, y generara una excepcin. No esperamos a que el programa seale la excepcin: sabemos que si el divisor es cero la operacin no puede ser correcta. Con eso en mente, decidimos anticiparnos,y en la lnea 17 evaluamos si N2 (el divisor) es cero, en cuyo caso, lanzaremos una excepcin nueva, creada por nosotros (instanciamos System.Exception), tal como lo muestra la lnea 18. El control del programa se traslada al bloque Catch, y es manejada como cualquier otra excepcin. Si todo ocurri como se esperaba, la salida ser la siguiente.
Prueba de manejo de Excepciones Dame el dividendo:10 Dame el divisor:0 > Problema: Divisor no puede ser cero Pulse INTRO para continuar
249
MAPA
250
TERMINOLOGA
Calificadores de excepcin, 241 Catch, 235 Cdigo protegido, 235 Err, 234, 242 Error List, 240 Errores, 233 Excepciones de hardware, 233 de software, 233 Excepciones, 233 Exit, 235 Finally, 235-6 InnerException, 237 Manejador de excepciones basado en tipos, 242 del usuario, 242 Manejo estructurado de excepciones, 234 Message, 237 SHE, 234 Source, 237 StackTrace, 237 Structured Exception Handling, 234 System.Exception, 236 Throw, 246 ToString, 237 Try, 235 TryCatchFinally, 235
PREGUNTAS
8.1 Para qu sirven los bloques Try
Catch Finally?
8.2 En qu consiste el filtrado de excepciones? 8.3 Qu son los calificadores de excepcin y para qu sirven? 8.4 De qu manera es posible lanzar excepciones personalizadas?
251
Notas:
252
EXAMEN
8. 9. 10.
Captulos:
9 Fundamentos de la programacin orientada a objetos
Parte 3
Programacin orientada a objetos
En esta parte del libro se presentan los conceptos de la programacin orientada a objetos (POO) utilizando Visual Basic. Aprovecharemos las capacidades de este lenguaje y las herramientas de Visual Studio para la creacin de objetos de negocios y clases, que posteriormente podrn ser utilizados desde cualquier aplicacin, haciendo realidad el esquema de desarrollo reutilizando el cdigo. Aprender a encapsular clases, utilizar la herencia de funcionalidad y el manejo contextualizado de procedimientos por medio del polimorfismo. Nuestra reflexin es la siguiente: la bsqueda de tiempo libre lleva a las personas a ser creativas, para hacer ms cosas con el mnimo esfuerzo. Sin embargo, no todas las personas con estas caractersticas son creativas; slo aquellas con la curiosidad y los conocimientos suficientes podrn utilizar esa creatividad para realizar cosas que trabajen para facilitarles la existencia. El enfoque orientado a objetos nos lleva a identificar algo que ya hemos hecho y reutilizarlo para hacer nuestros desarrollos menos extenuantes.
CAPTULO
255
256
Contenido
Trminos bsicos de POO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases y objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Campos, propiedades, mtodos y eventos . . . . . . . . . . . . . . . . . . . . . . Encapsulamiento (encapsulation) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herencia (inheritance) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polimorfismo (polymorphism) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overloading, Overriding y Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . Elementos esenciales de los objetos que permiten su programacin . . . . . . Identidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comportamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprobacin de la identidad, el estado y el comportamiento de objetos . . . . . . . . . . . . . . . . . . . . . . . . Instanciacin de objetos en Visual Studio . . . . . . . . . . . Modificacin de la identidad de los objetos en Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programacin de comportamientos desde Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 258 258 259 261 263 264 265 265 266 269 269 269 273 274 275 276 276 278
257
Clases y objetos
El presente captulo expone los conceptos generales de la programacin orientada a objetos (POO). Estos conceptos estn relacionados con los objetos en s y con su relacin con otros objetos.
Todava se habla de la POO con entusiasmo, sobre todo cuando quien lo hace no ha programado con lenguajes como C++ o Java. Es necesario destacar que hace mucho tiempo el tema dej de ser una novedad, y, sin embargo, por alguna extraa razn, se sigue viendo a dicho modelo de programacin como lo nuevo (sobre todo entre aquellos que nunca han desarrollado en POO). Quiz tenga mucho que ver que el lenguaje ms utilizado en el mundo, Visual Basic en su versin 6, no estaba orientado a objetos; cualquiera que programara en POO formaba parte de un grupo ms reducido y diferente, lo que confiere siempre un cierto grado de especialidad. Hasta hace poco, un programador en C++ era ms elogiado que un programador de Visual Basic, en gran medida porque haba menos programadores de C++ que de Visual Basic (simple economa: a menor oferta, mayor el precio). Ahora las cosas estn cambiando, ya que Visual Basic se integra al mundo POO, toma de s mismo la simplicidad de su cdigo, y adopta de la plataforma .NET capacidades que eliminan las limitaciones que anteriormente tena, ganando flexibilidad y potencia, y cubriendo aspectos que antes eran ms sencillos en otros lenguajes como C++. Si se pregunta qu es mejor, el enfoque de procedimientos, el de eventos o el orientado a objetos, la respuesta es contundente: depende de lo que se quiera hacer. Hay cosas ms sencillas de implementar en una orientacin que en otra, as que no se sienta mal por no haber aprendido a programar en POO con anterioridad. Quiz no lo haya necesitado. Aunque la experiencia previa en programacin es muy til al aprender POO, no todo el que programa Visual Basic 6.0 podr programar en Visual Basic sin modificar algunos paradigmas. Es importante, por no decir que indispensable, comprender el marco terico del modelo orientado a objetos para ser un buen programador en POO.
258
macin orientada a objetos en Visual Basic; lalos cuantas veces sea necesario hasta que los comprenda plenamente.
Clases y objetos
Una clase es una definicin formal de un tipo de objeto. La clase define qu datos formarn parte de un objeto, qu tareas desarrollar el objeto, y de qu manera interactuar el objeto con el usuario y con otros objetos. Los objetos son instancias de una clase. Por instancia podemos entender una copia funcional de la clase. A la accin de generar un objeto a partir de una clase, se le denomina instanciacin. Al procedimiento o cdigo que realiza la instanciacin se le denomina constructor. Al procedimiento o cdigo que destruye a un objeto, liberando los recursos que ste consuma, se le llama destructor. En los lenguajes .NET no es necesario codificar destructores (como era necesario hacer, por ejemplo, en C++), debido a la existencia del garbage collector, que es el elemento de CLR que se encarga de eliminar objetos no utilizados a fin de liberar los recursos que utilizan.
259
Los mtodos son los comportamientos predefinidos que puede presentar un objeto. En cierta forma, los mtodos representan las acciones que el objeto podr realizar. La manera en que se pueden definir los mtodos es agregando procedimientos y funciones a una clase; al momento de generar una instancia de dicha clase, los procedimientos y funciones que le codificamos a la clase formarn los mtodos disponibles para el objeto. Un evento es el resultado de la interaccin que un usuario o programa tiene con un objeto, en una circunstancia dada, que desencadena la ejecucin de un procedimiento o mtodo.
La interaccin que tiene el usuario o programa con un objeto provoca internamente una interaccin de dicho objeto con otros, que puede ser bidireccional, ya sea que el objeto reciba una peticin de un objeto o aplicacin, o bien que realice una peticin a otro objeto o aplicacin. A las propiedades, mtodos y eventos tambin suele llamrseles miembros (members), que son el conjunto de elementos declarados por una clase.
Encapsulamiento (encapsulation)
Para que una aplicacin realmente est orientada a objetos debe admitir las cualidades de encapsulamiento, herencia y polimorfismo. Estas tres cualidades son representativas de POO.
260
El encapsulamiento es la capacidad que tiene un objeto para almacenar datos y procedimientos, como una unidad funcional, y permitir el acceso a ellos sin que los dems objetos tengan la necesidad de conocer cmo se integran dichos datos y dicho comportamiento dentro del objeto. Usted ya sabe que los objetos se hacen peticiones entre s a travs de mensajes, y que un objeto puede hacer uso de otros objetos. Imagine que un objeto (objeto A) realiza un clculo financiero complejo. Imagine que otro objeto (objeto B) realiza un clculo que determina el monto de los gastos de la compaa en un periodo determinado. Resulta que el objeto A, para desarrollar sus operaciones, necesita la informacin que produce el objeto B, y para obtener dicha informacin se comunica con B enviando un mensaje (mensaje X). Como respuesta, el objeto B le enva al objeto A la contestacin a travs de un mensaje (mensaje Y). La persona que desarroll el objeto B se da cuenta de que el clculo que realiza el objeto puede mejorarse. Procede a cambiar el cdigo (comportamiento), hacindolo ms eficiente, reduciendo el tiempo de respuesta a la mitad. Como consecuencia del encapsulamiento, el objeto A no necesita saber qu hace el objeto B para proporcionar la informacin que se le pide. El encapsulamiento permite que el estado o el comportamiento de un objeto pueda modificarse para darle mayor o mejor funcionalidad al objeto, sin afectar a otros objetos asociados. El objeto A sigue enviando el mensaje X al objeto B, y el objeto B le sigue respondiendo con el mensaje Y, slo que en la mitad del tiempo que antes. El encapsulamiento slo debe respetar una regla: al modificar un objeto, ste debe seguir aceptando los mismos mensajes de peticin, y enviando los mismos mensajes de respuesta. Fuera de eso, el objeto puede ser una caja negra para los dems desarrolladores, sin que ello perjudique la funcionalidad de la aplicacin. Las ventajas que proporciona el encapsulamiento a los programadores son las siguientes:
Facilita la modularidad.
Un mdulo es un bloque de cdigo que desarrolla un proceso especfico. La modularidad es la capacidad que se tiene de dividir los procesos en mltiples procesos ms pequeos. Cuando se inicia un proyecto de programacin orientada a objetos, cada objeto acta como un mdulo; a cada desarrollador se le pide que desarrolle ciertos objetos, que obedeciendo a determinados mensajes de peticin, proporcionen determinados mensajes de respuesta. Al final del proyecto se integran todos los objetos, que de forma complemen-
261
taria se dan servicio entre s; en un momento dado, si a una persona se le ocurre modificar un objeto que otra persona est utilizando, esto no impacta negativamente, porque los mensajes que se comunican los objetos no deben de sufrir variacin.
Mantiene la informacin oculta.
El objeto puede por s solo encargarse de modificar los valores de sus propiedades; adems, para hacer uso del objeto no es necesario conocer cmo realiza las operaciones (comportamiento). Slo el objeto se encarga de manejar su estado y comportamiento. Hay procesos tan complejos, importantes y confidenciales que slo el desarrollador del objeto est autorizado para conocerlos. Imagine que tiene un objeto que se encarga de codificar y decodificar informacin confidencial en la organizacin; por ejemplo, si todos los programadores que utilizaran el objeto pudieran conocer los pormenores del algoritmo de codificacin y decodificacin, no estaramos seguros en qu momento podra ser conocido por todos, y, por tanto, copiado y vulnerado. El encapsulamiento elimina la necesidad de que otros conozcan cmo est codificado un objeto y, por tanto, favorece la confidencialidad de la implantacin de los procesos.
Herencia (inheritance)
La herencia describe la capacidad de crear una nueva clase basada en una existente. La clase a partir de la cual se generar la nueva recibe el nombre de clase base (base class); la nueva clase, llamada clase derivada (derived class), hereda todas las propiedades, mtodos y eventos de la clase base y a partir de ah, es posible agregarle las propiedades y mtodos particulares que la hacen especial. Un ejemplo puede aclararnos las cosas. Imagine que crea una clase llamada Vehculo AutoMotor. Esta clase contendr propiedades que todos los vehculos automotores tienen como son color, tipo de transmisin, tipo de combustible, etctera. Adems, tendr definidos los mtodos aplicables para todos los vehculos automotores; por ejemplo, encender o apagar el motor. Hay un tipo de vehculos automotores que sirven para carga de materiales (vehculo de carga); en ellos, la capacidad de carga en toneladas, las dimensiones mximas de la carga y la necesidad de refrigeracin de la carga son importantes, pero, son esos datos importantes para un vehculo que slo es utilizado para transportar personas? La respuesta es que no. Tenemos las siguientes alternativas de solucin para manejar la informacin del ejemplo:
Definir la clase VehculoAutoMotor con todas las caractersticas posibles para todos los
vehculos automotores posibles; eso sobrecargara a la clase de muchas propiedades no aplicables para todos los vehculos, complicando el trabajo de afirmar o negar las carac-
262
tersticas aplicables a un vehculo en particular. En realidad, todo est siendo manejado en un mismo objeto, tal y como sera en una programacin procedural.
Definir una clase independiente de VehculoAutoMotor; por ejemplo, VehculoAutoMotorCarga,
que contenga todas las propiedades y los mtodos que requieren ser especificadas para un vehculo automotor de carga. Obviamente, muchas de las caractersticas de los vehculos automotores de carga son comunes para todos los vehculos automotores. Eso implicara una doble codificacin (codificacin redundante), que revela que, no obstante que ya tenamos codificados los pormenores de los vehculos automotores, no reutilizamos dicho cdigo, pues creamos uno enteramente nuevo. En esta alternativa tampoco funciona la herencia.
slo aquellas propiedades y mtodos no definidos en VehculoAutoMotor. La nueva clase (VehculoAutoMotorCarga) se generara a partir de una clase base (Vehculo AutoMotor), aprovechando toda su codificacin. Esta alternativa implica un uso funcional de la herencia, en donde se tiene una clase base y una clase derivada. FIGURA 9.2 Herencia
Clase Base
Las ventajas que proporciona la herencia para los programadores de software son las siguientes:
Clases derivadas
263
Reuso de cdigo.
La mayor ventaja de la herencia es que el cdigo se reutiliza de una forma ms eficiente, pues las clases parten de otras clases ms generales; esto garantiza que de inicio las clases ya tienen la funcionalidad de otras anteriormente creadas. Slo se estar desarrollando nueva funcionalidad, evitndose el cdigo redundante. Es posible realizar una jerarqua que distinga procesos generales y especficos.
Jerarqua de clases.
La figura 9.2 muestra de manera conceptual cmo, a partir de una clase base, surgen clases derivadas que pueden disponer de todas las propiedades, mtodos y eventos de la clase base, y que adems incluyen las caractersticas particulares de aquello que no es posible representar usando solamente lo definido en la clase base. En la jerarqua de clases, la clase base no requiere de las clases derivadas, pero las clases derivadas s requieren de lo definido en la clase base.
Polimorfismo (polymorphism)
El polimorfismo es la capacidad de manejar mltiples clases que pueden ser utilizadas de manera intercambiable a travs de una misma implementacin (nombre de clase). El polimorfismo es esencial para la programacin orientada a objetos, ya que permite, a travs de un mismo nombre de clase, agrupar diferentes funcionalidades, dependiendo de las propiedades y mtodos que se utilicen al momento de invocarlas.
NOTA
En Visual Studio puede verse claramente esta capacidad. Si en alguno de sus programas utiliza, por citar un ejemplo, la funcin Val, que convierte a nmero una expresin, aparecer una referencia como sigue:
La misma implementacin (Val) puede comportarse de tres maneras, dependiendo del argumento que reciba. Si la funcin recibe un argumento String, realizar la conversin y devolver un valor de tipo Double; si recibe un argumento de tipo Char, devolver un valor de tipo Integer; y si recibe un argumento Object, devolver un valor de tipo Double. El programador no tendr que preocuparse por saber qu clase ha de utilizar en caso de proporcionar un argumento String, Char u Object. El polimorfismo se encarga de realizar la seleccin adecuada.
264
Imagine que tiene una aplicacin que controla las ventas de un negocio. Puede ser que tenga un objeto llamado RegistraVenta, que se encargue de almacenar en una base de datos los pormenores de la venta. Suponga que hay un objeto llamado ActualizaLneaCrdito que se encarga de actualizar la lnea de crdito de los clientes que compran en el establecimiento; como ha de suponer, las acciones que realizar ActualizaLneaCrdito tienen que ver si la compra se realiza a crdito o de contado. En enfoque procedural, sera necesario hacer dos procedimientos distintos, de diferente nombre, para controlar cada una de las alternativas. En POO se pueden generar dos clases distintas, que contengan cada una de las alternativas de la actualizacin de la lnea de crdito; la diferencia estriba en que para el programa slo existir una. Ser la misma plataforma de ejecucin la que determine, con base en los datos proporcionados, qu clase es la que se emplear.
NOTA
La implementacin en programacin de la terminologa descrita en este captulo se demostrar en el captulo siguiente.
Los miembros con caracterstica Overloaded son utilizados para proporcionar diferentes versiones de una propiedad o mtodo que tiene el mismo nombre, pero que acepta diferente nmero de argumentos, o argumentos de diferente tipo de dato. Las propiedades y mtodos con caracterstica Overriden son utilizados para reemplazar una propiedad o mtodo que, habiendo sido heredado de una clase base, no es lo apropiado para la clase derivada. Esto permite sustituir elementos heredados de la clase base, con aquellos que la clase derivada realmente necesita.
265
La nica restriccin que se tiene es que los miembros Overriden deben aceptar el mismo nmero de argumentos y devolver los mismos valores, respetando los tipos de datos de la clase base, a efecto de que el encapsulamiento de los objetos sea posible. Los miembros con caracterstica Shadowed son aquellos que reemplazan localmente a otros miembros existentes, dentro de un alcance diferente al original.
Identidad
La identidad del objeto es su capacidad de tener un nombre que lo identifica y diferencia de los dems. No podemos crear ningn objeto sin asignarle un nombre para su identificacin; de ser as generaramos un elemento al cual no podramos invocar de ninguna manera. Al momento de instanciarse, todos los objetos son exactamente iguales a la clase de la cual derivan; slo se diferenciarn por su identidad. En Visual Basic los objetos poseen una propiedad llamada Name, a travs de la cual se manifiesta su identidad. A la propiedad Name tambin se le conoce como propiedad de identidad. La propiedad Name puede ser utilizada en tiempo de ejecucin para evaluar la identidad de un objeto por su nombre, y no por su identificacin en el programa (nombre de la variable objeto, a lo que se conoce como nombre programtico). El valor que posee la propiedad Name es de tipo String, lo que facilita mucho su utilizacin en los procesos que estemos codificando. Los programadores de Visual Basic en su versin 6 tal vez no le dieran importancia al hecho de que todos los controles que se utilizaban en las aplicaciones deban ser referidos por
266
su nombre programtico, pues era la nica posibilidad que haba para identificar los elementos de un programa. Una vez realizada la codificacin, cambiar la identidad a un control (modificar la propiedad Name) era impensable, ya que sera necesario modificar el cdigo para admitir el nuevo nombre asignado. En Visual Basic queda claramente definido que se tiene un nombre programtico (nombre de los objetos) y una identidad de los objetos, en la propiedad Name.
Estado
El estado de un objeto es la situacin de forma y comportamiento que tiene el objeto en un momento determinado en tiempo de ejecucin. El estado est determinado por el juego de valores que tienen sus propiedades. Como sabemos, las propiedades son las caractersticas particulares del objeto y especifican su nombre, posicin, apariencia y hasta sus capacidades de interaccin con el usuario y otros objetos. Un objeto puede estar disponible o no para su uso en una interfaz (Enabled=True o Enabled=False); puede tener un ancho de 10 o 20 pxeles (Width=10 o Width=20). Si cambiamos el valor de cualquiera de las propiedades, como podra ser incrementar el ancho del objeto de 10 a 20 pxeles, ello representa una modificacin de estado. La figura 9.3 nos invita a imaginar el ncleo de un objeto como un conjunto de propiedades establecidas; vea cmo la identidad del objeto tambin forma parte del estado del mismo, pues Name es una propiedad, al igual que las de posicin, apariencia y otras.
Comportamiento
El comportamiento es la capacidad del objeto para funcionar de una determinada manera. Como respuesta a la interaccin del usuario, de otros objetos, o incluso del mismo sistema operativo, el objeto podr comportarse de diferente forma. El comportamiento de un objeto se presenta por la posibilidad de mandar llamar a ejecucin:
Los mtodos Los procedimientos de evento Los procedimientos y funciones definidas por el usuario
Los mtodos, como sabe, son los comportamientos predefinidos que un objeto puede presentar, y que se encuentran definidos por la clase de la cual el objeto deriva.
267
Los procedimientos de evento son aquellos procedimientos que le suceden a un objeto como respuesta a la interaccin que tienen con el usuario u otros objetos. El objeto tiene un conjunto de eventos que reconoce, y usted como desarrollador lo nico que hace es decirle a su programa a) que quiere que un objeto determinado sea sensible a los eventos que le sucedan (especificacin WithEvents al momento de la declaracin), b) elaborar un procedimiento y c) especificarle a dicho procedimiento que ser ejecutado en caso de que le suceda el evento a alguno de los objetos que maneje (handles). En versiones anteriores de Visual Basic, un procedimiento de evento poda servir slo para manejar las acciones que deberan suceder cuando a un objeto determinado le suceda un evento determinado; de hecho, el nombre de los procedimientos de evento estaba formado por el nombre del objeto y el nombre de evento, separados por un guin bajo. Haba controles para los cuales se aplicaban las mismas validaciones (por ejemplo, que los cuadros de texto no se dejaran vacos); no obstante que el proceso a realizar era el mismo para todos los cuadros de texto, a cada uno de ellos se le deba definir un procedimiento de evento. Algunas cosas cambiaron en Visual Basic. Un procedimiento de evento puede manejar un mismo evento para uno o ms objetos; por ese motivo, el nombre asociado a un solo objeto y un solo evento ya no tiene sentido. Ahora el nombre del procedimiento de evento puede ser el que sea. La nica cosa que debemos respetar son los argumentos implcitos. Los procedimientos pueden admitir argumentos; con base en ellos es posible modificar el resultado del procesamiento o el valor que devuelven (en el caso de las funciones). Los argumentos implcitos son aquellos que son declarados por Visual Basic de manera automtica; en la declaracin de este tipo de argumentos el programador no participa ms que como espectador y usuario. Cada evento podr exigir la presencia de los argumentos implcitos que necesita para trabajar; cuando nosotros declaramos un objeto especificando que queremos que sea sensible a eventos (WithEvents), tambin le estamos diciendo al programa que queremos que Visual Basic se encargue de actualizar, en tiempo de ejecucin, los datos de los argumentos implcitos de cada uno de los eventos aplicables al objeto. Nosotros no determinamos el valor que tendrn los argumentos implcitos; es el CLR, en tiempo de ejecucin, el que determina qu valores tendrn. Los procedimientos definidos por el usuario y las funciones definidas por el usuario, son los procedimientos y funciones que usted codifica; no dependen de los eventos que pueden sucederle al objeto, ni requieren estar predefinidos en ninguna clase: son la forma ms pura de codificacin. Hace muchos aos, cuando nadie hablaba an de objetos ni de eventos, los procedimientos y funciones definidos por el usuario ya existan.
268
NOTA
Algunos desarrolladores, para no estar preocupndose respecto a qu objetos permitirn manejo de eventos y cules no, colocan la especificacin WithEvents a todos los objetos. Aunque es una forma simple de quitarse problemas, no es lo ms estructurado; deja ver que el programador no conoce a profundidad el comportamiento que tendr su interfaz. Sugerimos colocar WithEvents slo a los objetos que realmente manejarn procedimientos de eventos.
La figura 9.3 muestra un panorama completo de la composicin de un objeto. El crculo del centro es el estado del objeto. Dentro del estado se encuentra la identidad, pues la propiedad de identidad forma parte del estado. Alrededor del estado del objeto estn las formas de comportamiento, que mantienen un dilogo con dicho estado, pues los mtodos, procedimientos de evento y procedimientos de usuario pueden modificar el estado, y ste puede determinar la disponibilidad de las formas de comportamiento. Los procedimientos y funciones definidas por el usuario son la parte ms especializada de las aplicaciones, ya que contienen los bloques de cdigo que han de realizar aquello que el lenguaje por s mismo no puede. En ocasiones se dice que los procedimientos y funciones definidas por el usuario son las reglas de negocio, para la aplicacin. FIGURA 9.3 Estado y comportamiento
269
Ejercicio 9.1
Comprobacin de la identidad, el estado y el comportamiento de objetos En este ejercicio se comprobar la identidad, el estado y el comportamiento de un objeto. 1. 2. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Windows Application, llamado CambiaEstado.
4.
5.
270
Moderadores de tamao
6.
7. 8.
El formulario, al igual que todos los objetos que son agregados a la interfaz en tiempo de diseo, tienen valores por omisin en todas sus propiedades. El objeto Form1 posee un aspecto que los valores por omisin le proporcionan. Seleccione la opcin View Toolbox (oprima las teclas Ctrl-Alt-X) para que aparezca Toolbox. Si Toolbox est en ocultacin automtica, fjela en Document Window. En Toolbox expanda el grupo de controles Common Controls.
271
9.
Haga doble clic en el control Button. Con ello se agregar en modo de insercin un botn en el rea de diseo de Form Designer. 10. Su interfaz ahora debe aparecer como sigue. La pregunta interesante es dnde se guarda el cdigo que genera esta interfaz?
11. En Solution Explorer haga clic en Show All Files. 12. Seleccione el nodo CambiaEstado Form1.vb. Vea cmo dicho nodo se compone de dos programas: Form1.vb y Form1.Designer.vb. En Form1.vb se editan los comportamientos de la aplicacin, mientras que en Form1.Designer.vb se codifica la interfaz, instanciando todos los objetos.
272
13. Haga doble clic sobre el nodo Form1.Designer.vb y vea el cdigo que aparece. Es un poco complejo, pero es el trabajo que Form Designer nos ha ahorrado. Con Visual Studio no nos preocupamos por instanciar los objetos de interfaz, ni por cambiar de forma programtica los valores por omisin de las propiedades. Al agregar un botn, por ejemplo, se agrega automticamente el siguiente cdigo en el programa Form1.Designer.vb:
Me.Button1 = New System.Windows.Forms.Button ... Button1 Me.Button1.Location = New System.Drawing.Point(0, 0) Me.Button1.Name = Button1 Me.Button1.Size = New System.Drawing.Size(75, 23) Me.Button1.TabIndex = 0 Me.Button1.Text = Button1 Me.Button1.UseVisualStyleBackColor = True ... Friend WithEvents Button1 As System.Windows.Forms.Button
14. Si pretende ser un desarrollador profesional, sin duda requiere Visual Studio. Como podr leer en comentarios del mismo programa, no se recomienda que modifique el programa directamente. Deje a Visual Studio hacer su trabajo y dedquese a desarrollar en modo de diseo lo ms que pueda. Slo edite el cdigo si sabe lo que est haciendo, y no descarte la posibilidad que el programa deje de funcionar o que Visual Studio deshaga los cambios que usted realice al programa sin notificarle nada. 15. En Solution Explorer haga doble clic en el nodo Form1.vb, para regresar al tiempo de diseo del formulario. 16. Seleccione View Properties (F4) para ver la herramienta Properties. 17. Seleccione el objeto Form1, haciendo un solo clic en el formulario que se ve en Form Designer. 18. Busque la propiedad Size, y vea las dimensiones que tiene el formulario. Algunas propiedades pueden expandirse, lo que indica que se forman por otras propiedades. La propiedad Size se compone de dos propiedades: Width y Height.
273
________________ ________________
19. Seleccione el modificador de tamao que aparece en el borde inferior del formulario y arrstrelo hacia arriba, de tal forma que el formulario quede a la mitad de su tamao original. Consulte nuevamente los valores que componen Size. Compruebe que las modificaciones en tiempo de diseo afectan directamente las propiedades de los objetos, modificando su estado.
Height: Width:
________________ ________________
21. Seleccione el objeto Button1, haciendo un solo clic en el botn que se ve en Form Designer.
Text Cambiar Color
22. Utilizando el modificador de tamao que se encuentra en el borde derecho del botn, ample el ancho del botn.
23. Arrastre el botn al centro del formulario, para que sea ms esttico. 24. Decida la forma en que prefiere cambiar las propiedades de sus objetos.
274
Cuando hacemos referencia a la forma programtica de hacer las cosas, queremos decir que a travs de cdigo hacemos cosas que es posible hacer en tiempo de diseo utilizando las herramientas de Visual Studio. 28. Una recomendacin general es que asigne los nombres de los objetos al inicio de los trabajos de desarrollo, antes de codificar comportamientos; asignados los nombres procure no cambiarlos, dado que el tal caso tendra que actualizar cada lnea de cdigo en donde los objetos eran utilizados, o de lo contrario se generar error. 29. Seleccione a Button1 haciendo un solo clic en el botn, y en Properties cambie el valor de la propiedad Name a Cambiar.
32. Vea cmo la clase tiene el mismo nombre del objeto Form y cmo el procedimiento es igual al nombre del botn y del evento que se est codificando (Cambiar_Click). La lnea 4 cambia el color de fondo del formulario, mientras que en la lnea 5 se cambia el color de fondo del botn. 33. Es importante notar que los cambios de estado en forma programtica se logran de la siguiente forma:
Objeto.Propiedad = Valor
34. Vea cmo el formulario no se refiere con su nombre (Formulario) sino por la constante Me; esto debe ser as por la forma en que Visual Studio maneja los formularios. Si no se estuviera utilizando Visual Studio, tendra que referirse el formulario por su nombre.
275
35. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 36. Haga clic en el botn y vea los cambios de color que provocamos. FIN DEL EJERCICIO *
MAPA
276
TERMINOLOGA
Argumentos implcitos, 267 Campos, 258 Clase, 258 Codificacin redundante, 262 Comportamiento, 266 Constructor, 258 Destructor, 258 Encapsulamiento, 259-60 Encapsulation, 259 Estado, 266 Evento, 259 Fields, 258 Form Designer, 269 Funciones definidas por el usuario, 267 Handles, 267 Herencia, 261 Identidad, 265 Inheritance, 261 Instancia, 258 Instanciacin, 258 Jerarqua de clases, 263 Members, 259 Mtodos, 259, 266 Miembros, 259 Objetos, 258 Overloaded, 264 Overloading, 264 Overriden, 264 Overriding, 264 Polimorfismo, 263 Polymorphism, 263 POO, 257 Procedimientos de evento, 267 definidos por el usuario, 267 Programacin orientada a objetos (POO), 257 Properties, 258 Propiedades, 258 Reuso de cdigo, 263 Shadowed, 265 Shadowing, 264 WithEvents, 267
PREGUNTAS
9.1 Cules son las tres caractersticas principales que identifican a la programacin orientada a objetos? 9.2 Defina clase, objeto, propiedad, mtodo y evento. 9.3 Explique qu es el estado de un objeto. 9.4 Explique los conceptos Overloading, Overriding y Shadowing. 9.5 Cules son las ventajas que aporta la herencia? 9.6 Cules son las ventajas que aporta el encapsulamiento? 9.7 Cules son las ventajas que aporta el polimorfismo?
277
Notas:
278
EXAMEN
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
1. A la accin de generar un objeto a partir de una clase se le llama: a) Instanciacin b) Generacin de objetos c) Derivacin 2. Es el procedimiento o cdigo que libera recursos que ya no utilizar un objeto: a) Constructor b) Destructor c) GarbageCollector 3. Es la habilidad de crear una nueva clase basada en una clase existente: a) Polimorfismo b) Herencia c) Encapsulamiento 4. Es la capacidad que tiene un objeto de almacenar datos y procedimientos como una unidad funcional: a) Polimorfismo b) Herencia c) Encapsulamiento 5. Son asociaciones formales de uno o ms datos de un determinado tipo, que da lugar a un nuevo tipo de dato compuesto: a) Delegado b) Estructura c) Encapsulado
CAPTULO
10
279
280
Contenido
Definicin de una clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Definicin de propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de bibliotecas de clases (libreras) . . . . . . . . . . . . . . . . . . . . . . . . . . Condiciones para la utilizacin de las bibliotecas de clases . . . . . . . . . . . . . . Creacin de una clase con propiedades y mtodos . . . . . . . . . . . Uso de Code Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de un diagrama de clases y modificacin del mismo con Class Designer . . . . . . . . . . . . . . . . . . . . . Uso del selector de documentos activos (Active Documents) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adicin de mtodos usando Class Designer . . . . . . . . . . Uso de Class View para examinar objetos . . . . . . . . . . . Consumo una clase a travs de instancias . . . . . . . . . . . . . . . . . . Uso de Object Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visualizacin de referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de clases en soluciones diferentes . . . . . . . . . . . . . . . . . . . . Integracin de proyectos existentes a una nueva solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Distribucin de copias locales de libreras DLL . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 281 283 284 284 285 289 291 292 296 298 302 302 304 304 305 307 308 308 310
281
En captulos anteriores tuvimos la oportunidad de trabajar con objetos que, necesariamente, fueron derivaciones de alguna clase definida en la biblioteca de clases de .NET Framework. Lo importante en este punto es saber que no siempre la biblioteca de clases de .NET Framework es la solucin a nuestros problemas; seguramente hay algn proceso o clculo muy especfico que nosotros deberemos desarrollar. Por esa razn es indispensable aprender a desarrollar una biblioteca de clases propias.
10
NombreClase CdigoClase
End Class
Donde NombreClase es el nombre a travs del cual la clase puede ser invocada. La instanciacin de la clase se deber llevar a cabo por medio de este nombre. CdigoClase es el contenido de la clase; como sabemos, el contenido de la clase se compone de datos (propiedades) y comportamiento (mtodos y funciones). Por esa razn debemos definir dentro de la clase los procedimientos (Sub - End Sub), funciones (Function - End Function), y propiedades (Property - End Property) que debe tener, entre otros atributos. Una clase, como ya sabe, es la definicin formal de un objeto. Las clases por s mismas no pueden ser utilizadas; es necesario crear unidades funcionales de las clases, es decir, objetos. Para ello debemos recurrir a un constructor, que es el cdigo que genera la instancia de una clase. En Visual Basic, un constructor tpico sera:
Dim
Objeto As
New
NombreClase( )
Donde Objeto es el nombre de la instancia de la clase y NombreClase es el nombre de la clase que se est instanciando. New es la instruccin constructora por excelencia. Una vez generada la instancia de la clase, podemos utilizar todos sus elementos: mtodos, funciones y propiedades.
282
Definicin de propiedades
Para una clase se puede, adems de definir su comportamiento a travs de mtodos y funciones, especificar qu propiedades han de conformar su estado. Las propiedades son las caractersticas particulares de un objeto; la clase debe definir qu propiedades tendrn los objetos que deriven de ella. Para su definicin, es necesario definir las propiedades dentro del bloque de cdigo que compone la clase. Las propiedades almacenan valores de un determinado tipo de dato; las operaciones que se pueden hacer con dicho valor es leerlo (GET) o asignarlo (SET). Las propiedades, aunque tambin son valores almacenados, tienen un manejo ms formal que las variables de memoria y, de hecho, requieren de una variable de memoria que permita la verificacin de los valores antes de su lectura o asignacin. La siguiente es la sintaxis de la definicin de propiedades:
Class NombreClase Dim Variable As TipoDatoPropiedad Property NombrePropiedad As TipoDatoPropiedad Get
CdigoLecturaValor
End Get Set (VariableArgumento As End Set End Property
TipoDatoPropiedad) CdigoAsignacinValor
... ...
End Class
Donde NombreClase es el nombre de la clase a la que pertenece la propiedad. Antes de declarar la propiedad se debe declarar una variable de trabajo (Variable) del mismo tipo de dato que el que pretende almacenar la propiedad (TipoDatoPropiedad). Para recuperar el valor que tiene la propiedad se usa CdigoLecturaValor, que es el bloque de cdigo que se encarga de recuperar el valor de la variable de paso, para considerarlo como valor de la propiedad. Para asignarle un valor a una propiedad se utiliza una variable de trabajo (VariableArgumento) que recibe, a manera de argumento, el valor que se pretende asignar a la propiedad. CdigoAsignacinValor es el bloque de cdigo que se encarga de validar el valor que se pretende asignar a la propiedad; en caso de que sea vlido, realiza la asignacin.
283
En una clase se pueden definir tantas propiedades como se requieran en el programa y, por supuesto, adems se pueden definir mtodos y funciones que formen parte de la misma. Estos mtodos y funciones pueden hacer uso de las propiedades con slo referirlas por su nombre.
10
NOTA
En este texto, como toda la documentacin tcnica relativa al tema, se utilizan los trminos biblioteca de clases y librera de clases indistintamente. Tienen el mismo significado.
Modificadores de acceso
La idea es generar una librera de clases independiente de los programas ejecutables; es apropiado pensar que dicha biblioteca estar disponible para su utilizacin por uno, dos o ms ejecutables (de ah la razn de independizarla). Ello no significa, sin embargo, que cualquier ejecutable pueda hacer uso de la biblioteca de clases; es posible que no queramos limitar el acceso a la biblioteca de clases. Para ello podemos utilizar los denominados modificadores de acceso. Los modificadores de acceso son calificadores de declaracin que determinan el grado de encapsulamiento de una clase. El acceso se aplica a las entidades (clases, propiedades, mtodos). A continuacin se muestran a grandes rasgos los modificadores de acceso:
284
Palabra clave
Public
Definicin Las entidades pueden ser llamadas desde cualquier parte; tambin se le conoce como acceso pblico. Las entidades se pueden llamar slo desde el contexto mismo de su declaracin. Tambin se le conoce como acceso privado. El acceso friend permite el acceso a las entidades desde el mismo programa en donde se hace su declaracin. El acceso protegido permite el acceso a las entidades slo desde la misma clase, as como sus clases derivadas. Es la mezcla del acceso friend y el acceso protegido.
Private
Friend
Protected
Protected Friend
La forma de especificar los modificadores de acceso es colocndolos al principio de la definicin de las clases, propiedades y mtodos.
Proporcionar el modificador de acceso requerido. Compilar la biblioteca de clases como librera (/target:library). Establecer la referencia del ejecutable con respecto a la librera (/r:librera.dll).
Si usted desarrolla utilizando Visual Studio, podr despreocuparse de establecer la mayora de las referencias y especificar la salida a DLL al momento de compilar, dado que la herramienta se encarga de dar las indicaciones correspondientes.
Ejercicio 10.1
Creacin de una clase con propiedades y mtodos
En este ejercicio se generar una clase que contiene propiedades y mtodos para su consumo desde otros programas.
285
1. 2. 3.
Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Class Library llamado Clase. En Text Editor desplegar lo siguiente:
10
4. Cambie el nombre de la clase, sustituyendo Class1 por Areas.
6.
286
7.
Aparecer una herramienta parecida a Intellisense, que permite seleccionar los patrones de cdigo preestablecidos de Visual Studio. Seleccione Common Code Patterns.
8.
9.
287
10. Aparecer el patrn de cdigo preestablecido buscado. Observe cmo algunas partes del cdigo estn sombreadas: son los elementos variables del code snippet. Se puede navegar entre ellos utilizando las teclas TAB para ir al siguiente y BACKTAB para ir al anterior. Al modificar un elemento variable, se modifica en todas las partes donde se utiliza; esto es una ventaja con respecto al uso de copiar y pegar, dado que era comn olvidar sustituir todas las referencias, generando errores. En el elemento variable que dice newPropertyValue escriba pBase. Presione TAB, con lo que debe desplazarse al segundo elemento variable, que por el momento tiene el valor de Integer; cmbielo por Decimal. Presione TAB y sustituya NewProperty por Base. 11. Vea cmo, automticamente, se actualizan las referencias posteriores.
10
12. Despus de la propiedad que se defini, agregue otra propiedad utilizando code snippets. En el elemento variable que dice newPropertyValue escriba pAltura. Presione TAB, con lo que debe desplazarse al segundo elemento variable, que por el momento tiene el valor de Integer; cambie Integer por Decimal. Presione TAB y sustituya NewProperty por Altura. Por el momento su cdigo debe lucir de la siguiente manera:
288
13. Despus de la segunda propiedad, desde el men contextual seleccione Insert snippet...., y utilice el code snippet Common Code Patterns Properties and Procedures Define a function. En el elemento variable MyFunc coloque el valor Rectangulo, en Integer coloque Decimal, y en los parntesis que indican el valor de retorno escriba (Base * Altura). 14. Despus de la funcin anterior, escriba otra: desde el men contextual seleccione Insert snippet...., y utilice el code snippet Common Code Patterns Properties and Procedures Define a function. En el elemento variable MyFunc coloque el valor TrianguloRectangulo, en Integer coloque Decimal y en los parntesis que indican el valor de retorno escriba ((Base * Altura)/2). 15. El cdigo debe haber quedado como sigue.
Codificacin de Clase
Class1.vb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Public Class Areas Private pBase As Decimal Public Property Base() As Decimal Get Return pBase End Get Set(ByVal value As Decimal) pBase = value End Set End Property Private pAltura As Decimal Public Property Altura() As Decimal Get Return pAltura End Get Set(ByVal value As Decimal) pAltura = value End Set End Property Function Rectangulo() As Decimal Return (Base * Altura) End Function Function TrianguloRectangulo() As Decimal Return ((Base * Altura) / 2) End Function End Class
289
> Lo nuevo
En Visual Studio 2005 los code snippets formalizan lo que los desarrolladores hacan todo el tiempo: copiar y pegar.
10
17. Al visualizar un diagrama de clases, Document Window invoca una herramienta llamada Class Designer, que permite disear de forma visual y dinmica clases de usuario. 18. Si hace clic en el icono para ver detalles , Class Designer se dividir en dos paneles; en el superior quedar el diagrama de la clase en modo extendido, mientras que en el inferior aparecer la ventana Class Details, que mostrar la relacin de propiedades, mtodos y eventos de la clase, adems de permitir agregar o eliminar elementos. En caso de que Class Details no aparezca de manera predeterminada, es posible invocar el men de contexto desde el diagrama de la clase y seleccionar View Class Details.
290
19. Con el modificador de tamao que tiene el diagrama de la clase en el extremo derecho, ample la dimensin del diagrama, de tal forma que quede con un ancho del doble.
Utilcelos alternadamente y vea las variaciones que tiene el diagrama de clase. Finalmente seleccione el modo Display Full signature.
291
21. La parte baja de Class Designer muestra la herramienta Class Details. Busque el apartado Properties y haga clic en <add property>. Automticamente se agregar una lnea en donde podr especificar los elementos bsicos de la propiedad. En la columna Name coloque el valor Radio, en Type coloque Decimal, deje el Modifier como Public, y finalmente en Summary escriba Valor de medida del radio.
10
Uso del selector de documentos activos (Active Documents)
22. Si presiona las teclas Ctrl-Tab aparecer el selector de documentos activos. En dicha herramienta se podrn seleccionar las herramientas activas, as como los documentos. Para seleccionar alguno de los elementos, puede hacer clic sobre la herramienta o documento, utilizando las flechas de direccin, o mantenga oprimida la tecla Ctrl mientras oprime repetidamente la tecla Tab hasta que se seleccione el documento deseado.
23. Presione Ctrl y mantenga presionada la tecla. Ahora presione Tab en repetidas ocasiones hasta que el programa en que codificamos la clase, Class1.vb (C:\APVBNETVS\ Ejercicios\Clase\Class1.vb) aparezca; cuando se haya seleccionado el archivo deseado, simplemente suelte la tecla Ctrl y el archivo aparecer en Document Window.
292
24. Vea cmo lo que agregamos en Class Designer se ha agregado a nuestro cdigo:
25. Qu diferencias encuentra entre las propiedades definidas usando code snippets y la propiedad definida desde Class Designer?
26. Regrese al diagrama de clase (ClassDiagram1.cd) y modifique la informacin de Summary para todos los elementos de la clase:
Miembro Rectangulo TrianguloRectangulo Altura Base pAltura pBase Summary Muestra el rea de un rectngulo Muestra el rea de un tringulo rectngulo Valor de medida de la altura Valor de medida de la base Variable de paso para altura Variable de paso para base Tipo Method Method Property Property Field Field
293
28. Otra forma de hacerlo es utilizando el icono para agregar nuevos miembros a la clase. Haga clic en el icono New Method; aparecer un men en el cual debe seleccionar New Method.
10
29. Automticamente se agregar una lnea en donde podremos especificar los elementos bsicos del mtodo. En la columna Name coloque el valor Circulo, en Type coloque el tipo del valor de retorno, que en este caso es Decimal; deje el Modifier como Public. 30. En Summary haga clic en el botn Description . En Summary escriba Muestra el rea de un crculo y en Returns escriba rea del crculo (Decimal).
294
31. Al lado de cada miembro en Class Details aparece un pequeo icono que indica el tipo de miembro del que se trata. Al hacer doble clic sobre el icono de miembro, Visual Studio permitir la edicin del miembro del que se trate.
Icono Miembro Property Method Events Field
32. Haga doble clic sobre el icono de miembro del mtodo Circulo. El programa deber ir al cdigo en donde se defina el mtodo. 33. Complemente el cdigo, de tal forma que quede de la siguiente manera: Codificacin de Clase
1 2 3 4 5 6 7 Class1.vb Circulo()
<summary> Muestra el rea de un crculo </summary> <returns>rea del circulo (Decimal)</returns> Public Function Crculo() As Decimal Return (3.1416D * (Radio ^ 2)) End Function
34. El cdigo completo debe haber quedado de la siguiente forma: Codificacin de Clase
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Class1.vb
Public Class Areas <summary> Variable de paso para base </summary> Private pBase As Decimal <summary> Valor de medida de la base </summary> Public Property Base() As Decimal Get Return pBase End Get Set(ByVal value As Decimal) pBase = value End Set End Property
295
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
<summary> Variable de paso para altura </summary> Private pAltura As Decimal <summary> Valor de medida de la altura </summary> Public Property Altura() As Decimal Get Return pAltura End Get Set(ByVal value As Decimal) pAltura = value End Set End Property <summary> Muestra el rea de un rectngulo </summary> Function Rectangulo() As Decimal Return (Base * Altura) End Function <summary> Muestra el rea de un tringulo rectngulo </summary> Function TrianguloRectangulo() As Decimal Return ((Base * Altura) / 2) End Function <summary> Valor de medida del radio </summary> Public Property Radio() As Decimal Get End Get Set(ByVal value As Decimal) End Set End Property <summary> Muestra el rea de un crculo </summary> <returns>rea del crculo (Decimal)</returns> Public Function Crculo() As Decimal Return (3.1416D * (Radio ^ 2)) End Function
10
End Class
296
35. En este programa, cuntas lneas de cdigo ha escrito usted sin la asistencia de Visual Studio? _____________________________
37. En la barra de bsqueda de Class View escriba Base y haga clic en el botn Search que aparece en la misma barra de bsqueda.
297
38. Aparecern en el rbol de archivos y miembros todos aquellos que contengan la palabra Base, empezando con la que ms concuerde con el patrn a buscar (que es la propiedad que definimos en nuestra clase). Haga clic en el botn Back que aparece en la barra de herramientas de Class View. 39. En el rbol de archivos y miembros busque el nodo Clase y expanda el rbol hasta colocarse en el miembro Areas. Observe cmo al seleccionar el nodo, todos sus miembros aparecen en el panel de objetos y miembros. De esa forma se pueden examinar los miembros de una clase y seleccionarlos para diferentes operaciones.
10
40. En el panel de objetos y miembros seleccione el miembro Circulo(), despliegue el men contextual y seleccione Go To Definition. De esa forma Visual Studio localizar el archivo de la solucin en la cual el miembro fue codificado, permitiendo su edicin. De esta forma se evita estar navegando por el Solution Explorer tratando de encontrar una clase y luego navegar entre el cdigo para encontrar el cdigo que define el miembro.
298
Ejercicio 10.2
Consumo de una clase a travs de instancias En este ejercicio se consumir una clase. Para ello se generar una instancia (objeto) y se utilizarn los mtodos declarados en la clase.
299
1. 2. 3.
4. 5.
Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Console Application, llamado UtilizaClase. En Solution Explorer seleccione UtilizaClase y despliegue el men contextual. Seleccione Add Reference. En la ventana Add Reference seleccione la pestaa Projects y seleccione el proyecto Clase. Con ello habilitamos a nuestra nueva aplicacin para consumir la funcionalidad de la clase que definimos en el ejercicio anterior. Haga clic en Ok. Agregue las lneas necesarias para hacer type safe a su programa; importe el espacio de nombres System con la clase Console. En Text Editor mostrar lo siguiente:
10
6.
Importe un nuevo espacio de nombres que le permita tener acceso a los recursos de la clase con la cual establecimos referencia. Escriba la siguiente lnea antes del bloque de mdulo:
Imports Clase
7.
300
8.
Dentro del mdulo deber generar una instancia de la clase Areas. Para ello deber escribir la siguiente lnea de cdigo, que declara una variable (X) de tipo Areas (con ello se reserva en memoria un espacio para manejar una variable que alojar un objeto construido a partir de nuestra clase, con toda la funcionalidad que le hayamos codificado):
Dim X As Areas
9.
Declarar la variable no implica que ya tengamos un objeto. Simplemente tenemos reservado un lugar para guardar el objeto, pero el objeto an no existe. Para generarlo necesitamos hacer uso de un constructor, lo que implica utilizar la instruccin New. Para generar un objeto a partir de Areas, y almacenar dicho objeto en el rea que hemos reservado, utilizamos la siguiente lnea:
X = New Areas()
10. A travs de la variable X ya podemos hacer uso de toda la funcionalidad programada en la clase. El cdigo de los puntos 8 y 9 puede simplificarse, instanciando al momento en que declaremos, dando una lnea como la que sigue:
Dim X As New Areas
11. Vea cmo Intellisense ya reconoce la existencia de nuestra clase y sus miembros. Incluso da la informacin que nosotros establecimos como comentario.
301
Codificacin de UtilizaClase
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Option Explicit On Option Strict On Imports System.Console Imports Clase
Module1.vb
Module Module1 Sub Main() Dim X As New Areas X.Altura = 10D X.Base = 20D WriteLine(- reas calculadas -) WriteLine(Rectngulo: & CType(X.TrianguloRectangulo(), String)) Write(Presione INTRO para continuar) ReadLine() End Sub End Module
10
Module1.vb
13. Construya la solucin (oprima la combinacin de teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (oprima la tecla F5). 14. La lnea 5 importa el espacio de nombres Clase, que est disponible gracias a que establecimos la referencia con la librera Clase. En la lnea 11 se declara una variable que tiene como origen nuestra clase Areas; en la misma lnea de declaracin se genera la instancia del objeto, utilizando el constructor New. 15. Se proporciona valor a las propiedades Altura y Base del objeto (lneas 13 y 14), y se utiliza el mtodo TrianguloRectangulo() para comprobar la funcionalidad de la clase. Como TrianguloRectangulo() retorna un valor Decimal, se realiza la conversin a String para evitar problemas en la concatenacin.
302
16. Como proporcionamos un valor 10 para la altura y 20 para la base, el resultado es el siguiente:
- reas calculadas Rectngulo: 100 Presione INTRO para continuar
Visualizacin de referencias
19. Visual Studio mantiene un complejo sistema de referencias a recursos, de tal forma que todos estn disponibles casi de cualquier parte. Para llegar al cdigo de definicin de un
303
miembro de una clase, por ejemplo TrianguloRectangulo(), basta hacer doble clic sobre TrianguloRectangulo () en Class View, o hacer doble clic sobre TrianguloRectangulo () en Object Browser, e incluso en Text Editor, colocndonos sobre TrianguloRectangulo() y seleccionando Go To Definition en el men de contexto.
10
20. Internamente, Visual Studio conoce dnde se encuentra todo lo que utilizamos en un programa. Vaya a Solution Explorer y, desde el nodo UtilizaClase, despliegue el men contextual y seleccione Build. Vea la ventana Output y perctese de que no slo se construy el proyecto UtilizaClase, sino tambin Clase, dado que contiene clases que son utilizadas por UtilizaClase.
304
TrianguloRectangulo()
Coloque el puntero del ratn sobre y despliegue el men contextual; seleccione Find All References. Aparecer una ventana llamada Find Symbols Results, que mostrar todas las referencias fsicas que permiten a Visual Studio encontrar todos los recursos que su programa necesita.
Module1 de UtilizaClase.
22. Por supuesto, al hacer doble clic en cualquiera de los elementos, Visual Studio nos trasladar al cdigo de definicin correspondiente. 23. Guarde los cambios en su solucin. FIN DEL EJERCICIO *
Ejercicio 10.3
Uso de clases en soluciones diferentes
En este ejercicio realizar los trabajos necesarios para poner a disposicin de todos los desarrolladores la funcionalidad de una clase. Es comn que un grupo de desarrolladores, en ambientes profesionales, generen libreras comunes que de forma estandarizada son utilizadas en todas las soluciones que construyen. Usos comunes son clases para gobernar la seguridad de las aplicaciones, clases para el acceso eficiente a los datos, clases para interfaces de usuario uniformes, etctera. Slo un grupo de desarrolladores son los encargados de fabricar las libreras, mientras que todos los dems desarrolladores, en todos los dems proyectos, las utilizan. Veamos cmo se logra esto usando Visual Studio.
305
2. 3.
4.
5.
6.
7.
Agregue a la solucin un proyecto Windows Console Application, llamado PruebaLibreria. En Solution Explorer seleccione PruebaLibreria y despliegue el men contextual. Seleccione Add Reference. En la ventana Add Reference seleccione la ficha Projects. Como puede ver, no aparece ningn proyecto, por lo cual no encontramos la librera Clase que definimos en el proyecto anterior. Seleccione la pestaa .NET y busque Clase. Como podr comprobar, tampoco aparece nuestra biblioteca dentro de las que se encuentran registradas en GAC (Global Assembly Cach). Haga clic en Cancel. Hay que agregar un elemento existente, en este caso el proyecto Clase de la solucin Ejercicios. Proceda de la siguiente forma: seleccione la solucin Calculos, despliegue el men contextual y seleccione Add Existing project. Seleccione el proyecto de la librera, que se identifica por el archivo Clase.vbproj (Visual Basic Project) ubicado en el directorio C:\APVBNETVS\Ejercicios\Clase. Si en este momento intenta agregar una referencia, se dar cuenta de que el proyecto de librera Clase ya aparece dentro de la pestaa Projects de Add Reference, con lo cual normalmente podr establecer la referencia sin problemas. El problema es que deber realizar este proceso en cada proyecto en el que desee utilizar la funcionalidad de la clase; ello implica dar permisos sobre los objetos de la librera y exponer el contenido del cdigo a modificaciones no autorizadas. Los problemas no paran ah: imagine que la librera incluya cdigo de cifrado a datos sensibles, todo el mundo sabr cmo se codific el algoritmo de seguridad. En realidad agregar el proyecto a la nueva solucin no es lo que queramos hacer, sino disponer de la funcionalidad de la librera, sin saber nada ms respecto al cdigo o la composicin. Elimine el proyecto Clase que acaba de agregar. Para ello, seleccione en Solution Explorer el nodo Clase, despliegue el men contextual y seleccione Remove. Al solicitarse la confirmacin de eliminacin, confrmela. Esto no impacta fsicamente al proyecto, solamente elimina la referencia de la solucin.
10
9.
306
10. En Solution Explorer seleccione el nodo PruebaLibreria. Despliegue el men contextual y seleccione Add Reference. Seleccione la pestaa Browse. Seleccione el archivo Clase.DLL que se encuentra en C:\APVBNETVS\Calculos. De esa forma disponemos de la funcionalidad del ensamblado, sin entrar en los pormenores de su desarrollo, desde una copia local. 11. Abra desde Solution Explorer el cdigo de Module1.vb de PruebaLibreria. Agregue un Imports, vea Intellisense y note que ya se puede disponer de la clase.
307
MAPA
10
308
TERMINOLOGA
Class, 281 Designer, 289 Code Snippets, 285 Diagrama de la clase, 289 Friend, 284 GET, 282 Libreras, 283 Modificadores de acceso, 283 Friend, 284 Object Browser, 302 Public, 284 Private, 284 SET, 282 Property, 282 Propiedades, 282 Protected, 284
PREGUNTAS
10.1 Cul es la sintaxis para declarar una clase? 10.2 Cul es la sintaxis para declarar una propiedad? 10.3 Explique los modificadores de acceso y su impacto en los elementos de una clase. 10.4 Explique el procedimiento para crear una biblioteca o librera. 10.5 Qu especificaciones deben hacerse en un programa para que pueda consumir la funcionalidad de una clase que se encuentra en una librera externa?
309
Notas:
10
310
EXAMEN
CAPTULO
11
Herencia y polimorfismo
Objetivos: Aprender la implementacin de herencia y polimorfismo de los objetos. 1. Aprender qu es la herencia entre objetos y cundo se debe utilizar. 2. Conocer los modificadores de funcionalidad de los objetos para programar adecuadamente la herencia en una jerarqua de clases. 3. Sabr qu son MyBase y MyClass, y cundo utilizarlas. 4. Aprender en qu consiste el polimorfismo y cmo establecerlo de manera programtica.
311
312
Contenido
Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cundo se debe utilizar la herencia? . . . . . . . . . . . . . . . . . . . . . . . . . Inherits (Heredar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Notlnheritable (No heredable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mustlnherit (Debe heredar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modificadores de acceso, necesarios para la herencia . . . . . . . . . . . . . Programacin de clases base y clases derivadas . . . . . . . . . . . . . Adicin de clases a un mdulo usando Class Designer . . Estatutos auxiliares para el manejo de herencia y polimorfismo . . . . . . . . . . NotOverridable (No reemplazable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overridable (Reemplazable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MustOverridable (Debe reemplazarse) . . . . . . . . . . . . . . . . . . . . . . . . . Overrides (Reemplaza) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overloads (Sobrecarga/Sustituye) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MyBase y MyClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprobacin del polimorfismo basado en herencia y el uso de MyBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Especificacin de modificadores de herencia usando Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 313 314 314 314 315 315 316 323 324 324 324 324 324 325 325 326 327 335 336 336 338
313
El manejo de propiedades, mtodos y eventos es slo el principio de la programacin orientada a objetos; las caractersticas principales de la POO descansan en la capacidad de los objetos para trabajar en colaboracin con otros objetos, y de aprovechar total o parcialmente su funcionalidad mediante la reutilizacin de cdigo segn lo requieran las aplicaciones. En el presente captulo estudiaremos los principios que permiten el mximo aprovechamiento del cdigo a travs de POO y con sus dos capacidades caractersticas: herencia y polimorfismo.
Herencia
La herencia (inheritance) es un concepto fundamental de la programacin orientada a objetos, y consiste en la capacidad de definir clases que sirven como base de otras clases, evitando la redundancia en la definicin de elementos como mtodos, eventos y propiedades. Hay una clase base y una o varias clases derivadas; las clases derivadas aprovechan todo lo declarado en la clase base, asumindolo como suyo y utilizando capacidades que no estn codificadas en ellas. Las clases derivadas pueden heredar, e incluso extender, las propiedades, los mtodos y los eventos de la clase base. Es posible tambin que las clases derivadas sustituyan o modifiquen (override) la funcionalidad de los mtodos de la clase base. En Visual Basic, por omisin, todas las clases pueden heredarse. Las ventajas de la herencia son muchas, pero la principal es que el desarrollador tendr que escribir y depurar el cdigo slo una vez, para una clase, y disponer en muchas clases de la misma funcionalidad, estableciendo las referencias adecuadas.
11
314
propiedades y eventos. Imagnese tener que determinar el tipo de transmisin, nmero de puertas y nmero de serie que una persona posee. Simplemente, de una cosa no puede derivar la otra. Se recomienda una jerarqua de clases, obviamente, slo si el cdigo de una clase brinda alguna funcionalidad que se pueda reutilizar; tratar de heredar aspectos muy particulares que slo son pertinentes para una clase no tiene sentido.
Inherits (Heredar)
El estatuto Inherits se utiliza para especificar que una clase de nueva creacin tiene como base una clase ya existente. La clase nueva es la clase derivada (derived class); la clase ya existente es la clase base (base class). La sintaxis es la siguiente:
Class
End Class
En este caso, la clase derivada dispone de todos los elementos declarados en la clase base.
NombreClase
NombreClase).
315
La sintaxis es la siguiente:
MustInherit Class
NombreClase
...
End Class
NOTA
Algunos lenguajes como C++ y C#, llaman a las clases calificadas como MustInherit, como clases abstractas (abstract class).
11
Ejercicio 11.1
Programacin de clases base y clases derivadas
1. 2. 3.
Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Console Application, llamado Herencia. Abra Class View (oprima las teclas Ctrl-Mays-C) y colquese en el nodo Herencia Herencia; despliegue el men contextual y seleccione View Class Diagram.
316
4.
317
6.
Aparecer la ventana New Class. En este programa queremos codificar clases en el programa de consola que ya comenzamos a construir (Module1.vb). Asignamos en Class Name el nombre MiClaseBase, en Access dejamos el valor de Public, y en File name especificamos que queremos agregar la clase a un archivo existente (Add to existing file), colocando el nombre de nuestro programa de consola (Module1.vb).
7.
Con ello se habr agregado a nuestro programa de consola una clase. Como podr sospechar, las clases no slo se pueden codificar como proyectos independientes, sino tambin integrarse perfectamente en otros proyectos. Aparecer nuestra nueva clase en el diagrama de clase. Seleccione la nueva clase, despliegue el men contextual y seleccione Class Details.
11
8.
318
9.
Utilizando Class Details, agregue a MiClaseBase dos mtodos, llamados Mensaje1() y Mensaje2(). En la columna Type no coloque nada, debido a que los mtodos no devolvern valores.
10. Haga las modificaciones pertinentes para que nuestro cdigo luzca como sigue. En esencia se hace al programa strong type, se importa un espacio de nombres, se colocan en Main() lneas para que el programa espere una tecla y se provee de comportamiento a los mtodos de MiClaseBase.
Codificacin de Herencia
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Option Explicit On Option Strict On Imports System.Console Module Module1 Sub Main()
Module1.vb
Write(Presione INTRO para continuar) ReadLine() End Sub End Module Public Class MiClaseBase <summary> Enva primer mensaje </summary> Public Sub Mensaje1() WriteLine(Clase Base - Mensaje 1) End Sub
319
25 26 27 28 29 30 31 32
<summary> Enva segundo mensaje </summary> Public Sub Mensaje2() WriteLine(Clase Base - Mensaje 2) End Sub End Class
11. Regrese al diagrama de clase del programa Herencia, agregue una nueva clase (Add Class); en Class name especifique MiClaseDerivada, en Access especifique Public, y en File name seleccione Add to existing file, especificando nuestro programa, es decir, Module1.vb.
11
12. Seleccione en el diagrama de clase el objeto MiClaseDerivada, despliegue el men contextual y seleccione Class Details. Agregue un mtodo, cuyo nombre sea Mensaje3().
320
Codificacin de Herencia
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 Option Explicit On Option Strict On Imports System.Console Module Module1
Module1.vb
Sub Main() Dim MiObjeto As New MiClaseDerivada MiObjeto.Mensaje1() MiObjeto.Mensaje2() MiObjeto.Mensaje3() Write(Presione INTRO para continuar) ReadLine() End Sub End Module Public Class MiClaseBase <summary> Enva primer mensaje </summary> Public Sub Mensaje1() WriteLine(Clase Base - Mensaje 1) End Sub <summary> Enva segundo mensaje </summary> Public Sub Mensaje2() WriteLine(Clase Base - Mensaje 2) End Sub End Class Public Class MiClaseDerivada Inherits MiClaseBase <summary> Enva tercer mensaje </summary> Public Sub Mensaje3() WriteLine(Clase Base - Mensaje 2) End Sub End Class
321
Module1.vb
14. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 15. En un mdulo lo que se ejecuta es el procedimiento principal, llamado Main(), lneas 22 a la 30. El mdulo completo tiene dos clases: MiclaseBase, de la lnea 20 a la 35, y MiClaseDerivada, de la lnea 37 a la 46.
MiClaseBase
tiene dos mtodos: Mensaje1( ), de la lnea 22 a la 27, y Mensaje2( ), de la lnea 29 a la 34. MiClaseDerivada tiene un solo mtodo: Mensaje3( ), de la lnea 40 a la 45. Tome en cuenta que la clase MiClaseDerivada no posee los mtodos pues la que los posee es la clase MiClaseBase.
Mensaje1()
Mensaje2(),
Lo ms importante de este programa es que MiClaseDerivada hereda la funcionalidad de MiClaseBase al aplicar la instruccin Inherits, en la lnea 38; aun cuando Mensaje1() y Mensaje2() no estn declaradas en MiClaseDerivada, ya forman parte de dicha clase, debido a que son tomadas de la clase base. La integracin es tal que, al estar codificando el programa, Intellisense reconoce los miembros de MiClaseBase como parte de MiClaseDerivada.
11
322
16. En la lnea 10 se tiene un constructor que genera una instancia de la clase MiClaseDerivada bajo el nombre de MiObjeto. Observe cmo las lneas 11 y 12 hacen uso de mtodos no declarados en la clase MiClaseDerivada; esto es posible gracias a que, al haber establecido una relacin de herencia con MiClaseBase, la clase derivada dispone automticamente de todos los mtodos, propiedades y eventos declarados en la clase base.
ClaseBase.
De esta forma, MiClaseDerivada slo declarar cosas que no estn declaradas en MiDeclarar los mismos mtodos en ambas clases sera redundante. Tome en cuenta las dimensiones que puede tomar su jerarqua de clases, ya que si hereda una clase que a su vez es derivada de otra clase, se hereda tambin la funcionalidad de la clase base de sta. Si todo ocurri como se esperaba, la salida ser la siguiente:
Clase Base - Mensaje 1 Clase Base - Mensaje 2 Clase Base - Mensaje 2 Presione INTRO para continuar
17. Si consultamos el diagrama de clase, nos daremos cuenta que reconoce ya la relacin de herencia existente entre nuestras dos clases.
323
En ocasiones heredamos una clase, pero nos damos cuenta que algunas entidades (mtodos, propiedades, eventos) no se ajustan del todo a lo que verdaderamente necesitamos; en resumen, no nos sirven tal y como fueron heredadas. Es posible que pensemos que los elementos heredados son tiles, pero que lo seran ms con algunas pequeas modificaciones. Dichas modificaciones se realizan en la clase derivada, respecto de las definiciones originales existentes en la clase base. La programacin orientada a objetos hace posible que eso suceda, pues permite implementar diferentes comportamientos para un mtodo (override), o de plano reemplazarlo por completo (overload). La funcionalidad heredada puede modificarse por otra que sea ms indicada para el problema de programacin que deseamos resolver; con ello se promueve que la reutilizacin del cdigo sea flexible y adaptable. Por omisin, una clase derivada hereda los mtodos y propiedades de su clase base. Si necesitamos que una propiedad o mtodo heredado se comporte de manera distinta a como se defini en la clase base, puede ser implementada de forma distinta (overridden) o reemplazada (overloaded); esto quiere decir que la herencia sirve hasta donde nosotros deseamos comenzar a hacer modificaciones. Los estatutos auxiliares de herencia sirven para especificar el grado de modificacin que ha de darse entre la clase derivada y la clase base; estos son: Overridable, NotOverridable, Overrides, MustOverride y Overloads. En cuanto a la clase base hay tres escenarios:
11
324
Overridable (Reemplazable)
El segundo escenario es que la clase base admita modificaciones o sustituciones a su funcionalidad. El estatuto Overridable establece que una propiedad o mtodo (elemento) de una clase base puede ser modificado en su implementacin o sustituido en una clase derivada.
Overrides (Reemplaza)
El primer escenario es cuando la clase base permite que su funcionalidad sea modificada, respetando la estructura original del elemento modificado. El estatuto Overrides permite la variacin en la clase derivada, de sus propiedades o sus mtodos. Esto ser siempre y cuando se mantengan los mismos argumentos en el mtodo de la clase base y la clase derivada. Overrides slo permite desarrollar en la clase derivada una implementacin distinta de un elemento de la clase base, y no su sustitucin por otro que no guarde semejanza.
Overloads (Sobrecarga/Sustituye)
El segundo escenario es que se desee sustituir la funcionalidad, sin necesidad de respetar estructuras o condiciones precedentes. En ocasiones, adems de modificar el comportamiento de los mtodos que participan en una relacin de herencia, es necesario hacer uso de diferentes argumentos, ya sea porque los que se tienen deben considerar otros tipos de datos, o bien, porque el mtodo que mo-
325
difica al heredado de la clase base requiere una cantidad distinta de argumentos. En este caso, ya no hablamos de una implementacin distinta de lo mismo, sino de dos mtodos bastante distintos entre s que comparten un nombre. En este ltimo caso, Overrides no sirve pues exige igualdad de argumentos. Para poder lograr nuestro cometido, debemos utilizar Overloads, que indica la sustitucin del mtodo de la clase base por otro de la clase derivada, tengan o no relacin entre s. Overloads es la nica forma de implementar, bajo un mismo nombre, dos mtodos que no coinciden ms que en el nombre.
MyBase y MyClass
Se puede utilizar la palabra reservada MyBase para llamar a ejecucin a un mtodo de la clase base desde una clase derivada. Esto quiere decir que a) si existe herencia entre dos clases, y b) en la clase derivada se modifica un mtodo, entonces c) es posible mandar llamar a ejecucin al mtodo, ya sea en la forma en que se encuentra en la clase base, o en la forma en que se encuentra en la clase derivada misma. Con MyBase podemos obligar a la aplicacin a que utilice un mtodo de la clase base y no de la clase derivada; en caso contrario, es posible que queramos mandar llamar el mtodo tal y como est en la clase derivada. Para ello utilizamos la palabra reservada MyClass, que se encarga de llamar a ejecucin un mtodo que se encuentra en la misma clase cuando sta es derivada. Es importante saber que tanto MyBase como MyClass, aunque en su manejo parecen objetos, realmente no lo son. No se instancian; existen porque el lenguaje los proporciona para un manejo ms flexible de la herencia y el polimorfismo.
11
Polimorfismo
El polimorfismo es la habilidad que tiene el lenguaje para definir mltiples clases que contengan mtodos y propiedades del mismo nombre, pero que brindan diferente funcionalidad. Cuando se presenta el polimorfismo es posible elegir, en tiempo de ejecucin, aquellos mtodos o propiedades que necesitamos. No importa que varias clases posean los mismos mtodos y las mismas propiedades: la aplicacin debe ser capaz de utilizar precisamente aquellas cuya funcionalidad estemos invocando. La herencia y la sustitucin de mtodos y propiedades tienen mucho que ver con el polimorfismo. Cuando se declara una clase y a partir de sta se derivan otras clases, estamos ante la presencia de la herencia; si adems de esto, los mtodos y propiedades de la clase
326
base que fueron heredados son modificados (Overriden) o sustituidos (Overloaded) en la clase derivada, de tal manera que comparten el mismo nombre pero no la misma funcionalidad, estamos ante el polimorfismo. Una manifestacin an ms pura del polimorfismo se presenta cuando se utiliza Overloads, que implica una sustitucin completa de mtodos que se encuentran en clases que guardan una relacin de herencia. Cuando en una clase derivada se modifican mtodos o propiedades de la clase base, se dice que hay polimorfismo basado en herencia.
Ejercicio 11.2
Comprobacin del polimorfismo basado en herencia y el uso de MyBase
En este ejercicio se comprobar el polimorfismo basado en herencia; para ello se definirn varias clases, se heredarn unas con otras y se ver el uso de la palabra reservada MyBase. El programa calcular lo que se le pagar a los empleados, partiendo del supuesto que puede haber pago normal, agregarse un bono por puntualidad del 25 por ciento, e incluso un bono adicional del 20 por ciento. 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue su solucin un proyecto Windows Console Application, llamado Nomina. Edite el programa de tal forma que aparezca de la siguiente manera:
Codificacin de Nomina
1 2 3 4 5 6 7 8 9 10 11 12 13 14 Option Explicit On Option Strict On Imports System.Console
Module1.vb
Module Module1 Const PagoXHoraVig As Decimal = 120D Const BonoPuntualidad As Decimal = 1.25D Sub Main() End Sub End Module
327
4. 5.
Abra Class View (oprima las teclas Ctrl-Mays-C), seleccione el nodo Nomina y haga clic en el icono View Class Diagram. Agregue, usando Class Designer, una clase llamada Pago, que ser pblica y que se agregar al programa de consola que estamos trabajando.
Nomina
11
Especificacin de modificadores de herencia usando Properties
6. En el diagrama de clase seleccione la clase Pago que acaba de agregar, invoque Class Details y agregue un mtodo de nombre CalculaPago, que ser pblico y que devolver un valor Decimal. En Class Details seleccione el mtodo que acaba de agregar y despliegue el men contextual; seleccione la opcin Properties.
328
7.
En la propiedad Inheritance
modifier
8.
Codificacin de Nomina
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Option Explicit On Option Strict On Imports System.Console
Module1.vb
Module Module1 Public Const PagoXHoraVig As Decimal = 120D Public Const BonoPuntualidad As Decimal = 1.25D Sub Main() End Sub End Module Public Class Pago <summary> Clculo del pago neto </summary> Public Overridable Function CalculaPago() As Decimal End Function End Class
329
9.
Coloque como argumentos de CalculaPago() las horas trabajadas y el pago por hora. Complemente el mtodo, a fin de que proporcione un resultado. El procedimiento debe quedar de la siguiente manera:
Codificacin de Nomina
1 2 3 4 5 6 7 8 9 10 11 12 13 14 Public Class Pago
Module1.vb - Pago
<summary> Clculo del pago neto </summary> Public Overridable Function CalculaPago(_ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal) As Decimal Return (HorasTrabajadas * PagoXHora) End Function End Class
10. Abra Class View (oprima las teclas Ctrl-Mays-C), seleccione el nodo Nomina Nomina y haga clic en el icono View Class Diagram. 11. Agregue, usando Class Designer, una clase llamada PagoBonificado, que ser pblica y que se agregar al programa de consola que estamos trabajando. 12. En el diagrama de clase seleccione la clase PagoBonificado que acaba de agregar, invoque Class Details y agregue un mtodo de nombre CalculaPago(), que ser pblico y devolver un valor Decimal. 13. Edite el programa y agregue una lnea que especifique que la nueva clase hereda la funcionalidad de la clase Pago. Aqu se generara una contaminacin de espacios de nombres, dado que Pago ya posee un mtodo llamado CalculaPago(), y al estar heredando su funcionalidad, equivaldra a estar definiendo dos miembros con el mismo nombre, lo cual no es posible. Para evitar el problema, estando en Class Details seleccione el mtodo CalculaPago() de PagoBonificado, e invoque Properties; deber modificarse la propiedad Inheritance modifier, asignando un valor Overrides. Dado que se est realizando una operacin de reemplazo (overrides), los argumentos del mtodo deben ser exactamente los mismos. La nica variante entre los dos procedimientos es que el mtodo CalculaPago() de la clase PagoBonificado retorna el monto a pagar multiplicado por la constante de bono de puntualidad. Seguramente se dio cuenta de que el monto a pagar es un dato que ya ofrece CalculaPago() de la clase Pago, por lo que se consume el mtodo de la clase base. 14. Desarrolle el punto anterior utilizando Class View, Class Designer y Class Details, o bien agregando el siguiente cdigo en el programa:
11
330
Codificacin de Nomina
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Module1.vb - PagoBonificado
Public Class PagoBonificado Inherits Pago <summary> Clculo de pago con bonificacin </summary> Public Overrides Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal) As Decimal Dim PagoNeto As Decimal PagoNeto = MyBase.CalculaPago(HorasTrabajadas, PagoXHora) Return PagoNeto * BonoPuntualidad End Function End Class
15. Abra Class View (oprima las teclas Ctrl-Mays-C), seleccione el nodo Nomina Nomina y haga clic en el icono View Class Diagram. 16. Agregue, usando Class Designer, una clase llamada PagoBonificadoExtra, que ser pblica y se agregar al programa de consola que estamos trabajando. 17. En el diagrama de clase seleccione la clase PagoBonificadoExtra que acaba de agregar, invoque Class Details y agregue un mtodo de nombre CalculaPago(), que ser pblico y devolver un valor Decimal. 18. Edite el programa y agregue una lnea que especifique que la nueva clase hereda la funcionalidad de la clase PagoBonificado. Aqu se generara una contaminacin de espacios de nombres, dado que Pago ya posee un mtodo llamado CalculaPago(), y al estar heredando su funcionalidad, equivaldra a estar definiendo dos miembros con el mismo nombre, lo cual no es posible. 19. Hay otro problema: el nuevo mtodo, adems de los beneficios de puntualidad, integrar un beneficio adicional que el usuario podr especificar, por lo cual el mtodo CalculaPago() no tiene el mismo nmero de argumentos que CalculaPago() de la clase PagoBonificado, por lo que una operacin de reemplazo no es posible. Deber realizarse una operacin de sustitucin (overload) para que los argumentos del mtodo no necesariamente sean los mismos. La sustitucin deber especificarse va cdigo, dado que Properties no ofrece el valor Overload para Inheritance modifier (lo cual tiene mucho sentido si consideramos que la sustitucin tiene que ver ms con el polimorfismo que con la herencia). La nica variante entre los dos procedimientos es que el mtodo CalculaPago() de la clase PagoBonificadoExtra devuelve el monto a pagar multiplicado por la constante de bono de puntualidad (informacin que ofrece el mtodo CalculaPago() de la clase base), y adems le agrega un porcentaje adicional de beneficio.
331
20. Desarrolle el punto anterior utilizando Class View, Class Designer y Class Details, o bien agregando el siguiente cdigo en el programa.
Codificacin de Nomina
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Module1.vb - PagoBonificadoExtra
Public Class PagoBonificadoExtra Inherits PagoBonificado <summary> Clculo de pago con bonificacin y extra </summary> Public Overloads Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal, _ ByVal Extra As Decimal) As Decimal Dim PagoBonificado As Decimal PagoBonificado = MyBase.CalculaPago( _ HorasTrabajadas, PagoXHora) Return PagoBonificado * Extra End Function End Class
11
21. Complemente el procedimiento Main() para proveer de funcionamiento al programa. Al final, deber lucir como sigue: Codificacin de Nomina
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Option Explicit On Option Strict On Imports System.Console Module Module1 Public Const PagoXHoraVig As Decimal = 120D Public Const BonoPuntualidad As Decimal = 1.25D Sub Main() Dim PagoNoPuntuales As Pago = New Pago() Dim PagoPuntuales As New PagoBonificado() Dim PagoPuntualesPlus As New PagoBonificadoExtra() Dim Horas As Decimal = 40 WriteLine(Pago a los no puntuales: & _ PagoNoPuntuales.CalculaPago(Horas, PagoXHoraVig)) WriteLine(Pago a los puntuales: & _ PagoPuntuales.CalculaPago(Horas, PagoXHoraVig)) WriteLine(Pago a los puntuales, + extra: & _ PagoPuntualesPlus.CalculaPago(Horas, _ PagoXHoraVig, 1.2D))
Module1.vb
332
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
Write(Pulse INTRO para continuar) ReadLine() End Sub End Module Public Class Pago <summary> Clculo del pago neto </summary> Public Overridable Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal) As Decimal Return (HorasTrabajadas * PagoXHora) End Function End Class Public Class PagoBonificado Inherits Pago <summary> Clculo de pago con bonificacin </summary> Public Overrides Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal) As Decimal Dim PagoNeto As Decimal PagoNeto = MyBase.CalculaPago(HorasTrabajadas, PagoXHora) Return PagoNeto * BonoPuntualidad End Function End Class Public Class PagoBonificadoExtra Inherits PagoBonificado <summary> Clculo de pago con bonificacin y extra </summary> Public Overloads Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal, _ ByVal Extra As Decimal) As Decimal Dim PagoBonificado As Decimal PagoBonificado = MyBase.CalculaPago( _ HorasTrabajadas, PagoXHora) Return PagoBonificado * Extra End Function End Class
333
Module1.vb
22. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 23. El programa calcula el monto a pagar a los empleados. Hay tres escenarios: un pago para todos los empleados, que es un monto neto; adems hay un monto para los empleados puntuales, que es un poco ms alto; finalmente hay un monto an ms alto para los que son puntuales, pero adems tienen un desempeo excepcional. 24. El programa se compone del procedimiento Main(), lneas 10 a la 26, que se encarga de hacer las instancias de las clases, as como de mostrar los resultados. 25. Al inicio del mdulo se declaran dos constantes de alcance pblico, que por lo mismo estarn disponibles tanto para el mdulo como para las clases del programa. Se anexan estas constantes con el nico fin de no solicitar informacin al usuario para la demostracin del programa. 26. El mtodo Pago.CalcularPago() requiere dos argumentos: horas trabajadas y pago por hora. Con ellos calcula el monto del pago a realizar, que resulta de la multiplicacin de los argumentos. La clase PagoBonificado hereda la funcionalidad de la clase Pago, y de hecho consume el resultado de sus mtodos. A su vez, PagoBonificadoExtra hereda la funcionalidad de PagoBonificado. Las relaciones de herencia entre las clases quedan como sigue: Pago es clase base de PagoBonificado; Pago bonificado es clase derivada de Pago y clase base para PagoBonificadoExtra; PagoBonificadoExtra slo es clase derivada de PagoBonificado. Respecto al manejo de los mtodos, podemos decir que el mtodo Pago.CalculaPago() es sustituido por PagoBonificado.CalculaPago, y PagoBonificado.CalculaPago es sustituido por PagoBonificadoExtra.CalculaPago. FIGURA 11.2 Relaciones de herencia del programa
11
334
27. Al ejecutarse el programa, se definen los valores iniciales del pago por hora vigente (lnea 7) y del bono de puntualidad (lnea 8). En el procedimiento principal se genera una instancia de la clase Pago (lnea 11), una instancia de la clase PagoBonificado (lnea 12) y una instancia de PagoBonificadoExtra (lnea 13). La funcionalidad de nuestras clases est disponible a travs de las variables objeto que acabamos de definir. Otro dato que se provee es el nmero de horas por semana sobre las que se calculan los pagos (lnea 14). 28. En las lneas 16 y 17 se muestra un mensaje que para construirse consume el mtodo CalculaPago() de la clase Pago, que es la que dio origen al objeto PagoNoPuntuales. Se proporcionan como argumentos el nmero de horas laboradas y el pago por hora vigente. El mtodo se encarga de recibir los dos valores (lneas 36 a la 38), multiplicarlos y devolver el resultado (lnea 40). Es importante observar que este mtodo fue codificado de tal forma que permite su reemplazo y sustitucin (modificador Overridable). 29. En las lneas 18 y 19 se muestra un mensaje que para construirse consume el mtodo CalculaPago() de la clase PagoBonificado (la que dio origen al objeto PagoPuntuales). Se proporcionan como argumentos el nmero de horas laboradas y el pago por hora vigente. El mtodo se encarga de recibir los dos valores (lneas 51 a la 53) y declara una variable de trabajo (lnea 55) a la cual le asigna el valor retornado el mtodo MyBase.CalculaPago(); en virtud de que la clase base es Pago, sera equivalente a ejecutar Pago.CalculaPago(). Se pasan los datos recibidos a MyBase.CalculaPago() y al resultado se le aplica el bono de puntualidad (lnea 57). Es importante notar que la clase hereda la funcionalidad de la clase Pago (lnea 46) y reemplaza la implementacin del mtodo Pago.CalculaPago(), por lo cual respeta la cantidad y el tipo de los argumentos establecidos en la clase base (lneas 51 a 53). 30. En las lneas 20 y 22 se muestra un mensaje que para construirse consume el mtodo CalculaPago() de la clase PagoBonificadoExtra, que es la que dio origen al objeto PagoPuntualesPlus. Se proporcionan como argumentos el nmero de horas laboradas, el pago por hora vigente y el porcentaje aplicable al pago por buen desempeo. El mtodo se encarga de recibir los tres valores (lneas 68 a la 71) y declara una variable de trabajo (lnea 73) a la cual le asigna el valor retornado el mtodo MyBase.CalculaPago(), es decir, PagoBonificado.ClaseBase(), a la cual le pasa los datos que necesita. Al resultado le aplica el bono extra (lnea 76). Es importante observar que la clase hereda la funcionalidad de la clase PagoBonificado (lnea 63) y sustituye la implementacin del mtodo PagoBonificado.CalculaPago() (lneas 68 a 71), dado que recibe un nmero distinto de argumentos que el mismo mtodo en su clase base. Si todo ocurri como se esperaba, la salida ser la siguiente:
Pago a los no puntuales: 4800 Pago a los puntuales: 6000.00 Pago a los puntuales, + extra: 7200.000 Pulse INTRO para continuar
335
MAPA
11
336
TERMINOLOGA
Abstract class, 315 Clase(s) abstractas, 315 base, 313 Clases derivadas, 313 Debe reemplazarse, 324 Herencia, 313 Inheritance, 313 Inherits, 314 Jerarqua de clases, 313 MustInherit, 314 MustOverride, 3234 MyBase, 325 MyClass, 325 No reemplazable, 324 NotInheritable, 314 NotOverridable, 323-4 Overload, 323 Overloaded, 323 Overloads, 323-4 Overridable, 323-4 Overridden, 323 Override, 313, 323 Overrides, 323-4 Polimorfismo, 325 Reemplaza, 324 Reemplazable, 324 Sobrecarga/Sustituy e, 324
PREGUNTAS
11.1 Qu es la herencia? 11.2 En qu casos se recomienda la implementacin de la herencia? 11.3 Cules son los estatutos para establecer relaciones de herencia entre clases? 11.4 Mencione y explique los estatutos auxiliares de herencia y polimorfismo. 11.5 Mencione un ejemplo de automatizacin real, en donde pueda usted implementar herencia y polimorfismo.
337
Notas:
11
338
EXAMEN
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
1. Es la habilidad de una clase para servir de base a otra clase, trasladndole su funcionalidad: a) Herencia b) Polimorfismo c) Encapsulamiento 2. Tipo de relacin para la que se recomienda la herencia: a) Has-a b) Is-a c) Go-to 3. Permite la variacin en la clase derivada, de las propiedades y mtodos (requiere mantener los mismos argumentos): a) Inherits b) Overrides c) Overloads 4. Habilidad de un lenguaje para definir clases que se comporten distinto, a pesar de llamarse igual: a) Herencia b) Polimorfismo c) Encapsulamiento 5. Permiten generar un tipo de dato compuesto: a) Delegados b) Clases c) Estructuras
Captulos:
12 Desarrollo de aplicaciones Windows 13 Desarrollo de aplicaciones Web con ASP.NET 14 Servicios Web XML
Parte 4
Interfases Windows/Web y Servicios Web XML
En esta parte del libro aprenderemos a desarrollar las interfases que proporcionarn a nuestros procesos datos completos y correctos. Esta parte describe la manera de recopilar los datos necesarios para el procesamiento y el almacenamiento. Comienza con una revisin de las posibilidades de las interfases de plataforma Windows, hoy por hoy, las ms sofisticadas y poderosas. Posteriormente analiza la elaboracin de interfases para el ambiente Web con ASP.NET. Finalmente, trata el tema de los Servicios Web XML, que permiten la elaboracin de interfases desatendidas, propias para el consumo aplicacin a aplicacin. Hay quienes argumentan que los datos nunca son suficientes para satisfacer las necesidades; esa percepcin es propia de las aplicaciones mal delimitadas. El desarrollador inteligente siempre sabe producir el mximo de informacin con el mnimo de datos, y se asegura de que los pocos datos requeridos siempre sean proporcionados en la cantidad y la forma correctas.
Otras herramientas:
1. disco.exe 2. wsdl.exe
CAPTULO
12
341
342
Contenido
Interfaz de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Desarrollo de interfaces basadas en objetos . . . . . . . . . . . . . . . . . . . . . . . . . Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formas de agregar controles a una interfaz . . . . . . . . . . . . . . . . . . . . . Estrategia para el estudio efectivo de los controles . . . . . . . . . . . . . . . Jerarqua de clases relacionadas con controles . . . . . . . . . . . . . . . . . . . . . . . Uso de la ayuda para conocer los miembros de las clases de BCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de Dynamic Help . . . . . . . . . . . . . . . . . . . . . . . . . . . Bsqueda de temas en la ayuda . . . . . . . . . . . . . . . . . . . Estructura de un tpico de ayuda . . . . . . . . . . . . . . . . . . Clasificacin de los controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles comunes (Common Controls) . . . . . . . . . . . . . . . . Grupo de controles contenedores (Containers) . . . . . . . . . . . . . . . . . . Grupo de controles de men y barras de herramientas (Menus & Toolbars) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles de datos (Data) . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles componentes (Components) . . . . . . . . . . . . . . . . . Grupo de controles de impresin (Printing) . . . . . . . . . . . . . . . . . . . . . Grupo de controles de cuadros de dilogo (Dialogs) . . . . . . . . . . . . . . Manejo de colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Las colecciones y la programacin de aplicaciones Windows . . . . . . . . For Each . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enfoque (Focus) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interfaz multipgina con manejo avanzado de cuadros de texto, barra de mens y botones de comando . . . . . . . . . . . Establecimiento de valores generales de formulario . . . Adicin de un sistema de mens usando Menu Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lneas gua en tiempo de diseo para la alineacin de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . Cmo agregar imgenes a objetos Button . . . . . . . . . . . Opciones de formato para grupos de objetos . . . . . . . . Cmo establecer pginas de controles (TabControl) . . . Uso de grupos de controles, combos y selectores de nmero . . Orden de tabulacin y activacin dinmica de controles . . . . . . Lanzamiento de tareas desde la barra de mens . . . . . . Procedimiento para el evento de arranque (Load) . . . . . 344 345 347 348 348 349 350 350 352 353 355 355 357 357 358 358 359 360 361 362 352 363 364 365 366 368 370 372 375 380 382 384 386
343
Uso de Tab Order para establecer el orden de tabulacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloqueo de controles (Lock Controls) . . . . . . . . . . . . . . . Activacin dinmica de elementos . . . . . . . . . . . . . . . . . Uso de controles para la visualizacin de pginas Web . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
344
Interfaz de usuario
Se llama interfaz de usuario al sistema de elementos de software a travs de los cuales un programa determinado se articula con el usuario para recibir datos y actuar en consecuencia. La interfaz puede ser grfica (GUI, Interfaz grfica de usuario, Graphic User Interface), si est constituida por elementos grficos (iconos, punteros, ventanas); o textual, cuando el usuario introduce comandos e instrucciones en forma de cadenas de caracteres especficas (por ejemplo, las aplicaciones de consola). En el caso de Visual Basic es posible implementar interfaces de usuario en ambas modalidades. El objetivo principal de una interfaz, sea cual sea su tipo, es recibir los datos vlidos, mnimos, suficientes y necesarios para que un programa produzca los resultados esperados, y para dar al usuario la informacin relacionada con sus operaciones. La interfaz de usuario es el principal elemento de comunicacin entre las aplicaciones y los consumidores de la aplicacin. Pueden ser consumidores de la aplicacin las personas que la utilizan o los programas que se conectan a ella de manera automtica y aprovechan su funcionalidad sin mediar la intervencin humana (como en el caso de los servicios Web XML). Una interfaz se constituye en un punto de contacto con el usuario: permite la entrada y salida de datos, encargndose de los enlaces subyacentes que el usuario no tiene necesidad de conocer. El usuario captura informacin y espera un resultado, sin importarle la arquitectura de hardware y software que permitan a la aplicacin producir la respuesta.
345
turar una fecha de nacimiento, lo que se espera es un dato de tipo Date, y no un String, un Integer u otro.
Valida que los datos respeten las reglas de operacin. Si las reglas de operacin deter-
minan que una fecha a capturar no sea anterior a la fecha del da del sistema, o que un nmero deba estar entre un determinado rango, la interfaz debe garantizar que slo se admitan datos que respeten dichas reglas.
Proporciona la manera de corregir los errores que en la captura se cometan, y debe
vencionalismos que el usuario utilice con ms frecuencia; el programador no debe anteponer sus preferencias personales si stas no facilitan la aceptacin de la aplicacin por parte del usuario.
La interfaz de usuario debe proporcionar la informacin de manera organizada y estti-
NOTA
En computacin hay un fenmeno que se conoce como GIGO (Garbage In, Garbage Out/basura entra, basura sale). Si una aplicacin acepta datos errneos, muy probablemente se generarn errores en el procesamiento. Se puede tener la mejor aplicacin del mundo, pero si la persona que utiliza la aplicacin introduce datos equivocados, obtendr resultados equivocados. Lo ms que puede hacer un programador es validar tantos datos como sea posible, ya sea por tipo de dato o por regla de operacin.
12
346
Para cumplir con el propsito de la interfaz, el mnimo de datos que podemos preguntar son el usuario y la contrasea dos veces. La interfaz muestra varios elementos: tres etiquetas (objetos Label), tres cuadros de texto (objetos TextBox) y dos botones de comando (objetos Button). Todos ellos se encuentran en un objeto ms grande, al que se conoce como formulario (objeto Form). La interfaz est compuesta entonces por 9 objetos. Un objeto contenedor es el que puede contener otros objetos. Los objetos contenedores son conocidos tambin como objetos padre (parent), mientras que los objetos contenidos son conocidos como objetos hijo (child). Es posible que un objeto contenedor est contenido en otro objeto contenedor, por lo que podemos decir que stos pueden anidarse. Se tienen los siguientes elementos grficos de interfaz: 1 objeto contenedor y 8 objetos contenidos (1 objeto padre y 8 objetos hijos). Es importante recalcar que en .NET usted no tiene que redactar el cdigo necesario para dibujar pxel por pxel cada uno de los elementos. La codificacin ya est disponible como parte de BCL en forma de objetos que pueden ser invocados desde su programa. Para dibujar un formulario, por ejemplo, basta con instanciar la clase System.Windows.Forms.Form y modificar el estado del objeto para obtener la apariencia y el comportamiento deseado. Los objetos que se necesitan en nuestra interfaz derivan de las siguientes clases:
Clase BCL System.Windows.Forms.Form System.Windows.Forms.Label System.Windows.Forms.TextBox System.Windows.Forms.Button Tipo Parent Child Child Child Cantidad 1 3 3 2
347
Controles
Los controles son las representaciones grficas de las clases, disponibles en Visual Studio a travs de Toolbox. Los controles son la forma para llegar a las clases de BCL, a fin de generar instancias que se conviertan en objetos de interfaz. Aunque los controles y los objetos son cosas distintas, est tan generalizado el uso de la palabra control para designar las instancias de las clases agregadas a una interfaz grfica que es comn encontrarlos como sinnimos. Si desea que su interfaz sea efectiva, requiere saber manejar los objetos que sta incluya; esto slo se logra conociendo la clase de la cual derivan y las capacidades de dicha clase. Los controles estn disponibles en la barra de herramientas, o Toolbox. La herramienta Toolbox se organiza en grupos de controles, clasificndolos de acuerdo con la similitud de su funcionalidad o enfoque. Los grupos de controles pueden expandirse o contraerse con el fin de tener presentes slo los controles que utilicemos. Incluso es posible la generacin de grupos de controles del usuario, colocando ah los controles ms usuales para nosotros; con ello se facilita la operacin de buscarlos y encontrarlos. FIGURA 12.3 Toolbox, o barra de herramientas.
12
348
349
ce a la filosofa de la interfaz de usuario que est desarrollando. Investigue primero los eventos por la sencilla razn de que, generalmente, mandamos a ejecucin un mtodo como respuesta a un evento; si el evento no sucede, el mtodo tampoco suceder. 5. Investigue, finalmente, los mtodos que permite la clase. Utilizando los mtodos podr poner a trabajar las capacidades de comportamiento intrnseco del objeto.
12
350
Esto implica que, como ya lo sabe, los controles heredan propiedades, mtodos y eventos de la clase base. La figura 12.4 ejemplifica la jerarqua de clases a la que estn sujetos la mayora de los controles que se utilizan en una interfaz de usuario. Si puede entender cules son los miembros de la clase Object y la clase Control habr entendido el comportamiento general de los controles. El nmero de miembros de dichas clases es muy extenso; no sera prctico mencionarlos todos. Si desea consultar un listado exhaustivo bsquelos en la ayuda de .NET Framework, mediante el nombre del control que le interese y la palabra Class.
Ejercicio 12.1
Uso de la ayuda para conocer los miembros de las clases de BCL Conocer la forma en que se puede buscar informacin de clases en la ayuda de .NET (es necesario que la ayuda est instalada en el sistema). 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Haga clic en el botn Show All Files de la barra de herramientas de Solution Explorer. 3. En Solution Explorer seleccione el nodo HolaMundoWin Form1.vb Form1.Designer.vb.
351
6. La herramienta Dynamic Help es una ayuda dinmica que actualiza vnculos a los temas de ayuda relativos a lo que estemos haciendo. Dependiendo de lo que estemos trabajando, aparecern los vnculos pertinentes. Inicialmente aparecern temas genricos del tipo de proyecto que tengamos en el espacio de trabajo. 7. Busque la siguiente lnea de cdigo y seleccione la palabra Label.
Me.lblResultado = New System.Windows.Forms.Label
8. En Dynamic Help aparecern slo temas relacionados con lo que acabamos de seleccionar.
9. Busque la ayuda de la clase Label. Deber iniciar con Label Class. 10. Vea cmo aparecen varios temas que inician con Label Class, pues la clase Label existe en diferentes jerarquas de espacios de nombres (namespaces). Si una clase apunta hacia System.Web.UI.MobileControls, se refiere a las clases para interfaces de cmputo mvil; System.Web.UI.WebControls, se refiere a las clases para interfaces Web ASP.NET; finalmente System.Windows.Forms agrupa a las clases para definir objetos en interfaces basadas en Windows. Incluso hay implementaciones de los controles para la programacin en programas de Microsoft Office, como Word y Excel. Dado que estamos en una aplicacin Windows, seleccione Label Class (System.Windows.Forms).
12
352
> Lo nuevo
En Visual Studio 2005, el contenido de la ayuda se distribuye de forma distinta, ms organizada y predecible. Cada clase tendr un encabezado de tema (Class), para posteriormente ofrecer generalidades (about class), miembros (all members), informacin del constructor (constructor), sintaxis declarativa (declarative sintaxis), eventos, mtodos y propiedades (events, methods, properties).
353
da de los cuadros de texto, especificando TextBox Class, about en Look for:, y oprimiendo la tecla Intro al finalizar. 15. Aparecern en Index Results aquellos temas que concuerden con la bsqueda.
12
354
18. Dependiendo del tpico de ayuda mostrado aparecern diversos elementos en Topic Content. En el encabezado del tpico aparecer el nombre del mismo; debajo, vnculos de acceso rpido a temas de inters general o, por lo menos, un vnculo See Also, que lleva a temas relacionados. Dependiendo del tpico los dems vnculos pueden variar. 19. Tambin en el encabezado del tpico aparece un vnculo para expandir o contraer los subtpicos de la ayuda; si los subtpicos estn contrados, aparecer el vnculo Expand All, que permitir expandirlos; en caso de que estn expandidos, aparecer el vnculo Collapse All, para contraerlos. 20. En caso de que los subtpicos correspondientes a TextBox Class no estn expandidos, haga clic en el vnculo Expand All. 21. Con la finalidad de encontrar informacin especfica, la ayuda cuenta con una opcin de filtro que vara dependiendo del contenido que se est buscando. Un filtro tpico es el lenguaje .NET en el que se ejemplifican las instrucciones y sintaxis; si usted slo codifica en Visual Basic, probablemente ver los ejemplos y sintaxis en todos los lenguajes .NET incluidos en la ayuda (C#, C++, J#, JScript) no har ms que complicar la investigacin. En caso de que el tpico tenga ejemplos de codificacin, la ayuda de .NET Framework permitir seleccionar el o los lenguajes en los que desee ver las implementaciones en cdigo. 22. En Language filter seleccione nicamente Visual Basic (usage). Vea cmo en el cuerpo de la ayuda aparecern slo ejemplos en el lenguaje seleccionado. Observe cmo en Visual Basic se puede incluso filtrar la ayuda para ver el uso (usage) o la declaracin de las sentencias (declaration). 23. En el cuerpo de la ayuda aparecer el tema desarrollado en subtpicos y ejemplos. Los subtpicos pueden contraerse o expandirse, haciendo clic en el icono (+ , ) que aparece contiguo al ttulo. Generalmente aparecer un resumen de la funcionalidad del tpico en la parte superior. 24. En el encabezado de la ayuda haga clic en el vnculo Members para examinar las propiedades, los mtodos y los eventos disponibles para el objeto Label en una interfaz Windows. 25. Vea cmo el filtro ha cambiado. Ahora permite filtrar con base en los miembros que desea ver. Ya decamos que los objetos de interfaz derivan de Object y de Controls. Si ya conoce los miembros comunes de dichas clases, es probable que slo le interese ver en la ayuda aquellos miembros que son particulares de la clase investigada. 26. En la ayuda de los miembros de Label, encuentre la propiedad BackColor. Dicha propiedad es comn a todos los controles, dado que la heredan de la clase Controls. 27. Expanda el cuadro combinado del filtro y desmarque todas las casillas de verificacin. Vea cmo BackColor ya no aparece. Esto sucede porque se inhabilit la opcin Include Inherited Members. 28. Este procedimiento es aplicable para encontrar ayuda para todas las clases de BCL. 29. Cierre la ventana de ayuda de .NET. FIN DEL EJERCICIO *
355
> Lo nuevo
En Visual Studio 2005 la ayuda viene mejorada, dado que permite la integracin con la comunidad de desarrolladores (se requiere estar en lnea para ello). No slo se puede consultar lo ltimo en documentacin, sino que directamente se pueden agregar preguntas a foros de Visual Studio. Se tiene un nuevo men, llamado Community, que permitir el acceso a los recursos disponibles para la comunidad de desarrolladores a nivel mundial.
Indica la no seleccin de otros controles. Este control realmente no se enlaza con ninguna clase de BCL y aparece en todos los grupos de controles. Muestra un botn que al presionarlo desencadena una accin. Representa una casilla de verificacin. Representa una lista de opciones que pueden ser marcadas en forma de casillas de verificacin. Representa un cuadro combinado de opciones (cuadro de texto + lista desplegable). Representa un selector de fechas.
12
Button
CheckBox CheckedListBox
ComboBox
DateTimePicker
356
Label
Representa una etiqueta textual de slo lectura. Representa una etiqueta que puede desplegar hipervnculos. Representa una lista. Representa una coleccin de elementos, preferentemente grficos, que pueden ser seleccionados. Representa un cuadro de texto que distingue entre una entrada vlida y una invlida, de acuerdo con un patrn. Representa un selector de fechas en modo mes. Representa un icono en el rea de notificacin. Representa un selector de nmeros dentro de un intervalo. Representa un cuadro en el cual se puede desplegar una imagen. Representa una barra de control de avance de un proceso. Representa un botn de opcin. Representa un cuadro de texto RTF (Rich Texto Format, Formato de texto enriquecido). Representa un cuadro de texto. Representa un cuadro de informacin que aparece slo al sobreponer el puntero del ratn sobre un elemento de interfaz. Representa una coleccin jerrquica de elementos (nodos) y permite su seleccin. Representa un navegador de Internet que puede incluirse en un formulario.
LinkLabel
ListBox ListView
MaskedTextBox
MonthCalendar
NotifyIcon
NumericUpDown
PictureBox
ProgressBar
RadioButton RichTextBox
TextBox ToolTip
TreeView
WebBrowser
357
Representa un espacio de trabajo en el cual los controles se acomodan automticamente de forma vertical y horizontal. Representa un marco que agrupa a otros controles, con la opcin de incluir un texto superior explicativo. Representa un espacio de trabajo en el cual se pueden colocar controles que requieren agruparse. Representa un rea de espacio de trabajo que se divide en dos paneles que pueden ajustarse de manera dinmica. Representa un conjunto de pginas de controles, que pueden seleccionarse mediante el uso de fichas. Representa un panel dinmico que se subdivide en celdas.
GroupBox
Panel
SplitContainer
TabControl
TableLayoutPanel
12
Representa un men contextual. Proporciona un sistema de mens a un formulario. Representa una barra de estado para un formulario.
StatusStrip
358
ToolStrip
Representa un contenedor para objetos de barra de herramientas. Proporciona paneles laterales en una forma, y un panel central, en donde se pueden colocar otros controles.
ToolStripContainer
Representa una base de datos desconectada que se almacena en memoria. Representa una rejilla de datos que permite personalizar la apariencia. Encapsula una fuente de datos para una forma. Representa una interfaz de navegacin y manipulacin de datos cuando se tienen en el formulario controles enlazados con las fuentes de datos. Permite la visualizacin de reportes ReportViewer.
DataGridView
BindingSource
BindingNavigator
ReportViewer
Representa la ejecucin de un proceso en un flujo de procesamiento separado (thread). Representa el encapsulamiento de nodos y objetos de Active Directory.
DirectoryEntry
359
DirectorySearcher
Representa una consulta sobre el Active Directory. Representa una interfaz entre un control y un error asociado con l. Representa una interaccin con el logo de eventos de Windows. Representa un monitoreo que vigila y detecta si un directorio o archivo ha sufrido cambios en su contenido. Representa ayuda popup o en lnea para un control. Representa una coleccin de objetos de imagen. Representa un manejador de colas en .NET. Representa un componente de monitoreo de desempeo de Windows (performance counter). Representa el acceso a procesos que pueden ser detenidos o iniciados de manera local o remota. Representa un recurso de acceso al puerto serial. Representa un servicio de Windows y permite su manipulacin. Representa un temporizador, que permite ejecutar procesos en determinado intervalo.
ErrorProvider
EventLog
FileSystemWatcher
HelpProvider
ImageList
MessageQueue
PerformanceCounter
Process
12
SerialPort
ServiceController
Timer
360
Control
Nombre PageSetupDialog
Uso
Permite a los usuarios establecer la configuracin de las pginas de impresin. Representa un cuadro de dilogo estndar de Windows para la seleccin de impresora y envo de impresin. Representa un documento de impresin que puede disearse. Representa una versin esencial de presentacin preliminar. Representa un cuadro de dilogo estndar de Windows para la visualizacin de presentaciones preliminares.
PrintDialog
PrintDocument
Representa un cuadro de dilogo estndar de Windows para la seleccin de colores. Muestra y permite que el usuario seleccione un directorio de los existentes en el sistema de archivos. Representa un cuadro de dilogo estndar de Windows para la seleccin de fuentes. Representa un cuadro de dilogo estndar de Windows para la seleccin de un nombre de archivo existente. Representa un cuadro de dilogo estndar de Windows para la especificacin de nombres de archivo vlidos.
FolderBrowser Dialog
FontDialog
OpenFileDialog
SaveFileDialog
361
Este libro no incluye todas las propiedades y el manejo de los controles, dado que el tema es extenso y no tiene que ver con Visual Basic como lenguaje, sino con el uso especfico de las clases de BCL.
Manejo de colecciones
Uno de los conceptos ms importantes en .NET Framework es el manejo de colecciones. Una coleccin es un conjunto de objetos de igual naturaleza que se agrupan como unidad de referencia, y a los que es posible referirse como una unidad, adems de ser elementos individuales y autnomos. Podemos encontrarnos las colecciones como instancias de clases de tipo Collection, como arreglos o como propiedades de objetos que permiten el manejo de colecciones (como es el caso de los contenedores). Es requisito para una coleccin que todos los objetos de la misma sean de un mismo tipo, a fin de guardar una coherencia de contenido que no perjudique el procesamiento que se realice con la coleccin. A cada uno de los elementos de una coleccin se le da el nombre de item. Los items son accesibles ya sea por un subndice que indica la posicin del elemento dentro de la coleccin, o por un nombre de elemento, en el caso que estos estn denominados. Dado que una coleccin tiene su propia identidad y comportamiento, posee propiedades y mtodos que permiten su manipulacin. Por ejemplo, para conocer el nmero de elementos que componen la coleccin basta con invocar la propiedad Collection.Count de la coleccin; para agregar elementos, podemos utilizar el mtodo Collection.Add, mientras que para eliminarlos podemos utilizar el mtodo Collection.Remove. Existen colecciones genricas para agrupar objetos de tipo indeterminado. Este tipo de colecciones no requiere la especificacin de un determinado tipo de objeto, lo que implica mucha flexibilidad; sin embargo, tambin implica prdida de desempeo de las aplicaciones, ya que es necesaria la realizacin de conversiones en tiempo de ejecucin (boxing, unboxing). Se habla de boxing cuando un tipo de dato primitivo es convertido en su equivalente a objeto (pasa de ser ByVal a ser ByRef), con lo cual podr disponer de toda la funcionalidad de la clase, como lo son los mtodos y propiedades intrnsecos de la clase que le dio origen. Se habla de unboxing en el caso contrario, cuando un objeto pasa de ser un objeto a su equivalente en dato primitivo (de ByRef a ByVal). No slo existen colecciones genricas; hay algunas de tipo objeto que refieren a un tipo de objeto determinado y que, por tanto, tienen la ventaja de evitar las conversiones en tiempo de ejecucin, lo cual las hace ms eficientes.
12
362
NOTA
Las colecciones sern aludidas en este libro con el siguiente estilo tipogrfico: Collection, a fin de que las distinga de las propiedades comunes.
For Each
El ciclo For taxis de For
For Each Each Each
es una estructura de control que sirve para explorar colecciones. La sines la siguiente:
Variable In Coleccin
proceso en donde Variable se establece como referencia del elemento en la coleccin Next
Variable
363
Donde Variable es una variable de trabajo del mismo tipo de dato que los elementos contenidos en la coleccin. Coleccin ser la coleccin de objetos a explorar.
NOTA
En la tabla de miembros ms utilizados se incluyen slo aquellos que sean inherentes al control que se est documentando; se omitir mencionar propiedades, mtodos y eventos que sean derivados de las clases Control y Object, que ya fueron documentados en el captulo anterior.
Enfoque (Focus)
Se entiende por enfoque (focus) la capacidad de interactuar a travs del teclado con un objeto. Por lgica, en tiempo de ejecucin slo un objeto puede poseer el enfoque en un momento determinado. Hay algunos objetos que no pueden tener el enfoque debido a su incapacidad de interactuar con el usuario (por ejemplo, los objetos invisibles como ToolTip). Los objetos que s permiten la interaccin del usuario tienen una propiedad denominada Control.TabIndex que indica el orden en que el control del programa navegar de un objeto a otro al presionar la tecla TAB. Inicialmente, en la ejecucin de un programa, el enfoque lo tendr el objeto que, teniendo la capacidad de poseer el enfoque, tenga el valor menor en la propiedad Control.TabIndex, siempre y cuando se encuentre habilitado (propiedad Control.Enabled establecida a True) y visible (propiedad Control.Visible establecida en True). Cuando es posible manipular el valor de un objeto con el teclado se dice que dicho objeto tiene el enfoque. Si el objeto, teniendo el enfoque, lo traslada a otro objeto, se dice que pierde el enfoque; si un objeto, no teniendo el enfoque lo recibe, se dice que adquiere el enfoque.
TabIndex.
12
El orden para adquirir y perder el enfoque est determinado por la propiedad Control. Este orden se respeta slo si se traslada el enfoque presionando la tecla TAB; es posible trasladar el enfoque de otras formas, como haciendo clic en un objeto, y en tales casos no importa el orden determinado en Control.TabIndex. Al orden en que los objetos van pasando el enfoque se le llama orden de tabulacin (Tab Order).
Hay varios mtodos y eventos relacionados estrechamente con el enfoque. El mtodo Control.Focus, por ejemplo, proporciona el enfoque a un objeto. Cuando un objeto deja de tener el enfoque, se produce para ese objeto el evento Control.LostFocus. Cuando un objeto adquiere el enfoque, le sucede el evento Control.GotFocus.
364
Como puede darse cuenta, el simple hecho de oprimir la tecla TAB o sealar con el puntero del ratn a un objeto que no posee el enfoque, propicia una buena cantidad de eventos, tanto para el objeto que recibe el enfoque como para el que lo pierde. Aqu se genera confusin: Cul ocurre primero? A continuacin le mostramos todos los eventos que suceden si un objeto adquiere el enfoque y lo pierde: 1. 2. 3. 4. 5. 6. Cuando entramos a un objeto, se provoca primero el evento Control.Enter. Ya que entramos, comenzamos a disponer de la capacidad de interactuar con l, por lo que se provoca el evento Control.GotFocus. Si estando en el objeto presionamos TAB, indicamos que queremos dejar el objeto, provocando el evento Control.Leave. Antes de poder dejar el objeto, es necesario saber si es vlido o no hacerlo; se provoca el evento Control.Validating. Si la validacin se lleva a cabo, se provoca el evento Control.Validated. Ya que comprobamos que fue vlido dejar el objeto, se pierde la capacidad de interactuar con l, por lo que se provoca el evento Control.LostFocus.
Definir un adecuado orden de tabulacin es indispensable para construir una buena interfaz. Si el orden es catico, el usuario se perder. No trate de ser innovador con respecto al orden de tabulacin: analice el orden en que el usuario del programa acostumbra capturar los datos o analice el documento a partir del cual realiza la captura, y proporcione el orden necesario. Cramelo, se lo van a agradecer mucho.
Ejercicio 12.2
Interfaz multipgina con manejo avanzado de cuadros de texto, barra de mens y botones de comando
Aprender a crear una aplicacin de interfaz Windows utilizando los controles grficos proporcionados por .NET Framework. 1. 2. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Windows Application, llamado Empresa. Deber aparecer un formulario en el diseador de formularios, que por omisin recibe el nombre de Form1.
365
NOTA
En trminos de notacin, cuando hagamos referencia a Clase.Miembro, por ejemplo Form.Name, nos referiremos al miembro de la clase; la explicacin ser vlida para todas las instancias que de dicha clase se generen. Cuando hagamos referencia a Instancia.Miembro, por ejemplo frmEmpresa.Name, especificaremos valores y condiciones que se le apliquen slo a un objeto en particular. En todos los casos, los controles pertenecen a Windows.Forms.Controls.
4.
Registro de empresa
450 350
5.
Cuando encuentre este tipo de tablas en los ejercicios, lo que debe hacer es lo siguiente: a) En la columna de propiedad se encuentra una referencia que se compone de Objeto.Propiedad. En la herramienta Properties debe asegurarse que tiene seleccionado el objeto al cual desea modificar las propiedades; eso se comprueba si el objeto aparece en el cuadro combinado de seleccin de objetos de Properties. Una forma de seleccionar el objeto es haciendo un solo clic sobre l. b) En algunos casos la propiedad tendr en la tabla dos referencias (Propiedad1.Propiedad2), lo que indica que la primera propiedad engloba a la segunda. c) A fin de cuentas debe encontrarse en la columna izquierda de la rejilla de propiedades la propiedad especificada (Propiedad), y debe establecer el valor de la misma en la columna derecha de la rejilla (Valor a asignar). d) Los valores de las propiedades no se asignan hasta oprimir la tecla Intro al terminar la edicin.
12
6.
La propiedad Form.Text permite asignar el ttulo que ha de mostrarse en la barra de ttulo del formulario; Form.Width permite asignar el ancho en pxeles del formulario, mientras que Form.Height permite asignar el alto en pxeles.
366
7.
En Properties busque la propiedad frmEmpresa.Icon, y haga clic en el botn de asistencia de introduccin de valores . Aparecer la ventana de seleccin de archivos. Seleccione el archivo WindowsApp.ico, que se encuentra en los archivos complementarios al captulo, en C:\APVBNETVS\Cap11. La propiedad Form.Icon permite seleccionar el icono del programa. Como puede ver, el icono que aparece en la barra de ttulo de la aplicacin ha cambiado por el que hemos especificado. Por el momento nuestra interfaz luce como sigue:
9.
367
10. Vea cmo se ha integrado una barra de mena que muestra el texto Type Here. Esta herramienta se llama Menu Designer, que permite ir diseando sistemas de men con suma facilidad. Por definicin, un sistema de men es un conjunto de opciones que se distribuyen visualmente de forma jerrquica y que al ser seleccionadas desencadenan acciones. FIGURA 12.6 Menu Designer.
12
11. En Menu Designer cada opcin constituye un elemento de men (menu item). Se tienen elementos de primer nivel, que son aquellas opciones que aparecen de forma permanente en la barra de mens, y que no dependen de ningn elemento de men. Tambin pueden insertarse elementos de segundo nivel, que son los que dependen de un elemento de primer nivel; elementos de tercer nivel, cuarto nivel, y as sucesivamente.
368
12. En el rea de edicin donde aparece Type Here se escribe la etiqueta de elemento; si como etiqueta del elemento emplea un verbo, procure utilizar uno en infinitivo. Al comenzar a editar una etiqueta de elemento, automticamente se proponen elementos latentes, que son aquellos que pudieran existir siempre y cuando se edite su etiqueta de elemento. Aparecer siempre un elemento latente abajo y otro a la derecha: los elementos latentes que aparecen en la parte inferior generan opciones de men al mismo nivel, mientras que las opciones que se editan hacia la derecha constituyen la formacin de un nuevo nivel de elementos (salvo en el caso de los elementos de primer nivel, donde lo que se genera es un nuevo elemento de primer nivel). 13. Escriba como etiqueta del elemento de primer nivel la palabra Acciones. En el elemento latente inferior escriba Limpiar campos; en el elemento latente inferior escriba un guin (-), y finalmente en el elemento latente inferior escriba Cerrar. Nuestro sistema de mens debe lucir como sigue (observe que al aplicar un guin como etiqueta se genera una lnea separadora):
14. El sistema de mens es para Visual Basic un objeto de tipo MenuStrip; los elementos de un sistema de mens constituyen objetos ToolStripMenuItem. Lo que escribimos en la etiqueta de elemento realmente constituye la propiedad ToolStripMenuItem.Text de cada elemento.
369
16. Al mover los objetos en la interfaz para colocarlos en el sitio que queremos, podremos usar las lneas gua (snaplines) que Visual Basic muestra; stas permiten una alineacin y distribucin esttica de los controles.
17. Existen diferentes lneas gua: las guas de proximidad, que son las que conectan a objetos entre s, indicando la distancia recomendada entre objetos para una interfaz grfica Windows (tambin pueden asociarse a bordes del espacio de trabajo). Adems existen las guas de alineacin, que permiten evaluar la posicin de un objeto en relacin con otros objetos y elementos del entorno. 18. Mueva btnCancelar de tal forma que se ubique en la esquina inferior derecha. No deje de acomodar el botn hasta que vea las guas de proximidad con el borde derecho e inferior. Eso garantiza las medidas estndar de una interfaz Windows.
12
19. Mueva btnAceptar de tal manera que se muestren las guas de proximidad, tanto con el borde inferior como con btnCancelar; adems deber buscarse que aparezca la gua de alineacin que garantice que el texto interno de los botones estn alineados en su lmite inferior.
370
21. La propiedad Button.Text permite asignar el texto que aparecer en la cara del botn. Si se antepone el carcter & a una de las letras en Button.Text, automticamente se forma una tecla de atajo (shortcut); esto permite que oprimir la combinacin de teclas Alt-A equivalga a hacer clic en btnAceptar, y presionar Alt-C sea equivalente a hacer clic en btnCancelar. 22. La propiedad Form.AcceptButton permite definir a un botn existente en la interfaz como accin de aceptacin, por lo cual oprimir la tecla Intro equivale a hacer clic en el botn especificado. Por otro lado, Form.CancelButton permite definir a un botn existente en la interfaz como accin de cancelacin, por lo cual oprimir la tecla Esc equivale a hacer clic en btnCancelar. En nuestra interfaz se asigna btnCancelar como botn de cancelacin. 23. Nuestra interfaz debe lucir como sigue:
371
25. El valor que ha de recibir btnAceptar.Image es de tipo Image, y no puede representarse mediante cdigo. Para ese tipo de valores y contenidos cada proyecto posee un archivo de recursos, de extensin .RESX; en ese archivo se almacenan diversos elementos externos que deseamos sean considerados como parte integral de la aplicacin. 26. Haga clic en Import..., y seleccione el archivo ok.png que se encuentra en el directorio de archivos complementarios del captulo. Haga clic nuevamente en Import... y seleccione el archivo Error.png. En la lista de recursos tendr entonces a Ok y Error. Seleccione Ok de la lista de recursos y acepte haciendo clic en el botn Ok. La imagen seleccionada aparecer en el centro del objeto. 27. Modifique btnCancelar.Image; seleccione el recurso Error de la lista de recursos cuando sta aparezca. Haga clic en Ok para aceptar. La imagen aparecer al centro del botn. 28. Como puede ver, las imgenes al centro de los botones no son las ms adecuadas. Modifique btnAceptar.ImageAlign asignando el valor MiddleLeft. Al hacer la modificacin aparecer una ayuda visual que indica la posicin en donde deseamos colocar la imagen.
12
372
29. Asigne tambin el valor de MiddleLeft a btnCancelar.ImageAlign. 30. La propiedad Button.Image representa la imagen que un botn presentar en su cara, mientras que Button.ImageAlign representa la posicin que la imagen ocupar en la cara del botn. 31. Nuestros botones deben lucir de la siguiente manera:
32. Como puede ver, los botones estn muy compactados, por lo que deber incrementar sus dimensiones utilizando los delimitadores de tamao. Incremente el tamao de btnAceptar hasta que el texto y la imagen se ajusten correctamente. Aunque la tentacin sea mucha, no modifique por el momento el tamao de btnCancelar.
373
Accin
Format Align Lefts Format Align Centers Format Align Rights Format Align Tops Format Align Middles Format Align Bottoms Format Make same size - Width Format Make same size - Height Format Make same size - Both Format Horizontal spacing Make equal Format Horizontal spacing Increase Format Horizontal spacing Decrease Format Horizontal spacing Remove Format Vertical spacing Make equal Format Vertical spacing Increase Format Vertical spacing Decrease Format Vertical spacing Remove
Alinea todos los objetos del grupo con el borde izquierdo del objeto principal de referencia. Alinea todos los objetos del grupo con el eje central vertical del objeto principal de referencia. Alinea todos los objetos del grupo con el borde derecho del objeto principal de referencia. Alinea todos los objetos del grupo con el borde superior del objeto principal de referencia. Alinea todos los objetos del grupo con el eje central horizontal del objeto principal de referencia. Alinea todos los objetos del grupo con el borde inferior del objeto principal de referencia. Establece a los objetos del grupo con el mismo ancho que el objeto principal de referencia. Establece a los objetos del grupo con el mismo alto que el objeto principal de referencia. Establece a los objetos del grupo con el mismo tamao que el objeto principal de referencia. Establece una misma distancia entre los objetos, sobre el eje horizontal. Incrementa de forma proporcional la distancia entre los objetos, sobre el eje horizontal. Disminuye de forma proporcional la distancia entre los objetos, sobre el eje horizontal. Elimina la distancia entre los objetos, sobre el eje horizontal, dejndolos contiguos. Establece una misma distancia entre los objetos, sobre el eje vertical. Incrementa de forma proporcional la distancia entre los objetos, sobre el eje vertical. Disminuye de forma proporcional la distancia entre los objetos, sobre el eje vertical. Elimina la distancia entre los objetos, sobre el eje vertical, dejndolos contiguos.
12
374
36. Otras opciones de formato aplicables tanto para los objetos en grupo como para un objeto individual, son las siguientes:
Icono en barra de herramienta/Opcin de men Accin
Format Center in form Horizontally Format Center in form Vertically Format Order Bring to front Format Order Send to back
Centra los objetos respecto al ancho del formulario. Centra los objetos respecto al alto del formulario. Coloca el objeto al frente de los dems, de tal forma que tendr prioridad en la seleccin. Coloca el objeto atrs de los dems, dndoles menor prioridad de seleccin.
37. Trace un rectngulo imaginario que toque los dos botones del formulario.
39. El objeto primario de referencia es btnCancelar, dado que tiene delimitadores de tamao en color blanco. Haga, en btnAceptar, a fin de que se establezca como objeto primario de grupo. 40. Seleccione Format Make same size Both . Los botones asumirn el tamao del objeto principal de referencia, es decir, btnAceptar. 41. Apoyndose en las lneas gua, vuelva a distribuir los botones de tal manera que tengan una distribucin esttica. Nuestro formulario debe lucir como sigue:
375
12
376
44. Lo que se agrega a la interfaz es un objeto TabControl que contiene dos objetos TabPage; cada TabPage posee su pestaa de seleccin, de tal forma que se pueda alternar entre ellas. Si hacemos clic sobre el rea superior del control, es decir, en el rea donde se encuentran las pestaas de seleccin de pgina, estaremos trabajando con el objeto TabControl en su calidad de contenedor de objetos TabPage. Por otro lado, si hacemos clic en la pestaa de algn TabPage y luego hacemos clic en el cuerpo de la pgina, estaremos trabajando con el objeto TabPage. 45. Haga clic en cualquiera de las pestaas de seleccin de pgina, a fin de seleccionar el TabControl. Cambie el nombre del objeto de TabControl1 a tcDatos. 46. TabControl proporciona herramientas a nivel objeto para la manipulacin de su comportamiento y apariencia (figura 12.09). A travs de los delimitadores de tamao es posible extender o contraer el control, simplemente arrastrando el delimitador en la direccin en que queremos que se expanda o contraiga. Tambin est el icono para mover el objeto de lugar, a travs del cual podemos arrastrar un control hacia otro sitio en la interfaz. Finalmente tenemos el icono de tareas de objeto (smart tag) que proporciona una liga rpida hacia las acciones ms comunes a realizar con el control, y adems permite la modificacin rpida de las propiedades ms comunes; si bien las acciones son generalmente posibles en el men de contexto, smart tag es ms especfico. 47. Haga clic en el smart tag del objeto y seleccione el vnculo Add Tab.
48. Se agregar un TabPage ms a tcDatos. En el plano subyacente, lo que ocurri es que se agreg un elemento ms a la coleccin TabPages. 49. Si seleccionamos la pestaa de un TabPage y luego hacemos clic en el rea del cuerpo del TabPage estaremos trabajando con la pgina. Seleccione la ficha TabPage1 y haga clic en el cuerpo de la pgina; en Properties cambie la propiedad Name, de TabPage1 a tpGenerales. Modifique tambin el nombre de TabPage2 por tpContacto, y el de TabPage3 por tpSitio. 50. Modifique las siguientes propiedades:
Propiedad tpGenerales.Text tpContacto.Text tpSitio.Text btnAceptar.Enabled Valor a asignar
377
51. Seleccione tpGenerales y agregue 5 etiquetas (Label), 1 cuadro de texto con mscara (MaskedTextBox), 3 cuadros de texto (Textbox) y un objeto para seleccin de fecha (DateTimePicker). Todos los controles se encuentran en el grupo Common Controls de Toolbox. 52. Distribuya los objetos de la siguiente forma:
53. Modifique las siguientes propiedades. Un consejo rpido: si al seleccionar un objeto su propiedad por omisin es Text, se puede comenzar a escribir el valor de la propiedad Text sin seleccionarla en Properties. Tal es el caso de Label: haga clic en los objetos Label y escriba simplemente lo que la etiqueta ha de mostrar, automticamente se actualizar Text. Los controles se relacionan en orden de lectura de izquierda a derecha, de arriba abajo:
Propiedad Label1.Text MaskedTextBox1.Name mtbIDEmpresa.Mask Valor a asignar
12
ID Empresa: mtbIDEmpresa
, seleccionar <Custom> y escribir 9999999999 en Mask
378
Propiedad Label1.Text Label2.Text TextBox1.Name txtNombre.CharacterCasing txtNombre.MaxLength Label3.Text TextBox2.Name txtDireccion.AcceptsReturn txtDireccion.MaxLength txtDireccion.Multiline
Valor a asignar
ID Empresa: Nombre: txtNombre Upper 40 Direccin: txtDireccion True 200 True (aumentar el alto del objeto, una vez modificada esta propiedad) NIP de acceso: txtNIP 10 * dtpClienteDesde
379
55. Las propiedades Text de los controles indican la parte textual visible de los objetos. La propiedad MaskedTextBox.Mask sirve para representar la mscara o patrn de entrada que aceptar el control; en nuestro caso, el nmero de empresa es un nmero de mximo diez posiciones, por lo que la mscara de entrada es 9999999999. La propiedad TextBox.CharacterCasing determina si el contenido del cuadro de texto ser convertido a minsculas, maysculas, o ser mixto; en nuestro caso pedimos que el nombre de la empresa est en maysculas. La propiedad TextBox.MaxLength permite especificar el nmero mximo de caracteres que podrn ser ingresados en el cuadro de texto. La propiedad TextBox.AcceptsReturn permite que se incluya Intro dentro del contenido, sin darle significado especial. La propiedad TextBox.MultiLine establece que el cuadro de texto puede incluir varias lneas de escritura; al establecer esta propiedad como True, automticamente aparecen delimitadores de tamao que permiten no slo incrementar el ancho del objeto, sino tambin el alto. La propiedad TextBox.PasswordChar permite establecer un smbolo a travs del cual lo que uno escribe en un cuadro de texto queda oculto a la vista. 56. Guarde todos los cambios realizados en su solucin e inicie la depuracin (oprima la tecla F5). Ejecute la aplicacin y verifique que en el ID de la empresa slo se puedan capturar nmeros, hasta un total de diez; que lo capturado en el nombre siempre est en mayscula, que en direccin se pueda capturar ms de una lnea; que se admita el uso de Intro; que el NIP aparezca como oculto a la vista, y que se pueda seleccionar una fecha distinta a la mostrada como antigedad del cliente. FIN DEL EJERCICIO*
12
380
Ejercicio 12.3
Uso de grupos de controles, combos y selectores de nmero Aprender a utilizar grupos de controles, combos y selectores de nmeros en una interfaz Windows. 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Contine trabajando con el proyecto Empresa, iniciado en el ejercicio anterior. Seleccione tpContacto y agregue cuatro etiquetas (Label), un cuadro de texto (TextBox), un cuadro de texto con mscara (MaskedTextBox), un cuadro combinado (ComboBox), un selector de nmero (NumericUpDown) y un cuadro de grupo (GroupBox), dentro del cual se debern agregar en modo arrastre dos botones de opcin (RadioButton). Al seleccionar el cuadro de grupo y moverlo de lugar, los botones de radio debern moverse junto con l. Distribuya los objetos de la siguiente manera:
4.
5.
Nombre: txtNombreCon 50
381
Upper Telfono: mtbTelefono 99 (99) 9999-9999 Ttulo: cboTitulo , y escribir las opciones del combo, una en cada lnea.
12
Propiedad Label9.Text NumericUpDown1.Name nudSucursales.Maximum nudSucursales.Minimum GroupBox1.Text RadioButton1.Name rbtnMasculino.Checked rbtnmasculino.Text RadioButton2.Name rbtnFemenino.Text Valor a asignar
382
6.
7.
8.
Las propiedades Text de los controles indican la parte textual visible de los controles. La propiedad NumericUpDown.Maximum sirve para indicar el nmero mximo hasta donde permitir el selector de nmeros llegar, mientras que NumericUpDown.Minimum determina el mnimo. La propiedad GroupBox.Text permite establecer el texto de encabezado que ha de aparecer en un cuadro de grupo de controles. La propiedad RadioButton.Checked indica si el botn de opcin est seleccionado o no; slo puede haber un botn de opcin seleccionado en un grupo de controles a un tiempo. Guarde todos los cambios realizados en su solucin e inicie la depuracin (oprima la tecla F5). Ejecute la aplicacin y verifique que aparecen todos los elementos que haya agregado en String Collection Editor para el cuadro combinado; que los lmites mximos y mnimos del selector de nmeros se respete, y que al seleccionar un botn de opcin dentro de un grupo, los dems dejan de estar seleccionados.
Ejercicio 12.4
Orden de tabulacin y activacin dinmica de controles Aprender a manipular la activacin dinmica de controles en una interfaz, dependiendo del cumplimiento de condiciones. Aprender tambin el manejo de la herramienta Tab Order.
383
1. 2. 3.
4.
Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Contine trabajando con el proyecto Empresa, iniciado en el ejercicio 12.2. Seleccione tpSitio y agregue un objeto de casilla de verificacin (CheckBox), un cuadro de texto (TextBox), un botn de comando (Button), un control de navegacin en Internet (WebBrowser) y un control de ayuda fugaz (ToolTip). Este ltimo es invisible en tiempo de ejecucin, por lo que no se agrega a la interfaz; la forma en que deber incluirlo es arrastrando el control desde ToolBox hasta el cuadro de texto de la interfaz. Distribuya los objetos de la siguiente forma:
5.
12
chkSitio Tiene sitio Web? txtURL False btnVerSitio &Ver False webPagina Coloque aqu la ruta http del sitio Mensaje del sistema
384
6.
7.
Las propiedades Text de los controles indican la parte textual visible de los objetos. La propiedad ToolTip.ToolTipTitle sirve para especificar el ttulo de encabezado que aparecer con el mensaje de ayuda fugaz, que se especifica en la propiedad TextBox.ToolTip. La propiedad Control.Enabled de los controles indica si estn o no disponibles para su uso en tiempo de ejecucin, no obstante de que estn visibles.
Form1.vb - LimpiaCampos
385
6 7 8 9 10 11 12 13 14 15 16 17 18 19
txtNIP.Text = Campos del segundo TabPage txtNombreCon.Text = mtbTelefono.Text = rbtnMasculino.Checked = True cboTitulo.SelectedIndex = 0 Campos del tercer TabPage chkSitio.Checked = False txtURL.Text = txtURL.Enabled = False btnVerSitio.Enabled = False End Sub
9.
Como puede ver, se limpian todos los campos textuales y se reestablecen los valores iniciales del formulario. 10. Vaya a Form Designer y en tiempo de diseo seleccione la opcin Limpiar Campos, haciendo doble clic sobre la opcin. Aparecer nuevamente el cdigo, pero habr agregado un procedimiento de evento que se lanzar cuando el usuario seleccione la opcin en tiempo de ejecucin. El procedimiento se llama LimpiarCamposToolStripMenuItem_Click. En dicho procedimiento mande llamar el procedimiento LimpiaCampos, que acabamos de desarrollar.
Codificacin de Empresas
1 2 3
Form1.vb LimpiarCamposToolStripMenuItem_Click
12
Private Sub LimpiarCamposToolStripMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LimpiarCamposToolStripMenuItem.Click Call LimpiaCampos() End Sub
11. Aunque la instruccin Call para mandar a ejecutar un procedimiento puede omitirse, se incluye para mejorar la claridad del cdigo. 12. Vaya a Form Designer y en tiempo de diseo seleccione la opcin Cerrar, haciendo doble clic sobre la opcin. Aparecer nuevamente el cdigo, que deber complementar de la siguiente manera:
386
Codificacin de Empresas
1 2 3
Form1.vb CerrarToolStripMenuItem_Click
Private Sub CerrarToolStripMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CerrarToolStripMenuItem.Click Me.Close() End Sub
13. Al aplicar el mtodo Close() sobre el formulario (que se reconoce a s mismo como Me), se cierra el formulario. 14. Guarde todos los cambios realizados en su solucin e inicie la depuracin (oprima la tecla F5). Ejecute la aplicacin, escriba en los campos textuales del formulario y seleccione la opcin de men Limpiar Campos. Luego compruebe que al utilizar la opcin de men Cerrar, el formulario se cierra. Con ello habr aprendido cmo enviar comandos a travs del men.
387
Codificacin de Empresas
1 2 3 4 5
Form1.vb - frmEmpresa_Load
Private Sub frmEmpresa_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call LimpiaCampos() End Sub
19. De esta manera, antes de que el formulario se muestre por primera vez, ser ejecutado el procedimiento que iniciar los valores del formulario.
12
388
22. Los nmeros que aparecen en los controles son los ndices de orden, e indican el orden y la profundidad del mismo. De acuerdo con la figura 12.12, el men es el punto de donde parte el orden de tabulacin (0), siguiendo el botn Aceptar (1), luego el botn Cancelar (2) y finalmente el TabControl (3). Como TabControl es contenedor, su contenido tendr un orden 3.x.y.z, donde x es el orden de las pginas, y es el orden de los controles dentro de la pgina, y z sera el orden de los controles dentro de un control contenedor dentro de la pgina. 23. Se recomienda que las etiquetas (Label) sean las primeras en el orden, dado que no reciben el enfoque. Despus debe darse el orden de acuerdo a como se desee el orden de tabulacin. Para modificar el orden slo se requiere hacer clic sobre el control hasta que tenga el ndice de orden que queremos. Al tener activada la herramienta de Tab Order, al posicionar el puntero del ratn sobre el control, aparece un borde sombreado y el puntero cambia a cruz. Al hacer clic en ese momento, el ndice de orden cambia, y cambia el orden del resto de los controles de tal manera que no haya dos iguales.
24. Modifique el orden de tabulacin de tal manera que quede de la siguiente manera:
389
25. Al terminar de colocar el orden deseado, basta hacer clic en el botn Tab Order nuevamente para dar por aceptados los cambios. Se recomienda aplicar el orden de tabulacin cuando ya se est bastante seguro de que no modificar la interfaz.
12
Form1.vb - ActivaAceptar
2 3 4 5 6 7 8 9
Sub ActivaAceptar(ByVal sender As Object, ByVal e As EventArgs) Handles mtbIDEmpresa.LostFocus, txtNombre.LostFocus, txtDireccion.LostFocus, txtNIP.LostFocus, txtNombreCon.LostFocus, mtbTelefono.LostFocus If mtbIDEmpresa.Text = Or txtNombre.Text = _ Or txtDireccion.Text = Or txtNIP.Text = _ Or txtNombreCon.Text = Or mtbTelefono.Text = Then btnAceptar.Enabled = False Else btnAceptar.Enabled = True End If End Sub
390
30. En la lnea 1 del bloque anterior se declara el procedimiento. Despus del nombre del procedimiento (ActivaAceptar) se abren parntesis declarando dos argumentos. Estos argumentos se denominan argumentos implcitos, dado que CLR en tiempo de ejecucin provee los datos a los argumentos sin que el usuario tenga que enviarlos mediante una llamada Call. La mayora de los eventos manejados en .NET requieren de dos argumentos implcitos: sender, que puede ser cualquier tipo de objeto (Object) transferido en modo value type y que hace referencia al objeto desde el cual se desencadena el evento; y e que es de tipo EventArgs (manejador de argumentos de eventos), que tambin es pasado en modo value type. En la misma declaracin del procedimiento se agrega la referencia Handles, que indica qu eventos controlar el procedimiento codificado. En nuestro caso, el procedimiento se ejecutar cuando se cause el evento Control.LostFocus para los objetos mtbIDEmpresa, txtNombre, txtDireccion, txtNIP, txtNombreCon, mtbTelefono. En todo el cdigo no ver un llamado a ejecucin de ActivaAceptar; CLR lo lanzar a ejecucin y ser quien tambin le dir qu objeto es el que provoc, as como los argumentos pertinentes del evento. 31. En la lneas 2 a la 4 se evala si alguno de los objetos no ha sido capturado (Text=), en cuyo caso inhabilita el botn Aceptar. De lo contrario, es decir, si todos tienen valor, el botn Aceptar se habilita. 32. Otra activacin automtica que podemos hacer es que, en la tercera pgina, slo se pueda capturar informacin de URL y ver la pgina en Internet si la casilla de verificacin est marcada. En Form Designer haga doble clic en chkSitio. Se precodificar el procedimiento por omisin aplicable al cuadro de verificacin. Se trata del evento CheckBox.CheckedChanged, que se lanzar cuando se cambie el estado de marcado de la casilla de verificacin. Codifique lo siguiente:
Codificacin de Empresas
1 2 3 4
Form1.vb chkSitio_CheckedChanged
Private Sub chkSitio_CheckedChanged( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkSitio.CheckedChanged txtURL.Enabled = chkSitio.Checked btnVerSitio.Enabled = chkSitio.Checked End Sub
33. Nos aprovechamos de que la propiedad que almacena si la casilla de verificacin est o no marcada es Boolean. Si la casilla de verificacin no est marcada, la propiedad CheckBox.Checked es False, y si est marcada la propiedad CheckBox.Checked es True. Asigne el valor de CheckBox.Checked a las propiedades Control.Enabled de los objetos dependientes: al marcar la casilla de verificacin, los objetos se activarn, y al desmarcarla se inhabilitarn (lneas 2 y 3).
391
34. Guarde todos los cambios realizados en su solucin e inicie la depuracin (oprima la tecla F5). Ejecute la aplicacin y verifique que el botn Aceptar est disponible slo si todos los campos requeridos tienen datos. Verifique que el cuadro de verificacin gobierna la disponibilidad del cuadro de texto en el que se solicita el URL y el botn de ver sitio. FIN DEL EJERCICIO*
Ejercicio 12.5
Uso de controles para la visualizacin de pginas Web
Aprender a utilizar los controles para la visualizacin de contenidos Web desde formularios Windows. 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Contine trabajando con el proyecto Empresa del ejercicio anterior. En Form Designer seleccione tpSitio y haga doble clic en btnVerSitio para editar el procedimiento que ha de ejecutarse al hacer clic en el botn Ver. Codifique lo siguiente:
Codificacin de Empresas
1 2 3
Form1.vb - btnVerSitio_Click
12
Private Sub btnVerSitio_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVerSitio.Click webPagina.Navigate(New Uri(txtURL.Text)) End Sub
4.
5.
La lnea 2 se encarga de ir, en el objeto WebBrowser, a la direccin en Internet que se haya proporcionado en txtURL. La liga no puede proporcionarse de forma textual, y por ello tiene que ser una nueva instancia de la clase WebBrowser.Uri, que permite especificar recursos en Internet. Guarde todos los cambios realizados en su solucin e inicie la depuracin (oprima la tecla F5). Ejecute la aplicacin, active la casilla de verificacin que pregunta si tiene sitio Web, escriba como liga http://www.aprendapracticando.com y haga clic en Ver. La pgina debe aparecer en el formulario.
392
MAPA
393
TERMINOLOGA
AcceptButton, 370 AcceptReturn, 378 Add, 361 BackgroundWorker, 358 Barra de herramientas, 357 BindingNavigator, 358 BindingSource, 358 Bloqueo de controles, 389 Boxing, 361 Button, 355 Call, 385 CancelButton, 370 CharacterCasing, 378 CheckBox, 355 CheckedListBox, 355 Child, 346 Close, 386 Coleccin, 361 ColorDialog, 360 ComboBox, 355 Common Controls, 355 Containers, 357 ContextMenuStrip, 357 Controles, 347 Controles comunes, 355 contenedores, 357 de impression, 359-60 de men, 357 Controls, 362 Count, 361 Cuadros de dilogo, 360 DataGridView, 358 DataSet, 358 DateTimePicker, 355 Default event, 386 Delimitadores de tamao, 372 Dialogs, 360 Directory Searcher, 359 DirectoryEntry, 358 Elemento de menu, 367 Elementos grficos de interfaz, 346 Enabled, 363 Enfoque, 363 Enter, 364 ErrorProvider, 359 Etiqueta de elemento, 368 EventLog, 359 Evento por omisin, 386 FileSystem Watcher, 359 FlowLayoutPanel, 357 Focus, 363 FolderBrowserDialog, 360 FontDialog, 360 For Each, 362 GotFocus, 364 Graphic User Interface, 344 GroupBox, 357 Grupo(s) de controles, 347 de objetos, 372 GUI, 344 Guas de alineacin, 369 de proximidad, 369 HelpProvider, 359 Image, 370 ImageAlign, 371 ImageList, 359 Input Mask, 378 Interfaz de usuario, 344 Interfaz grfica de usuario, 344 Item(s), 361, 381 Label, 356 Leave, 364 Lneas gua, 369 LinkLabel, 356 ListBox, 356 ListView, 356 Load, 386 Lock Controls, 389 LostFocus, 364 Mask, 377 MaskedTextBox, 356 MaxLength, 378 Menu item, 367 Mens, 357 MenuStrip, 357 MenuStrip, 366 MessageQueue, 359 Modo arrastre, 348 insercin, 348 trazo, 348 MonthCalendar, 356 Multiline, 378 NotifyIcon, 356 NumericUpDown, 356 Objeto contenedor, 346 hijo, 346 padre, 346 principal de referencia, 372 OpenFileDialog, 360 PageSetupDialog, 360 Pginas de controles, 375 Panel, 357 Parent, 346 PasswordChar, 378 Performance Counter, 359 PictureBox, 356 Pointer, 355 PrintDialog, 360 PrintDocument, 360 Printing, 359-60 PrintPreview Control, 360
12
394
PrintPreview Dialog, 360 Procedimiento de evento de arranque, 386 Process, 359 ProgressBar, 356 RadioButton, 356 Remove, 361 ReportViewer, 358 RESX, 371
RichTextBox, 356 SaveFileDialog, 360 SerialPort, 359 Service Controller, 359 Smart tag, 376 Snaplines, 369 SplitContainer, 357 StatusStrip, 357 TabControl, 357, 375
TabIndex, 363 TableLayoutPanel, 357 Tareas de objeto, 376 Tecla de atajo, 370 Text, 370 TextBox, 356 Timer, 359 Toolbars, 357 ToolStrip, 358
Container, 358 Designer, 366 ToolTipTitle, 383 ToolTrip, 356 TreeView, 356 Unboxing, 361 Uri, 391 Validated, 364 Validating, 364 Visible, 363 WebBrowser, 356
PREGUNTAS
12.1 Cul es el principal propsito de una interfaz? 12.2 Explique qu son los objetos contenedores y cundo se da una relacin padre-hijo entre objetos. 12.3 Cules son las tres formas de agregar objetos en Form Designer? 12.4 Mencione los pasos que integran la estrategia para el estudio efectivo de controles. 12.5 Qu importancia tiene que los controles deriven de la clase Control y Object? En qu nos beneficia? 12.6 Seleccione 15 controles que considere que utilizar en sus interfases Windows.
395
Notas:
12
396
EXAMEN
CAPTULO
13
397
398
Contenido
Motivos del auge de las aplicaciones Web . . . . . . . . . . . . . . . . . . . . . . . . . . . Requerimientos para el desarrollo de ASP.NET . . . . . . . . . . . . . . . . . . . . . . . Entorno operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herramientas de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Procesamiento de pginas Web en .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caractersticas de ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elementos de una pgina Web ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estructura bsica de una pgina ASP.NET . . . . . . . . . . . . . . . . . . . . . . . Contenido HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloques proveedores de cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Directivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formulario del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controles del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adicin de cdigo a una pgina: Cdigo declarativo . . . . . . . . . . . . . . Controles comunes en aplicaciones Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles estndar (Standard) . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles de datos (Data) . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles de validacin (Validation) . . . . . . . . . . . . . . . . . . . Grupo de controles de navegacin (Navigation) . . . . . . . . . . . . . . . . . Grupo de controles de acceso (Login) . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles HTML (HTML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de una pgina Web ASP.NET, prueba e identificacin de sus elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuraciones iniciales del diseador de pginas Web para las vistas y el posicionamiento de controles . . Adicin de elementos a un sitio Web . . . . . . . . . . . . . . . Establecimiento de valores generales de formulario . . . Revisin del cdigo generado por el servidor . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 400 400 401 402 403 410 410 411 411 412 414 415 417 419 419 421 422 422 423 423 424 425 427 427 437 439 440 441 443
399
El tema de ASP.NET es suficientemente amplio para dedicarle un libro aparte. Dado que es una de las formas ms populares en que se consume cdigo en Visual Basic, este captulo se ocupa del tema desde la perspectiva ms amplia de la programacin orientada a objetos.
13
400
Lo ms interesante de todo es que la comunidad de desarrolladores, a la vez que es proveedora de servicios, se convierte al mismo tiempo en promotora, generando un nicho econmico en el que es mejor estar dentro. Plataformas de desarrollo estandarizadas y disponibles. La nueva plataforma de desarrollo, Microsoft.NET, maximiza el uso de Internet como medio de comunicacin al tiempo que resuelve los problemas inherentes al desarrollo en ambiente Web, facilitando como nunca antes el proceso de desarrollo, y logrando un equilibrio entre simplicidad, consistencia y potencia. El respaldo de Microsoft hacia la tecnologa .NET Framework asegura la mxima penetracin de los productos en las organizaciones, lo cual permite generar un crculo virtuoso entre productos y servicios relacionados (market share). Esto promueve que cada vez ms empresas y desarrolladores la adopten como su plataforma de desarrollo y operacin, lo que gradualmente garantizar el mximo conocimiento sobre la tecnologa, servicios de desarrollo y consultora disponibles, as como precios justos de productos y servicios. Ese fenmeno ya se vivi con Visual Basic. Ahora es el turno de .NET. Antes de adentrarnos en la programacin de ASP.NET, es conveniente analizar de manera breve algunos conceptos de programacin Web.
Entorno operativo
Motor de ejecucin Web. Es el que se encargar de recibir las peticiones de pginas y resolverlas, entrando en contacto con los componentes involucrados por la pgina Web requerida, as como con los componentes de .NET Framework, tales como CLR y BCL. En el caso de una plataforma Microsoft, el motor de ejecucin Web se llama Internet Information Server, conocido tambin como IIS. Para verificar que IIS est disponible en su equipo, trate de desplegar la siguiente pgina:
http://localhost
Con ello deber aparecer la pgina de presentacin de IIS. Se recomienda ampliamente contar con la versin 5.5 o superior.
401
IIS slo est disponible en las versiones Server de Windows (2000, 2003 y posteriores), as como las versiones Professional de los sistemas de escritorio de Windows (XP, 2000, etcetra). No siempre se instala de manera predeterminada, y por ese motivo es necesario verificar la disponibilidad de IIS. En caso de que no lo tenga instalado, proceda a instalarlo; es indispensable. No olvide que deber tener instalado IIS y levantar los servicios Web antes de instalar .NET Framework SDK! Si instala .NET Framework SDK y luego instala y habilita IIS, las aplicaciones ASP.NET no funcionarn, dado que no hay manera que se registre la articulacin entre herramientas. Si ya instal .NET Framework SDK y despus instala IIS, ser necesario que establezca el registro de articulacin con la siguiente instruccin en lnea de comandos:
aspnet_regiis.exe -i
Privilegios de depuracin. Para depurar pginas en ASP.NET es necesario que la cuenta con la que est desarrollando pertenezca al grupo de usuarios de depuracin (Debugger Users). Los trabajos de depuracin sostienen un dilogo intenso con el sistema operativo y es necesario que el desarrollador tenga los permisos necesarios para interactuar con los servicios de monitoreo de problemas del equipo. .NET Framework. Es necesario que el equipo sea capaz de resolver el contenido Web ASP.NET, y para ello es necesario que disponga de .NET Framework instalado, lo que permitir acceder a CLR y BCL. El cdigo ASP.NET es compilado al momento de realizar peticiones a pginas ASP.NET, y los ensamblados que se generan en el proceso son administrados y requieren de CLR para funcionar. Adems, los controles Web del servidor son clases de BCL (que debe estar presente en el entorno operativo del equipo de desarrollo).
Herramientas de desarrollo
Visual Studio. Definitivamente la mejor opcin para el desarrollo profesional de pginas ASP.NET es Visual Studio, que integra facilidades de diseo y depuracin de pginas Web. Aunque no es necesario para el desarrollo de pginas Web ASP.NET, s agiliza enormemente la labor de desarrollo. Visual Web Developer Express Edition. Es un entorno integrado de desarrollo de aplicaciones Web, para uso semiprofesional. Similar a Visual Studio, incluye diseadores y asistentes interesantes, pero es ms limitado respecto de la produccin de software y el trabajo en equipo.
13
402
El hecho de que ASP sea .NET, pone de manifiesto que las pginas activas operan ahora bajo las reglas de funcionamiento de la plataforma .NET. No se trata de mejoras sobre la misma forma de funcionar; esto implica cambios radicales que producen mejoras. En ASP clsico (ASP antes de .NET) las pginas se resolvan de modo interpretado; es decir, cada vez que se solicitaba una pgina ASP al servidor, sta deba ser analizada, interpretada y transformada en cdigo HTML equivalente, el cual finalmente era remitido al cliente. En ASP.NET la forma de ejecucin es distinta, dado que trabaja bajo el modelo peticin - respuesta dinmico orientado a eventos, en donde hay contenidos que se resuelven en el servidor. Adems el cdigo remitido al cliente est preparado para la captura de eventos y la ejecucin automtica de procesos, sin necesidad de que el usuario haga peticiones explcitas. Al hacer la peticin, el servidor se percata de que la pgina requerida es ASP.NET (ASPX); la pgina, que es tratada como un programa, primeramente es procesada por un analizador de cdigo (Parser), que verifica que el programa est bien escrito y que no presente errores de sintaxis o referencias perdidas (uso de variables, procedimientos, o miembros inexistentes). Si el programa no tiene errores de sintaxis o referencias perdidas, el programa es puesto a disposicin del compilador de pginas de .NET Framework; el compilador se encargar de generar un ensamblado de extensin DLL, de nombre nico, que define una clase capaz de generar el cdigo HTML que ha de ser devuelto al navegador del cliente. Este ensamblado se almacena en un rea denominada cach de ensamblados (Assembly Cache), donde se almacenan todos los ensamblados generados por el compilador de pginas. Ya que est generado el ensamblado capaz de producir el contenido Web que ha de ser devuelto al cliente, un elemento denominado HTTP Runtime se encarga de solicitar la ejecucin de la clase generada, para crear la instancia del objeto generador y producir el contenido Web. El contenido Web generado por la clase es almacenado en una rea denominada cach de salida (Output Cache); en ese espacio se almacenan los contenidos HTML, los guiones de ejecucin de parte del cliente e incluso los datos generados como parte de la salida. De ah, el contenido es enviado al cliente solicitante. Si posteriormente se solicita la misma pgina, se buscar primeramente en el cach de salida; si el contenido Web se encuentra todava ah, no se realizar procesamiento alguno, por lo cual la respuesta es extremadamente rpida.
403
En el peor de los casos, si el contenido Web no se encuentra en el cach, se producir la ejecucin de la clase crendose un nuevo contenido Web, lo cual de todas maneras es mucho ms rpido que utilizar cdigo interpretado. FIGURA 13.1 Procesamiento de pginas Web ASP.NET.
Caractersticas de ASP.NET
ASP.NET es la implementacin en plataforma Microsoft para aplicaciones bajo el modelo peticin-respuesta dinmica orientada a eventos. En s se trata de un modelo de servicios necesarios para construir aplicaciones empresariales en plataforma Web. Antes de ASP.NET contbamos con lo que ahora se ha dado en llamar ASP Clsico, que operaba bajo el modelo peticin-respuesta dinmico. Esta tecnologa est perdiendo vigencia rpidamente, ya que ASP.NET es ms potente, sencillo y organizado; en trminos generales, hay ciertas caractersticas de ASP.NET que lo estn convirtiendo rpidamente en el estndar para el desarrollo Web. Las caractersticas particulares ms relevantes de ASP.NET son las siguientes: Aceptacin de varios lenguajes Desempeo mejorado Cdigo compilado Manejo automtico de estado Cdigo separado del diseo (Code Behind)
13
404
Uso de bibliotecas de clase de .NET Framework Controles Web del servidor Independencia del navegador Servicios Web XML Seguridad mejorada Mayor escalabilidad Permite sesiones cookie-less Fcil configuracin Fcil implementacin (Copy Deployment) Personalizacin basada en Web Parts Recursos de personalizacin: Master pages, Skins y Themes
Aceptacin de varios lenguajes. ASP Clsico permita desarrollar en un solo lenguaje llamado cdigo ASP, que era ms bien un subconjunto de Visual Basic. Si usted tena experiencia en algn otro lenguaje, por ejemplo Java o C, de nada le serva. Era necesario que aprendiera cdigo ASP para poder instruir al servidor en cualquier tarea. ASP.NET es la alternativa de desarrollo de aplicaciones Web para la plataforma .NET y por ese motivo posee muchas de las caractersticas que hacen de .NET la plataforma de desarrollo ms fuerte del mercado; una de ellas es que acepta varios lenguajes de .NET, como Visual Basic, C#, JScript .NET y J#, entre muchos otros. No importa qu lenguaje .NET sea el que domine: podr desarrollar procedimientos en cualquier lenguaje .NET aceptado, e integrar la funcionalidad a sus pginas Web. Si es desarrollador de aplicaciones de consola o aplicaciones Windows, no tendr que cambiar de lenguaje por el simple hecho de cambiar de ambiente. Una ventaja adicional es que toda la programacin Web puede hacerse bajo el enfoque orientado a objetos; el desarrollador usa etiquetas para controlar propiedades y desde el cdigo puede manejar eventos y ejecutar mtodos. Desempeo mejorado. En ASP Clsico, los bloques de cdigo de parte del servidor deban ser interpretados y ejecutados cada vez que se invocaba la pgina; la accin de interpretar el cdigo una y otra vez degradaba el desempeo de las aplicaciones. En ASP.NET el cdigo se compila hasta terminar siendo cdigo ejecutable para el servidor. Es interpretado una sola vez y a partir de ah, cada vez que ejecutemos la pgina Web invocaremos la versin interpretada y depurada de la pgina. El hecho de que ya no tengamos que interpretar cdigo de manera recurrente hace que las aplicaciones tengan un mejor desempeo; si adems consideramos que el cdigo compilado es ms rpido que el cdigo interpretado, la ventaja en velocidad es significativa. Cdigo compilado. En ASP Clsico los bloques de cdigo que el servidor resolva terminaban siendo cdigo interpretado; es decir, cada vez que se tena acceso a la pgina ASP,
405
IIS deba interpretar el cdigo, buscar errores de sintaxis, generar el cdigo HTML correspondiente y resolver la pgina. En el caso de ASP.NET, el cdigo se compila en el servidor. La primera vez que acceda a la pgina probablemente tarde un poco, pero a partir de ah el ensamblado que generar el cdigo HTML a remitir al navegador ya estar disponible en un rea de cach. En ese sentido, despus de la primera vez que se entra a una pgina, el servidor ya no resuelve nada, slo ejecuta el programa ya existente. En virtud de que el servidor mantiene el cach, no importa qu usuario haya llamado por primera vez la pgina; la versin compilada del cdigo estar disponible para todos los que la requieran posteriormente. Otra ventaja es que .NET Framework se encarga de realizar las compilaciones y ejecuciones cuando son necesarias de manera automtica; el desarrollador slo requiere intentar cargar la pgina en un navegador. .NET Framework decidir el tratamiento ptimo de la solicitud realizada. Al ejecutar una pgina ASP.NET se genera un ensamblado de extensin DLL que se alojar en el directorio \Bin del sitio, desde donde se consumir su funcionalidad. Manejo automtico del estado. En ASP Clsico mantener el estado de los formularios (Form-state) era un suplicio. Si se queran trasladar datos de una pgina a otra de manera confiable era necesario realizar una labor intensa que consista en declarar objetos ocultos (hidden objects), as como variables de sesin, que generalmente en un momento dado de la ejecucin perdan vigencia y arruinaban todo el proceso. Otra alternativa era manejar los valores mediante cookies; el problema es que con tantos ataques a la privacidad realizados en Internet, inhabilitar la admisin de cookies es una prctica comn. Ese hecho, obviamente, dejaba a la aplicacin sin una funcin completa. En ASP.NET, el estado de formulario se mantiene de manera automtica a travs de un objeto oculto y cifrado; las pginas ya no llaman a otras pginas para hacer un mismo proceso en partes. En lugar de ello, las pginas se mandan llamar a s mismas y realizan el traslado de datos de manera transparente para el usuario. Cdigo separado (Code Behind). En ASP Clsico, los programas eran una verdadera ensalada de tecnologas que confunda a los inexpertos y dificultaba el mantenimiento de los programas a los expertos. En un mismo programa era comn encontrar etiquetas HTML (lenguaje de marcas), llamadas a componentes (objetos COM), bloques de cdigo de parte del cliente codificados en VBScript, bloques de cdigo de parte del cliente codificados en JavaSctipt y bloques de cdigo de parte del servidor (cdigo ASP).
13
406
En ocasiones, los encargados del diseo de las pginas modificaban cdigo ASP o cdigo de los guiones; a su vez, los programadores de procedimientos modificaban la codificacin de diseo, etctera. En resumen, era un caos. Con ASP.NET el cdigo puede estar separado del diseo de la pgina (capacidad llamada Code Behind). En su totalidad, se trata de cdigo de parte del servidor, y las etiquetas HTML se reducen al mnimo. Como producto obtenemos programas ms limpios y estructurados. Tranquilamente se puede encargar a un grupo de diseo que trabaje sobre la forma de la pgina, mientras que los programadores podrn estar desarrollando procedimientos de manera independiente. Como en Visual Studio el cdigo se maneja en modo Code Behind, por cada aplicacin se tendr la pgina Web ASPX, que ser la pgina en donde se encuentren las etiquetas ASP.NET; por otro lado, se tendr un programa de extensin VB o CS (dependiendo el lenguaje que decidamos utilizar), en donde se encontrar la programacin de una clase que provee la funcionalidad de orientacin a eventos de la pgina. Al ejecutarse la pgina, la clase se compilar generando un ensamblado que despus se puede consumir. Uso de BCL. Con ASP Clsico era posible utilizar los componentes registrados en el servidor y, aunque se empleaba una buena cantidad de ellos, este uso era de alguna manera ajena al cdigo ASP y no estaba plenamente integrada. En ASP.NET, en virtud de que codificamos con lenguajes .NET, podemos hacer uso de la biblioteca de clases de .NET Framework, lo que permite agregar funcionalidad sin precedentes a las aplicaciones Web. Como sabe, la biblioteca de clases de .NET Framework posee un gran nmero de clases disponibles para su uso en los programas; aunque probablemente no pueda utilizarlas todas en ambiente Web, la cantidad de elementos que puede utilizar es bastante amplia. Controles Web del Servidor. En ASP Clsico desarrollbamos con Front Page o con Visual InterDev; aunque dichas herramientas posean una caja de herramientas con controles, realmente se trataba de vnculos a generadores de cdigo que implementaban un determinado objeto utilizando cdigo HTML y DHTML. En ASP.NET se tienen verdaderos controles Web de parte del servidor. Al agregar un elemento grfico en Visual Studio se agregan etiquetas que sern resueltas en el servidor y se traducirn en objetos plenamente funcionales de parte del cliente, capaces de percibir eventos y realizar llamadas automticas al servidor. Otra ventaja de los controles Web del servidor es que son objetos de BCL que pueden ser identificados y utilizados de forma programtica. Independencia del navegador. En ASP Clsico terminbamos de codificar las pginas y las probbamos; cuando comprobbamos que todo funcionaba bien hacamos la publicacin. El problema surga cuando el usuario revisaba nuestras aplicaciones en un navegador
407
distinto al que nosotros utilizamos (por ejemplo, Netscape Navigator). La aplicacin perda la esttica y algunos elementos ya no funcionaban. El problema era que la funcionalidad de nuestras aplicaciones dependa del navegador; en un mundo de aplicaciones globales no podemos obligar a nuestros clientes a que tengan tal o cual navegador. Eso hacia necesario indagar qu navegador utilizaba el cliente, a fin de proporcionarle un resultado funcional acorde al mismo. Prcticamente se desarrollaban dos programas para dos diferentes navegadores. En ASP.NET, los controles Web del servidor son capaces de determinar por s mismos qu navegador utiliza el cliente para que el servidor genere el cdigo correspondiente. En otras palabras, las aplicaciones sern independientes de la plataforma que las lea. Servicios Web XML. En ASP Clsico no existan los servicios. Para poder distribuir funcionalidad era necesario desarrollar componentes, registrarlos en el servidor y esperar que no se dieran problemas tcnicos y de permisos para poder utilizarlos en aplicaciones Web desde estaciones remotas. Los componentes son paquetes binarios ejecutables, por lo cual no son afines a los firewalls y los servidores proxy; otro problema adicional: slo funcionan para la misma plataforma operativa, es decir, Windows. En ASP.NET se puede hacer uso de Servicios Web XML, componentes funcionales que pueden ser utilizados mediante peticiones Web y facilitan el intercambio de funcionalidad utilizando Internet como medio. Los Servicios Web XML utilizan protocolos estndar como SOAP (Simple Object Access Protocol) y XML (eXtensible Markup Language) para trabajar, por lo que permiten la interaccin con plataformas operativas distintas a Windows. Seguridad mejorada. De manera predeterminada, el ambiente Web proporciona acceso annimo a los sitios; no obstante ello, es posible que se desee restringir el acceso de alguna manera. En ASP Clsico slo se tena un tipo de seguridad: Autenticacin Windows. Bajo este esquema, el IIS poda ejecutar una validacin de seguridad, dando acceso de acuerdo con el sistema de usuarios y roles de usuarios de Windows. En ASP.NET, adems de la autenticacin Windows, se emplea la autenticacin de formularios, a travs de la cual usted puede restringir el acceso por medio de programacin. ASP.NET tambin proporciona seguridad mediante los servicios de Microsoft Passport, que es un servicio centralizado de autenticacin brindado por Microsoft. Adems, ASP.NET cuenta con un nuevo mecanismo, denominado membresa ASP.NET (ASP.NET membership), que es una funcionalidad interconstruida de ASP.NET que permi-
13
408
te crear y administrar un esquema de control de usuarios y puede ser utilizada a travs de controles de Login disponibles en Toolbox. Si se implementa el esquema basado en membresa ASP.NET, llevar a cabo las labores de registro de usuarios y cambios de contrasea, entre otras, ser tan sencillo como arrastrar y colocar. Mayor escalabilidad. En ASP Clsico los estados de las sesiones eran mantenidos en el mismo servidor en donde se encontraba el motor de ejecucin Web (IIS); esto provocaba que para poder utilizar informacin relativa a las sesiones era necesario invocarla en el mismo servidor. En caso de que se presentara un incremento en el trfico de transacciones, la nica opcin para manejarlas era incrementar la capacidad del servidor. Una de las consecuencias de esta situacin era la potencial sobrecarga del servidor, debido a que el procesamiento y el estado de sesiones no se podan distribuir. En ASP.NET el estado de las sesiones puede ser mantenido en un proceso separado, en una mquina o base de datos aparte, lo que permite la existencia de una sesin con servidores combinados (cross-server session). La ventaja de esto es que se pueden conectar servidores adicionales para absorber los incrementos de trfico de transacciones. Sesiones cookie-less. Algunas ocasiones, en ASP Clsico se desarrollaban aplicaciones que hacan uso de cookies; el problema sobrevena cuando el usuario inhabilitaba la capacidad de su navegador de admitirlas, en cuyo caso las aplicaciones dejaban de funcionar normalmente. Con ASP.NET es posible mantener el estado de las sesiones incluso si la capacidad del navegador para manejar Cookies est inhabilitada. A este funcionamiento se le ha dado el nombre de cookie-less. ASP.NET maneja de manera cifrada la informacin que se manejara a travs de Cookies (SessionID), trasladando los valores por medio del URL (Uniform Resource Locator). Fcil configuracin. Con ASP Clsico la configuracin de las aplicaciones era un poco oscura; era necesario conocer bien el ambiente de la aplicacin y Visual InterDev. Con ASP.NET la configuracin se mantiene en un archivo textual XML, llamado Web.config, que es entendible si se lo quiere leer. Fcil implementacin (Copy Deployment). Con ASP Clsico copiar una aplicacin Web a otro servidor requera precisin. Las razones eran simples: los archivos del sitio se encontraban en la carpeta del sitio, las libreras se encontraban en la carpeta \SYSTEM del sistema operativo, y se encontraban registradas en el Registro de Windows del equipo origen. Para migrar una aplicacin haba que estar seguro de copiar la carpeta de la aplicacin y adems verificar que todas las libreras de un equipo estuvieran debidamente copiadas y registradas en el equipo destino. Lo peor de todo, si la aplicacin requera una librera que
409
no estaba registrada en el servidor destino, era necesario dar de baja el servidor Web para poder integrar la nueva librera; este escenario es el peor de todos para las aplicaciones que requieren la mxima disponibilidad. Con ASP.NET todos los archivos que una aplicacin necesita se encuentran en la carpeta del sitio. Para copiar un sitio a otro servidor basta con copiar la carpeta del sitio en su totalidad. A este tipo de implementacin se le ha dado el nombre de Copy Deployment. Recursos de personalizacin: Master pages, Skins y Themes. En ASP.NET se pueden utilizar recursos adicionales para la personalizacin y estandarizacin de los sitios desarrollados. Las pginas maestras (master pages) son pginas generales que definen la apariencia, el comportamiento y el enfoque del sitio en general. Las variaciones se manejan a travs de pginas de contenido (content pages). Para definir este tipo de pginas es necesario crear una pgina de extensin .master que contendr una apariencia predefinida (layout) compuesta en HTML y controles Web del servidor; esta pgina contendr, en lugar de directivas @ Page, una directiva @ Master. Una pgina maestra puede tener dos o ms controles delimitadores de contenido (ContentPlaceHolder), que no son otra cosa que regiones en la pgina Web en donde se pueden integrar elementos de contenido. Las pginas de contenido dispondrn de la directiva @ Page, en donde el argumento MasterPageFile permite el enlace con la pgina maestra; en la pgina de contenido se agregan controles de contenido que permiten especificar el ContentPlaceHolder en donde el contenido ha de integrarse. En tiempo de ejecucin, las pginas maestra y de contenido se enlazan para producir un resultado coherente y estandarizado. Las pginas de apariencia (skins) son archivos con extensin .skin que definen las propiedades de apariencia para las pginas ASP.NET; junto con las pginas de cascadas de estilos (.CSS) determinan el look de las pginas Web. Se definen escribiendo una pgina con los controles Web del servidor a los que se les desea establecer propiedades de apariencia predeterminadas junto con las propiedades que se desea establecer como predeterminadas. No se especifica la propiedad Id, dado que no se utilizarn ms que como referencia para indicar a ASP.NET que aplique determinados valores en sus propiedades de apariencia a un determinado tipo de controles. Los temas (themes) son conjuntos de recursos adicionales, como imgenes, cdigo de parte del cliente (scripting) y sonido, que se pueden integrar a un sitio Web para darle mayor calidad. Personalizacin de la interfaz: Web Parts. En ASP.NET es posible dividir el contenido de una pgina en partes autnomas, denominadas Web Parts, que el usuario puede personalizar. Con base en las Web parts es posible reubicar contenido en la pgina, ocultar o mostrar partes, e incluso modificarlas dinmicamente respecto de su contenido.
13
410
A medida que introducimos elementos en el rea de encabezado y el cuerpo de la pgina (que sern resueltos en el servidor), la pgina comienza a ponerse interesante. En una pgina ASPX podemos incluir lo siguiente: Contenido HTML Bloques proveedores de cdigo Directivas Formulario del servidor Controles del servidor Controles Web (Web Controls) Controles HTML (HTML Controls) Controles de validacin (Input Validation Controls) Rich Controls Cdigo declarativo
411
Contenido HTML
Las pginas ASP.NET tienen las capacidades anteriores de ASP Clsico; en ese sentido, siguen aceptando contenido HTML . Tan es as que la pgina bsica contiene las etiquetas de estructura bsicas HTML. Una diferencia importante es que las pginas ASP.NET son rigurosas en el manejo de etiquetas, pues cuidan que cada una de ellas se abra y cierre debidamente, adems de que su sintaxis sea correcta en estricto sentido. Anteriormente, las pginas equivocadas simplemente no funcionaban como deban; en ASP.NET, no slo no funcionarn, sino que marcarn error. Por contenido HTML nos referimos a etiquetas HTML, manejo de estilos, bloques de cdigo de parte del cliente, declaracin de objetos COM, etctera. Esto implica que sus pginas funcionarn como funcionaban antes. En caso de que utilicen componentes COM, stos no necesariamente tendrn que ser codificados y compilados en su forma equivalente para .NET. En ese sentido, la inversin realizada en componentes y codificacin se mantiene.
13
En este ejemplo, el servidor dar un saludo (Buenos das, Buenas tardes, Buenas noches), considerando la fecha y hora del servidor (no la fecha y hora de parte del cliente). Todo este cdigo deriva en el saludo apropiado segn la hora del servidor.
412
NOTA
Tanto el contenido HTML como los bloques proveedores de cdigo se mantienen por compatibilidad con los desarrollos pasados. En ASP.NET es deseable utilizarlos lo menos posible, a fin de darle mayor simplicidad y funcionalidad a los desarrollos.
Directivas
Las directivas son especificaciones de valores que utiliza la pgina y los compiladores de controles de usuario al procesar pginas Web en ASP.NET. Para declararlas se utiliza la siguiente sintaxis, que se coloca al inicio de la pgina Web:
<%@ NombreDirectiva [ Atributos ] %>
Donde NombreDirectiva es el nombre de la directiva que se desea incluir y Atributos son los atributos y sus valores, expresados en pares igualados (propiedad = valor); los atributos se separan entre s por espacios en blanco. Las directivas ms importantes son las siguientes: @Page. Define atributos especficos de pgina utilizados por el analizador sintctico y el compilador de pginas ASP.NET. Puede incluirse slo en archivos .ASPX (formularios Web de ASP.NET). @Control. Define atributos especficos de control utilizados por el analizador sintctico y el compilador de pginas ASP.NET. Slo puede incluirse en archivos .ASCX (controles de usuario de ASP.NET). @Assembly. Vincula un ensamblado de forma declarativa con la pgina o el control de usuario actual. @Implements. Indica de forma declarativa que una pgina o un control de usuario implementa una interfaz .NET Framework especificada. @Import. Importa explcitamente un espacio de nombres en una pgina o un control de usuario. @OutputCache. Controla de forma declarativa la normativa de cach de resultados de una pgina o control de usuario. @Reference. Vincula de forma declarativa una pgina o un control de usuario a la pgina o control de usuario actual. @Register. Asocia alias a nombres de espacios de nombres y clases, que permiten la representacin de controles de usuario y controles de servidor personalizados cuando se incluyen en una pgina o un control de usuario solicitados.
413
Una de las directivas de ms tilidad es la directiva @Page. Algunos atributos importantes de esta directiva son los siguientes. AutoEventWireUp. (Boolean). Indica si los eventos de la pgina estn interconectados de manera automtica (True indica que la conexin est habilitada). Los eventos producidos por los controles Web trabajan de manera diferente a los eventos en los formularios de cliente tradicionales o en aplicaciones Web basadas en cliente. La diferencia se basa principalmente en la separacin existente entre el propio evento y el lugar donde ste se controla. En las aplicaciones basadas en cliente (Windows o ASP Clsico), los eventos se producen y controlan en el cliente; en las pginas ASP.NET, los eventos se producen en el cliente, pero son controlados en el servidor. Buffer. (Boolean). Determina si el bfer de respuestas HTTP est habilitado. CodeBehind. (String). Especifica el nombre del archivo que contiene el cdigo asociado a la pgina. Este cdigo ser un programa que contendr una clase que le dar comportamiento a la pgina Web; de esta forma puede separarse el cdigo de la interfaz. El diseador de formularios de Visual Studio .NET usa este atributo al desarrollar una pgina Web utilizando dicha herramienta. CompilerOptions. (String). Cadena que contiene opciones del compilador para compilar la pgina; se trata de la secuencia de modificadores que utilizaramos al compilar desde lnea de comandos. Debug. (Boolean). Indica si la pgina se debe compilar con smbolos de depuracin o no. En ocasiones slo se obtiene informacin relevante a los errores aplicando este atributo. Por omisin tiene el valor False. EnableViewState. (Boolean). Indica si se mantiene el estado entre solicitudes de pgina de manera automtica. Si el valor es True, el estado entre las pginas se manejar a travs del objeto oculto _VIEWSTATE. ErrorPage. (String). Define una direccin URL de destino para la redireccin cuando se produce una excepcin de pgina no controlada. Inherits. (String). Define la clase de cdigo en segundo plano que hereda la pgina. sta puede ser cualquier clase derivada de la clase Page. Language. (String). Especifica el lenguaje utilizado cuando se compilan todos los bloques de procesamiento en lnea (<% %> y <%= %>) y de declaraciones de cdigo dentro de la pgina. Los valores pueden representar cualquier lenguaje compatible con .NET, incluidos Visual Basic (vb), C# (C#) o JScript .NET. Otra de las directivas tiles es la directiva @Import, que permite importar espacios de nombres para nuestras pginas. Veamos ejemplos del uso de @Page y @Import.
13
414
Para determinar a Visual Basic como el lenguaje para la codificacin de cdigo declarativo:
<%@ Page Language=vb %>
Para importar el espacio de nombres que se requiere para trabajar con datos:
<%@ Import Namespace=System.Data %>
Ya que contamos con un formulario del servidor, podemos colocar diversos objetos dentro de l. Un formulario del servidor permitir especificar controles Web del servidor, de tal manera que puedan ser procesados por .NET Framework en el servidor. A una pgina de extensin ASPX que contiene un formulario del servidor dentro del cual se definen diversos controles del servidor, se le conoce como Web Form.
415
13
Seleccin del control. Se deber abrir la etiqueta normal. En el caso de los controles Web y los controles de validacin, deber agregarse la especificacin asp:; de esta
416
Web.UI.WebControls.
forma, el analizador de la pgina asociar la etiqueta con el espacio de nombre System. Posteriormente se agrega el nombre del control del servidor que se desea utilizar. En el ejemplo, NombreControl es el nombre del control del servidor que se desea invocar. Es necesario especificar qu control del servidor es el que queremos que el servidor resuelva. Identidad del objeto. Se deber identificar a cada uno de los controles, a fin de que sean utilizables de manera programtica; esto se logra a travs de la propiedad Id, a la cual se le asigna un nombre vlido de objeto (NombreObjeto). No se admiten espacios en blanco y caracteres especiales; por regla general, inicie los nombres con una letra o un guin bajo. Propiedades. Se podrn asignar a un control del servidor diversas propiedades (propiedades), colocando el nombre de la propiedad y su valor, en pares igualados (propiedad = valor); las propiedades se separarn entre s por espacios en blanco. Referencia de ejecucin en el servidor. Es muy importante que al final se incluya la referencia runat=server, ya que de otra manera el servidor no se dar por enterado de la existencia de la etiqueta, tratar de resolverla de parte del cliente, sin ningn efecto. Cerrado de la etiqueta. Se puede cerrar la etiqueta de un control del servidor aplicando el cerrado estilo XML (/>), en el caso de los controles Web y de los controles de validacin, y utilizando cerrado tipo HTML (>) en el caso de los controles HTML, siempre y cuando la etiqueta no vaya seguida por contenido. Para aquellas etiquetas que afectan un contenido determinado, es decir, que tienen una etiqueta de inicio y una etiqueta de conclusin, y donde todo lo que est entre ambas se ve afectado por ellas, se deber aplicar el cerrado estilo HTML (</etiqueta>).
Slo siguiendo la sintaxis correcta las etiquetas sern reconocidas como controles. El siguiente ejemplo muestra cmo sera utilizar un control Web para la creacin de un cuadro de texto:
asp:TextBox id=Entrada runat=server />
Integracin de un control HTML (HTML Control). Integrar un control HTML del servidor es muy similar a integrar una etiqueta HTML; la nica variacin es que debe agregarse la especificacin runat=server dentro de la etiqueta. Se agrega dicha especificacin para garantizar que el servidor IIS, en conjunto con .NET Framework, se encargue de producir el equivalente HTML funcional para todos los navegadores. Si desarrolla ASP.NET y prueba usando Internet Explorer no notar beneficio, pero si desea que sus aplicaciones sean globales y funcionales en muchos navegadores, el uso de controles HTML es casi obligado.
417
El siguiente ejemplo muestra cmo sera utilizar un control HTML para la creacin de un vnculo (Link/Anchor):
<a id=MiLiga href=http://www.aprendapracticando.com runat=server> Ir al sitio Aprenda Practicando </a>
Esta liga generara un vnculo especfico hacia la pgina determinada para el navegador que hizo la peticin.
Integrando un control de validacin (Input Validation Control). Un control de validacin es un tipo especializado de control Web; la diferencia con un control Web es que los de validacin siempre se subordinan a un control Web definido previamente. Un control de validacin generalmente cuenta con una propiedad llamada ControlToValidate, que contiene el nombre del control que es validado a travs del control de validacin.
Este tipo de control provoca la generacin de etiquetas HTML y scripts en JScript y VBScript, que se encargarn de garantizar, de parte del cliente, que la entrada de datos sea vlida. El siguiente ejemplo muestra cmo se generara un control de validacin, que no permitiera omitir el valor del objeto al que llamamos Entrada:
<asp:TextBox ID=txtEntrada Runat=server /> <asp:RequiredFieldValidator ID=ValidadorTexto ControlToValidate=txtEntrada ErrorMessage=No se puede omitir el dato Display=dynamic Runat=server/>
13
418
Las pginas no siempre funcionan con cdigo separado. En este caso, los bloques de cdigo estn inmersos en la misma pgina Web. En ASP.NET el ideal es que los procedimientos estn claramente diferenciados, a fin de que el cdigo no pase de porciones ejecutadas por el cliente a porciones ejecutadas por el servidor. Se le llama cdigo declarativo al cdigo que se declara en una pgina ASP.NET definiendo scripts que se ejecutan de parte del servidor. Los scripts se definen en el rea de encabezado de la pgina, utilizando para ello la etiqueta script, que ser interpretada y ejecutada de parte del servidor; dentro del script podrn definirse procedimientos en el lenguaje que se haya seleccionado (VB.NET o C#, por ejemplo). La sintaxis para definir cdigo declarativo es la siguiente:
<Script runat=server> </Script>
La forma de los procedimientos de cdigo declarativo depender de los controles Web que se estn utilizando. Generalmente, la estructura de los procedimientos ser muy similar a la que tienen los procedimientos de eventos en Visual Basic (Sub End Sub); los argumentos implcitos corresponden generalmente al objeto que produce el evento (sender As Object), as como a un manejador de eventos (e As EventArgs). Obviamente, dependiendo del objeto y el evento que se provoca el manejador de eventos puede cambiar. ste sera un ejemplo tpico de un procedimiento de cdigo declarativo, que ocurre al hacer clic (evento Click) en un botn:
Sub Aceptar_Click(sender As Object, e As EventArgs) Cdigo a ejecutar End Sub
En la mayora de los casos es necesario especificar qu procedimiento es el que se utilizar para manejar un determinado evento; esto se realiza generalmente utilizando las propiedades On...; en el caso de nuestro ejemplo, como se est capturando el evento Click, se utilizara una propiedad llamada OnClick en la definicin del objeto que provoca el evento.
<asp:Button ID=Aceptar OnClick=Aceptar_Click Text=Haz clic Runat=server />
419
Representa una etiqueta para el mostrado de datos. Representa un cuadro de texto para introduccin de datos. Representa un botn de comando que ejecuta un procedimiento. Representa un botn con estilo de vnculo. Representa una imagen que ejecuta un procedimiento al hacer clic en ella. Representa un vnculo hacia un recurso Web. Representa un cuadro combinado para la seleccin de opciones. Representa una lista de opciones de seleccin. Representa una casilla de verificacin. Representa una lista de opciones en donde cada una de ellas es una casilla de verificacin. Representa un botn de opcin. Representa una lista de botones de opcin. Representa una imagen.
TextBox
Button
LinkButton
ImageButton
HyperLink
DropDownList
ListBox
13
CheckBox CheckBoxList
420
ImageMap
Representa una imagen con regiones sensibles. Representa una tabla de contenido (filas/columnas). Representa una lista de vietas. Representa un campo oculto. Representa un espacio esttico para texto en una pgina. Representa un calendario de seleccin dinmica de fecha. Representa un control para el desplegado aleatorio de contenido (publicidad en banners). Representa un cuadro de texto y un botn que permiten cargar un archivo al servidor. Representa controles de navegacin entre varias pginas. Representa un documento XML. Representa un contenedor de objetos View. Representa un contenedor de controles Web. Representa un almacn de controles que pueden ser integrados de forma dinmica a una interfaz. Representa un contenedor de controles Web que forman parte de un contenedor MultiView. Representa una seccin de la pgina cuyo contenido puede ser reemplazado dinmicamente. Representa un espacio reservado para desplegar texto esttico.
Table
Calendar
AdRotator
FileUpload
Wizard
Xml MultiView
Panel
PlaceHolder
View
Substitution
Localize
421
Representa una rejilla de datos, donde mediante un patrn bidimensional lnea-columna, se representa el contenido de un origen de datos. Representa un control enlazado de datos (data bound control) que despliega los elementos con base en una plantilla. Representa los valores de un solo registro, tomado de un origen de datos. Representa los valores de un solo registro, tomado de un origen de datos, atendiendo a una plantilla definida por el usuario. Este objeto permite la adicin, borrado o edicin de registros. Representa un control enlazado de datos que permite dar un formato basado en plantillas a cada elemento del conjunto de registros proporcionados por el origen. Representa una conexin de enlace para bases en SQL Server. Representa una conexin de enlace para bases en Access. Representa un objeto de negocios que provee los datos a los controles enlazados, en una aplicacin multicapa. Representa un origen de datos XML para controles enlazados. Representa un origen de datos til para el enlazado con los datos de la estructura jerrquica de un mapa de sitio.
DataList
DetailsView
FormView
Repeater
SqlDataSource
AccessDataSource
13
ObjectDataSource
XmlDataSource
SiteMapDataSource
422
Representa un validador para la no omisin de un dato. Representa un validador que comprueba que un valor se encuentre dentro de un intervalo. Representa un validador que comprueba que un valor obedezca a una mscara de expresin regular. Representa un validador que verifica un valor comparativamente con otro valor o con un tipo de dato. Representa un validador persona lizado que acta tanto de parte del cliente como del servidor. Representa un resumen de los resultados de las validaciones de una interfaz.
RangeValidator
Regular ExpressionValidator
CompareValidator
CustomValidator
ValidationSummary
Representa un conjunto de hipervnculos e imgenes que permiten la navegacin entre las pginas del sito, con el mnimo consumo de espacio de trabajo en la pantalla. Representa un men en una pgina Web. Representa un rbol jerrquico de datos.
Menu TreeView
423
Representa una interfaz preconstruida que permite la autenticacin de usuarios. Representa la visualizacin de la informacin de usuarios registrados y usuarios annimos. Representa la interfaz para recuperacin de contrasea, utilizando el correo electrnico proporcionado al momento del registro del usuario. Representa un control informativo que indica el estado de un usuario registrado, proporcionando medios para el ingreso (LogIn) y la salida (LogOut). Representa un control informativo que muestra el nombre del usuario actual. Representa la recoleccin de informacin de usuarios nuevos. Representa la interfaz a travs de la cual los usuarios registrados pueden cambiar su contrasea.
LoginView
PasswordRecovery
LoginStatus
LoginName
CreateUserWizard
ChangePassword
13
Representa una interfaz preconstruida que permite la autenticacin de usuarios. Representa un botn de comando.
Input (Button)
424
Input (Reset)
Representa un botn de comando de tipo Reset. Representa un botn de comando de tipo submit, que provoca una peticin al servidor. Representa un cuadro de texto. Representa un cuadro de texto para seleccin de un archivo. Representa un cuadro de texto con entrada oculta. Representa una casilla de verificacin. Representa un botn de opcin. Representa un control oculto. Representa un cuadro de texto multilnea. Representa una tabla. Representa una imagen. Representa un cuadro combinado. Representa una lnea horizontal. Representa un espacio de contenido que es reservado en el espacio de trabajo.
Input (Submit)
Input (Password) Input (Checkbox) Input (Radio) Input (Hidden) Textarea Table Image Select Horizontal Rule Div
Ejercicio 13.1
Creacin de una pgina Web ASP.NET, prueba e identificacin de sus elementos Desarrollar una aplicacin Web que solicita datos generales de los usuarios de un servicio en Internet. Se pregunta el nombre de una persona, su correo electrnico y su edad. La edad deber estar entre 0 y 100 aos. Tambin preguntar la fecha en que utiliz el sistema por primera vez. Los datos no pueden omitirse, el correo electrnico debe tener un formato de correo electrnico, y debido a que el negocio habra iniciado el 1 de enero de 2002, y ade-
425
ms estuvo sin operar todo el 2004, las fechas en que se utiliz el sistema por primera vez debe estar dentro de rangos vlidos. En caso de errores, se debe mostrar un resumen de errores encontrados en la pgina que deber aparecer en un cuadro de dilogo. 1. Abra la solucin Ejercicios, que debe encontrarse en (archivo de extensin sln).
C:\APVBNETVS\Ejercicios
Configuraciones iniciales del diseador de pginas Web para las vistas y el posicionamiento de controles
2. El diseador de pginas Web (HTML Designer, tambin llamado Web Forms Designer) tiene dos vistas de trabajo: vista de cdigo fuente (source view) y vista de diseo (design view). En vista source se puede desarrollar una pgina manipulando directamente las etiquetas de controles de ASP.NET; la vista design, por su parte, permite trabajar en un ambiente visual con las pginas. Generalmente es ms sencillo trabajar en vista design, pero ser frecuente que tengamos que alternar entre una y otra. La forma de alternar entre una y otra es a travs de la barra de trabajo que aparece en la parte inferior de HTML Designer, en la cual aparecen botones de seleccin de vistas y las etiquetas en las que nos encontremos trabajando.
3.
4.
Podemos predeterminar la vista en que queremos que inicie HTML Designer cada vez que abrimos una pgina Web. Seleccione la opcin de men Tools Options, el nodo HTML Designer, y en Start pages in, seleccione el botn de opcin Design view. Con ello, cada nueva pgina que abramos mostrar inicialmente la vista de diseo.
13
426
5.
6.
En vista de diseo, se entiende por posicionamiento de controles a la forma en que los controles adquieren una posicin fsica en la interfaz para mostrarse en tiempo de ejecucin. Los controles pueden posicionarse de diferentes maneras: posicin absoluta, si la posicin en la interfaz no cambia dependiendo del contenido, dado que se establecen las propiedades HTML z-index, left y top respecto del elemento contenedor; posicin relativa, es similar a la posicin absoluta, slo que las propiedades left y top se asignan respecto del flujo de la pgina; posicin esttica, si el control se coloca de acuerdo con el flujo de la pgina; y no posicionado, si no se especifican atributos y la posicin se determina por los atributos por omisin correspondientes al elemento en cuestin. Dar a los controles posicin absoluta es lo ms parecido a trabajar en ambiente de interfaz Windows, aunque no se recomienda cuando hay objetos de dimensin variable, como podran ser campos con enlazado de datos. Para las interfaces que contienen objetos con dimensin dinmica, recomendamos el posicionamiento relativo, que por una parte permite el acomodo a discrecin en tiempo de diseo, pero en tiempo de ejecucin ajusta las posiciones para que los objetos no se empalmen unos con otros y mantengan la distancia original entre ellos. Podemos predeterminar el posicionamiento de los controles en HTML Designer. Seleccione la opcin de men Tools Options, el nodo HTML Designer CSS Positioning, marque la casilla de verificacin Change positioning to the following for controls added using the Toolbox, paste or drag and drop, y en el cuadro combinado seleccione Absolutely positioning. Con ello, cada nuevo control integrado a la interfaz quedar posicionado de forma absoluta. Esto es muy conveniente para el tipo de interfaz que deseamos desarrollar, puesto que no tiene objetos de longitud variable.
427
8.
Con ello se habr generado una nueva pgina Web ASPX en el proyecto. En Server Explorer seleccione el nodo que acaba de agregar (Usuario.aspx), invoque el men de contexto y seleccione la opcin Set As Start Page, para obligar a que la nueva pgina sea la pgina de arranque del proyecto.
13
428
NOTA
Por cuestin de notacin, cuando hacemos referencia a Clase.Miembro, por ejemplo Form.Name, nos referimos al miembro de la clase; la explicacin ser vlida para todas las instancias que se generen de dicha clase. En caso de que un miembro sea aplicable a todos los objetos que se deriven de una misma clase base, se colocar la referencia de la clase base pertinente; por ejemplo, BaseValidator.Display. Cuando hagamos referencia a Instancia.Miembro, por ejemplo txtNombre.MaxLength, especificaremos valores y condiciones aplicables a un objeto en particular. En la mayora de los casos los controles pertenecen a Web.UI.WebControls.
10.
429
Propiedad Label1.Text Textbox1.ID txtNombre.MaxLength txtNombre.ToolTip RequiredFieldValidator1.ControlToValidate RequiredFieldValidator1.Display RequiredFieldValidator1.ErrorMessage RequiredFieldValidator1.Text Label2.Text TextBox2.ID txtCorreo.MaxLength txtCorreo.ToolTip RequiredFieldValidator2.ControlToValidate RequiredFieldValidator2.Display RequiredFieldValidator2.ErrorMessage RequiredFieldValidator2.Text RegularExpressionValidator1.ControlToValidate RegularExpressionValidator1.Display RegularExpressionValidator1.ErrorMessage
Valor a asignar
Nombre: txtNombre 40 Capture aqu su nombre txtNombre Dynamic El nombre no debe omitirse * Correo: txtCorreo 40 Capture aqu su correo electrnico txtCorreo Dynamic El correo no puede omitirse * txtCorreo Dynamic Formato de correo electrnico incorrecto. *
RegularExpressionValidator1.Text RegularExpressionValidator1.ValidationExpression
13
430
Se incluir la expresin siguiente, que representa una direccin de correo electrnico en Internet: \w+([-+.]\w+)*@\w+([.]\w+)*\.\w+([-.]\w+)*
Label3.Text TextBox3.ID txtEdad.MaxLength txtEdad.ToolTip RequiredFieldValidator3.ControlToValidate RequiredFieldValidator3.Display RequiredFieldValidator3.ErrorMessage RequiredFieldValidator3.Text RangeValidator1.ControlToValidate RangeValidator1.Display RangeValidator1.ErrorMessage
Edad: txtEdad 3 Capture su edad (0 a 100) txtEdad Dynamic La edad no puede omitirse * txtEdad Dynamic La edad no est dentro del rango permitido 100 0 * Integer txtEdad Dynamic La edad debe ser un nmero entero DataTypeCheck * Integer Inicio: txtInicio txtInicio Dynamic La fecha de inicio de servicios no debe omitirse
RangeValidator1.MaximumValue RangeValidator1.MinimumValue RangeValidator1.Text RangeValidator1.Type CompareValidator1.ControlToValidate CompareValidator1.Display CompareValidator1.ErrorMessage CompareValidator1.Operator CompareValidator1.Text CompareValidator1.Type Label4.Text TextBox4.ID RequiredFieldValidator4.ControlToValidate RequiredFieldValidator4.Display RequiredFieldValidator4.ErrorMessage
431
RequiredFieldValidator4.Text CustomValidator1.ControlToValidate CustomValidator1.Display CustomValidator1.ErrorMessage CustomValidator1.Text Calendar1.ID Button1.ID btnAceptar.Text Hyperlink1.NavigateURL Hyperlink1.Text ValidationSummary1.DisplayMode ValidationSummary1.ShowMessageBox ValidationSummary1.ShowSummary
* txtInicio Dynamic La fecha de inicio de uso es incorrecta * calInicio btnAceptar Aceptar datos http://www.aprendapracticando.com Ir al sitio de Aprenda Practicando BulletList True False
11. Realice los reacomodos necesarios para que la interfaz luzca de la siguiente manera:
13
432
Codificacin de Usuario.aspx.vb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Partial Class Usuario Inherits System.Web.UI.Page
CustomValidator1_ServerValidate
Protected Sub CustomValidator1_ServerValidate( ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate If Year(args.Value) < 2002 Or Year(args.Value) = 2004 Then args.IsValid = False Else args.IsValid = True End If End Sub End Class
13. Observe cmo en la pestaa se hace referencia al programa Usuario.aspx.vb; en s es un programa en Visual Basic, independiente de la pgina Web ASPX. Al hecho de que el cdigo no est en la misma pgina se le conoce como code behind. Tener el cdigo separado del diseo es muy til, sobre todo para evitar la modificacin involuntaria de trabajo entre diseadores y codificadores. Vea cmo Visual Studio le asigna el mismo nombre que la pgina y le agrega la extensin VB. Al momento de cargar la pgina la primera vez, el programa VB se compila formando un DLL que deber colocarse en el directorio \BIN de la aplicacin cuando se instale en ambientes de produccin; este directorio es especial, dado que por omisin IIS realiza la bsqueda de componentes y controles en l, sin necesidad de hacer referencias explcitas en el proyecto. La pgina permanece sin cambios, mientras que el cdigo queda oculto. 14. Estando en Text Editor, en el cuadro combinado de objetos seleccione calInicio, y en el de miembros seleccione SelectionChanged, con el fin de que se precodifique el procedimiento de evento que ha de ocurrir cuando se seleccione una fecha en el calendario.
433
Codificacin de PrimeraPagina.aspx.vb
1 2 3 4
calInicio_SelectedDate
Protected Sub calInicio_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles calInicio.SelectionChanged txtInicio.Text = calInicio.SelectedDate End Sub
15. En el procedimiento asignar al control txtInicio la fecha que se seleccione en calInicio. Esto permite la validacin del control, dado que Calendar no puede validarse directamente. Ejecucin guiada de PrimeraPagina.aspx 16. La propiedad WebControl.Id de los controles Web es el equivalente a la propiedad Name de los controles para Windows Forms, y sirve para identificar los controles; cambiar el Id de los controles es especialmente til si se van a utilizar programticamente. 17. El control tpico de captura de informacin es TextBox, pues permite ingresar un valor de tipo String que puede ser convertido en cualquier otro tipo de dato. La propiedad TextBox.MaxLength permite limitar el nmero de caracteres que ha de admitir un cuadro de texto, independientemente del tamao del control en la pantalla. La propiedad TextBox.ToolTip permite asignar una ayuda textual fugaz para los objetos, que aparecer en tiempo de ejecucin al colocar el puntero del ratn sobre el control. 18. Los controles de validacin son especialmente tiles dado que verifican que los datos de entrada sean correctos antes de realizar funciones de procesamiento en el servidor. Los controles de validacin derivan de la clase BaseValidator, que define las principales propiedades comunes para todos los validadores. Fundamentalmente debe especificarse en dichos controles la propiedad BaseValidator.ControlToValidate, que indica qu control ser validado; la propiedad BaseValidator.ErrorMessage permite establecer el texto que ha de mostrarse en el resumen de errores, mientras que BaseValidator.Text permite establecer el mensaje de error que aparece en la interfaz si el control a validar no cumple con los criterios de validacin. En caso de que se asigne BaseValidator.ErrorMessage pero no BaseValidator.Text, el valor de BaseValidator.ErrorMessage ser asignado a BaseValidator.Text de forma automtica. La propiedad BaseValidator.Display de los controles de validacin permite establecer la forma en que se muestran los mensajes de error, que puede ser de forma dinmica (Dynamic), esttica (Static) o no mostrarse (None).
13
434
19. Es importante mencionar que no todos los controles pueden ser validados a travs de los controles de validacin. Una forma sencilla de saber si el control permite validacin es comprobar si la clase posee la propiedad WebControl.CausesValidation; esta propiedad indica si se desea que el control cause validaciones, por lo cual de existir para el control, indica que las admite. Tambin es importante saber que un mismo control puede ser sujeto a varias validaciones al mismo tiempo. 20. En lo particular los controles de validacin tienen diversas propiedades inherentes a la funcin que realizan. Por su simpleza, RequiredFieldValidator es el ms sencillo, ya que realiza la verificacin de si un control tiene contenido en su propiedad de valor. Este validador es el primero que se comprueba, dado que los dems tienen sentido slo cuando el control ya tiene un valor. En caso que RequiredFieldValidator reporte error, las dems validaciones no se realizan. 21. Un control que s tiene sus propiedades particulares es RangeValidator, ya que utiliza la propiedad RangeValidator.MinimumValue para especificar el umbral del rango, y utiliza la propiedad RangeValidator.MaximumValue para especificar el valor ms alto dentro del rango. Es muy importante especificar el tipo de dato sobre el que est basado el rango, dado que de lo contrario se asumir un rango de valores String que puede diferir mucho de un comportamiento numrico, por ejemplo. El tipo de dato a utilizar se especifica utilizando la propiedad RangeValidator.Type. 22. El control CompareValidator por su parte se ocupa de comparar el valor que posee el control a validar respecto de un valor fijo, el valor que tenga otro control, o verificar si el dato de entrada pertenece a un tipo de dato especfico. a) Si se desea la comparacin sobre un valor fijo, ste se debe especificar a travs de la propiedad CompareValidator.ValueToCompare. b) Si la comparacin es con el valor de otro control, ste debe especificarse en la propiedad CompareValidator.ControlToCompare. c) La comparacin a realizar se hace en trminos de un operador de comparacin, representado por la propiedad CompareValidator.Operator y que puede asumir los siguientes valores: Equal (igual), GreaterThan (mayor que), GraterThanEqual (mayor o igual), LessThan (menor que), LessThanEqual (menor o igual), NotEqual (distinto). d) En caso de que la comparacin sea respecto de un tipo de dato (saber si el control a validar posee un valor de un determinado tipo de dato), slo se requiere establecer en CompareValidator.Operator el valor DataTypeCheck, y especificar el tipo que esperamos en la propiedad CompareValidator.Type. 23. En el caso de RegularExpressionValidator, la comparacin se realiza contra una expresin regular. Las expresiones regulares son una notacin estandarizada para la definicin de patrones de coincidencia; en el caso de la implementacin de Microsoft .NET, los patrones guardan mucha semejanza con las reglas definidas en Perl y awk.
435
24.
25.
26.
27.
La herramienta Regular Expression Editor permite simplificar la determinacin de algunos patrones estndar, aunque tambin es posible construir expresiones regulares propias. En el caso de CustomValidator la validacin est determinada por un procedimiento que nosotros codificamos. Este tipo de validacin se utiliza cuando los dems controles de validacin no son suficientes para representar un criterio. En nuestro caso, la fecha de inicio de uso del servicio no puede ser anterior al ao 2002, ni dentro de 2004; como el rango no es continuo, se requiere de programacin para manejarla. Una de las mejores caractersticas de este control de validacin es que adems permite la validacin utilizando procedimientos de parte del cliente, definida a travs de la propiedad CustomValidator.ClientValidationFunction. En el procedimiento de evento de la validacin se puede tener acceso del valor del control a validar mediante la propiedad args.Value del argumento implcito ServerValidateEventHandler.args. Para indicar la existencia de errores, podemos recurrir a la propiedad args.IsValid del argumento implcito ServerValidateEventHandler.args. El cdigo del procedimiento de evento para CustomValidator (CustomValidator1 ServerValidate()) hace lo siguiente: En la lnea 8 se evala si la propiedad de valor del control validado (args.Value) es menor a 2002 o igual a 2004, se considera que el dato no es vlido (args.IsValid=False), o de lo contrario si lo es. La propiedad args. Value asumir el valor de calInicio.DateSelected, dado que es la propiedad de valor del control que se est validando. El cdigo del procedimiento de evento para la seleccin de fecha de Calendar (calInicio_SelectionChanged()) simplemente asigna la propiedad de valor de calInicio a la propiedad de valor de txtInicio. El control ValidationSummary permite mostrar el resumen con todos los errores que contravienen las restricciones marcadas por los controles de validacin de la pgina. Una de las propiedades importantes es la propiedad ValidationSummary.Display-Mode, que puede tener los siguientes valores: BulletList (lista con vietas), List (lista sin vietas), y SingleParagraph (prrafo sencillo). El resumen mostrar en el modo especificado el conjunto de valores de las propiedades BaseValidator.ErrorMessage de todos los controles de validacin que no se hayan cumplido satisfactoriamente; la posicin donde los resultados aparecern es donde el control se haya colocado. Tambin es posible que los errores aparezcan en un cuadro de dilogo y no en la pgina; esta modalidad est disponible si se asigna el valor de True a la propiedad Validation Summary.ShowMessageBox. Para el caso en que no queramos ver en la pgina los errores de manera textual, se puede suprimir la visualizacin colocando la propiedad ValidationSummary.ShowSummary en False. El control Calendar sirve para seleccionar fechas en un ambiente grfico. La propiedad de valor de este control es Calendar.SelectedDate, que es de tipo DateTime. Es posible seleccionar ms de una fecha; para ello se debe establecer un modo de seleccin a travs de la propiedad Calendar.SelectionMode, que puede tener los siguientes valores: Day (da), DayWeek (una fecha o toda una semana), DayWeekMonth (una
13
436
28.
29.
30.
31.
fecha, una semana o un mes), o None (no se puede seleccionar nada). En caso de que se seleccione ms de una fecha, stas son accesibles a travs de la coleccin Calendar.SelectedDates. Por omisin la seleccin es de tipo Day. Finalmente, el control HyperLink establece un vnculo hacia un recurso Web. El texto del vnculo est representado por la propiedad HyperLink.Text, y el vnculo hacia el que se enva el control del navegador se establece en la propiedad HyperLink. NavigateURL. Cuando se involucran controles de validacin en un programa, es posible saber si en la pgina se tuvieron errores. Para ello podemos recurrir a la propiedad Page.IsValid de la pgina, que est representada por el objeto Page. El objeto Button simplemente ejecutar el procedimiento de evento Button.Click cuando se haga clic en l. El texto que aparece en la cara del botn est representado por la propiedad Button.Text. Guarde todos los cambios realizados en su solucin e inicie la depuracin (tecla F5). Para empezar haga clic en el botn sin ingresar datos. Vea cmo aparecen asteriscos rojos (propiedades BaseValidator.Text) al lado de los campos que presentan error. Slo se muestra el correspondiente a la validacin de campos requeridos, dado que no intenta realizar ms validaciones por ausencia de datos. Los mensajes de error (Base Validator.ErrorMessage) aparecern en la ventana de dilogo, como una lista con vietas.
437
32. Introduzca datos vlidos para cada uno de los campos, pero procure causar un solo error a la vez de la siguiente lista, a fin de observar el comportamiento del programa: a) Colocar un correo electrnico que no tiene el formato adecuado (una palabra, por ejemplo). b) Colocar una edad negativa. c) Escribir letras en la edad. d) Seleccionar una fecha del 2004. e) Seleccionar una fecha antes del 2002. Para asegurarse de que la validacin se hace, no olvide hacer clic en el botn. Si vemos la interfaz de usuario quiere decir que .NET Framework en conjunto con IIS ya nos enviaron el cdigo HTML y los bloques de cdigo script correspondientes a los controles Web y los controles de validacin que indicamos en la pgina; esto permite que de parte del cliente se realicen validaciones antes de lanzar la peticin. Si no hay errores de validacin esto provoca una peticin HTTP al servidor.
13
438
35. El cdigo para crear un vnculo que permita ir al sitio de Aprenda Practicando es el siguiente.
<a id=HyperLink1 href=http://www.aprendapracticando.com style= z-index: 118; left: 8px; position: absolute; top: 377px>Ir al sitio de Aprenda Practicando</a>
Sin embargo, slo tuvimos que agregar un control a la interfaz y modificar propiedades en tiempo de diseo. Qu forma de desarrollo preferira? Aunque la programacin directa es en ocasiones necesaria, si programar de forma artesanal no le agrega valor al programa, para qu hacer las cosas difciles? 36. Cierre la aplicacin. FIN DEL EJERCICIO*
439
MAPA
13
440
TERMINOLOGA
.css, 409 .master, 409 .skin, 409 @ Master, 409 @ Page, 409 @Assembly, 412 @Control, 412 @Implements, 412 @Import, 412 @OutputCache, 412 @Page, 412 @Reference, 412 @Register, 412 AccesDataSource, 421 AdRotator, 420 Analizador de cdigo, 402 ASP clsico, 402 ASP.NET, 400 membership, 407 asp:, 415 ASPX, 402 Assembly Cache, 402 Autenticacin de formularios, 407 Windows, 407 AutoEventWireUp, 413 Bloques proveedores de cdigo, 411 Buffer, 413 BulletedList, 420 Button, 419 Cach de ensamblados, 402 de salida, 402 Calendar, 420, 435 Cascadas de estilos, 409 ChangePassword, 423 CheckBox, 419 CheckBoxList, 419 CodeBehind, 406, 413, 417 Cdigo declarativo, 417 separado, 417 CompareValidator, 422, 434 CompilerOptions, 413 Content pages, 409 ContentPlaceHolder, 409 Control(es) de acceso, 423 de datos, 421 de navegacin, 422 de validacin, 415, 422 de validacin, 416 del servidor, 415 HTML 423 Web del Servidor, 406, 415 ControlToValidate, 429 Cookie-less, 408 Cookies, 408 Copy Development, 408 CreateUserWizard, 423 Cross-server session, 408 CustomValidator, 422 CustomValidator, 435 DataList, 421 Debug, 413 Delimitadores de contenido, 409 DetailsView, 421 Directivas, 412 Display, 429 DisplayMode, 431 Div, 424 DropDownList, 419 EnableViewState, 413 ErrorMessage, 429 ErrorPage, 413 Estado de los formularios, 405 Expresiones regulares, 434 eXtensible Markup Language (XML), 407 FileUpload, 420 Form-state, 405 Formulario del servidor, 414 FormView, 421 GridView, 421 HiddenField, 420 Horizontal Rule, 424 HTML, 423 http Runtime, 402 HyperLink, 419 IIS, 400 Image, 419, 424 ImageButton, 419 ImageMap, 420 Inherits, 413 Input Button, 423 Checkbox, 424 File, 424 Hidden, 424 Password, 424 Radio, 424 Reset, 424 Submit, 424 Text, 424 Validation Control, 417 Internet Information Server (IIS), 400 IsValid, 435 Label, 419 Language, 413 LinkButton, 419 ListBox, 419 Literal, 420 Localize, 420 Login, 423 LoginName, 423 LoginStatus, 423 LoginView, 423 Master pages, 404, 409 MasterPageFile, 409 MaximumValue, 430 Membresa ASP.NET, 407 Menu, 422 Microsoft Passport, 407 MinimumValue, 430 Modelo peticinrespuesta dinmico orientado a eventos, 402 Motor de ejecucin Web, 400 MultiView, 420 NavigateURL, 431 Navigation, 422 ObjectDataSource, 421 Operator, 430 Output Cache, 402 Pginas de apariencia, 409 de contenido, 409 maestras, 409 Panel, 420 Parser, 402 PaswordRecovery, 423 PlaceHolder, 420 RadioButton, 419 RadioButtonList, 419
441
RangeValidator, 422, 434 RegularExpression Validator, 422, 434 Repeater, 421 RequiredFieldValidator, 422 RequiredFieldValidator, 434 Rich controls, 415 runat=server, 414 Scripting, 409
Select, 424 Servicios Web XML, 407 Servidores combinados, 408 ShowMessageBox, 431 ShowSummary Simple Object Access Protocol (SOAP), 407 SiteMapDataSource,
421 SiteMapPath, 422 Skins, 404, 409 SOAP, 407 SqlDataSource, 421 Substitution, 420 Table, 420, 424 Temas, 409 Text, 429 Textarea, 424 TextBox, 419 Themes, 404, 409 TreeView, 422
Type, 430 Validation, 422 ValidationExpression, 429 ValidationSummary, 422, 435 View, 420 Web Parts, 404, 409 Wizard, 420 XML, 407 Xml (control), 420 XmlDataSource, 421
PREGUNTAS
13.1 Cules son los motivos que han provocado el auge de las aplicaciones Web? 13.2 Mencione los requerimientos que se tienen para el desarrollo en ASP.NET. 13.3 Enumere las caractersticas de ASP.NET. 13.4 Enumere los elementos de una pgina ASP.NET, y explique para qu sirve cada una. 13.5 Mencione cules son los grupos de controles en las aplicaciones ASP.NET. 13.6 Cuales son los 15 controles que usted cree que utilizar con ms frecuencia?
13
442
Notas:
443
EXAMEN
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
1. Es el modelo de peticin utilizado por ASP.NET a) Modelo de peticin respuesta b) Modelo de peticin respuesta dinmico c) Modelo de peticin respuesta dinmico orientado a eventos 2. Caracterstica que permite separar el cdigo de las etiquetas en ASP.NET a) Code Behind b) Managed code c) Assembly Cache 3. Componentes funcionales que pueden ser utilizados mediante peticiones Web. a) Servicios Web XML b) Web Components c) DHTML 4. Cantidad de esquemas de seguridad que soporta ASP.NET a) 1 b) 2 c) 3 5. Son implementaciones funcionales basadas en etiquetas, a travs de las cuales se obtiene HTML dinmico, sensible a eventos. a) Cdigo declarativo b) Controles Web c) HTML.NET
8. Con ASP.NET se puede indicar que las etiquetas HTML se resuelvan del lado del servidor. 9. 10. Las directivas permiten especificar valores a ser considerados al momento de la compilacin que realiza .NET Framework. Los equipos desde los que se llama una pgina ASP.NET deben tener .NET Framework instalado.
13
CAPTULO
14
445
446
Contenido
Servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funcionalidad antes de los servicios Web XML . . . . . . . . . . . . . . . . . . . Funcionalidad con servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . . . Caractersticas de los servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . Cundo utilizar servicios Web XML? . . . . . . . . . . . . . . . . . . . . . . . . . . UDDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Web Service Discovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Infraestructura de operacin de los Servicios Web . . . . . . . . . . . . . . . . . . . . Elementos para la creacin de un Servicio Web XML . . . . . . . . . . . . . . . . . . Procedimiento de consumo desde el navegador . . . . . . . . . . . . . . . . . Creacin de un Servicio Web XML y demostracin de su uso desde el navegador . . . . . . . . . . . . . . . . . . . . . . . . . . . Creacin de un Servicio Web XML . . . . . . . . . . . . . . . . . Prueba del Servicio Web XML desde el navegador . . . . Consumo programtico de un Servicio Web XML desde una aplicacin Windows . . . . . . . . . . . . . . . . . . . . . . . . . . Estableciemiento de la referencia a un Servicio Web XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Consumo programtico de un Servicio Web XML . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 447 448 448 449 450 451 452 453 454 454 455 455 457 459 460 461 463 464 464 466
447
A medida que los negocios se globalizan, las redes de computadoras se han constituido en un elemento indispensable de las aplicaciones. Las cosas ya no suceden sobre un solo escritorio, sino sobre muchos escritorios dispersos geogrficamente. Conforme pasa el tiempo, el alcance de las redes ha ido variando; hasta hace algunos aos la comunicacin era entre equipos de la misma organizacin, a distancias relativamente manejables. Ahora, las distancias son globales y podemos estar comunicndonos con un equipo que se encuentra en un punto distante del planeta. No slo el alcance de las redes ha cambiado; tambin aquello que viaja por ellas. Al principio, lo que se transmita por las redes eran datos, y la funcionalidad radicaba en un servidor o en clientes especficos funcionando en alguna plataforma determinada. En el nuevo escenario global ya no se puede garantizar que equipos y servidores dispongan de las mismas plataformas operativas; ahora no slo se requiere que los datos viajen, sino que la funcionalidad pueda distribuirse de manera remota, sin importar las plataformas que tengan los equipos. Atendiendo a estas necesidades surgen los servicios Web XML.
14
448
Si la aplicacin requera un funcionamiento distribuido se utilizaba tecnologa DCOM (Distributed Component Object Model), que permita el intercambio de paquetes de datos y la ejecucin remota de componentes sin la necesidad de registrarlos en los equipos clientes. El esquema era bueno, pero tena la limitante de tratarse de tecnologa propietaria que requera una homologacin de plataforma entre el cliente y el servidor. En el nuevo ambiente globalizado, dicha homologacin resulta un problema ya que no podemos obligar a nuestro socio de negocios en otra parte del mundo a utilizar la misma plataforma operativa que nosotros (Windows, por ejemplo). En otras palabras, seguimos necesitando que la funcionalidad de los componentes sea distribuida, pero sin la necesidad de homologacin de plataforma.
realizan las peticiones y proporcionan las respuestas utilizando protocolos estndar de la Web, como HTTP (Hyper Text Transfer Protocol), XML (eXtensible Markup Language) y SOAP (Simple Object Access Protocol). Toda plataforma que maneje dichos protocolos podr aprovechar la funcionalidad de los servicios Web XML. Comunicacin aplicacin a aplicacin basada en Internet. Al utilizar un servicio Web XML no se tiene una interfaz de usuario visible; realmente se trata de un componente que puede ser consumido de manera programtica de aplicacin a aplicacin.
449
Los servicios Web XML proporcionan una interfaz estndar para la recepcin de peticiones y envo de respuestas, denominada contrato (contract); dicho contrato pone a disposicin de los usuarios la informacin requerida por el componente, describe los comportamientos del mismo y relaciona los datos de entrada/salida del componente. Mediante el contrato, un servicio Web XML informa a otras aplicaciones cmo interactuar con l. Independencia de lenguaje. Los servicios Web XML pueden ser consumidos desde programas escritos en cualquier lenguaje .NET, por lo que no es necesario aprender un lenguaje determinado para tener acceso a su funcionalidad. Independencia de la plataforma. Independientemente de la plataforma que dispongan los clientes de una aplicacin, el contrato se encarga de hacer la peticin en un formato estndar y recibir la respuesta correspondiente. Arquitectura libre del manejo de estados (stateless architecture). Los servicios Web XML no manejan estados de objetos; cada respuesta brindada por un servicio Web XML es una nueva instancia de un objeto con su estado particular. Lo que una peticin realiza no afecta lo realizado por otras peticiones. Comunicacin sincrnica/asincrnica. El requerimiento de ejecucin de un mtodo de servicio Web XML y el requerimiento de la respuesta son independientes. La aplicacin que consume el servicio Web XML y el servicio Web XML mismo pueden operar con mayor disponibilidad, ya que liberan recursos mientras se est en tiempo de espera.
14
450
mos a un procesador de palabras en lnea y pagaremos slo por el tiempo que utilizamos dicho procesador; probablemente no almacenaremos los archivos en nuestro disco duro sino en un servicio de almacenamiento, en lnea tambin, y as poco a poco requeriremos slo un equipo con buen nivel de comunicaciones y no uno con mucha memoria, procesador y espacio de almacenamiento. Microsoft ha empleado con xito el concepto a travs de Microsoft Passport, que es un esquema de seguridad y perfiles que puede ser utilizado y contratado por cualquier aplicacin. Hay otros ejemplos: el sistema de seguimiento de paquetes de Federal Express (FedEx Tracker) est disponible como servicio para rastrear un envo con slo proporcionar el nmero de gua; Barnes & Noble cuenta con un servicio que proporciona el precio de venta de un libro, si se proporciona un ISBN (Barnes & Noble Price Quote). De esas maneras se podr obtener va Web servicios como cotizaciones y tipos de cambio, pronsticos del clima, ofertas de productos, etctera. Cuando cliente y servidor requieren compartir funcionalidad en Internet, pero difieren en su plataforma operativa. Sucede cuando los equipos no operan con la misma plataforma. En la actualidad, por ejemplo, el esquema basado en COM/DCOM utiliza tecnologa de propietario, que no es compatible con otros equipos en Internet, lo que limita la distribucin de la funcionalidad. Si se requiere disponer de funcionalidad entre plataformas distintas compatibles con los protocolos estndar de la Web, los servicios Web XML son la solucin.
UDDI
Uno de los puntos ms importantes de un servicio es su publicidad. De nada sirve un servicio Web XML que nadie conoce. As como las empresas de servicios a los consumidores tienen la necesidad de darse a conocer, un servicio Web XML requiere comunicar, de alguna forma, que existe y para qu sirve. Pensando en ello se ha definido un mecanismo para darles publicidad a los servicios Web XML que las empresas desarrollan, denominado UDDI (Universal Description Discovery and Integration). UDDI est formado por un registro distribuido de informacin de los servicios Web XML; dicho registro est implementado en un formato XML y en l se pueden encontrar los negocios que ofrecen servicios Web XML, as como la descripcin de los mismos. Cada negocio que desarrolla servicios Web XML registra su informacin a travs de un sitio Web (http://www.uddi.org/), o a travs de herramientas y programas comerciales o que se desarrollen para tal efecto. Una vez registrado, el servicio Web XML queda expuesto a la comunidad de desarrolladores para su consumo.
451
Una buena recomendacin es que, antes de desarrollar un servicio Web XML, revise los servicios Web XML ya desarrollados y disponibles; quiz entre ellos encuentre la solucin de procesamiento con un costo menor.
14
URL_Servicio
Donde URL_Servicio es el URL del servicio Web XML. La ejecucin de disco.exe sobre el servicio Web XML producir archivos de extensin y .DISCO. El archivo de extensin .DISCO contiene la informacin que permite localizar el Servicio Web XML y sus componentes requeridos. A este archivo se le denomina discovery document.
.WSDL
Es muy importante realizar el descubrimiento del servicio Web XML antes de generar la clase proxy usando wsdl.exe, debido a que si no se hace el descubrimiento antes, la descripcin del servicio no tendr la suficiente informacin para crear una clase proxy. Es necesario consultar algunos otros parmetros para usar la utilera en las referencias tcnicas del producto; tambin aparecen si se ejecuta la utilera sin argumentos.
452
WSDL
No slo basta encontrar qu servicios Web XML estn disponibles; es muy importante conocer tambin cmo funcionan y cmo los podemos consumir. Un WSDL (Web Service Description Language) es la especificacin estndar de funcionamiento y datos de un servicio Web XML. WSDL se maneja a travs de un contrato, conocido tambin como Service Description, que es un documento XML que contiene informacin relacionada con el servicio Web XML y los paquetes de datos que el servicio Web XML maneja, tanto de entrada como de salida. En cierta forma, WSDL especifica los datos requeridos por el servicio, su comportamiento y sus datos de retorno; acta como un contrato de intercambio de paquetes de datos entre el consumidor de servicios Web XML (Web Service Consumer) y el servicio Web XML. WSDL tambin contiene las referencias a las direcciones asociadas con el servicio Web XML, mismas que dependern del protocolo utilizado para consumir el servicio (HTTP, SMTP, etctera). El documento WSDL es un documento XML; el elemento raz es llamado definitions y contiene cinco nodos hijos que muestran la forma en que est definido el servicio Web XML. Dichos elementos hijo son los siguientes:
types. Define los tipos de datos utilizados para el intercambio de mensajes entre el
consumidor y el servicio.
message. Describe los mensajes que sern comunicados entre el consumidor y el ser-
vicio.
portType. Identifica el conjunto de operaciones que realiza el servicio y los mensajes
Para generar un WSDL, se utiliza la utilera wsdl.exe, desde la lnea de comandos, con la siguiente sintaxis. Si trabaja en Visual Studio esto se realiza automticamente:
wsdl /l:Lenguaje /n:NombreNamespace
URL_Servicio
Donde Lenguaje es el lenguaje que se desea utilizar, NombreNamespace es el nombre del espacio de nombres a generarse en el WDSL, y URL_Servicio es el URL del servicio Web XML a partir del cual se generar WSDL. La ejecucin de wsdl.exe sobre el servicio Web XML producir un programa generado en el lenguaje especificado que deber ser compilado como librera para su uso programti-
453
co. Dicho programa alojar una clase con la misma programacin contenida en el servicio Web XML original, pero adems contendr especificaciones descriptivas que permitirn el consumo de la funcionalidad de la clase utilizando protocolos abiertos. A esta nueva versin del programa se le conoce como clase proxy. Es necesario consultar algunos otros parmetros para usar la utilera en las referencias tcnicas del producto; tambin aparecen si se ejecuta la utilera sin argumentos.
14
1. 2.
El equipo que consume el Servicio Web XML intenta localizar un Servicio Web XML que le proporcione una funcionalidad especfica. Como no sabemos si alguien ya desarroll un Servicio Web XML que brinde la funcionalidad que requerimos, buscamos en un servidor UDDI; en caso de que ya exista el ser-
454
3. 4.
5. 6. 7.
vicio buscado, el servidor enviar la direccin URL en donde se puede solicitar informacin del Servicio Web XML pertinente, que est contenida en discovery document. En caso de que ya sepa dnde encontrar el Servicio Web XML no es necesario acudir al servidor UDDI para hacer una localizacin inicial. El consumidor utiliza la informacin de la ubicacin de discovery document y lo recupera. Este documento contiene las referencias a los recursos requeridos por el Servicio Web XML. El documento informa respecto a la funcionalidad del servicio con lo que podemos saber si en trminos generales nos sirve o no; tambin proporciona los elementos para solicitar la descripcin del servicio. Si el Servicio Web XML proporciona la funcionalidad que deseamos, se requiere la descripcin del servicio para saber cmo se utiliza y qu informacin devuelve. Ya con esta informacin se consume el servicio en los trminos que especifica la descripcin del servicio. Se recibe la respuesta del servicio.
455
2. 3. 4. 5.
Aparecer la pgina de descripcin, que expone todos los mtodos del servicio. Se selecciona un mtodo del servicio. Se proporcionan los datos que el mtodo requiere. Se reciben los resultados del mtodo en formato XML.
14
El protocolo HTTP es textual y es incapaz de manejar objetos complejos. Como este tipo de consumo del servicio Web XML se realiza utilizando el protocolo HTTP, la respuesta slo puede ofrecerse mediante XML. Si se desea que el servicio Web XML devuelva objetos complejos, como lo es un DataSet, por ejemplo, se requerir el manejo del protocolo SOAP, para lo cual se necesitar la intermediacin de un proxy.
Ejercicio 14.1
Creacin de un Servicio Web XML y demostracin de su uso desde el navegador Desarrollar un servicio Web XML que contenga un mtodo. En s el ejercicio es bastante pequeo, pues slo trata de explicar las formalidades de la construccin de un servicio Web XML; ya tendr la oportunidad de codificar algoritmos ms complejos en los servicios que desarrolle. Se demostrar la forma en que se puede probar el Servicio Web XML desde el navegador. En el caso del desarrollo de Servicios Web XML con Visual Studio, todo el proceso de descubrimiento, generacin del proxy y exposicin se realizan de forma automtica.
456
3.
4.
Como sabe, los Servicios Web XML no tienen interfaz de usuario, dado que son un componente de consumo va protocolos de Internet. En ese sentido, realmente se trata de una clase especial que permite su consumo a travs de peticiones Web. En Visual Studio la pgina ASMX, aunque existe, sirve slo para definir la directiva @WebService y hacer referencia al cdigo en donde realmente se programa el servicio. Codifique lo siguiente:
Codificacin de Aritmetica
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
App_Code/Service.vb
Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols <WebService(Namespace:=http://tempuri.org/)> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class Service Inherits System.Web.Services.WebService txtInicio.Text = calInicio.SelectedDate <WebMethod(Description:=Suma de dos nmeros)> _ Public Function Suma(ByVal N1 As Integer, ByVal N2 As Integer) _ As Integer Return (N1 + N2) End Function End Class
457
Ejecucin guiada de 5.
Aritmetica.asmx
14
6.
7.
De la lnea 1 a la 3 se establecen los espacios de nombre requeridos por el Servicio Web XML; queda claro que es un servicio que est basado en Web y que utilizar protocolos de Internet para el transporte. La clase tiene el nombre Service de manera predeterminada. El nombre de clase puede cambiarse siempre y cuando la referencia en el archivo ASMX tambin se modifique (lnea 8). En la lnea 12 se define un mtodo Web al cual le especificamos una descripcin informativa de lo que hace. El mtodo Web (WebMethod) se compone por una funcin que recibe dos argumentos (nmeros enteros) y devuelve un nmero entero, producto de la suma de los dos argumentos que se proporcionen. En lugar de una simple suma, usted puede recibir otro tipo de datos e incluso devolver objetos completos, como puede ser un arreglo o una base de datos en memoria (DataSet).
En Solution Explorer seleccione la pgina Service.asmx, del proyecto http:// Despliegue el men contextual y seleccione View in browser. Aparecer una pgina de consumo del servicio, que muestra el nombre de la clase y una lista de los mtodos codificados.
458
9.
Aparecer una lista de los mtodos expuestos por el servicio, de acuerdo con la descripcin del mismo. Vea cmo aparece Suma con la descripcin que colocamos en el cdigo para el mtodo. Haga clic en el vnculo Suma. Aparecer una interfaz que pregunta los argumentos requeridos por el servicio.
10. En N1 proporcione el nmero 20, y en N2 proporcione el nmero 30. Haga clic en Invoke. Con ello se realizar el procesamiento correspondiente y la respuesta se devolver utilizando un paquete de datos mediante XML.
459
Ejercicio 14.2
Consumo programtico de un Servicio Web XML desde una aplicacin Windows En este ejercicio comprobar la forma en que se puede consumir programticamente un Servicio Web XML desde una aplicacin que no es Web. Se requiere haber desarrollado el ejercicio anterior. 1. 2. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Windows Application, llamado ConsumeWS. Deber aparecer un formulario en el diseador de formularios, que de manera predeterminada recibe el nombre de Form1. Disee una interfaz con los siguientes elementos: tres etiquetas (Label), tres cuadros de texto (TextBox) y un botn (Button). Modifique las propiedades necesarias para que la interfaz luzca de la siguiente manera:
14
3.
Valor a asignar
460
5.
Desde la ventana Add Web Reference se pueden agregar referencias a Servicios Web que se encuentran en la misma solucin, en el equipo local o en los servidores UDDI de la red local. Haga clic en el vnculo Web services in this solution. Con ello aparecern los servicios Web disponibles en la solucin.
461
6.
Cmo slo tenemos definido un servicio en la solucin, es lo nico que aparece. Haga clic en el vnculo del nombre del servicio, que se llama Service. Aparecer el vnculo hacia el servicio, la lista de mtodos, as como el nombre de referencia del servidor Web (localhost). Haga clic en el botn Add Reference para establecer la referencia al recurso Web.
14
Codificacin de ConsumeWS
1 2 3 4 5 6 7 8 9 10 11 12 13 Public Class Form1
Form1.vb
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim wsAritmetica As New localhost.Service() TextBox3.Text = wsAritmetica.Suma( _ CType(TextBox1.Text, Integer), _ CType(TextBox2.Text, Integer) ) End Sub End Class
462
Ejecucin guiada de 8.
ConsumeWS
En la lnea 6 se declara una variable objeto (wsAritmetica) a travs de la cual podremos utilizar la funcionalidad de la clase Service, que est disponible a travs de la referencia localhost. 9. Ya que declaramos la variable, utilizamos a travs de ella el mtodo Web Suma(). Para ello le asignamos el resultado del mtodo a la propiedad Text de TextBox3 (lnea 7). Vea cmo se coloca la variable de trabajo, el mtodo Web y, entre parntesis, los argumentos que requiere el servicio. 10. Establezca el proyecto como proyecto de arranque. Guarde todos los cambios realizados en su solucin e inicie la depuracin (oprima la tecla F5). Proporcione los valores 20 y 30 en N1 y N2, y haga clic en Invocar Servicio Web XML.
11. Al hacer clic se invoca el Servicio Web XML, se le proporcionan los argumentos al mtodo Web y se utiliza el resultado del servicio. 12. Cierre la aplicacin. FIN DEL EJERCICIO *
463
MAPA
14
464
TERMINOLOGA
Add Web Reference, 460 .ASMX, 454 binding, 452 Clase proxy, 453 definitions, 452 Descubrimiento de servicio Web, 451 Disco, 451 Disco.exe, 451 Discovery document, 454 message, 452 portType, 452 service, 452 Servicios Web XML, 447 types, 452 UDDI, 450 Universal Description Discovery and Integration (UDDI), 450 Web Service Description Language, 452 Discovery, 451 <WebMethod()>, 454 WSDL, 452 wsdl.exe XML Web Service, 447
PREGUNTAS
14.1 Qu son los Servicios Web XML y cules son sus caractersticas principales? 14.2 En qu consiste UDDI y para qu sirve? 14.3 En qu consiste WSDL y para qu sirve? 14.4 En qu casos se recomienda el uso de los Servicios Web XML? 14.5 Mencione en qu casos cree usted que podra utilizar Servicios Web XML en su mbito profesional.
465
Notas:
14
466
EXAMEN
Captulos:
15 Manejo de bases de datos con ADO.NET 16 Manejo de bases de datos desde aplicaciones Windows 17 Manejo de bases de datos desde aplicaciones Web 18 Colecciones genricas (generics)
Parte 5
Manejo de Bases de datos con ADO.NET
En esta parte del libro aprenderemos a desarrollar aplicaciones que manejen bases de datos de alto rendimiento. El objetivo principal es que aprenda a desarrollar aplicaciones capaces de actualizar almacenes de datos fsicos, aprovechando al mximo las herramientas que proporciona Visual Studio. En esta parte culmina todo lo aprendido en el libro: utilizamos la programacin general en Visual Basic para la elaboracin de los procesos y procedimientos, adems de dar la estructura a las aplicaciones; tambin utilizamos las tcnicas para el desarrollo de interfaces complejas Windows y Web; trabajamos con Visual Studio al mximo, y ponemos en prctica la capacidad de entender el cdigo que la herramienta genera, gracias a nuestro conocimiento del modelo de programacin orientada a objetos. Desarrollar actualizadores que insertan, modifican, eliminan y muestran registros desde los tres principales tipos de interfaz (Consola, Windows y Web) puede parecer pretencioso. La ventaja es que, en cierta forma, es necesario ser pretencioso para llegar hasta este punto. Si en este mundo globalizado somos simples datos, garantizar el almacenamiento fiel de los datos de stos significa garantizarnos un poco de perpetuidad.
Otras herramientas:
1. ildasm.exe 2. Visual Studio 2005 Command Prompt
CAPTULO
15
469
470
Contenido
ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Historia del acceso a los almacenes de datos . . . . . . . . . . . . . . . . . . . . . . . . . Formas de trabajo con bases de datos en .NET . . . . . . . . . . . . . . . . . . . . . . . Bases de datos conectadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bases de datos desconectadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modos de trabajo con ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Proveedores de datos de .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de consultas y procedimientos almacenados con Server Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adicinde una conexin a Server Explorer . . . . . . . . . . . Visualizacin de los datos de una tabla desde Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adicin de una vista a la base de datos con Query Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adicin y prueba de un stored procedure con Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modelo de objetos de ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data Provider Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DataSet Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cmo realizar la conexin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objeto Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Miembros ms utilizados en Connection . . . . . . . . . . . . . . . . . . . . . . . Propiedad ConnectionString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Connection Pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cerrado de conexin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Proceso de conexin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Establecimiento de una conexin a base de datos de forma programtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Miembros ms utilizados en Command . . . . . . . . . . . . . . . . . . . . . . . . Tipos de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de ejecucin de los comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . DataReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de comandos para ejecutar procedimientos almacenados y uso de DataReader . . . . . . . . . . . . . . . . . . . . . . . Altas, bajas, cambios y consultas en modo conectado . . . . . . . . Consumo de cadenas de conexin de app.Config . . . . . . . . . . . . Compilacin de un proyecto para liberacin (Release) . Crackeado de un usuario y contrasea usando ILDASM . Adicin de un archivo de configuracin para la aplicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Consumo de valores desde el archivo de configuracin . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 472 477 477 478 480 481 482 482 485 486 488 491 492 494 496 496 497 499 499 500 500 501 503 504 505 506 506 507 510 514 515 516 517 518 521 522 523 525
471
ADO.NET
ADO.NET es un conjunto de clases que forman parte de la biblioteca de .NET Framework y permite a las aplicaciones tener acceso a bases y otros almacenes de datos con fines de lectura, adicin o actualizacin, ya sea de manera conectada o desconectada. ADO.NET no es un producto en s mismo; forma parte de .NET Framework, pero es tal su importancia que merece ser estudiado de manera particular. Antes de entender la forma en que ADO.NET trabaja es necesario comprender que una base de datos sirve para almacenar y recuperar informacin. Surgen entonces dos preguntas: Almacenarla dnde?, recuperarla de dnde? Independientemente de si trabajamos con Access, SQL Server, Oracle, Informix, MySQL o cualquier otra base de datos del mercado, los datos terminan siempre en archivos que se almacenan en diversos medios de almacenamiento permanente (disco duro, cinta, cartucho, etctera). Los manejadores de bases de datos permiten administrar y organizar la estructura de las bases de datos, facilitando la labor de almacenamiento, actualizacin y recuperacin; sin embargo, a fin de cuentas siempre terminamos con un archivo al que debemos leer y en el que debemos escribir de una manera especfica. A estos archivos les damos el nombre de almacn de datos u orgenes de datos. Los almacenes de datos pueden estar a nuestra disposicin ya sea mediante el uso de sistemas manejadores de bases de datos (DBMS/Data Base Management System), programas que proporcionan una interfaz de acceso al almacn de datos y que en la actualidad poseen incluso lenguajes de manipulacin de datos (DML/Data Manipulation Language), e interfaces grficas intuitivas, llenas de asistentes y generadores de cdigo. Ejemplos de este tipo de sistemas son Access, Visual FoxPro, SQL Server, Oracle, etctera. Otra forma de acceder a estos archivos es mediante programacin, a travs de componentes y libreras que permiten el enlace con los almacenes de datos, as como su manipulacin y recuperacin. Dependiendo de la tecnologa que estemos utilizando, hablamos de libreras, controladores y proveedores de datos. Ejemplos de esto son DAO, ADO, ADO.NET, OLEDB, ODBC, etctera.
15
472
Dado el carcter de este libro, nos interesa el acceso a los almacenes de datos de manera programtica, a travs de componentes y libreras, y especficamente utilizando ADO.NET. Para todo desarrollador profesional, en su labor de desarrollo de aplicaciones amplias para organizaciones, es indispensable saber hacer que una interfaz de usuario se comunique con almacenes de datos mediante programacin; esto lleva a la necesidad de conocer los elementos del lenguaje que permitan manipular las bases de datos. En el caso de .NET, es necesario familiarizarse con el modelo de objetos ADO.NET, que precisamente sirve para eso. A travs de programacin es posible crear accesos rpidos, eficientes y confiables. Ciertamente no seremos los primeros en intentarlo, pero s los que menos problemas enfrentaremos para hacerlo, ya que ADO.NET es una plataforma sorprendentemente potente y sencilla; adems, si disponemos de Visual Studio, la codificacin se realiza prcticamente sola. La historia nos dice que somos afortunados; muchos quisieron ver lo que nuestros ojos estn por ver.
473
15
Dcada de 1990
Dcada de 2000
Libreras nativas de acceso a datos. Al principio, la diferencia entre plataformas y la diversidad de medios de conexin no era problema porque no haba alternativas. El acceso a las bases de datos se realizaba a travs de libreras nativas que funcionaban slo para un manejador de base de datos especfico en una plataforma operativa especfica. Ejemplos de ello fueron DBLib para SQL Server y OCI (Oracle Call Interface) para Oracle. Las libreras nativas son libreras ejecutables de tecnologa propietaria que sirven para enlazar a un solo tipo de almacn de datos en particular en una plataforma especfica. El enlace con las bases de datos era tan rpido como limitado; en virtud de que no haba intermediacin entre base de datos y cdigo nativo, el acceso a la base de datos era directo y, por tanto, muy veloz. Sin embargo, las libreras funcionaban slo con el manejador de base de datos especfico en una plataforma operativa; otra desventaja era que el desarrollador deba aprender a manejar tantas libreras nativas como manejadores de bases de datos utilizara en su aplicacin. Si por alguna razn el usuario decida usar otro manejador de bases de datos, no slo se tena que cambiar el manejador, sino tambin era necesario modificar el cdigo fuente de las aplicaciones, lo que en ocasiones generaba una inversin alta en tiempo y dinero. sa fue la razn por la que muchas empresas no cambiaban manejador de base de datos, aun cuando no fuera el ms adecuado para su negocio. ODBC. Al inicio de la dcada de 1990, Microsoft y otras empresas desarrollaron un estndar, denominado ODBC (Open Data Base Connectivity/Conectividad abierta de bases de datos). La idea era proporcionar una capa de acceso a datos comn a travs de la cual
474
pudiera tenerse acceso a cualquier motor de base de datos, siempre y cuando estuviera basada en el modelo relacional. Dichos motores, llamados motores de base de datos relacionales (RDBMS/Relational Data Base Management System), tales como SQL Server, Oracle, e Informix, utilizaran para el enlace unos controladores ODBC (ODBC drivers) que servan como protocolos de comunicacin entre las aplicaciones y la base de datos. ODBC agreg un elemento intermedio entre la base de datos y las aplicaciones, llamado Manejador de controladores ODBC (ODBC Driver Manager), que se ocupaba de cargar y administrar los controladores ODBC. En ese contexto, la aplicacin se comunicaba mediante instrucciones de bajo nivel con el manejador de controladores ODBC, quien a su vez se comunicaba con la base de datos a travs de las API (Application Programming Interface), que constituyen un conjunto de definiciones que permiten a un programa comunicarse con otro. En teora, si se cambiaba el manejador de base de datos, por ejemplo de Oracle a SQL Server, ya no sera necesario cambiar el cdigo de la aplicacin, dado que bastara con utilizar un controlador distinto. Cambiar de manejador de base de datos sera como cambiar la impresora o el monitor: se conecta el dispositivo, se instalan los controladores y listo.
NOTA
Esto es slo en teora, ya que los manejadores de base de datos admiten diferentes dialectos del lenguaje SQL, como ya veamos en el captulo anterior, lo que no permite una compatibilidad tan transparente.
Con ODBC nace el concepto de orgenes de datos, que vienen siendo el acceso a almacenes de datos por intermediacin de un manejador de controladores, y el uso de un controlador. Con respecto a la velocidad de acceso, el que se agregara una capa de intermediacin entre la aplicacin y la base de datos, naturalmente, redujo un poco la rapidez. DAO. Lenguajes como C++ facilitaban el trabajo de bajo nivel que requera ODBC. En cierta forma, el proceso de interaccin con el manejador de controladores ODBC era algo natural. Sin embargo, con la aparicin de Visual Basic surgi la necesidad de comunicarse con las bases de datos en un ambiente ms orientado a objetos, capaz de asumir muchas cosas. ODBC era demasiado complejo de implementar en un ambiente de desarrollo cuyo principal atractivo era la simplicidad. En la versin 3 de Visual Basic apareci DAO (Data Access Objects), que proporcionaba un modelo de objetos que permita tener acceso con el motor de base de datos Jet, la tecnologa utilizada por Microsoft Access.
475
Aun cuando era posible tener acceso a bases de datos en Access a travs de ODBC, DAO rpidamente cobr popularidad; en primer lugar, porque era mucho ms sencillo, de acuerdo con la filosofa de desarrollo de Visual Basic, y segundo, debido a que por ser un motor optimizado para Jet, era (y sigue siendo) la forma ms rpida de tener acceso a las bases de datos en Access. Aunque est optimizado para bases de datos basadas en Jet (Access), DAO tambin acepta otras bases de datos a travs de ODBC. De esa forma, se dispone de la simplicidad de DAO y el poder de ODBC.
RDO. El problema con DAO es que al querer utilizarlo con bases de datos no basadas en Jet, es decir, cuando utilizaba orgenes de datos ODBC, se volva muy lento.
15
Buscando remediar eso, Microsoft cre RDO (Remote Data Objects), que es un modelo de objetos similar a DAO pero optimizado para ODBC. No obstante los cambios, la velocidad de conexin no mejor mucho. Slo se logr tener un poco menos de los mismos problemas. OLE DB. Para resolver el problema de la velocidad, ya en un contexto lleno de diferentes manejadores de bases de datos y condiciones de conectividad, surgi OLE DB. OLE DB es similar a ODBC, en el sentido de que utiliza una especie de controladores, llamados proveedores de datos (OLE DB Providers), que implementaban un conjunto de interfaces COM que permitan el acceso a las bases de datos en un formato estndar de lnea-columna. A las aplicaciones que utilizan OLE DB se les denomina OLE DB Consumer. En un esquema COM, OLE DB extendi el nmero de servicios disponibles para el manejo de los datos a travs de libreras de fcil utilizacin, permitiendo el manejo de transacciones, persistencia de datos, manipulacin de parte del cliente, conjuntos de registros jerrquicos, etctera. Con OLE DB, Microsoft estableci su estrategia UDA (Universal Data Access), que por primera vez reconoca que los datos no slo pueden estar en bases de datos, sino en muchos otros lugares y formatos como mensajes de correo electrnico, hojas electrnicas, archivos de texto simple, etctera.
NOTA
En este libro optamos por enfocarnos en los almacenes de datos por esta razn. No siempre hablamos de bases de datos; podemos hablar tambin de archivos de texto u hojas electrnicas, por ejemplo. Todas las bases de datos son almacenes de datos, pero no todos los almacenes de datos son bases de datos.
476
La desventaja de OLE DB es que segua siendo complejo; por tratarse de una interfaz basada en COM, su manejo implicaba la interaccin con libreras y no con un modelo de objetos sencillo, que formara parte del sistema operativo. ADO.ADO (ActiveX Data Objects) es un OLE DB Consumer que proporciona acceso a los orgenes de datos OLE DB a travs de un modelo de objetos sencillo. Brinda la velocidad de OLE DB, sin la complejidad derivada de lidiar con libreras COM, ya que proporciona un modelo de objetos tan sencillo como DAO. La desventaja de ADO, no obstante su potencia, flexibilidad y sencillez sigue siendo la velocidad; no debemos olvidar que agrega una capa de intermediacin, adicional a la que agrega OLE DB, por lo que entre la aplicacin y la base de datos est ADO y OLE DB, que hacen ms lento el enlace. ADO.NET. Como ya lo definimos, es un conjunto de clases que forman parte de la biblioteca de clases de .NET Framework, y que permiten a las aplicaciones tener acceso a bases de datos y otros almacenes de datos con fines de lectura, adicin o actualizacin de datos, ya sea de manera conectada o desconectada. ADO.NET permite el enlace con los almacenes de datos a travs de los proveedores de datos de .NET (.NET Data Providers). Estos controladores estn diseados para aligerar el peso de las capas que hay entre el almacn de datos y la interfaz, lo que mejora el desempeo. Dentro de las ventajas que ofrece ADO.NET, estn las siguientes:
Maneja copias locales de datos y permite el manejo de bases de datos desconectadas. Utiliza XML como formato para la transmisin de datos entre el almacn de datos y la copia local de datos; esto garantiza que los datos son autodescriptivos. Proporciona un modelo de objetos que permite programar de manera sencilla el manejo de bases de datos. La capacidad de manejar bases de datos desconectadas permite sustentar de manera eficiente las aplicaciones de computacin mvil. El esquema de bases de datos desconectadas permite una mayor escalabilidad debido a que el uso de recursos es por peticin, y no constante y concurrente. Maneja sus propios controladores de datos, que con el tiempo se irn mejorando para que su rendimiento sea mejor.
MARS (Multiple Active Result Sets). Permite tener abiertos ms de un conjunto de registros en una misma conexin abierta (no slo uno, como suceda en versiones 1.0 y 1.1). Operaciones asncronas. A travs de nuevos mtodos disponibles para las cases Connection y Command, es posible ejecutar operaciones de dos vas (asncrnicas).
477
Actualizaciones por lotes (batch updates). Es posible reproducir en el almacn de datos fsico las afectaciones realizadas a un conjunto de registros de una base de datos desconectada. Anteriormente los cambios se reproducan registro por registro.
15
La seguridad del acceso a los datos es fcil de mantener. El acceso concurrente a los datos es fcil de controlar. Los datos se encuentran actualizados todo el tiempo.
La conectividad entre la aplicacin y la base de datos debe ser permanente. Cada conexin a la base de datos requiere recursos para ser mantenida, lo que implica que la escalabilidad no es muy buena. Cada conexin utiliza recursos, independientemente de si se estn realizando operaciones con la base de datos o no.
Las bases de datos conectadas se recomiendan para aquellas aplicaciones en donde los datos actualizados en tiempo real son crticos, en donde se tienen usuarios concurrentes y donde la informacin debe estar actualizada para todos todo el tiempo, como puede ser un sistema bancario, un sistema de control de la produccin o un sistema financiero para el control de movimientos en la bolsa.
478
La forma de trabajo es muy similar a la forma en que trabaja actualmente el modelo cliente/servidor: 1. 2. 3. 4. En el momento en que se requiere interactuar con el almacn de datos se establece una conexin. Al abrir una conexin, se enva al manejador de bases de datos una instruccin SQL u otra que se desee ejecutar en el servidor. El servidor ejecuta la instruccin y, en su caso, devuelve datos a travs de la conexin que se encuentra todava abierta. Al haberse concluido el trabajo, la conexin se cierra.
Se puede trabajar todo el tiempo, sin la preocupacin de estar consumiendo recursos en el servidor, pues el acceso a las bases de datos es por peticin. Mientras no utilizamos la conexin, otros usuarios pueden hacer uso de ella. La escalabilidad se mantiene de manera eficaz, ya que el uso concurrente de la base de datos se mantiene al mnimo.
479
Los datos no estn permanentemente actualizados. Los conflictos relacionados con la modificacin de los mismos datos por diferentes usuarios deben resolverse, de tal forma que no se pierdan transacciones.
Las bases de datos desconectadas se recomiendan para aquellas aplicaciones donde la actualizacin de datos que realizan los usuarios no es necesariamente concurrente, donde no se requiere la informacin actualizada todo el tiempo y donde se tienen pocos recursos de cmputo y almacenamiento. Por ejemplo, en el caso de una agenda en lnea, correo electrnico, control de gastos personales y en toda la gama de aplicaciones ideales para dispositivos mviles, como celulares o palm-tops.
15
La forma en que trabaja el esquema desconectado es muy distinta a la forma de trabajar bajo el modelo cliente/servidor. Para empezar, no es necesario que exista un almacn de datos, aunque lo comn es que s exista. En este esquema: 1. 2. 3. Se realiza una conexin, de igual forma que en esquema conectado. La aplicacin, en lugar de ejecutar instrucciones sobre el almacn de datos, toma el conjunto de datos mnimos que la aplicacin requiere para trabajar. Se cierra la conexin.
480
4. 5. 6.
Los datos extrados se almacenan en una memoria temporal (cach) en el equipo que hizo la peticin (copia local de datos). Sobre la copia local de datos, la aplicacin realiza consultas y modificaciones. Cuando as se considere oportuno, se reproducen en el almacn de datos las modificaciones realizadas en la copia local.
Modo conectado. Si trabajamos slo con objetos que pertenecen a Data Provider Objects, utilizando una conexin a un almacn de datos para cada operacin que realicemos. En este esquema no se aprovechan los principios del modelo relacional, ya que slo se trabaja con matrices bidimensionales de datos (filas/columnas); la definicin de llaves, relaciones y dependencias entre tablas debe ser manejada de manera programtica. Modo parcialmente conectado. Cuando trabajamos con Data Provider Objects y DataSet Objects; en este modo se establece una conexin con el almacn de datos para leer datos y definiciones, y cargarlos en DataSet; una vez que tenemos una copia de los datos en memoria local, trabajamos con los datos ya en el DataSet. Cuando hemos concluido las modificaciones a los datos, actualizamos el almacn de datos, de tal forma que considere las modificaciones realizadas en el DataSet. En este esquema se aprovecha la capacidad de almacenamiento de los manejadores de bases de datos, as como sus definiciones del modelo de datos; adems, se aprovecha la compatibilidad de DataSet con el modelo relacional por parte del cliente, por lo que las llaves, relaciones y dependencias que se tienen en el manejador de bases de datos pueden ser reproducidas de manera local. Modo totalmente desconectado. Es cuando trabajamos slo con objetos que pertenecen a DataSet Objects y no establecemos conexin alguna con los almacenes de datos. Generalmente el trabajo en este modo es virtual, para efectos de procesamiento. En este esquema se aprovecha la compatibilidad con el modelo relacional que tiene DataSet, pero como no hay enlace con ningn almacn de datos, no se pueden adquirir definiciones y se hace necesario programar todas las especificaciones del modelo de datos de manera local.
Los captulos siguientes se especializan en cada uno de los diferentes modos de trabajo; se har especial nfasis en el modo parcialmente conectado, pues es el modo ms frecuente de trabajo, tanto en aplicaciones Web como en aplicaciones de escritorio y cliente/servidor.
481
Esta preferencia por el modelo parcialmente conectado no es una casualidad, ya que en l convive el manejador de bases de datos y ADO.NET, obtenindose lo mejor de los dos mundos.
15
Proveedor
Uso en
Server proporciona el acceso a bases de datos Microsoft SQL Server 7.0 y posteriores. Namespace: System.Data.SqlClient
Proporciona el acceso a bases de datos expuestas a travs de OLE DB. Se recomienda para el acceso a SQL Server 6.5 y Access. Namespace: System.Data.OleDb
Proporciona el acceso a bases de datos Oracle versin 8.1.7 y posteriores. Namespace: System.Data.OracleClient
Prcticamente es posible conectarse desde .NET a cualquier plataforma de bases de datos. Los proveedores de datos de .NET Framework permiten interactuar con los manejadores de bases de datos utilizando Visual Studio como herramienta de desarrollo y depuracin, incluso en ambientes que no son de programacin.
482
Ejercicio 15.1
Uso de consultas y procedimientos almacenados con Server Explorer
Aprender a utilizar la herramienta Server Explorer. 1. Abra la solucin Ejercicios, que debe encontrarse en (archivo de extensin sln).
C:\APVBNETVS\Ejercicios
3.
4.
5.
La herramienta tiene su propia barra de herramientas, que incluye botones para refrescar el rbol de conexiones, detener el proceso de refrescado y establecer la conexin a una base de datos. Suponga que tiene una instancia de SQL Server de nombre APRENDAWS. Imagine que quiere establecer una conexin con la base de datos de prueba Pubs y que se enlazar utilizando la cuenta de administracin sa, cuya contrasea es secreto. sta es una parte del diagrama de entidad relacin de la base de datos Pubs:
483
15
6.
titles
Contiene informacin de los ttulos (libros) que pueden ser comercializados. Contiene la informacin de las casas editoriales que comercializan los ttulos. Contiene la informacin de los empleados de las casas editoriales. Contiene la informacin de los puestos de trabajo que los empleados de las editoriales pueden tener. Contiene la informacin de los autores que tienen obras publicadas. Contiene la informacin de qu autores escribieron qu ttulos. Contiene la informacin de las ventas de los ttulos. Contiene la informacin de los establecimientos (tiendas/libreras) en donde se realizan las ventas de los ttulos.
publishers
employee jobs
484
7.
Haga clic en el botn Connect to Database de la barra de herramientas de Server Explorer. Aparecer un asistente para la conexin.
8.
En Data source especifique el tipo de proveedor de datos con el que desee trabajar. En este caso utilizaremos SqlClient, dado que nos estamos enlazando a una base de datos SQL Server 2000. En Server name especifique el nombre de la instancia a la que desea enlazarse, que en este caso es APRENDAWS. En Log on to the server seleccione el uso de autenticacin basada en SQL Server (Use SQL Server Authentication); escriba en User name la cuenta sa y en Password secreto. En Connect to a database, especifique en Select or enter a database name el nombre de la base, Pubs. Proporcionados estos datos, haga clic en el botn Test Connection, con lo que comprobar si la informacin que ha proporcionado es correcta. Si todo es correcto, aparecer un mensaje de alerta como el siguiente:
485
9.
La base de datos y todos los elementos manejables a travs de Visual Studio son mostrados en el rbol de conexiones.
15
486
487
14. Aparecer el asistente de consultas (Query Designer), en el que se seleccionarn slo los campos que nos interesan: stores.stor_name, titles.title, stores.state, titles.price, sales.qty. FIGURA 15.6 Query Designer.
15
15. Los cambios que realice en la seleccin visual de columnas se reflejarn de manera automtica en los atributos de columna y en la instruccin SQL. 16. En los atributos de columna, en el atributo Filter del campo state, escriba la condicin = CA. Vea cmo la instruccin SQL cambia automticamente.
17. Ahora agregaremos el campo calculado a nuestra consulta. En los atributos de columna, despus de la columna state, escriba sales.qty*titles.price en Column y VentasTotales en el atributo Alias.
488
19. Ejecute la consulta haciendo clic en el botn Execute SQL , para ver si los resultados son correctos. Los resultados deben aparecer en el rea de resultados.
20. Si todo est correcto, guarde la vista en la base de datos, oprimiendo las teclas Ctrl-S y asignando el nombre de VentasCA.
21. Cierre Query Designer. 22. Compruebe que en la base de datos ya se ha agregado una vista ms.
489
15
27. Modifique el cdigo para que quede como el siguiente. Vea cmo Text Editor delimita las instrucciones SQL mientras codifica.
Codificacin de dbo.StoredProcedures.AprendaWS.Pubs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE PROCEDURE dbo.TitulosVendidosEstado ( @state char(2) ) AS BEGIN select titles.title from sales, titles, stores where titles.title_id = sales.title_id and sales.stor_id = stores.stor_id and stores.state = @state END RETURN
28. El procedimiento espera que se proporcione como parmetro el estado del que se desea obtener informacin (lnea 3). Con base en ello, se extraern los nombres de los ttulos que hayan sido vendidos en el estado proporcionado. Al guardar el procedimiento almacenado (oprima las teclas Ctrl-S) se realizar una verificacin de sintaxis y se almacenar el procedimiento en la base de datos. La instruccin cambiar automticamente, de CREATE PROCEDURE a ALTER PROCEDURE, para futuros cambios.
490
NOTA
Para adquirir el dominio en la codificacin de procedimientos almacenados, adquiera el libro Aprenda Practicando Microsoft SQL Server 2000, del mismo autor de esta obra, en donde se aborda la programacin avanzada de Transact SQL, as como la administracin bsica de bases de datos SQL Server.
29. Colquese en cualquier parte del procedimiento almacenado que est editando y despliegue el men contextual, seleccionando la opcin Execute.
30. Como el procedimiento almacenado requiere valores en los parmetros, se desplegar la ventana Run Stored Procedure, solicitando los valores correspondientes. Proporcione como valor CA y haga clic en Ok.
491
15
492
Permite establecer la conexin con un almacn de datos. Se debe definir un objeto Connection por cada enlace a almacn de datos requerido por la aplicacin. Los objetos DataReader, DataAdapter y Command requieren de un objeto Connection para funcionar.
Command
Ejecuta comandos SQL y, opcionalmente, devuelve datos del almacn de datos. Se requiere un objeto Command para cada instruccin a enviar al almacn de datos. DataReader requiere de un objeto Command para realizar la lec-
493
tura; DataAdapter requiere un objeto Command por cada operacin a realizar (SELECT, INSERT, UPDATE y DELETE). En caso de que Data Adapter no realice alguna de las operaciones de actualizacin, no ser necesario definir Command.
DataReader
Permite generar un flujo de datos (data stream) de slo lectura con el almacn de datos. El objeto DataReader se puede utilizar para lecturas slo hacia delante; no es requerido por ningn objeto, por lo que su uso es opcional.
15
DataAdapter
Permite generar un flujo de datos (data stream) de lectura/escritura entre la copia local de datos y el almacn de datos. Se encarga de cargar datos del almacn de datos en el DataSet (SELECT) y de reproducir en el almacn de datos los cambios realizados en el DataSet (INSERT, UPDATE, DELETE) de manera desconectada. Se requiere si se desea la interaccin entre un DataSet y un almacn de datos.
En el momento en que DataReader o DataAdapter poseen datos, ya se tiene una copia local de datos en el equipo cliente. Los Data Provider Objects son llamados as porque, dependiendo del proveedor o controlador de datos que se utiliza, se les antepone un prefijo que determina su origen.
En manuales y guas de estudio, suele referirse a los objetos como xxxCommand o xxxDataReader, de tal forma que, en caso de que aparezcan nuevos controladores y proveedores de datos, usted slo tenga que aprender el prefijo que desea aplicar, aprovechando as el conocimiento del modelo de objetos que ya tiene. Dependiendo del controlador de datos .NET que se desee utilizar, el nombre de los objetos vara.
494
Adems de estos objetos, .NET Framework tambin provee los siguientes objetos relacionados con el proveedor de datos (dependiendo del manejador de bases de datos utilizados, estarn disponibles o no).
Objeto Transaction Funcin
Permite listar comandos como parte de una transaccin para el origen de datos. Permite generar automticamente propiedades de comandos y parmetros, con base en la informacin de DataAdapter. Permite crear y manejar cadenas de conexin. Define valores de entrada, salida y retorno para comandos y procedimientos almacenados. Representa errores que ocurren en el origen de datos. Expone informacin de los errores que ocurren en el origen de datos. Permite establecer los atributos de seguridad y control de acceso a los recursos de datos.
CommandBuilder
ConnectionStringBuilder Parameter
Exception Error
ClientPermission
DataSet Objects
El hecho de que se tenga un flujo de datos con el almacn de datos no implica que podamos manejar los datos tal y como si dispusiramos de la base de datos en nuestro equipo. Para poder hacerlo, requerimos de un conjunto de objetos que nos permitan disponer de la copia local de datos, con todas las particularidades de una base de datos; nos referimos a DataSet Objects.
DataSet
se compone de un conjunto de datos locales de parte del cliente y permite operar sobre ellos con toda la funcionalidad de un manejador de base de datos, lo cual posibilita la adicin y modificacin de registros, y la realizacin de consultas, por ejemplo, respetando las reglas de las bases de datos originales y con la ventaja de que todo sucede de manera desconectada. Si lo que vamos a desarrollar son aplicaciones conectadas, tal y como lo habamos hecho siempre, probablemente DataSet no nos resultar tan maravilloso. Sin embargo, creemos que al igual que todo el mundo, usted tiene inters en las aplicaciones Web y, por tanto, le interesan las bases de datos desconectadas.
495
Si usted conoce las bases de datos relacionales, ver que DataSet y sus objetos asociados son prcticamente una base de datos relacional. FIGURA 15.8 DataSet Objects.
15
Representa la copia local y desconectada de datos, residentes en memoria. Se requiere un objeto de manera local.
DataSet
DataTable
Representa una tabla dentro del modelo de datos. Se organiza a travs de la coleccin Tables, que depende de DataSet. Se requiere un objeto DataTable por cada tabla del modelo de datos a representar de manera local.
DataView
Representa una vista personalizada de los datos de un DataTable, permitiendo ordenamiento, filtrado, bsqueda, edicin y navegacin. Representa una columna o campo perteneciente a una tabla determinada. Se organiza a travs de la coleccin Columns, que depende de DataTable. Se requiere un objeto DataColumn por cada columna o campo del modelo de datos a representar de manera local.
DataColumn
DataRow
Representa una fila o un registro perteneciente a una tabla determinada. Se organiza a travs de la coleccin Rows, que depende de DataTable.
496
Se requiere un objeto DataRow por cada registro del modelo de datos a representar de manera local.
Constraint
Representa una restriccin de valor nico o llave fornea, que se aplica a una tabla determinada. Se organiza a travs de la coleccin Constraints, que depende de DataTable. Se requiere un objeto Constraint por cada restriccin de valor nico (generalmente, esto es aplicable a las llaves primarias, aunque no necesariamente), y tambin uno por cada llave fornea definida en el modelo de datos a representar de manera local.
DataRelation
Representa una relacin entre tablas. Se organiza a travs de la coleccin Relations, que depende de DataSet. Se requiere un objeto DataRelation por cada relacin entre tablas existente en el modelo de datos a representar de manera local.
DataSet
se apoya fuertemente en el manejo de colecciones. Como todas las colecciones, se puede referir el contenido a travs de Items o bien, sealando el identificador de elemento que corresponda de manera explcita.
Objeto Connection
El objeto Connection sirve para establecer y abrir un flujo de datos entre la interfaz de usuario y el almacn de datos de un determinado tipo. Cuando utilizamos el objeto Connection, debemos especificar a qu tipo de almacn de datos nos vamos a conectar y proporcionar toda la informacin necesaria para establecer el enlace. Cuando establecemos el enlace, se dice que tenemos una conexin abierta. Otros objetos pertenecientes a Data Provider Objects, como DataReader y DataAdapter, dependen de la existencia previa de una conexin abierta; esto resulta lgico si consideramos que si no hay una conexin abierta con un almacn de datos, no puede haber lectura ni intercambio de datos e instrucciones.
497
El objeto Connection tiene diferentes implementaciones y vara dependiendo del tipo de almacn de datos con el que nos queramos conectar; sin embargo, tiene un cuadro de miembros bsicos aplicables a todas las diferentes implementaciones. A continuacin se mencionan los miembros comunes a todos los diferentes tipos de almacn de datos.
15
Propiedades
Propiedad ConnectionString Utilidad
Devuelve o establece la cadena utilizada para abrir una base de datos. Devuelve el tiempo de espera para intentar establecer una conexin antes de detenerse y generar un error. El tiempo es expresado en segundos. Devuelve el nombre de la base de datos actual o de la que se va a utilizar una vez que se abre la conexin. Devuelve el nombre de la instancia de SQL Server con la que se va a establecer la conexin. Obtiene una cadena que contiene la versin del servidor a la que se conecta el cliente. Obtiene el estado actual de la conexin.
ConnectionTimeout
Database
DataSource
ServerVersion
State
Mtodos
Mtodo BeginTransaction Accin que realiza BeginTransaction()
Inicia una transaccin de base de datos con el valor IsolationLevel actual. El argumento aislamiento es el nivel de aislamiento de transaccin de la conexin.
498
Close
Close()
Cierra la conexin al origen de datos. ste es el mtodo recomendado para cerrar conexiones abiertas.
CreateCommand CreateCommand()
Abre una conexin de base de datos con los valores de propiedad que especifica ConnectionString.
Eventos
Evento Disposed StateChanged Causas que lo originan
Se produce cuando el objeto ha sido eliminado. Se produce cuando el estado de la conexin cambia.
Se requiere al menos una conexin por cada almacn de datos utilizado por nuestro programa, aunque los almacenes de datos pertenezcan a distintos tipos. Para establecer un enlace, es necesario que se proporcione informacin relativa al almacn de datos a travs de la cadena de conexin, representada por la propiedad ConnectionString; una vez especificada la cadena de conexin se puede intentar establecer el enlace utilizando para ello el mtodo Open. Para no saturar los canales de comunicacin, el enlace se intenta establecer en un tiempo determinado en segundos, que se puede especificar a travs de la propiedad ConnectionTimeout; si no se especifica el tiempo, de manera predeterminada ser de 15 segundos. Cuando se utilizan modelos de datos especficos para una base de datos, como SqlClient y OracleClient, no queda duda del tipo de almacn de datos con el cual nos queremos conectar; el caso de OleDb es diferente, ya que se puede intentar un enlace con todas aquellas bases de datos compatibles con OLE DB. De esto deriva la necesidad de aclararle al sistema qu comportamiento deseamos para el proveedor de datos (Provider).
499
Propiedad ConnectionString
La ms importante propiedad de Connection es ConnectionString, ya que proporciona informacin que identifica al almacn de datos y le proporciona informacin requerida para la conexin, utilizando para ello parmetros textuales, en forma de igualaciones separadas por punto y coma (;). Al valor asignado a ConnectionString se le ha llamado cadena de conexin. El formato sera el siguiente:
Connection.ConnectionString=parmetro=valor;parmetro=valor;
15
El valor de la propiedad puede cambiarse slo si no se tiene la conexin abierta. Los parmetros a utilizar al elaborar una cadena de conexin son:
Parmetro Provider Funcin
Es til slo si se est utilizando OleDb. Establece el nombre del controlador que sustenta la conexin. Establece el tiempo en segundos que se intentar establecer conexin con el almacn de datos. Initial Catalog Establece el nombre de de la base de datos o almacn de datos con el que nos queremos conectar. En el caso de bases de datos basadas en archivo fsico, como Access, es el nombre fsico del archivo de bases de datos. Nombre del almacn de datos. En el caso de SQL Server, es el nombre del servidor de base de datos; en el caso de otras bases de datos (por ejemplo una base de datos en Access), es el nombre fsico del archivo que constituye el almacn de datos. Contrasea de la cuenta SQL Server, para permitir el acceso a la base de datos. Cuenta de SQL Server, para permitir el acceso a la base de datos. Establece si la conexin ser segura o no. Acepta los valores True y False.
Connection Timeout
Data Source
Password
Connection Pooling
ADO.NET administra las conexiones de manera eficiente, pues posee un concepto denominado Connection Pooling, que se encarga de revisar constantemente el uso que se le da a
500
una conexin. En caso de que una conexin no sea utilizada, proceder a la desconexin automtica, reactivndola en el momento en que se intente la utilizacin del flujo de datos, siempre y cuando los objetos sigan vigentes. Se recomienda, sin embargo, cerrar las conexiones de manera explcita, ya que no hay ms eficiencia que eso. Connection Pooling se encarga de nuestro trabajo si somos descuidados en nuestra tcnica de programacin; como no lo somos, no tendr mucho trabajo con nuestra forma de programar. Si desea ir ms all, puede no slo cerrar la conexin; tambin puede liberar los recursos utilizados en el servidor para mantener la conexin a travs del mtodo Dispose.
Cerrado de conexin
Aunque ADO.NET cerrar las conexiones que estn inactivas durante cierto tiempo, dejando latente la conexin mediante Connection Pooling, no hay nada ms preciso que hacer uno mismo la tarea de cerrado de conexin. Para cerrar una conexin abierta puede utilizar el mtodo Close. La conexin se cerrar y reducir considerablemente los recursos utilizados en el equipo para mantener la conexin. Sin embargo, se mantiene la conexin en estado latente (connection pooling) hasta que el objeto es desechado por completo. El mantener la conexin en estado latente consume recursos, aunque pocos. Si definitivamente ya no utilizar la conexin, lo recomendable es cerrarla y desechar el objeto definitivamente, utilizando para ello el mtodo Dispose.
Proceso de conexin
Generalmente el proceso consiste en lo siguiente: 1. 2. 3. 4. 5. 6. 7. Asegurarse de que se ha importado el namespace requerido para tener acceso al proveedor de datos correspondiente. Declarar variables objeto basadas en el objeto Connection del proveedor de datos seleccionado. Instanciar el objeto Connection. Establecer propiedades de conexin; la propiedad indispensable es ConnectionString, que especificar el almacn de datos con el cual nos enlazaremos. Abrir la conexin, aplicando el mtodo Open. Abierto el flujo de datos se hace lo que se requiere hacer con los datos: adicin, modificacin, eliminacin o consulta de registros. Se cierra la conexin usando el mtodo Close.
501
Ejercicio 15.2
Establecimiento de una conexin a base de datos de forma programtica En este ejercicio realizaremos una conexin a una base de datos SQL Server mediante programacin. Suponga que tiene una instancia de SQL Server, de nombre APRENDAWS. Imagine que desea establecer una conexin con la base de datos de prueba Pubs y que se enlazar utilizando la cuenta de administracin sa, cuya contrasea es secreto. 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Console Application, llamado Conecta. Edite el programa de tal forma que aparezca de la siguiente manera:
15
Codificacin de Conecta Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As SqlConnection conn = New SqlConnection() conn.ConnectionString = Data Source=aprendaws; & _ Initial Catalog=pubs;Persist Security Info=True; & _ User ID=sa;Password=secreto conn.Open() Console.WriteLine(conn.State.ToString()) conn.Close() Console.Write(Pulse INTRO para continuar) Console.ReadLine() End Sub End Module
4.
Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
502
5.
6. 7.
lizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). En la lnea 4 se importa el espacio de nombres requerido para un enlace a una base de datos en SQL Server. El procedimiento de conexin se realiza de la siguiente forma: se declara una variable a travs de la cual se manejar programticamente la conexin (lnea 9), se genera una instancia de Connection sobre la variable (lnea 10), se establece la cadena de conexin (lnea 11) y se abre el flujo de datos con el almacn de datos (lnea 14). La lnea 15 muestra de forma textual el estado de la conexin. Si la conexin fue exitosa, se desplegar Open. Finalmente se cierra la conexin (lnea 16) para evitar el consumo innecesario de recursos. Si todo ocurri como se esperaba, la salida ser la siguiente:
8.
Aprovechando la flexibilidad de Visual Basic, se puede hacer ms compacto el cdigo. Vea las siguientes equivalencias posibles:
Declaracin, instanciacin y asignacin de cadena de conexin por separado. 1 2 3 4 Dim conn As SqlConnection conn = New SqlConnection() conn.ConnectionString = CadenaDeConexin conn.Open()
Declaracin, instanciacin y asignacin de cadena de conexin por separado. 1 2 3 Dim conn As New SqlConnection() conn.ConnectionString = CadenaDeConexin conn.Open() Declaracin, instanciacin y asignacin de cadena de conexin juntas. 1 2 Dim conn As New SqlConnection(CadenaDeConexin) conn.Open()
503
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As New SqlConnection(Data Source=aprendaws; & _ Initial Catalog=pubs;Persist Security Info=True; & _ User ID=sa;Password=secreto conn.Open() Console.WriteLine(conn.State.ToString()) conn.Close() Console.Write(Pulse INTRO para continuar) Console.ReadLine() End Sub End Module
15
9.
Para implementar la conexin en cualquier otro manejador basta con especificar el espacio de nombres que corresponda, utilizar los objetos Data Provider pertinentes y colocar una cadena de conexin apropiada.
Command
Comando. El objeto Command permite ejecutar comandos sobre un almacn de datos sobre el cual mantenemos conexin; opcionalmente, un comando puede tambin retornar datos extrados del almacn de datos. Un objeto Command siempre acta sobre una conexin abierta (Connection), es de una naturaleza o tipo especfico (CommandType), ejecuta una instruccin determinada (CommandText) y realiza la ejecucin de una manera especfica que determina los efectos producidos por el comando.
504
Propiedades
Propiedad CommandText Utilidad
Devuelve o establece el procedimiento almacenado, la instruccin de SQL o la tabla de la que se extraern datos. Su contenido depende de lo que se especifique en la propiedad CommandType. Obtiene o establece un valor que indica cmo se interpreta la propiedad CommandText. Obtiene o establece el objeto tancia de objeto Command.
Connection
CommandType
Connection
Parameters Transaction
Obtiene el objeto ParameterCollection. Obtiene o establece del objeto la Transaction en la que se ejecuta el objeto Command. Obtiene o establece la manera en que se aplican los resultados de comando a DataRow cuando lo utiliza el mtodo Update del DataAdapter.
UpdateRowSource
Mtodos
Mtodo Cancel Cancel() Accin que realiza
505
Eventos
Evento Disposed Causas que lo originan
La siguiente seccin describe algunas particularidades de los comandos para cada uno de los proveedores de datos ms comunes. Tambin muestra el control por medio del cual los podemos invocar desde Toolbox en Visual Studio.
15
Tipos de comandos
Los tipos de comando que se tienen son los siguientes:
Tipo de comando StoredProcedure Descripcin
Si lo que se va a ejecutar es un procedimiento almacenado (Stored Procedure) de SQL Server o de Oracle, en la propiedad CommandText debe especificarse el nombre del procedimiento almacenado a ejecutar. El procedimiento almacenado puede devolver o no valores.
TableDirect
Si se desea recuperar el contenido de una tabla o tablas, en la propiedad CommandText debe especificarse el nombre de la tabla o tablas a recuperar. Si son ms de una, debe proporcionarse la lista de tablas, separadas por comas, lo que producir como resultado su unin (Join). Si se desea ejecutar una instruccin SQL, en CommandText debe especificarse una instruccin SQL vlida. Dependiendo del manejador de base de datos, es posible que el dialecto SQL cambie; deber ajustarse a las instrucciones SQL reconocidas por el manejador de bases de datos que est utilizando.
Text
En caso de que un comando devuelva valores, es necesario que stos se almacenen en un objeto contenedor de datos. Un objeto contenedor de datos es aqul que puede almacenar datos extrados a travs de un flujo de datos en una conexin abierta. Son objetos contenedores de datos DataSet y DataReader.
506
Mtodo que ejecuta una consulta que retorna un flujo de datos en forma de registros. Este tipo de ejecucin utiliza a DataReader como contenedor de datos. Mtodo que ejecuta una consulta de valor simple, es decir, un solo dato. Este tipo de ejecucin devuelve slo una fila y una columna; al igual que ExecuteReader, utiliza a DataReader como contenedor de datos. Mtodo que ejecuta una instruccin SQL que no devuelve valores, como puede ser INSERT, DELETE o UPDATE.
ExecuteScalar
ExecuteNonQuery
DataReader
Lector de datos. Los Data Provider Objects proporcionan un objeto que permite la lectura de datos slo hacia delante, llamado DataReader. En virtud de que ADO.NET es muy extenso, no profundizaremos en las particularidades de DataReader ms all de lo que requerimos en este momento para comprobar nuestro trabajo con las bases de datos. DataReader es especfico para cada proveedor de datos, por lo cual tendremos SqlDataReader, OleDbDataReader, OracleDataReader y as sucesivamente. DataReader trabaja sobre una conexin abierta a travs de un comando que deber ser ejecutado bajo el mtodo ExecuteReader. En el caso de SQL Server 2000, se puede ejecutar ExecuteXMLReader, aprovechando la compatibilidad con XML que provee el manejador de bases de datos. Cuando ya tenemos el DataReader trabajando en conjunto con una conexin y un comando, podemos leer los datos a travs de un mtodo llamado Read.
DataReader
lee registros de un almacn de datos uno tras otro. Cada registro que lee es puesto en un rea temporal de cach, desde donde los datos pueden ser tomados proporcionando el nombre de los campos a recuperar.
El mtodo Read tiene una doble funcin: primero, evala si es posible cargar un registro al rea de cach; de ser as, carga el registro, y al mismo tiempo devuelve True. Si no es posible cargar un registro al rea de cach, significa que ya hemos llegado al fin de archivo; en ese caso Read no cargar nada al cach y devolver False.
507
Un aspecto importante es que DataReader utiliza totalmente la conexin, de tal forma que no se puede ejecutar sobre la conexin ninguna otra operacin mientras DataReader est en proceso de lectura.
Ejercicio 15.3
Uso de comandos para ejecutar procedimientos almacenados y uso de DataReader En este ejercicio realizaremos una conexin a una base de datos SQL Server mediante programacin y ejecutaremos un comando con el fin de poblar un DataReader y mostrar el contenido. Utilizar gran parte del cdigo del ejercicio anterior y adems consumiremos el procedimiento almacenado TitulosVendidosEstado. 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Console Application, llamado LeeDatos. Edite el programa de tal forma que aparezca de la siguiente manera:
15
Codificacin de LeeDatos Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim Estado As String Console.Write(Siglas del estado: ) Estado = Console.ReadLine() Dim conn As SqlConnection conn = New SqlConnection() conn.ConnectionString = Data Source=aprendaws; & _ Initial Catalog=pubs;Persist Security Info=True; & _ User ID=sa;Password=secreto conn.Open() Dim cmd As SqlCommand cmd = New SqlCommand() cmd.CommandText = _ String.Format(EXEC TitulosVendidosEstado {0}, Estado)
508
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
cmd.Connection = conn Dim Lector As SqlDataReader Lector = cmd.ExecuteReader Do While Lector.Read() Console.WriteLine(Lector(title)) Loop Lector.Close() conn.Close() Console.Write(Pulse INTRO para continuar) Console.ReadLine() End Sub End Module
4.
5. 6.
7.
8. 9.
Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). La conexin se realiza de la misma forma que en el ejercicio anterior. En la lnea 21 se declara la variable a travs de la cual se ha de manejar el comando. En la lnea 22 se asigna una instancia de SqlCommand a la variable que acabamos de declarar. En la lnea 23 se asigna la instruccin SQL que deseamos que se ejecute a travs del comando, y en la lnea 25 especificamos sobre qu conexin se ha de ejecutar el comando. En la lnea 27 se declara una variable para el manejo del lector de datos (DataReader) que, como podr observar, no requiere ser instanciado de forma explcita. En la lnea 28 decimos que el resultado de ejecutar el comando provee de datos al lector. En la lnea 30 comienza la exploracin del lector de datos. Mientras el lector pueda leer un registro de datos, se estar mostrando la columna title. Proporcione como dato de entrada CA. Al ejecutarse el procedimiento almacenado, devolver todos los ttulos vendidos en el estado de California; los datos se asignarn al DataReader. Se muestra el contenido en el Do While. Si todo ocurri como se esperaba, la salida ser la siguiente:
Siglas del estado: CA Secrets of Silicon Valley Is Anger the Enemy? Is Anger the Enemy?
509
Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean Fifty Years in Buckingham Palace Kitchens Sushi, Anyone? Straight Talk About Computers Silicon Valley Gastronomic Treats You Can Combat Computer Stress! Pulse INTRO para continuar
10. Aprovechando la flexibilidad de Visual Basic se puede hacer ms compacto el cdigo. Vea las siguientes equivalencias posibles:
Declaracin, instanciacin y asignacin de cadena de conexin por separado. 1 2 3 4 5 6 Dim cmd As SqlCommand cmd = New SqlCommand() cmd.CommandText = _ String.Format(EXEC TitulosVendidosEstado {0}, Estado) cmd.Connection = conn Dim Lector As SqlDataReader Lector = cmd.ExecuteReader() Declaracin, instanciacin y asignacin de comando y conexin juntas. 1 2 Dim cmd As New SqlCommand( _ String.Format(EXEC TitulosVendidosEstado {0}, _ Estado),conn) Dim Lector As SqlDataReader = cmd.ExecuteReader()
15
Codificacin de LeeDatos Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As New SqlConnection(Data Source=aprendaws; & _ Initial Catalog=pubs;Persist Security Info=True; & _ User ID=sa;Password=secreto conn.Open() Dim cmd As New SqlCommand( _ String.Format(EXEC TitulosVendidosEstado {0}, _ Estado),conn) Dim Lector As SqlDataReader = cmd.ExecuteReader() Do While Lector.Read()
510
19 20 21 22 23 24 25 26 27 28 29 30
Console.WriteLine(Lector(title)) Loop Lector.Close() conn.Close() Console.Write(Pulse INTRO para continuar) Console.ReadLine() End Sub End Module
11. Para implementar la conexin en cualquier otro manejador basta con especificar el espacio de nombres que corresponda, utilizar los objetos Data Provider pertinentes y colocar una cadena de conexin apropiada. FIN DEL EJERCICIO *
Ejercicio 15.4
Altas, bajas, cambios y consultas en modo conectado En este ejercicio realizaremos un actualizador (Alta, Baja, Cambio, Consulta) para la tabla Jobs. Aprovecharemos lo que hemos aprendido para realizar operaciones en modo conectado. 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Console Application, llamado ActPuestos. Edite el programa de tal forma que aparezca de la siguiente manera:
Codificacin de ActPuestos Module1.vb 1 2 3 4 5 6 7 8 Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Dim conn As SqlConnection
511
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
Sub Main() Try Call AbreConexion() Dim Opcion As String Do While Opcion <> X Console.WriteLine(**************************) Console.WriteLine(Opciones de la aplicacin:) Console.WriteLine(A - Alta de registros) Console.WriteLine(M - Modificacin de registros) Console.WriteLine(E - Eliminacin de registros) Console.WriteLine(C - Consulta de registros) Console.WriteLine(X - Salir del programa) Console.Write(Qu opcin desea:) Opcion = Console.ReadLine() Select Case Opcion Case A Call AgregarRegistro() Case M Call ModificarRegistro() Case E Call EliminarRegistro() Case C Call ConsultarRegistros() Case X Exit Do End Select Console.WriteLine(**************************) Loop Call CerrarRecursos() Catch ex As Exception Console.WriteLine(Ha ocurrido un error) Console.WriteLine(ex.Message) Exit Sub End Try End Sub Sub AbreConexion()
15
512
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
conn = New SqlConnection(Data Source=aprendaws; & _ Initial Catalog=pubs;Persist Security Info=True; & _ User ID=sa;Password=secreto) conn.Open() End Sub Sub AgregarRegistro() Console.Write(Descripcin de puesto:) mjob_desc = Console.ReadLine() Console.Write(Nivel mnimo:) mMin_lvl = CType(Console.ReadLine(), Byte) Console.Write(Nivel mximo:) mMax_lvl = CType(Console.ReadLine(), Byte) Dim OrdenSQL As String OrdenSQL = String.Format(INSERT INTO Jobs (Job_desc, & _ Min_lvl, Max_lvl) VALUES ({0}, {1}, {2}), _ mJob_desc, mMin_lvl, mMax_lvl) Dim cmd As New SqlCommand(OrdenSQL, conn) cmd.ExecuteNonQuery() End Sub Sub ModificarRegistro() Console.Write(ID de puesto:) mJob_id = CType(Console.ReadLine(), Integer) Console.Write(Descripcin de puesto:) mJob_desc = Console.ReadLine() Console.Write(Nivel mnimo:) mMin_lvl = CType(Console.ReadLine(), Byte) Console.Write(Nivel mximo:) mMin_lvl = CType(Console.ReadLine(), Byte) Dim OrdenSQL As String OrdenSQL = String.Format(UPDATE Jobs SET Job_desc={0}, & _ Min_lvl={1}, Max_lvl={2} WHERE Job_id={3}, _ mJob_desc, mMin_lvl, mMax_lvl, mJob_id) Dim cmd As New SqlCommand(OrdenSQL, conn) cmd.ExecuteNonQuery() End Sub Sub EliminarRegistro() Console.Write(ID de puesto:) mJob_id = CType(Console.ReadLine(), Integer) Dim OrdenSQL As String OrdenSQL = String.Format(DELETE Jobs WHERE Job_id={0}, _ mJob_id) Dim cmd As New SqlCommand(OrdenSQL, conn) cmd.ExecuteNonQuery() End Sub Sub ConsultarRegistros()
513
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
Dim Lector As SqlDataReader Dim OrdenSQL As String OrdenSQL = SELECT * FROM Jobs Dim cmd As New SqlCommand(OrdenSQL, conn) Lector = cmd.ExecuteReader Do While Lector.Read Console.WriteLine(String.Format({0}, {1}, {2}, {3}, _ Lector(0), Lector(1), Lector(2), Lector(3))) Loop Lector.Close() End Sub Sub CerrarRecursos() If conn.State = ConnectionState.Open Then conn.Close() End If End Sub End Module
15
Ejecucin guiada de ActPuestos Module1.vb 4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). El procedimiento principal se encarga de llamar al procedimiento AbreConexion(), que se encarga de abrir la conexin a la base de datos. Posteriormente, utilizando un Do While propone un men de opciones. Dependiendo de la seleccin que se haga, se ejecutar el procedimiento AgregarRegistro(), que se encarga de agregar un registro a la tabla Jobs; ModificarRegistro() que se encarga de modificar los datos de un registro existente; EliminarRegistro(), que se encarga de eliminar un registro existente, y ConsultarRegistros(), que se encarga de mostrar el contenido de la tabla Jobs. Dependiendo de la operacin a realizar, se preguntarn los datos necesarios, y se construir la sentencia SQL apropiada. Seleccione la opcin C y vea los registros que actualmente tiene la tabla. Seleccione la opcin A y agregue el puesto Vendedor Senior, con nivel mnimo 100 y nivel mximo 175. Vea cmo no se proporciona valor de ID, dado que es Identity y el manejador SQL Server lo asignar automticamente. Seleccione la opcin C y compruebe que el programa agreg el registro. Vea cmo no se proporciona valor de ID, dado que es Identity y el manejador SQL Server lo asignar automticamente.
5.
6. 7.
8. 9.
514
10. Seleccione la opcin M y cambie la descripcin por Vendedor Senior Jr, con nivel mnimo 120 y nivel mximo 175. Deber proporcionar el nmero de ID que automticamente el manejador le proporcion a su registro. 11. Seleccione la opcin C y compruebe que el programa modific el registro. 12. Seleccione la opcin E y elimine el registro que acaba de agregar. Tendr que proporcionar el nmero de ID que automticamente le asign el manejador. 13. Seleccione la opcin C y compruebe que el programa elimin el registro. 14. Esta misma interfaz puede realizarse en Windows o en Web. Finalmente las operaciones terminarn siendo ADO.NET y el manejo es el mismo. 15. Cierre su aplicacin. FIN DEL EJERCICIO *
Ejercicio 15.5
Consumo de cadenas de conexin de app.Config En este ejercicio analizaremos la forma en que se consumen las cadenas de conexin en aplicaciones Windows y Consola, con la finalidad de asegurar el cdigo. Trabajar con el ejercicio 15.2, realizado con anterioridad. 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Uno de los problemas de seguridad es la exposicin de informacin delicada en una cadena de conexin, principalmente nombre de usuario y contrasea. La recomendacin general es que utilice la seguridad integrada de Windows; de esa manera, los procesos de autenticacin (reconocer al usuario) y autorizacin (darle permisos al usuario reconocido) quedan bajo el control del sistema operativo. Para implementar este tipo de autenticacin es necesario agregar en la cadena de conexin el argumento:
Integrated Security=SSPI;
4.
En lugar de:
User ID=usuario;password=contrasea;
5.
La desventaja es que se debe realizar trabajo de asociacin de cuentas de sistema operativo con las bases de datos y sus objetos. Eso implica que todos los que se conectan a los datos deben poder firmarse en el equipo, lo cual abre otras posibilidades de inseguridad, adems de que se requiere una minuciosa administracin de cuentas. Como podr imaginarse, en Web ese esquema no es funcional.
515
6.
Otra desventaja de integrar textualmente la cadena de conexin en nuestros programas es que en caso de que cambie el nombre del servidor, del usuario o la contrasea, tendrn que modificarse todos los programas, y recompilarse. Lo ideal es tener la informacin en un archivo externo de configuracin, que en el caso de aplicaciones de consola y Windows se llama app.config; desde ah la informacin puede consumirse a travs de programacin. En caso de cambios, se modifica el archivo de configuracin que se aplica para todos los programas y automticamente todo se actualiza sin necesidad de recompilar.
15
Codificacin de Conecta Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As SqlConnection conn = New SqlConnection() conn.ConnectionString = Data Source=aprendaws; & _ Initial Catalog=pubs;Persist Security Info=True; & _ User ID=sa;Password=secreto conn.Open() Console.WriteLine(conn.State.ToString()) conn.Close() Console.Write(Pulse INTRO para continuar) Console.ReadLine() End Sub End Module
8.
Generalmente, Visual Studio compila en modo depuracin las aplicaciones (Debug) con lo cual nos asiste en la correccin de problemas. Cuando el programa ya no causa errores y estamos listos para liberarlo, se recomienda construir el programa (Build) en modo liberacin (Release), para proceder a la distribucin.
516
9.
En Solution Explorer haga doble clic en el nodo Conecta de herramientas cambie el modo de compilacin a Release.
Module1.vb.
En la barra
10. En Solution Explorer seleccione el nombre del proyecto Conecta. Despliegue el men contextual y seleccione Rebuild, para reconstruir el ensamblado en modo Release. 11. El ensamblado para distribucin habr quedado en el directorio Bin\Release del proyecto. Como el ensamblado ya es un archivo EXE y no se puede abrir desde un editor de texto, podemos sentirnos seguros de que nadie conocer la informacin de usuario y contrasea de la base de datos No es cierto?
517
15. Expanda el rbol de elementos hasta que ubique el elemento method Main: void(), que es el procedimiento en el que habamos codificado la cadena de conexin. Haga doble clic sobre el elemento y se mostrar el cdigo en su forma administrada (managed).
15
16. Vea en la ilustracin la lnea IL_0007, en donde aparece la cadena de conexin, totalmente legible para el ojo curioso, no siempre bien intencionado. 17. Cierre ILDASM.
518
20. En Solution Explorer haga doble clic sobre el nodo app.config del proyecto Conecta. Con ello se editar el archivo de configuracin. 21. Dentro del elemento <configuration> agregue un elemento <connectionString> y dentro de ste, una cadena de conexin. Las primeras lneas del archivo deben quedar as:
Codificacin de Conecta app.config (parte) 1 2 3 4 5 6 7 8 9 <?xml version=1.0 encoding=utf-8 ?> <configuration> <connectionStrings> <add name=conn connectionString=Server=aprendaws;Initial Catalog=Pubs;User Id=sa;passwrod=secreto/> </connectionStrings> <system.diagnostics> <sources> <source name=DefaultSource switchName=DefaultSwitch> ...
22. El nombre conn asignado al valor de configuracin podr ser invocado programticamente.
519
24. Seleccione el nodo Conecta en Solution Explorer y despliegue el men contextual. Seleccione Add Reference y en la pestaa .NET de la ventana Add Reference seleccione System.Configuration; haga clic en Ok. Con ello se agrega la referencia a System.Configuration.dll. 25. Modifique el programa para que quede de la siguiente forma:
Codificacin de Conecta Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Option Explicit On Option Strict On Imports System.Data.SqlClient Imports System.Configuration
15
Module Module1 Sub Main() Dim conn As SqlConnection conn = New SqlConnection() Dim Settings As ConnectionStringSettings Settings = ConfigurationManager.ConnectionStrings(connStr) conn.ConnectionString = Settings.ConnectionString conn.Open() Console.WriteLine(conn.State.ToString()) conn.Close() Console.Write(Pulse INTRO para continuar) Console.ReadLine() End Sub End Module
26. En la lnea 5 se import el espacio de nombres System.Configuration, necesario para poder disponer de los elementos de app.config. 27. En la lnea 14 se declara una variable que nos servir para leer los valores almacenados en el archivo de configuracin. A la variable le asignamos el valor almacenado en un elemento llamado connStr, dentro de la seccin connectionString del archivo de configuracin (lnea 15). Todos los elementos que hayan sido agregados en la seccin a travs de Add podrn ser recuperados del archivo de configuracin. En la lnea 16, finalmente, se recupera la cadena de conexin de la variable de trabajo, y se le asigna
520
28.
29.
30.
31.
32.
a la propiedad Connection.ConnectionString del objeto de conexin conn. Sobra decir que es posible almacenar ms de una cadena de conexin. Suponga que diez programas utilizan la misma cadena de conexin y ya han sido compilados. Si cambia cualquier cosa en la cadena de conexin, slo basta con modificarla en el archivo de configuracin para que todos los programas funcionen sin modificaciones; en este caso, no sera necesario recompilar los programas. Construya en modo Release el proyecto Conecta, establzcalo como proyecto de inicio (StartUp Project) e inicie la depuracin. El programa debe ejecutarse sin problemas. En la ventana Visual Studio 2005 Command Prompt (lnea de comandos), aplique el comando Dir y vea cmo en modo Release se agreg un archivo de configuracin especfico para el proyecto, llamado Conecta.exe.config. La conexin se realiza, sin que la cadena de conexin est expuesta en el ejecutable. Queda claro que ahora est expuesta en el archivo de configuracin, que es un archivo textual XML, y que puede ser encriptado utilizando las clases del espacio de nombres System.Security.Cryptography.Xml. Cierre su aplicacin, as como Visual Studio 2005 Command Prompt.
521
MAPA
15
522
TERMINOLOGA
Actualizaciones por lotes, 477 ADO, 476 ADO.NET, 476 app.config, 515 Base de datos conectada, 477 desconectada, 478 Batch updates, 477 BeginTransaction, 497 Cancel, 504 Client, 494 Close, 498 Command, 492, 503 Builder, 494 CommandText, 504 CommandType, 504 Connection, 492, 504 Pooling, 499 StringBuilder, 494 Timeout, 499 ConnectionString, 497 ConnectionTimeout, 497 Constraint, 496 CreateCommand, 498 CreateParameter, 504 DAO, 474 Data Provider Objects, 491 Motor de base de datos Jet, 474 DataAdapter, 493 Multiple Active Database, 497 Result Sets, DataColumn, 495 476 DataReader, 493, .NET Data 506 Provoders, 476 DataRelation, 496 .NET Framework DataRow, 495 Data Provider, DataSet Objects, 481 491 OCI, 473 DataSet, 495 ODBC, 473 Datasource, 497 OLE DB, 475 DataTable, 495 Consumer, 475 DataView, 495 OleDbCommand, DBLib, 473 493 Dispose, 498, 504 OleDbConnection, Disposed, 498, 505 493 Error, 494 OleDbDataAdapter, Exception, 494 493 ExecuteNonQuery, OleDbDataReader, 506 493 ExecuteReader, 506 Open, 498 ExecuteScalar, 506 OracleCommand, ILDASM.EXE, 516 493 Integrated Security, OracleConnection, 499 493 Lector de datos, OracleData 506 Adapter, 493 Liberacin, 515 OracleDataReader, MARS, 476 493 Modo Parameter, 494 conectado, 480 Parameters, 504 parcialmente Password, 499 conectado, 480 Permission, 494 totalmente Procedimientos desconectado, almacenados, 480 488 Source, 499 Proveedor de datos .NET Framework, 481 Proveedores de datos de .NET, 476 Provider, 499 Query Designer, 487 RDO, 475 Release, 515 Remote Data Objects, 475 Server Explorer, 482 SqlCommand, 493 SqlConnection, 493 SqlDataAdapter, 493 SqlDataReader, 493 State, 497 StateChanged, 498 Stored Procedures, 488 StoredProcedure, 505 SuperVersion, 497 TableDirect, 505 Text, 505 Transaction, 494, 504 UDA, 475 Universal Data Access, 475 UpdateRowSource, 504 User ID; 499 Web.Config, 517
523
PREGUNTAS
15.1 Cules son las fases evolutivas del acceso a las bases de datos en forma programtica? 15.2 Explique cules son las diferencias entre el esquema conectado y el esquema desconectado de bases de datos. 15.3 Explique los objetos Data
Provider Objects. Objects.
15
15.5 Explique los tipos de comando y los tipos de ejecucin del objeto Command. 15.6 Para qu sirve DataReader?
524
Notas:
525
EXAMEN
15
CAPTULO
16
y la forma de poblar un
5. Aprender a utilizar el objeto DataSet para crear actualizadores usando Visual Studio.
527
528
Contenido
Modelo de objetos DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funcionalidad de las colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . For Each y la lectura de colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . Independencia de DataSet respecto del almacn de datos . . . . . . . . . Alternativas para poblar de datos un DataSet . . . . . . . . . . . . . . . . . . . . . . . . DataAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Miembros ms utilizados en DataAdapter . . . . . . . . . . . . . . . . . . . . . . DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Miembros ms utilizados en DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . Categoras de objetos de DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DataSet y XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cargado de datos en un DataSet de forma programtica . . . . . Uso de Data Sources, Typed Datasets y relaciones padre-hijo . . Creacin de un origen de datos (Data Source) . . . . . . . . Creacin de una aplicacin de navegacin de datos desde Data Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adicin de registros en modo desconectado y duplicacin de modificaciones al almacn de datos . . Generacin de interfaz con registros padre-hijo en tiempo de diseo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Actualizador de registros con Data Sources y enlazado de datos a un cuadro combinado . . . . . . . . . . . . . . . . . . . . . . . . Personalizacin de cuadros combinados de tablas relacionadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529 531 533 534 534 535 536 538 539 541 541 542 545 545 550 554 555 556 557 562 563 564 566
529
Uno de los rasgos que caracteriza a toda base de datos es la forma en que maneja las relaciones entre sus tablas. El concepto es tan importante que permite clasificarlas en las que son relacionales y las que no lo son. El manejo de relaciones es fundamental e implica el reconocimiento de llaves primarias y forneas, la existencia de campos de coincidencia y la existencia de reglas de integridad entre las tablas. Si no somos capaces de trabajar todos esos conceptos al momento de programar, podemos decir que estamos desarrollando aplicaciones de bases de datos, pero no podremos decir que programamos aplicaciones de bases de datos relacionales. No obstante que las bases de datos, bajo el esquema conectado, permiten un manejo directo y sencillo de los datos, tienen una desventaja que resulta crtica: no tienen la capacidad de manejar bases de datos en su dimensin relacional. Si lo analiza detenidamente, se dar cuenta de que trabajamos slo con matrices bidimensionales de datos (tablas, filas/columnas), y que todo manejo relativo a la dependencia entre tablas, restricciones de integridad, manejo de llaves, etctera, debemos controlarlo a travs de programacin. Esto equivale a desperdiciar la capacidad de control que el manejador de base de datos relacional posee, por lo que sera igual cargar los datos en Access, SQL Server, un archivo en Excel o un archivo de texto simple. Para aprovechar todo el poder de las bases de datos relacionales es necesario utilizar el objeto DataSet, sobre el que recae la posibilidad de manejo de bases de datos desconectadas en ADO.NET. Al usar DataSet dispondremos automticamente de un modelo de base de datos relacional de parte del cliente, independiente del almacn de datos.
16
530
Exploraremos cada uno de los objetos que componen el modelo de objetos DataSet de manera detallada. A nivel modelo de objetos es importante lo siguiente: 1. En resumen, tenemos un modelo de base de datos (DataSet) que se compone de tablas (DataTable) relacionadas entre s (DataRelation); las tablas se componen a su vez de campos (DataColumn), de los cuales tendremos ocurrencias o filas (Rows) que debern atender algunas restricciones (Constraint). En el plano especfico la organizacin est basada en colecciones: a) Todo el modelo se subordina al DataSet. b) Las tablas se almacenan en una coleccin perteneciente a DataSet llamada DataTable Collection. c) Cada tabla contiene su coleccin para almacenar sus columnas (DataColum Collection), filas (DataRowCollection) y restricciones (ConstraintCollection). d) Las relaciones entre tablas pertenecen al modelo de datos, no a las tablas, y se almacenan en una coleccin llamada DataRelationCollection. e) Aunque no son parte necesaria del modelo, se pueden tener vistas parciales de las tablas, especificando columnas y filtros especficos, utilizando el objeto DataView. Un DataSet puede tener muchas tablas (objetos DataTable), que se organizan en una coleccin llamada DataTableCollection; cada tabla se compone de un conjunto de campos (objetos DataColumn), que se organizan en una coleccin llamada DataColumCollection. Cada tabla puede contener uno, varios o ningn registro; sin importar cuantos registros se tengan, cada registro es un objeto DataRow que se almacena en una coleccin llamada DataRowCollection asociado a la tabla. Una vez que existen las tablas es posible establecer restricciones aplicables a sus campos (objetos Constraint), a efecto de que se respete la integridad referencial del modelo de datos. Las restricciones se organizarn en una coleccin llamada ConstraintCollection. Tambin es posible establecer dependencia padre/hijo entre tablas (DataRelation) al especificar relaciones entre ellas; stas se organizarn en una coleccin llamada DataRelationCollection. Si se desea tener una vista parcial de los datos de una tabla, se puede utilizar el objeto
DataView.
2.
531
Alias
16
Con el uso de propiedades podemos saber cuntos elementos componen la coleccin (Collection.Count), as como extraer cualquiera de ellos y disponer de sus propiedades particulares (Collection.Item). Mediante el uso de mtodos podemos agregar objetos a la coleccin (Collection.Add), eliminar todos los elementos de la coleccin (Collection.Clear), copiar los elementos a un arreglo (Collection.CopyTo), y eliminar cualquier elemento (Collection.Remove). Si queremos saber si un elemento existe o no, podemos utilizar (Collection.Contains). Las colecciones almacenan referencias a un determinado tipo de objeto; cada objeto referido a una coleccin constituye un elemento (Item), que se organiza en la coleccin en forma de un arreglo de base cero. Suponga que tiene un DataSet de nombre dsBasica; suponga tambin que dicho DataSet se compone de cuatro tablas llamadas Clientes, Proveedores, Movimientos e Histrico.
532
Todo es un objeto en .NET: dsBasica es un objeto DataSet y cada una de las tablas es un objeto DataTable. En ese sentido, la coleccin Tables almacena la referencia de los cuatro objetos DataTable.
Tables
La siguiente lnea nos despliega en la consola cuntos elementos existen en la coleccin de dsBasica:
Console.WriteLine(dsBasica.Tables.Count())
Devuelve un valor de 4 pues existen cuatro objetos DataTable referidos en la coleccin. Como la coleccin almacena los elementos con base cero, los subndices de referencia seran 0, 1, 2 y 3. Para conocer el nombre de cada una de las tablas almacenadas en Tables podramos recurrir al siguiente cdigo:
Console.WriteLine(dsBasica.Tables.Item(0).TableName) Console.WriteLine(dsBasica.Tables.Item(1).TableName) Console.WriteLine(dsBasica.Tables.Item(2).TableName) Console.WriteLine(dsBasica.Tables.Item(3).TableName)
Cada una de las lneas mostr la propiedad TableName del elemento especificado a travs del subndice proporcionado, que deber estar entre 0 y el mximo subndice posible, es decir, el nmero de elementos menos uno. Como puede ver es una forma poco adecuada para examinar la coleccin; si la coleccin hiciera referencia a 1000 objetos en lugar de 4, el cdigo sera bastante ineficaz. NOTA
Un error comn es utilizar el nmero de elementos (Count) como subndice, lo que provoca error en tiempo de ejecucin. Si la coleccin tiene cinco elementos (n), y el primero tiene un subndice de cero que aumenta progresivamente sobre base entera, el mximo subndice posible ser el total de elementos menos uno (n-1).
533
Tambin podemos recurrir al siguiente cdigo, que sera la automatizacin del anterior, y que proporcionara los mismos resultados:
Dim i As Integer For i=0 To (dsBasica.Tables.Count() 1) Console.WriteLine(dsBasica.Tables.Item(i).TableName) Next i
Es sencillo, con la salvedad de que el cdigo puede ser bastante complejo y las lneas bastante largas. Podemos simplificar un poco ms el cdigo asignando la coleccin a un objeto:
Dim i As Integer Dim MisTablas As DataTableCollection = dsBasica.Tables For i=0 To (MisTablas.Count() 1) Console.WriteLine(MisTablas.Item(i).TableName) Next i
16
El hecho de que un objeto haga las veces de una coleccin permite ver al cdigo en trminos ms sencillos. Esa posibilidad da paso a la estructura de control For Each.
Para poder trabajar, For Each requiere de una variable de trabajo de la misma naturaleza que los objetos referidos por la coleccin. Continuando con nuestro ejemplo, el cdigo para mostrar el nombre de cada uno de los elementos de la coleccin sera el siguiente:
Dim TablaEnColeccion As DataTable For Each TablaEnColeccion In dsBasica.Tables Console.WriteLine(TablaEnColeccion.TableName) Next TablaEnColeccion
Lo que hace For Each es que cada elemento de la coleccin se asigna a la variable de trabajo; dentro del bloque de cdigo entre For Each y Next se puede utilizar la variable de trabajo como si estuviramos trabajando con el elemento de la coleccin. Si la coleccin tiene 1 o 1000 elementos, el cdigo es el mismo. El cdigo anterior es equivalente al siguiente, que es marcadamente ms complejo:
534
Dim TablaEnColeccion As DataTable TablaEnColeccion = dsBasica.Tables.Item(0) Console.WriteLine(TablaEnColeccion.TableName) TablaEnColeccion = dsBasica.Tables.Item(1) Console.WriteLine(TablaEnColeccion.TableName) TablaEnColeccion = dsBasica.Tables.Item(2) Console.WriteLine(TablaEnColeccion.TableName) TablaEnColeccion = dsBasica.Tables.Item(3) Console.WriteLine(TablaEnColeccion.TableName)
Escoja la forma ms conveniente. Imagine que son 500 elementos en la coleccin, cul opcin le conviene?
535
3.
XML. Si los datos provienen de estructuras de datos XML vlidas. Este tipo de almacn de datos es muy utilizado en aplicaciones de cmputo mvil, ya que no es necesario consumir recursos para almacenar y recuperar datos.
Dependiendo de las necesidades de la aplicacin, se puede tener una combinacin de diferentes orgenes a fin de incrementar la confiabilidad y el tiempo de respuesta de la aplicacin.
DataAdapter
Adaptador de datos. El objeto DataAdapter, es un conjunto de comandos y conexiones que sirve de interfaz entre el almacn de datos y DataSet. no interacta de ninguna forma con el almacn de datos de manera directa; Data acta como puente entre DataSet y el almacn de datos para efectuar cualquier operacin de recuperacin o escritura.
DataSet Adapter
16
En caso de que los datos que han de poblar un DataSet provengan de un almacn de datos, primero se cargan en el DataAdapter para luego trasladarse al DataSet mediante el uso del mtodo Fill. Fill define una tabla dentro del DataSet, trasladando los datos contenidos en la tabla ms la definicin bsica de los campos. Inicialmente, la definicin de los campos incluye slo el nombre del campo y el tipo de dato, dejando fuera importantes cuestiones como la longitud mxima permitida, la capacidad de permitir valores nulos, etctera. Debido a lo bsico de la definicin de campos realizada por Fill, se dice que se tiene un DataSet sin tipos (Untyped DataSet). El mtodo FillSchema se emplea para trasladar las especificaciones de tipo, longitud y restricciones al DataSet, de tal manera que la representacin de la base de datos en memoria y en el almacn fsico de datos concuerde. Cuando DataSet representa de manera completa los atributos del modelo de datos en el almacn fsico, se dice que se tiene un DataSet con tipos (Typed DataSet). La especificacin generalmente se hace a travs de XML y XSD. Es importante aclarar que los datos que han de poblar un objeto DataSet no siempre provienen de un almacn de datos; es posible, incluso, que DataSet pueda generarse de manera programtica en forma totalmente independiente de cualquier almacn de datos. En ese entendido, es posible utilizar DataSet sin su correspondiente objeto DataAdapter, si es que la aplicacin nada tiene que ver con un almacn de datos; en ese escenario, tambin saldra sobrando una conexin.
536
Dependiendo del proveedor de datos se utilizar un diferente DataAdapter (SqlDataAdapter, OleDbDataAdapter, OracleDataAdapter). En este libro lo consideraremos de forma genrica.
Propiedades
Propiedad AcceptChangesDuringFill Utilidad
Obtiene o establece un valor que indica si debe llamarse al mtodo AcceptChanges en DataRow despus de agregarse a DataTable durante cualquiera de las operaciones Fill. Obtiene o establece un procedimiento almacenado o una instruccin de Transact-SQL para eliminar registros de un conjunto de datos. Obtiene o establece un procedimiento almacenado o una instruccin de Transact-SQL para insertar nuevos registros en el origen de datos. Obtiene o establece un procedimiento almacenado o una instruccin de Transact-SQL para seleccionar registros en el origen de datos. Obtiene o establece un procedimiento almacenado o una instruccin de Transact-SQL para actualizar los registros del orien de datos.
DeleteCommand
InsertCommand
SelectCommand
UpdateCommand
Las propiedades DeleteCommand, InsertCommand, SelectCommand y UpdateCommand son denominadas propiedades de ejecucin; usualmente se debe definir como mnimo Select Command (propiedad por omisin de DataAdapter); el resto de las propiedades de ejecucin se pondrn en funcionamiento al aplicar el mtodo Update, mismo que reproducir las modificaciones realizadas en DataSet en el almacn de datos.
537
Mtodos
Mtodo Dispose Dispose() Accin que realiza
Agrega filas a DataSet o las actualiza para que coincidan con las filas del origen de datos. Este mtodo devuelve el nmero de filas actualizadas correctamente en el DataSet.
Fill(dataset As DataSet, nombre As String)
Agrega filas a DataSet o las actualiza para que coincidan con las filas del origen de datos. dataSet es el nombre del objeto DataSet al cual se le agregarn los datos, mientras que nombre es el nombre bajo el cual se identificar en DataTable en el que se cargarn los datos. Este mtodo devuelve el nmero de filas actualizadas correctamente en el DataSet.
FillSchema FillSchema(dataSet, esquema As SchemaType)
16
Agrega un DataTable a un DataSet y configura el esquema para hacerlo coincidir con el del origen de datos. El esquema determina la fuente de definiciones para los elementos de la base de datos de parte del cliente. Puede ser SchemaType. si se desea que se apliquen las asignaciones del DataAdapter; esta es la opcin por omisin, y hace coincidir el modelo de datos entre el almacn de datos y la copia local. Tambin puede ser SchemaType.Source, si se desea hacer caso omiso a las definiciones en DataAdapter.
GetFillParameters GetFillParameters() Mapped,
Obtiene los parmetros establecidos por el usuario al ejecutar una instruccin SELECT de SQL.
Update Update(dataSet)
Llama a las instrucciones INSERT, UPDATE o DELETE respectivas para cada fila insertada, actualizada o eliminada en DataSet. Este mtodo devuelve el nmero de filas actualizadas correctamente en el almacn de datos.
538
Finalize
Finalize()
Permite que un objeto Object intente liberar recursos y realizar otras operaciones de limpieza antes de que el objeto Object sea reclamado por el recolector de elementos no utilizados. En C# y C++, los finalizadores se expresan mediante la sintaxis del destructor.
OnFillError OnFillError()
Eventos
Evento Disposed FillError RowUpdated Causas que lo originan
Se produce cuando el objeto ha sido eliminado. Se devuelve cuando se produce un error durante una operacin de relleno. Se produce durante Update despus de que se ejecute un comando en el origen de datos. Se hace un intento de actualizacin, de manera que se inicia el evento. Se produce durante Update antes de que se ejecute un comando en el origen de datos. Se hace un intento de actualizacin, de manera que se inicia el evento.
RowUpdating
DataSet
Conjunto de datos. El objeto DataSet es el elemento ms poderoso de ADO.NET y representa la copia local y desconectada, residente en memoria, de datos organizados bajo el modelo relacional.
Al rea en memoria donde se almacena la copia local y desconectada de los datos del DataSet se le llama cach. En dicho espacio, DataSet permite almacenar un pequeo modelo relacional en la memoria del equipo local; su organizacin se basa en colecciones Tables, Rows, Columns, Constraints y Relations que simulan lo que en los manejadores de base de datos relacional se almacena en las tablas del sistema. A toda la informacin que especifica cmo se han de almacenar los datos en memoria y a las restricciones pertinentes se le denomina esquema (schema). Mantener el control del es-
539
quema produce muchos beneficios en el mbito relacional, pero hace que trabajar con DataSet sea ms complejo que trabajar con DataReader. DataSet agrega una capa ms de objetos, lo que exige ms recursos del equipo; si su aplicacin no amerita trabajar con bases de datos desconectadas, procure evitar el uso de DataSet.
Propiedades
Propiedad CaseSensitive Utilidad
16
Obtiene o establece un valor que indica si las comparaciones de cadena en los objetos DataTable distinguen entre maysculas y minsculas. Obtiene o establece un valor que indica si se siguen las reglas de restriccin al intentar realizar cualquier operacin de actualizacin. Obtiene la coleccin de relaciones que vincula las tablas y permite el desplazamiento desde las tablas primarias a las secundarias. Obtiene la coleccin de tablas incluidas en DataSet.
EnforceConstrains
Relations
Tables
Mtodos
Mtodo Clear Clear() Accin que realiza
Borra cualquier dato de DataSet mediante el procedimiento de quitar todas las filas de todas las tablas.
Clone Clone()
Copia la estructura de DataSet, incluidos todos los esquemas, relaciones y restricciones de DataTable. No copia ningn dato.
540
Copy
Copy()
Devuelve el esquema XSD para la representacin XML de los datos almacenados en DataSet.
ReadXml ReadXml()
Restablece el estado original del DataSet. Las subclases deben reemplazar a Reset para restaurar el estado original de un DataSet.
WriteXml WriteXml()
Eventos
Evento Disposed Causas que lo originan
541
Objetos de datos. Son los que tienen por objeto almacenar los datos. e) DataRow
16
DataSet y XML
DataSet
est muy vinculado a XML por ser ste el convencionalismo utilizado para comunicar paquetes de datos y organizar el contenido de los objetos en cach. Los datos en DataSet no se almacenan en formato binario o en tecnologa propietaria, sino en lenguaje XML. Ese hecho permite una universalidad que sin duda facilitar la implementacin de los lenguajes .NET en plataformas distintas a los sistemas operativos de Microsoft.
Esta vinculacin hace necesario establecer la referencia hacia la librera System.Xml.dll al momento de compilar cualquier programa que haga uso de intercambio de datos con DataSet. Sobra decir que al trabajar con Visual Studio no es necesario establecer las referencias manualmente, dado que al detectarse el uso de elementos que requieren la librera, sta es incluida. Los mtodos que permiten la funcionalidad XML de DataSet son los siguientes: GetXML. Devuelve la representacin XML de los datos almacenados en DataSet. GetXMLSchema. Devuelve el esquema XSD para la representacin XML de los datos almacenados en DataSet. ReadXML. Lee el esquema y los datos XML del DataSet. ReadXMLSchema. Lee un esquema XML en el DataSet. WriteXML. Escribe datos XML y, de forma opcional, el esquema del DataSet. WriteXMLSchema. Escribe la estructura del DataSet como un esquema XML.
542
Ejercicio 16.1
Cargado de datos en un DataSet de forma programtica En este ejercicio realizaremos la carga de datos de un objeto DataSet utilizando un adaptador de datos. Suponga que tiene una instancia de SQL Server, de nombre APRENDAWS. Imagine que desea establecer una conexin con la base de datos de prueba Pubs y que se enlazar utilizando la cuenta de administracin sa, cuya contrasea es secreto. La tabla de la que queremos ver los datos es la tabla Jobs. 1. 2. 3. 4. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Windows Application, llamado VerPuestos. Agregue una rejilla de datos (DataGridView). Distribuya los objetos de la siguiente forma:
5.
543
La propiedad DataGridView.ReadOnly hace que los objetos sean de slo lectura, con lo que evitamos modificaciones inesperadas en el programa. Haga doble clic en la barra de herramientas del formulario y modifique el programa para que luzca de la siguiente manera:
Codificacin de VerPuestos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Option Explicit On Option Strict On
Module1.vb
Imports System.Data.SqlClient Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim conn As SqlConnection conn = New SqlConnection() conn.ConnectionString = Data Source=aprendaws; & _ Initial Catalog=pubs;Persist Security Info=True; & _ User ID=sa;Password=secreto conn.Open() Dim Datos As New DataSet Dim Adaptador As New SqlDataAdapter( _ select * from jobs, conn) Adaptador.Fill(Datos, Puestos) conn.Close() dgvPuestos.DataSource = Datos.Tables(Puestos) dgvPuestos.Refresh() End Sub End Class
16
Module1.vb
9.
Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). De la lnea 12 a la 17 se hace una conexin comn a la base de datos.
544
10. En la lnea 19 se declara un objeto DataSet. En la lnea 20 se declara un objeto DataAdapter, que se encargar de resolver las discrepancias entre la forma en que DataSet y SQL Server representan el mismo modelo de datos. El constructor recibe dos parmetros: primeramente se proporciona una consulta de referencia que se almacena directamente en la propiedad SelectCommand de DataAdapter y determina el contenido de un miembro contenido en DataSet; posteriormente se proporciona la conexin sobre la que se intentarn las operaciones. DataSet constituye para nuestro objeto DataGridView un origen de datos (data source) en s mismo y todas sus tablas constituyen un miembro de datos (data member), que en caso de ser ms de uno, deber especificarse de manera explcita. 11. Al aplicar el mtodo DataAdapter.Fill de nuestro adaptador (lnea 22), se cargan los datos contenidos en el almacn de datos a la copia local (DataSet). El constructor recibe dos argumentos: el nombre del DataSet al que ser agregado el resultado de la consulta y el nombre de miembro que se desea asignar a dicho resultado. A fin de cuentas, al DataSet llamado Datos se le agreg un DataTable que representa el miembro Puestos. 12. Vea cmo la conexin se cierra en la lnea 24, pero eso ya no importa, dado que ya tenemos los datos de la base en nuestra copia local. Todas las operaciones que podamos realizar con el almacn de datos tambin son posibles ahora en nuestra copia local. 13. En la lnea 26 se especifica que el origen de datos de nuestra rejilla es el miembro Puestos de nuestro DataSet. 14. En la lnea 27 se refresca la rejilla de datos a fin de que muestre los datos finales. Si todo funcion bien, nuestro programa mostrar los datos.
545
Ejercicio 16.2
Uso de Data Sources, Typed Datasets y relaciones padre-hijo
En este ejercicio realizaremos un actualizador de puestos utilizando las facilidades visuales que Visual Studio nos ofrece para el trabajo con bases de datos desconectadas. La tabla de la cual queremos editar los datos es la de puestos (Jobs); cada registro de la tabla puede estar siendo utilizado por empleados que tienen asignado un puesto (employee), por lo que entre las tablas existe una relacin padre-hijo. Este ejercicio requiere que se haya realizado el ejercicio 16.1, que defina una conexin a base de datos, que en nuestro caso se llama aprendaws.pubs.dbo, y en su caso se llamar instancia.pubs.dbo, donde instancia es el nombre de su servidor SQL Server. 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Windows Application, llamado Puestos. Modifique las siguientes propiedades:
Propiedad Form1.Text Valor a asignar
16
Actualizador de puestos
546
5.
En Data Sources haga clic en el vnculo Add New Data Source..., o seleccione la opcin Data Add New Data Source, para agregar un origen de datos al proyecto. Aparecer el asistente Data Source Configuration Wizard, que permite seleccionar entre diferentes fuentes de datos para el origen de datos: Database, si se trata de una conexin a un almacn fsico de datos; Web Service, si se trata de una peticin de datos va Web, u Object, si se trata de cualquier contenedor de datos reconocido y existente, como podra ser un objeto de negocio. Lo ms comn es una base de datos. Seleccione Database y haga clic en Next>.
547
6.
El asistente nos permitir seleccionar una conexin de las definidas en nuestra solucin. Seleccione la conexin instancia.pubs.dbo. Nuestra conexin se realiza utilizando la cuenta sa y la contrasea secreto. En produccin es una muy mala prctica utilizar la cuenta sa de SQL Server; pero peor an es incluir la contrasea de dicha cuenta en la cadena de conexin. Por cuestiones de simplicidad incluimos esta prctica, pero en entornos reales no lo haga (ms adelante le diremos cmo manejar la conexin en forma segura). Haga clic en el botn de opcin Yes, include sensitive data in the connection string. Si hace clic en [+] Connection String se dar cuenta de que la cadena de conexin expone informacin sensible (usuario y contrasea). Haga clic en el botn Next.
16
7.
El asistente permitir almacenar la cadena de conexin en el archivo de configuracin de la aplicacin. Por lo pronto tome nota del nombre que le asigna a la conexin en el archivo de configuracin: pubsConnectionString. Haga clic en el botn Next.
548
8.
El asistente mostrar los elementos de la base de datos que se pueden representar en un Data Source. Expanda el nodo Tables y seleccione las tablas Employee y Jobs. Vea cmo el DataSet recibir el nombre de pubsDataSet. Haga clic en el botn Finish.
9.
Al hacer clic Visual Studio generar un Data Source y lo incluir en su proyecto bajo la extensin XSD. Adems de eso, agregar un archivo de configuracin de la aplicacin llamado, en el caso de las aplicaciones Windows, app.config. En ese archivo se agregar la cadena de conexin, para en un futuro poder utilizar la referencia a la constante que determinamos (pubsConnectionString), y que el usuario y la contrasea de la conexin no estn expuestos en el cdigo. 10. Vaya a Solution Explorer, identifique el archivo pubsDataSet.xsd y haga doble clic en l. Aparecer la representacin grfica del modelo de datos que actualmente tenemos en memoria. Como vemos, incluye los campos de las tablas seleccionadas, pero no slo eso, ya que adems reconoce una relacin entre ellas; esto es un gran paso, ya que en el esquema conectado la representacin de relaciones no era posible, dado que todo era un arreglo bidimensional de datos. Vea cmo tambin hay reconocimiento de llaves primarias.
549
16
11. En Solution Explorer haga doble clic sobre el nodo app.config y compruebe que en el elemento <configuration> existe otro elemento llamado <connectionStrings>, que incluye la definicin de nuestra cadena de conexin. 12. Vea cmo Data Sources ha experimentado cambios.
550
15. En Data Sources aparece el DataSet que se defini y, en forma jerrquica, aparecern las tablas y las columnas que lo componen. Cada nodo de tabla y campo posee un selector de estilo que permite determinar la forma en que el objeto aparecer en una interfaz grfica. En el caso de los nodos que representan tablas, se puede seleccionar entre vista de rejilla (DataGridView), detalle de registro individual (Details) o no darle forma en interfaz (None). 16. Seleccione el nodo Jobs y especifique el estilo Details.
551
16
17. En el caso de los nodos que representan columnas, los estilos disponibles son los siguientes: a) b) c) d) e) f) g) TextBox, para un cuadro de texto ComboBox, para una lista desplegable de opciones Label, para que aparezca como etiqueta LinkLabel, para que aparezca como vnculo ListBox, para que aparezca como una lista de seleccin DateTimePicker, en el caso de campos de fecha None, en caso de que no queramos que aparezca en la interfaz.
18. Seleccione Jobs.min_lvl y el estilo NumericUpDown. Haga lo mismo con Jobs. max_lvl. Finalmente seleccione Job_id y seleccione el estilo Label para asegurarnos que no se modificar directamente la llave primaria. Es recomendable proteger las llaves primarias, particularmente cuando su modificacin implica la necesidad de cambiar tambin datos en tablas relacionadas.
552
19. Arrastre el nodo Jobs de Data Sources a su formulario y vea lo que pasa.
553
20. Acaba de crear una interfaz de edicin y navegacin de datos sin haber utilizado una sola lnea de cdigo. Por cada columna se agregaron objetos que permiten la visualizacin y edicin de datos; a partir de estos objetos puede modificar propiedades. Por ejemplo, para el caso de la ilustracin anterior, seleccionamos el objeto tipo Label en el que se mostrar Job_id y le cambiamos la propiedad Label.BorderStyle a Fixed3D. 21. Vea cmo en la parte baja aparecen los objetos que no tienen representacin grfica en la interfaz. Se coloc el DataSet que ya tenamos creado (PubsDataSet) y se cre un manejador de enlace de datos (BindingSource) de nombre JobsBindingSource. Se cre tambin un BindingNavigator, de nombre JobsBindingNavigator, que permite la navegacin entre registros. Finalmente tenemos un DataAdapter que permitir que los cambios que realicemos en el DataSet de forma desconectada puedan ser enviados al almacn de datos al aplicar el mtodo DataAdapter.Update. 22. Se le llama data bound controls a los elementos de la interfaz involucrados en operaciones de enlazado de datos con una fuente de datos; a esto se le conoce como Data Binding. Al proporcionar un estilo a los elementos en Data Sources, cada elemento puede ser integrado con un simple arrastrar y colocar en la interfaz; dependiendo del estilo, se asumirn propiedades estndar que pueden ser modificadas. Si ya se tiene un control y se desea que opere como data bound control, basta con arrastrar el elemento a enlazar al control, para que la asociacin se realice. 23. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 24. La barra de navegacin (BindingNavigator) sirve para la navegacin entre los registros de un DataSet y se compone de la siguiente manera: FIGURA 16.3 Binding Navigator.
16
554
25. Vaya al final, retroceda cuatro registros y vaya al inicio. Compruebe la forma en que los registros estn asociados a la barra de navegacin. 26. Cierre la aplicacin.
Al aplicar el mtodo DataAdapter.Update se har una revisin de los objetos DataRow de la tabla; si DataRow.RowState es Added, se ejecutar el comando establecido en DataAdapter.InsertCommand sobre el almacn de datos; si es Deleted, se ejecutar el comando DataAdapter.DeleteCommand; si es Modified, se ejecutar el comando DataAdapter.UpdateCommand. 29. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 30. Vea el nmero de registros que reporta la barra de navegacin. 31. Haga clic en agregar (Add new) , en la barra de navegacin. Vea cmo en la barra de navegacin se reporta un nuevo registro. En Job desc, coloque Vendedor Senior, en min lvl coloque 70 y en max lvl coloque 100. Este nuevo registro (DataRow) tendr un estado (RowState) de agregado (Added). 32. Haga clic en guardar cambios (Save data) , en la barra de navegacin. Se disparar el mtodo DataAdapter.Update del adaptador que controla la informacin de la tabla; el proceso revisar el estado de todos los registros que tienen el estado Unchanged.
555
Slo encontrar un registro con estado Added, que provocar que se ejecute sobre el almacn de datos el comando guardado en DataAdapter.InsertCommand. El almacn de datos estar actualizado, y no hemos tenido la necesidad de codificar nada. 33. Cierre la aplicacin.
16
556
dingSource), as como un DataAdapter, por si se editan los datos desde la rejilla de datos que acabamos de agregar. 39. Construya la solucin (oprima las Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (F5). 40. Utilice la barra de navegacin a discrecin y vea la manera en que se enlazan dinmicamente los registros de ambas tablas. En caso de que existan empleados con un determinado puesto, se mostrarn en la rejilla, cuando el puesto que tiene est en los campos de detalle. 41. Nuestra interfaz se ve de la siguiente manera:
Ejercicio 16.3
Actualizador de registros con Data Sources y enlazado de datos a un cuadro combinado En este ejercicio realizaremos un actualizador de ventas de ttulos, utilizando Data Sources. Se ver la forma en que se pueden agregar expresiones a un origen de datos. Este ejer-
557
cicio requiere que se haya realizado el ejercicio 16.1, que defina una conexin a base de datos, que en nuestro caso se llama aprendaws.pubs.dbo, y en su caso se llamar instancia.pubs.dbo, donde instancia es el nombre de su servidor SQL Server. 1. 2. 3. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). Agregue a su solucin un proyecto Windows Windows Application, llamado Ventas. Modifique las siguientes propiedades:
Propiedad Form1.Text Valor a asignar
Registro de ventas
4.
5.
6. 7. 8.
Agregue el origen de datos que requiere el programa. Abra la herramienta Data Sources, con la opcin Data Show Data Sources (oprimas las teclas Mays-Alt-D); fije la herramienta en el rea de trabajo de Visual Studio. En Data Sources haga clic en el vnculo Add New Data Source..., o seleccione la opcin Data Add New Data Source, para agregar un origen de datos al proyecto. Aparecer el asistente Data Source Configuration Wizard. Seleccione Database y haga clic en Next>. Seleccione la conexin instancia.pubs.dbo. Haga clic en el botn de radio Yes, include sensitive data in the connection string. Haga clic en el botn Next. El asistente permitir almacenar la cadena de conexin en el archivo de configuracin de la aplicacin. Deje el nombre que se propone por omisin y haga clic en el botn Next. El asistente mostrar los elementos de la base de datos que se pueden representar en un Data Source. Expanda el nodo Tables y seleccione las tablas Sales, Stores y Titles. Vea cmo el DataSet recibir el nombre de pubsDataSet. Haga clic en el botn Finish.
16
558
11. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 12. Vea cmo en el cuadro combinado asociado a stor id aparecen los cdigos, y no las descripciones, de la tienda. Por un lado eso es correcto, ya que en la tabla se almacena la clave y no la descripcin; por otro lado, es antiesttico y poco claro. Lo ideal es que se vean las descripciones, pero que se manejen internamente las claves. 13. Cierre la aplicacin. 14. Cuando trabajamos con datos enlazados a un almacn de datos, estamos ante lo que se conoce como Data Binding. Las principales propiedades que entran en juego en operaciones de enlazado de datos son las siguientes:
Propiedad DataSource Funcin
Representa el objeto que actuar como fuente de datos. Puede ser un elemento de datos en memoria (DataSet, DataTables, etc.) o flujos de datos (DataReader). Representa el objeto que provee el contenido a mostrar en el objeto. Representa el objeto que provee el dato que internamente constituye el valor del control, para su utilizacin en procesamiento.
DisplayMember
ValueMember
559
DataBindings
Representa la coleccin de enlaces que se llevan a cabo a travs del objeto. Representa el subndice del elemento seleccionado. Representa el valor del elemento seleccionado.
SelectedIndex SelectedValue
15. En tiempo de diseo seleccione el cuadro combinado asociado a stor id y despliegue el men de acciones del control. Marque la casilla de verificacin Use data bound items.
16
16. Al activar la casilla de verificacin aparecen las propiedades involucradas en el enlazado de datos. 17. Seleccione en Data Sources el nodo Other Data Sources Project Data Sources pubsDataSet stores.
560
18. Al hacer la seleccin se genera un nuevo enlace, al que se le da el nombre de storesBindingSource. Cada enlace que hacemos tendr su propio identificador. 19. Para Display Member seleccione stor_name, y en Value Member seleccione stor_id. En Selected Value seleccione salesBindingSource stor_id, que es el id que le corresponde al registro. 20. Finalmente, en Properties busque el grupo de propiedades DataBindings y seleccione None para que el texto que aparezca en el cuadro combinado sea el que le corresponde de acuerdo con los datos enlazados.
21. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas CTRL-MAYS-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 22. Navegue entre los registros y vea cmo en lugar de stor_id aparece stor_name. Si hacemos clic en el combo, aparecern todas las tiendas de las cuales podemos seleccionar alguna.
561
16
562
MAPA
563
TERMINOLOGA
AcceptChanges, 536 Adaptador de datos, 535 Add, 531 CaseSensitive, 539 Clear, 531, 539 Clone, 539 Constraint, 530, 541 ConstraintCollection, 530 Contains, 531 Copy, 540 CopyTo, 531 Count, 531 Data Binding, 553 bound controls, 553 Source Configuration Wizard, 546 Sources, 550 DataAdapter, 535 DataBindings, 559 DataColumn, 530, 541 DataColumnCollection, 530 DataRelation, 530 DataRelationCollection, 530 DataRow, 541 DataRowCollection, 530 DataSet sin tipos, 535 DataSource, 558 DataTable, 530, 541 DataTableCollection, 530 DataView, 530 Datos, objetos de, 541 DeleteCommand, 536 DisplayMember, 558 Dispose, 537, 540 Disposed, 538, 540 DuringFill, 536 EnforceConstraints, 539 Esquema, 538 objetos de, 541 Fill, 535, 537 FillSchema, 535, 537 Finalize, 538 GetFillParameters, 537 GetXml, 540-1 GetXmlSchema, 540-1 InsertCommand, 536 Item, 531 Objetos de esquema, 541 de datos, 541 OnFillError, 538 ReadXml, 540-1 ReadXmlSchema, 540-1 Relation(s), 539, 541 Remove, 531 Reset, 540 Rows, 530 RowUpdated, 538 RowUpdating, 538 Schema, 538 SelectCommand, 536 SelectedIndex, 559 SelectedValue, 559 Tables, 539 Untyped DataSet, 535 Update, 537 UpdateCommand, 536 ValueMember, 558 WriteXml, 540-1 WriteXmlSchema, 540-1
16
564
PREGUNTAS
16.1 Mencione los objetos que componen el modelo de objetos DataSet. 16.2 Mencione qu colecciones permiten la organizacin de objetos Data
Set.
16.3 Mencione para qu sirve DataAdapter y cules son sus miembros ms importantes. 16.4 Mencione cules son los miembros ms importantes de DataSet. 16.5 Mencione qu mtodos de DataSet permiten la integracin de XML.
565
Notas:
16
566
EXAMEN
CAPTULO
17
567
568
Contenido
Data Source Controls y Data Bound Controls. . . . . . . . . . . . . . . . . . . . . . . . . Data Source Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data Bound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Establecimiento de un enlazado de datos hacia un GridView . . Adicin y configuracin de un SqlDataSource . . . . . . . . Adicin y configuracin de un GridView . . . . . . . . . . . . Actualizador de bases de datos desconectadas con ASP.NET . . . Adicin y configuracin de un objeto DetailsView . . . . Personalizacin de campos en DetailsView . . . . . . . . . . Anlisis de las plantillas de los campos en DetailsView . Establecimiento de los comandos para la afectacin de datos va SqlDataSource . . . . . . . . . . . . . . . . . . . . . . Especificacin de la funcionalidad disponible en DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 569 570 572 572 576 579 580 581 584 587 592 596 597 597 599
569
Uno de los aspectos que mayores cambios experiment .NET Framework, con respecto a la versin 1.1, es el desarrollo en ASP.NET. Son tantos los cambios introducidos en la versin 2.0 de .NET Framework que se ha dado la diferencia en nombre: ASP.NET 2.0. ASP.NET redujo la cantidad de programacin al mximo, permitiendo la mayor cantidad de funcionalidad con un mnimo de lneas de cdigo escritas por el desarrollador. En el caso del soporte a las aplicaciones de base de datos, el cambio es exponencial. Si adems de eso estamos desarrollando en Visual Studio, el cdigo es, prcticamente, cosa del pasado (al menos en la capa de presentacin de las aplicaciones y el enlazado de datos).
17
Representa un origen de datos basado en objetos de negocio. Es cuando los datos no se reciben de un proveedor de datos .NET, sino de un objeto o clase. Representa un acceso a bases de datos va los proveedores de datos ADO.NET (managed data providers como OleDbClient, SQLClient, OracleClient, etctera)
SqlDataSource
570
AccessDataSource
Representa un acceso a una base de datos en Microsoft Access. Representa el consumo de datos desde un archivo XML, especialmente diseado para su utilizacin desde controles Web jerrquicos como TreeView o Menu. Representa un conjunto de datos utilizable en el mecanismo de navegacin entre pginas de ASP.NET
XMLDataSource
SiteMapDataSource
Muestra los datos en forma de una lista de vietas. Muestra los datos en forma de una lista de seleccin, en donde cada elemento es una casilla de verificacin. Muestra los datos en forma de una lista desplegable de seleccin (combo). Muestra los datos en forma de una lista de seleccin de tamao fijo. Muestra los datos en forma de un conjunto de botones de opcin. Muestra anuncios publicitarios. Muestra los datos en forma de tabla. Cada elemento es mostrado de acuerdo a una plantilla (template) que es definida por el usuario. Muestra un registro de datos en forma tabular y permite la edicin, eliminacin e insercin de registros.
DropDownList
ListBox
DetailsView
571
FormView
Muestra un registro de datos en forma personalizada y permite la edicin, eliminacin e insercin de registros. Despliega datos en una tabla y permite edicin, actualizacin, ordenacin y paginado. Muestra un men dinmico. Muestra datos en forma de una lista cuyo formato puede personalizarse usando plantillas. Muestra datos en forma de un rbol jerrquico de nodos.
GridView
Menu Repeater
TreeView
Dependiendo del objeto de que se trate sern las propiedades que se deban establecer para el manejo de datos desde la Web. En el caso de objetos de lista de seleccin (BulletedList, CheckBoxList, DropDownList, ListBox y RadioButtonList) cada registro de la fuente de datos (Row) representar un elemento (Item) del objeto. Los elementos se almacenarn en una coleccin llamada Items. Cada registro de la fuente de datos contendr campos (Fields), que pueden jugar un papel importante en el manejo enlazado; por ejemplo, generalmente la informacin textual que se ve en la interfaz no es lo que deseamos que internamente se maneje para los procesos y el almacenamiento. Para especificar el campo que queremos que se muestre en la interfaz utilizamos la propiedad ListControl.DataTextField; para especificar el campo que el programa utiliza para efectos de procesamiento y almacenamiento, utilizamos la propiedad ListControl.DataValueField. Cuando se selecciona un elemento, el ndice del elemento se almacena en la propiedad ListControl.SelectedIndex, el elemento se almacena en ListControl.SelectedItem y el valor del elemento se almacena en la propiedad ListControl.SelectedValue. El evento predeterminado de este tipo de objetos es ListControl.SelectedIndexChanged, que sucede cuando el elemento seleccionado cambia. El mtodo WebControl.DataBind es el que realiza el enlazado entre el Data Source Control y el Data Bound Control.
17
572
Ejercicio 17.1
Establecimiento de un enlazado de datos hacia un GridView En este ejercicio se realiza un enlazado a un objeto GridView, para mostrar el contenido de un origen de datos de forma tabular, con paginacin y con posibilidad de ordenamiento. El enlazado que se realiza es de una va, ya que slo se realizan actividades de lectura. 1. 2. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). En Solution Explorer seleccione el proyecto http://localhost/apnetspvs, invoque el men de contexto, seleccione la opcin Add New Item y agregue una Web Form de nombre Enlazado01.aspx.
4.
Aparecer el asistente de configuracin de Data Source. Haga clic en New Connection, a fin de definir una nueva conexin para nuestros proyectos Web.
573
5.
Aparecer el asistente de conexin. Coloque el nombre de su servidor en Server Name. En nuestro caso es APRENDAWS, aunque usted deber especificar el pertinente. Se elige Use SQL Server Authentication y se proporciona el usuario y la contrasea de acceso. Elija Select or enter a database name y especifique pubs como base de datos de trabajo. Presione Test connection para comprobar que la conexin es posible. Si la conexin es satisfactoria, haga clic en el botn Ok, con lo que aparecer nuevamente el asistente de configuracin de conexin.
17
574
6.
7.
Se recomienda que la conexin se almacene como variable en el archivo de configuracin, que en el caso de Web se trata de Web.config. El asistente solicitar el nombre que deseamos darle a la conexin en el archivo de configuracin. Asegrese de que la casilla de verificacin Yes, save this connection as est seleccionada, y escriba en el cuadro de texto el nombre ConexionDBWeb.
575
8.
La conexin nos servir para trabajar con datos de alguna tabla de la base de datos pubs. Seleccione la opcin Specify columns from a table or view y en el cuadro combinado de nombres de tabla seleccione sales (ventas). Al hacer esto aparecern las columnas de la tabla en el espacio Columns; marque la casilla de verificacin que muestra un asterisco con el fin de que se incluyan todas las columnas de la tabla. Haga clic en el botn Next.
17
9.
Aparecer en el asistente una ventana de prueba. Haga clic en Test query y vea si los datos se extraen satisfactoriamente. En caso de que as sea, haga clic en el botn Finish.
576
10. Con esto ya ha quedado configurada una conexin que puede ser utilizada por nuestra aplicacin a travs del objeto SqlDataSource1, y que mostrar las ventas de libros que se encuentran almacenadas en la base de datos pubs.
12. Utilice la smart tag de GridView y modifique Choose Data Source, eligiendo SqlDataSource1, que es el nombre de nuestro objeto de origen de datos.
577
13. Al seleccionar el origen de datos, automticamente cambiar el contenido del DataView, mostrando un contenido ajustado a la informacin contenida en el Data Source.
14. En la smart tag de GridView seleccione Auto Format. En la lista Select a scheme, seleccione la opcin Rainy Day y haga clic en el botn Ok. De esa forma le habremos proporcionado un formato a nuestros datos.
17
15. En la smart tag de GridView marque las casillas de verificacin Enable paging y Enable sorting, para que sea posible paginar el contenido y ordenar los datos cuando hagamos clic en el encabezado de la rejilla de datos.
Enlazado01.aspx
16. Utilice Solution Explorer para establecer http://localhost/apvbnetvs/ como proyecto de inicio de la solucin (StartUp Project). Seleccione la pgina Enlaza-
578
do01.aspx
como pgina de inicio (Set as Start Page). Guarde todos los cambios que ha realizado en la solucin (oprima las teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5).
17. En la barra inferior del GridView aparecen vnculos que refieren a las pginas de datos. Haga clic en dichos vnculos para que aprecie cmo el contenido de la tabla sales se ha distribuido en varias pginas; seguramente la ltima pgina posee menos elementos que las dems. 18. En la parte superior de GridView aparecen los encabezados en forma de vnculos. Al hacer clic en ellos los datos se ordenarn por dicha columna. 19. Cierre la aplicacin. 20. En este ejercicio vimos cmo se gener un Data Source Object (SqlDataSource) y cmo se utiliz a travs de un Data Bound Control (GridView). FIN DEL EJERCICIO *
579
Ejercicio 17.2
Actualizador de bases de datos desconectadas con ASP.NET Este ejercicio realiza un actualizador de registros (altas, bajas, cambios y consultas), utilizando las facilidades que Visual Studio provee a ASP.NET. En este ejercicio se realiza un enlazado de datos de dos vas, dado que se realizan operaciones de lectura y escritura. 1. 2. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). En Solution Explorer seleccione el proyecto http://localhost/apnetspvs, despliegue el men contextual, seleccione la opcin Add New Item y agregue una Web Form de nombre Enlazado02.aspx. Agregue a la interfaz un objeto SqlDataSource. Utilice la smart tag del control y seleccione la opcin Configure Data Source. En el asistente, seleccione ConexionDBWeb en la pregunta Which data connection should your application use to connect to the database? y haga clic en el botn Next.
3. 4.
17
5.
Seleccione la tabla jobs y especifique que desea trabajar con todos los campos de la tabla (*). Haga clic en el botn Next.
580
6.
Haga clic en el botn Finish para concluir con la definicin del nombre del origen de datos ser SqlDataSource1.
SqlDataSource.
El
581
11. Automticamente se habrn colocado los campos que contiene SqlDataSource en forma de parejas de valores. En trminos generales, cada lnea del objeto DetailsView es un campo (Field), se pueden agregar campos que no estn definidos en SqlDataSource e incluso se pueden agregar campos relacionados con el comportamiento de DetailsView con respecto a las actividades de edicin, eliminacin e insercin de registros nuevos. 12. Utilizando los delimitadores de tamao, aumente el ancho del objeto DetailsView1. 13. Utilizando la smart tag de DetailsView1 seleccione Auto Format... y luego el formato Slate.
17
14. Nuestra interfaz debe lucir de la siguiente forma:
582
mienta se compone de tres elementos principales: la lista de campos disponibles (Available fields), que permite seleccionar los objetos que han de verse en la interfaz que representa DetailsView1; la lista de campos seleccionados (Selected fields), que permite seleccionar los campos que ya han sido integrados a la interfaz a travs de DetailsView1; y las propiedades de campos enlazados (BoundField properties), que permite modificar las propiedades de los campos enlazados.
16. El vnculo Convert this field into a TemplateField es un elemento fundamental de la ventana Fields, dado que permite manejar un campo de DetailsView como objeto TemplateField. Los objetos TemplateField son campos personalizados que permiten la visualizacin y el uso de un control enlazado, habilitando comportamientos variados a partir de plantillas (templates). Esto implica que un mismo control enlazado puede verse y comportarse de diferente manera, de acuerdo con la plantilla que le apliquemos en un momento dado. 17. Al seleccionar un campo en Selected fields, las propiedades de este elemento se muestran y editan en BoundField properties. En nuestro caso, los campos devueltos por SqlDataSource1 aparecen en la lista Selected fields (stos fueron agregados automticamente). 18. Elija en Selected Fields el campo job_id. En BoundField properties busque la propiedad HeaderText y coloque el valor Id del puesto: oprima la tecla Intro para aceptar. Haga clic en el vnculo Convert this field into a TemplateField, para disponer de varias mscaras de comportamiento para job_id. Vea cmo la referencia del campo cambia en Selected Fields, tanto en la descripcin como en el icono.
583
19. Repita el procedimiento para los dems campos. Elija en Selected Fields el campo job_desc. Modifique en BoundField properties la propiedad HeaderText, colocando el valor Descripcin:, y haga clic en el vnculo Convert this field into a TemplateField. 20. Elija en Selected Fields el campo min_lvl. Modifique en BoundField properties la propiedad HeaderText, colocando el valor Nivel mnimo:, y haga clic en el vnculo Convert this field into a TemplateField. 21. Elija en Selected Fields el campo max_lvl. Modifique en BoundField properties la propiedad HeaderText, colocando el valor Nivel mximo:, y haga clic en el vnculo Convert this field into a TemplateField. 22. En Available fields seleccione el nodo CommandField. Haga clic Add. CommandField permitir controlar las operaciones de su interfaz. 23. Elija en Selected Fields el campo CommandField, y en BoundField properties, cambie las siguientes propiedades:
Propiedad ButtonType CancelText DeleteText EditText InsertText NewText SelectText UpdateText Valor a asignar
17
Button Cancelar Borrar registro Modificar datos Insertar Nuevo registro Consulta Actualizar
584
24. Haga clic en el botn Ok. Nuestra interfaz debe lucir de la siguiente forma:
585
DetailsView1
tillas.
- Id del puesto:.
17
28. Con ello se mostrarn todas las vistas y comportamientos disponibles para el campo Id del puesto. Vea cmo existen distintas formas en que el campo puede verse y comportarse. ItemTemplate ser la vista general del campo, AlternatingItemTemplate es la forma en que lucir el campo en caso de alternado de colores, EditItemTemplate es la forma en que lucir en caso de que se proceda a la edicin del campo, InsertItemTemplate es la forma en que se manejar el campo en caso de insercin de registros y HeaderTemplate es la forma en que aparecer el encabezado del campo.
586
29. Visual Studio ha detectado que jobs_id (campo al que se enlaza el campo de DetailsView1) es de tipo identity en la base de datos, por lo que no puede hacer otra cosa que mostrar el dato de dicho campo. 30. Utilizando la smart tag de DetailsView1, en Display, seleccione Field[1] Descripcin. Vea cmo este campo admite operaciones de edicin en la base de datos e incluye cuadros de texto en los escenarios de edicin e insercin.
587
31. Haga clic sobre el cuadro de texto (TextBox) del escenario EditItemTemplate. Despliegue Properties (oprima la tecla F4) y vea cul es el valor de la propiedad Id del cuadro de texto donde se manejar el campo job_desc. El objeto se llama TextBox1. Si revisramos todos los objetos que manejan los campos, tendramos lo siguiente:
Campo en la base de datos job_id job_desc min_lvl max_lvl Campo en DetailsView1 Id del Puesto Descripcin Nivel mnimo Nivel mximo Control en Templates Label1 TextBox1 TextBox2 TextBox3
32. Despliegue la smart tag de DetailsView1 y seleccione el vnculo End Template Editing.
17
35. Haga clic en el botn Query Builder para que Command and Parameter Editor le asista en la elaboracin de la instruccin de eliminado de datos. Aparecer la ventana
588
Add Table, en la cual se especifican las tablas involucradas en la instruccin SQL a construir. Seleccione jobs y haga clic en Add. Se integrarn las tablas a Query Builder, por lo que puede cerrar Add Table haciendo clic en Close.
36. Query Builder se divide en cuatro secciones o paneles (panes): el de diagrama, el de seleccin y asignacin, el de instruccin textual y el de los resultados de la ejecucin del comando. En el panel de seleccin y asignacin seleccione en Column el campo job_id, en Table escriba jobs y en Filter escriba =@job_id. Haga clic en el botn Ok. para regresar a Command and Parameter Editor. Automticamente se actualizar la instruccin SQL, quedando como sigue: FIGURA 17.1 Estructura de Query Builder Panes.
589
37. La instruccin SQL que auxiliar a SqlDataSource en la eliminacin de datos ha quedado como sigue:
DELETE FROM jobs WHERE (job_id = @job_id)
38. Como puede darse cuenta, se est haciendo uso de un parmetro que no ha sido declarado en ninguna parte (@job_id). 39. Haga clic en el botn Add Parameter de Command and Parameter Editor. Se agregar un parmetro en Parameters. Escriba en la columna Name el nombre del parmetro @job_id. En el cuadro combinado Parameter source seleccione Form, lo que indica que se tomar el valor que se tenga en el formulario que dinmicamente crear DetailsView1. Finalmente, escriba en FormField el nombre del campo que en las plantillas contiene la informacin de job_id, es decir Label1. Haga clic en el botn Ok.
17
40. De esta forma, el comando interacta con DetailsView1 para construir la instruccin SQL que se ejecutar sobre el almacn de datos va SqlDataSource1. El comando, obviamente, eliminar el registro en que nos encontremos. 41. Modifique el valor de la propiedad InsertQuery, haciendo clic en el botn que invoca el Command and Parameter Editor . Utilice Query Builder para la construccin de la instruccin INSERT. Seleccione la tabla jobs nuevamente y seleccione slo los campos que no forman la llave primaria (job_desc, min_lvl, max_lvl), dado que la llave primaria es identity. Vea cmo al seleccionar los campos en el diagrama, stos se agregan en el panel de seleccin y asignacin. Para cada una de las columnas se deber especificar un parmetro con el mismo nombre, anteponiendo el smbolo de arroba. Los parmetros se colocarn en la columna New Value. Presione el botn Ok.
590
42. La instruccin SQL que auxiliar a SqlDataSource en la insercin de datos ha quedado de la siguiente manera:
INSERT INTO jobs(job_desc, min_lvl, max_lvl) VALUES (@job_desc, @min_lvl, @max_lvl)
43. Agregue los parmetros que acabamos de definir en la instruccin (@job_desc, @min_lvl, y @max_lvl). Al igual que el parmetro @job_id, estos parmetros recibirn los datos de la forma (Form), con los Form fields siguientes: TextBox1, TextBox2 y TextBox3, respectivamente.
591
44. Modifique el valor de la propiedad UpdateQuery, haciendo clic en el botn que invoca el Command and Parameter Editor . Utilice Query Builder para la construccin de la instruccin UPDATE. Seleccione la tabla jobs nuevamente y seleccione slo los campos que no forman la llave primaria (job_desc, min_lvl, max_lvl), dado que la llave primaria es identity y no se puede modificar. Vea cmo al seleccionar los campos en el diagrama, stos se agregan en el panel de seleccin y asignacin; para cada una de las columnas se deber especificar un parmetro con el mismo nombre, anteponiendo el smbolo de arroba. Los parmetros se colocarn en la columna New Value . Oprima el botn Ok. 45. En este caso es muy importante no olvidar el filtro de modificacin en el panel de seleccin y asignacin para evitar la sustitucin de valores para todos los registros. Despus de los campos que se han agregado automticamente agregue manualmente job_id en Columns y jobs en Table; no seleccione la casilla de verificacin Set y en Filter escriba =@job_id.
17
46. La instruccin SQL que auxiliar a SqlDataSource en la modificacin de datos ha quedado como sigue.
UPDATE jobs SET job_desc = @job_desc, min_lvl = @min_lvl, max_lvl = @max_lvl WHERE (job_id = @job_id)
47. Agregue los parmetros que acabamos de definir en la instruccin (@job_desc, @min_lvl, @max_lvl y @job_id). Estos parmetros recibirn los datos de la forma (Form) con los siguientes Form fields: TextBox1, TextBox2, TextBox3 y Label1, respectivamente.
592
48.
SqlDataSource
ya es capaz de ejecutar instrucciones SQL sobre el almacn de datos, en coordinacin con los valores que recopilar DetailsView.
593
Enlazado02.aspx
51. Utilizando Solution Explorer establezca el proyecto http://localhost/apvbnetvs/ como proyecto de inicio de la solucin (StartUp Project); seleccione la pgina Enlazado02.aspx como pgina de inicio (Set as Start Page). Guarde todos los cambios que ha realizado en la solucin (oprima las teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 52. Inicialmente se puede observar que DetailsView est haciendo el enlazado y la informacin se muestra en el formato especificado.
17
53. Haga clic en los vnculos numerados de la parte baja de DetailsView. Esos vnculos son de paginacin; corresponde un vnculo a cada uno de los registros extrados del origen de datos. Lo que vemos est en memoria, en un objeto DataSet (estamos trabajando de forma desconectada). 54. Haga clic en el botn Nuevo registro. Cambiar la interfaz, mostrando los campos en el contexto de insercin de datos, InsertItemTemplate. Escriba en Descripcin el dato Programador AP; en Nivel mnimo escriba 60; en Nivel mximo escriba 100. Haga clic en el botn Insertar.
594
55. Al hacer clic en Insertar, DetailsView le proporciona los valores de parmetro al comando SQL asignado a la propiedad InsertQuery de SqlDataSource1, e intenta el mtodo Update sobre el DataSet de trabajo. Al hacerlo, el comando de insercin reproduce la instruccin SQL de agregado de datos sobre el almacn de datos fsicos. En resumen, hemos agregado un registro a una base de datos en modo desconectado. 56. Utilice la paginacin hasta que vea el registro que acaba de agregar. El id asignado puede variar, dependiendo de los registros que tenga en su base.
595
57. Haga clic en Modificar datos. En Descripcin cambie a Programador AP-DEV, en Nivel mnimo a 70 y en Nivel mximo a 120. Haga clic en el botn Actualizar.
58. Utilice la paginacin para colocarse en el registro que acaba de modificar y vea cmo los datos se han actualizado.
17
59. Haga clic en Borrar registros. Su registro se habr borrado. 60. Lo importante de todo es que para toda esta funcionalidad no fue necesario escribir una sola lnea de cdigo. FIN DEL EJERCICIO *
596
MAPA
597
TERMINOLOGA
AccessDataSource, 570 AdRotator, 570 BulletedList, 570 Campos, 571 CheckBoxList, 570 Command and Parameter Editor, 589 Data Bound Controls, 570 Source Controls, 569 DataBind, 571 DataList, 570 DataTextField, 571 DataValueField, 571 DetailsView, 570 DropDownList, 570 Fields, 571 FormView, 571 GridView, 570 ListBox, 570 Menu, 571 ObjectDataSource, 569 Panel de diagrama, 588 de instruccin textual, 588 de resultados de ejecucin de comandos, 588 de seleccin y asignacin, 588 RadioButtonList, 570 Repeater, 571 SelectedIndex, 571 SelectedIndexChange, 571 SelectedItem, 571 SelectedValue, 571 SelectedValueField, 571 SiteMapDataSource, 570 Smart Tag, 576 SqlDataSource, 569 TreeView, 571 XML Data Source, 570
PREGUNTAS
17.1 Para qu sirven los Data Source Controls? 17.2 Cules son los Data Source Controls ms comunes? 17.3 Para qu sirven los Data Bound Controls? 17.4 Cules son los Data Bound Controls ms comunes? 17.5 Qu Data Source Controls y Data Bound Controls cree que utilizar en su mbito profesional?
17
598
Notas:
599
EXAMEN
17
CAPTULO
18
601
602
Contenido
Generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloques de cdigo usando generics . . . . . . . . . . . . . . . . . . . . . . . . . . Programacin de un mtodo dinmico usando Generics Colecciones genricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementacin de List (Generics). . . . . . . . . . . . . . . . . . Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementacin de Queue (Generics) . . . . . . . . . . . . . . . Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementacin de Stack (Generics) . . . . . . . . . . . . . . . . Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementacin de Dictionary (Generics) . . . . . . . . . . . . Mapa mental del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rpido del captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. 603 604 604 607 607 608 610 610 613 613 616 616 619 620 620 622
603
Generics
La versin 2.0 de .NET Framework aporta mltiples mejoras a clases existentes de BCL, adems de reorganizar y reclasificar algunos de los recursos. Una de las principales capacidades totalmente nuevas que introduce la versin 2.0 son las implementaciones genricas. Las implementaciones genricas, mejor conocidas como Generics, son la funcionalidad proporcionada por CLR con el fin de que clases, estructuras, interfaces y mtodos puedan utilizar datos de entrada de tipo indeterminado (que se resolver al llamar a ejecucin). En otras palabras, son implementaciones donde no slo los valores de los datos son intercambiables, sino tambin sus tipos. Este concepto es muy similar a los templates manejados por C++, que tenan, a grandes rasgos, la misma funcionalidad. Para darnos una idea de por qu es necesario introducir estos elementos a los lenguajes .NET, considere el caso hipottico descrito a continuacin. Imagine que tiene una base de datos con informacin bibliogrfica, y que cuenta con una clase para realizar una bsqueda compleja; en ella se puede proporcionar el nombre del ttulo (de tipo String) o bien el ISBN (un dato Double). Dado que no se sabe si la informacin proporcionada ser un String o un Double, ser necesario manejar datos de tipo Object, que no son eficientes; adems, la codificacin de la clase tendra que anticiparse a los posibles conflictos de diferencia de tipo. Una alternativa sera hacer procedimientos distintos dependiendo del tipo de dato proporcionado o, de plano, implementar objetos con polimorfismo. Si adems queremos que los programas sean type safe, el programa se complicar ms dado que deberemos estar al pendiente de cualquier conversin de datos. Generics ofrece una solucin prctica al problema. Con generics, el tipo de dato es intercambiable y se especifica al momento de la declaracin en tiempo de ejecucin. De esa forma se codifica un solo procedimiento capaz de manejar ms de un tipo de dato de manera transparente. La funcionalidad de generics puede darse en dos formas generales:
Bloques de cdigo Es el tipo de uso de generics por medio del cual clases y mto-
18
dos se implementan con parmetros cuyo tipo de dato a utilizar es especificado al momento de llamar a ejecucin. Colecciones Son colecciones preconstruidas que permiten la especificacin en tiempo de ejecucin del tipo de dato a almacenar.
604
En este ejemplo, la clase MiClase utiliza generics de tal manera que los datos tiles para el proceso pueden ser de cualquier tipo (pero que se especificar al momento de la instanciacin). El mtodo Muestra expondr el dato proporcionado a la clase sin importar su tipo. Al momento de consumir la clase es necesario hacer referencia al tipo de datos que se desea utilizar; esto se lleva a cabo a travs de la especificacin Of, caracterstica de generics.
Dim A As New MiClase(Of Integer) A.Dato = 10 A.Muestra() Dim B As New MiClase(Of String) B.Dato = Mensaje B.Muestra()
El procedimiento no requiere de modificacin alguna para funcionar con datos de diferentes tipos, pero al mismo tiempo es type safe. Este mismo procedimiento puede intentarse sin utilizar generics, pero en caso de especificar Option Strict On, quedaran al descubierto las conversiones implcitas que el programa realiza. En el caso de no realizarse las conversiones explcitas se provocara una excepcin.
Ejercicio 18.1
Programacin de un mtodo dinmico usando Generics En este ejercicio comprobaremos la funcionalidad de generics mediante un procedimiento que puede manejar informacin de entrada de diferentes tipos de dato. El programa ser
605
type safe, con el fin de hacer evidente que no es necesario realizar conversiones explcitas de datos con el uso adecuado de generics. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado UsoGenerics. 3. Edite el programa de tal forma que aparezca de la siguiente forma:
Codificacin de UsoGenerics
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 Option Strict On Imports System.Console Module Module1
Module1.vb
Sub Main() Dim X As Integer = 5 Dim Y As Integer = 7 WriteLine(I = & X) WriteLine(J = & Y) Intercambia(Of Integer)(X, Y) WriteLine(I = & X) WriteLine(J = & Y)
Dim W As String = Juan Dim Z As String = Mara WriteLine(S = & W) WriteLine(R = & Z) Intercambia(Of String)(W, Z) WriteLine(S = & W) WriteLine(R = & Z) Write(Presiona INTRO) ReadLine() End Sub Sub Intercambia(Of T)(ByRef a As T, ByRef b As T) Dim Paso As T Paso = a a = b b = Paso End Sub End Module
18
606
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 5. En las lneas 1 y 2 se garantiza que el programa sea type safe; con ello nos aseguraremos de que no realice conversiones implcitas (que iran en contra del concepto de uso de generics). 6. En la lnea 29 se declara un procedimiento denominado Intercambia, que est preparado para manejar un tipo de dato de forma genrica (T). Este tipo de dato es indeterminado en cdigo, pero deber ser especificado al momento de mandar llamar a ejecucin el procedimiento. 7. El procedimiento Intercambia recibir dos argumentos (a, dato que le especifiquemos al generic (T).
b),
8. Lo que el procedimiento hace es muy sencillo: declara una variable de paso que tendr el mismo tipo de dato que el especificado al momento de la ejecucin. El programa asigna el valor del primer argumento a la variable de paso para no perder el valor; luego asigna el valor del segundo argumento al primero, y el valor de la variable de paso al segundo argumento. Con ello se habrn intercambiado los valores. El primer argumento tendr el valor que tena el segundo y viceversa. 9. Al mandar a ejecutar el procedimiento (lneas 11 y 20), se especifica el tipo de dato que deber utilizar el procedimiento, en sustitucin del tipo indeterminado (T). Los valores proporcionados al procedimiento corresponden al mismo tipo de dato, dado que as fueron especificados. Si todo ocurri como se esperaba, la salida ser la siguiente:
I = 5 J = 7 I = 7 J = 5 S = Juan R = Mara S = Mara R = Juan Presiona INTRO
607
Colecciones genricas
Las colecciones genricas son aquellas en las cuales el tipo de datos de sus elementos slo es conocido hasta el momento de su declaracin. Las colecciones genricas o generics ms importantes son las siguientes:
List: Representa un conjunto de elementos comn. Queue: Representa un conjunto de elementos de tipo FIFO (First In First Out)
Primero en entrar, primero en salir. Representa un conjunto de elementos de tipo LIFO (Last In First Out) ltimo en entrar, primero en salir. Dictionary: Representa un conjunto de elementos en donde una llave est relacionada con un valor determinado.
Stack:
MiColeccin As
New
ColeccinGeneric(Of
[,Tipo])
Donde MiColeccin es el nombre de la coleccin, ColeccinGeneric es el tipo de coleccin que deseamos especificar. La especificacin Of T es obligatoria para generics; a travs de sta definiremos el tipo de dato que deseamos que utilice el procedimiento. Se debe sustituir la T por el tipo de dato que deseamos que el programa maneje. En el caso de Dictionary, es necesario especificar el tipo de dato a almacenar como valor de diccionario. Ese punto se ver ms adelante.
List
Es la coleccin generic que representa un conjunto de elementos comn; es la ms sencilla, dado que no tiene comportamientos implcitos en su naturaleza. Sus miembros ms importantes son los siguientes:
Propiedad o mtodo Capacity Count Item Add Clear Find Insert Remove Uso Nmero de elementos que la coleccin puede contener. Nmero de elementos en la coleccin. Representa un elemento de la coleccin. Permite agregar un elemento a la coleccin. Elimina todos los elementos de la coleccin. Devuelve la primera ocurrencia de un elemento determinado en la coleccin. Inserta un elemento en la lista. Remueve un elemento de la coleccin.
18
608
Ejercicio 18.2
Implementacin de List (Generics) En este ejercicio comprobaremos la funcionalidad de la coleccin List. El programa preguntar una serie de nmeros y los desplegar en el orden en que se capturaron. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado UsoList. 3. Edite el programa de tal forma que aparezca de la siguiente manera:
Codificacin de UsoList
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Imports System.Console
Module1.vb
Module Module1 Dim lstNumeros As New List(Of Integer) Sub Main() Dim strNumero As String Do While True Write(Capture un nmero (omitir para finalizar):) strNumero = ReadLine() If strNumero = Then Resultados() Write(Pulse INTRO) ReadLine() Exit Do Else lstNumeros.Add(CType(strNumero, Integer)) End If Loop End Sub Sub Resultados() For Each Entero As Integer In lstNumeros WriteLine(Entero.ToString()) Next End Sub End Module
609
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 5. De la lnea 9 a la 20 se tiene un ciclo que estar preguntando nmeros enteros; cuando no se proporcione informacin, se dar por concluido el ciclo. 6. Lo importante del programa es la implementacin de List, que aparece en la lnea 4. Vea cmo se decide que el tipo de dato a utilizar en la coleccin es Integer. 7. Por cada iteracin del ciclo se pregunta un nmero (lneas 10 y 11); en caso de que la captura no sea nula (lnea 17) se agrega a la coleccin la conversin a Integer de lo capturado (lnea 18). De esa forma se va poblando la coleccin; a diferencia de los arreglos, una coleccin de tipo List no requiere saber de forma predefinida el nmero de elementos que tendr, por lo que constituye una mejor utilizacin de recursos. Esto evita un problema general de los arreglos, que al requerir la especificacin predeterminada del nmero de elementos que lo componen, siempre se corre el riesgo de haber definido muy pocos, lo que causa excepciones de desbordamiento, o demasiados, lo que produce el uso innecesario de recursos. 8. En caso de que se omita la entrada, se asume que ya no se desea capturar ms informacin (lnea 12), y se procede a ejecutar el procedimiento Resultados, que muestra el contenido de la coleccin. 9. Capture 10, 20, 30, 40 y 50. 10.
Resultados
18
610
Queue
Es la coleccin generic que representa un conjunto de elementos FIFO (First In First Out / Primero en entrar, primero en salir). Sus miembros ms importantes son los siguientes:
Propiedad o mtodo Count Clear Dequeue Uso Nmero de elementos en la coleccin. Elimina todos los elementos de la coleccin. Elimina un elemento y devuelve el control al primer elemento de la cola. Enqueue Peek Agrega un elemento al final de la cola. Devuelve el control al primer elemento, sin eliminar ningn elemento. ToArray Copia los elementos de la coleccin a un arreglo.
Ejercicio 18.3
Implementacin de Queue (Generics)
En este ejercicio comprobaremos la funcionalidad de la coleccin Queue. El programa preguntar una serie de nmeros, pero slo interesan los ltimos tres que se capturen y que se mostrarn al final. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado UsoQueue. 3. Edite el programa de tal forma que aparezca de la siguiente manera:
611
Codificacin de UsoQueue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Imports System.Console
Module1.vb
Module Module1 Dim queNumeros As New Queue(Of Integer) Sub Main() Dim strNumero As String Do While True Write(Capture un nmero (omitir para finalizar):) strNumero = ReadLine() If strNumero = Then Resultados() Write(Pulse INTRO) ReadLine() Exit Do Else If queNumeros.Count = 3 Then queNumeros.Dequeue() End If queNumeros.Enqueue(CType(strNumero, Integer)) End If Loop End Sub Sub Resultados() For Each Entero As Integer In queNumeros WriteLine(Entero.ToString()) Next End Sub End Module
18
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 5. El funcionamiento del programa es muy similar al ejercicio anterior. A travs de un ciclo se preguntan datos; al omitir uno se asume que ya no se desea capturar ms.
612
6. Lo importante del programa es la implementacin de Queue, que aparece en la lnea 4. Vea cmo se decide que el tipo de dato a utilizar en la coleccin es Integer. 7. Por cada iteracin del ciclo, se pregunta un nmero (lneas 10 y 11); en caso de que la captura no sea nula (lnea 12) se agrega a la coleccin la conversin a Integer de lo capturado (lnea 21). De esa forma se va poblando la coleccin. 8. En caso de que se omita la entrada, se asume que ya no se desea capturar ms informacin (lnea 12), y se procede a ejecutar el procedimiento Resultados, que muestra el contenido de la coleccin. 9. Capture 10, 20, 30, 40 y 50. 10. Como slo vamos a permitir 3 elementos, se realiza una validacin: si el nmero de elementos es 3 quiere decir que ya no se debe aceptar uno ms, a menos de que uno de los elementos ya existentes salga. 11. Si el nmero de elementos es 3 (lnea 18), se instruye a la coleccin a eliminar uno de los elementos (lnea 19). Como el comportamiento de la coleccin es FIFO, saldr primero el que haya entrado primero. 12. Resultados solamente muestra los ltimos tres elementos capturados, dado que los primeros que se capturaron fueron saliendo al tratar de agregar un elemento ms cuando ya haba 3 elementos en la coleccin.
Si todo ocurri como se esperaba, la salida ser la siguiente. Capture un nmero (omitir para finalizar):10 Capture un nmero (omitir para finalizar):20 Capture un nmero (omitir para finalizar):30 Capture un nmero (omitir para finalizar):40 Capture un nmero (omitir para finalizar):50 Capture un nmero (omitir para finalizar): 30 40 50 Pulse INTRO
613
Stack
Es la coleccin generic que representa un conjunto de elementos LIFO (Last In First Out / ltimo en entrar, primero en salir ). Sus miembros ms importantes son los siguientes:
Propiedad o mtodo Count Clear Peek Pop Push ToArray Uso Nmero de elementos en la coleccin. Elimina todos los elementos de la coleccin. Devuelve el control al primer elemento, sin eliminar ningn elemento. Elimina un elemento y retorna el control al primer elemento de la pila (stack). Inserta un elemento al inicio de la pila. Copia los elementos de la coleccin a un arreglo.
Ejercicio 18.4
Implementacin de Stack (Generics)
En este ejercicio comprobaremos la funcionalidad de la coleccin Stack. El programa preguntar una serie de nmeros. Se demostrar el comportamiento LIFO de la coleccin. 1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado UsoStack. 3. Edite el programa de tal forma que aparezca de la siguiente forma:
18
614
Codificacin de UsoStack
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Imports System.Console
Module1.vb
Module Module1 Dim staNumeros As New Stack(Of Integer) Sub Main() Dim strNumero As String Do While True Write(Capture un nmero (omitir para finalizar):) strNumero = ReadLine() If strNumero = Then Resultados() Write(Pulse INTRO) ReadLine() Exit Do Else staNumeros.Push(CType(strNumero, Integer)) End If Loop End Sub Sub Resultados() For i As Integer = 0 To staNumeros.Count - 1 WriteLine(staNumeros.Pop.ToString()) Next WriteLine(- Elementos que quedaron en Stack -) For Each Entero As Integer In staNumeros WriteLine(Entero.ToString()) Next WriteLine(- Fin de elementos -) End Sub End Module
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 5. El funcionamiento del programa es muy similar al ejercicio anterior. A travs de un ciclo se preguntan datos; al omitir uno se asume que ya no se desea capturar ms.
615
6. 7.
Lo importante del programa es la implementacin de Stack, que aparece en la lnea 4. Vea cmo se decide que el tipo de dato a utilizar en la coleccin es Integer. Por cada iteracin del ciclo, se pregunta un nmero (lneas 10 y 11); en caso de que la captura no sea nula (lnea 12) se agrega a la coleccin la conversin a Integer de lo capturado (lnea 18). De esa forma se va poblando la coleccin. En caso de que se omita la entrada, se asume que ya no se desea capturar ms informacin (lnea 12), y se procede a ejecutar el procedimiento Resultados, que muestra el contenido de la coleccin. Capture 10, 20, 30, 40 y 50.
8.
9.
10. Al ejecutarse Resultados (lnea 23) se utiliza un For Next para la inspeccin de los elementos (lnea 24). La informacin se extrae utilizando el mtodo Pop, que tiene la particularidad de eliminar el elemento al mismo tiempo que lo lee. Se mostrarn los elementos, del ltimo capturado al primero capturado. Al concluir el proceso, la coleccin habr quedado sin elementos. 11. Las lneas 27 a la 31 se encargan de demostrar que ya no hay elementos en la coleccin, una vez que se leyeron utilizando Pop.
Si todo ocurri como se esperaba, la salida ser la siguiente. Capture un nmero (omitir para finalizar):10 Capture un nmero (omitir para finalizar):20 Capture un nmero (omitir para finalizar):30 Capture un nmero (omitir para finalizar):40 Capture un nmero (omitir para finalizar):50 Capture un nmero (omitir para finalizar): 50 40 30 20 10 - Elementos que quedaron en Stack - Fin de elementos Pulse INTRO
18
616
Dictionary
Es la coleccin generic que representa un conjunto de elementos donde una llave est relacionada con un valor. En el caso de Dictionary, es necesario especificar el tipo de dato que tienen los valores asociados a la llave. Sus miembros ms importantes son los siguientes:
Propiedad o mtodo Count Item Keys Values Add Clear ContainsKey ContainsValue Remove Uso Nmero de elementos en la coleccin. Representa un elemento de la coleccin. Representa la coleccin de llaves. Representa la coleccin de valores. Agrega un elemento a la coleccin. Elimina los elementos de la coleccin. Determina si en la coleccin existe un valor de llave determinada. Determina si en la coleccin existe un determinado valor. Elimina un elemento de la coleccin.
Este ejemplo declara un diccionario, carga tres elementos y despliega el valor correspondiente en una de las llaves.
Dim Pais As New Dictionary(Of T String, String) Pais.Add(MX, Mxico) Pais.Add(EU, Estados Unidos) Pais.Add(CN, Canad) Console.WriteLine(Pais(MX))
Ejercicio 18.5
Implementacin de Dictionary (Generics)
En este ejercicio comprobaremos la funcionalidad de la coleccin Dictionary. El programa preguntar una serie de nmeros. Se demostrar el comportamiento LIFO de la coleccin.
617
1. Abra la solucin Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensin sln). 2. Agregue a su solucin un proyecto Windows Console Application, llamado UsoDictionary. 3. Edite el programa de tal forma que aparezca de la siguiente manera:
Codificacin de UsoDictionary
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Imports System.Console
Module1.vb
Module Module1 Dim dicPCard As New Dictionary(Of String, String) Sub Main() Dim strInicial As String dicPCard.Add(N, dicPCard.Add(S, dicPCard.Add(E, dicPCard.Add(O, Norte) Sur) Este) Oeste)
Write(Dame la inicial de un punto cardinal:) strInicial = ReadLine() WriteLine(Inicial de {0}, dicPCard(strInicial)) Write(Presione INTRO) ReadLine() End Sub End Module
18
Module1.vb
4. Construya la solucin (oprima las teclas Ctrl-Mays-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solucin (teclas Ctrl-Mays-S). Inicie la depuracin para comprobar el comportamiento de su programa (tecla F5). 5. Lo importante del programa es la implementacin de Dictionary, que aparece en la lnea 4. Vea cmo se decide que el tipo de dato a utilizar como llave es String, y que
618
el dato de valor asociado a la llave tambin es String. Dada la especificacin Of, el tipo de dato de la llave puede ser intercambiable en un momento dado. 6. De la lnea 9 a la 12 se puebla con datos la coleccin. Simplemente se almacenan los puntos cardinales y se les coloca una inicial como llave. 7. En las lneas 14 y 15 se pregunta por una inicial de un punto cardinal. Capture la letra N. 8. La lnea 17 muestra el valor asociado a la llave proporcionada. Como puede ver, para recuperar el valor asociado a una llave slo es necesario colocar el nombre de la coleccin y, entre parntesis, el valor de la llave cuyo valor deseamos recuperar. 9. Si todo ocurri como se esperaba, la salida ser la siguiente.
Dame la inicial de un punto cardinal:N Inicial de Norte Presione INTRO
619
MAPA
18
620
TERMINOLOGA
Colecciones genricas, 607 Dictionary, 616 Generics, 603 Implementaciones genricas, 603 List, 607 Of, especificacin, 604 Queue, 610 Stack, 613 Templates, 603
PREGUNTAS
18.1 En qu consisten las generics? 18.2 Cules son las dos formas generales de implementar generics? 18.3 En qu casos se recomienda el uso de generics, en relacin a los arreglos? 18.4 Mencione cules son las colecciones generics ms usuales y explique sus diferencias.
621
Notas:
18
622
EXAMEN