programacion net basico manual de introduccion al desarrollo de aplicaciones con c

197
Programación .NET (Básico ) Manual de introducción al desarrollo de aplicaciones con C# Primera Parte

Upload: cedric-cano

Post on 26-Dec-2015

49 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

Programación .NET (Básico ) Manual de introducción al desarrollo de aplicaciones con C# Primera Parte

Page 2: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 2 -

PABLO PASCUAL

FERNÁNDEZ HINOJOSA

PROGRAMACIÓN .NET

(BÁSICO ) – MANUAL

DE INTRODUCCIÓN AL

DESARROLLO DE

APLICACIONES CON C# -

PARTE I

Buffa Sistemas S.R.L

2010

Buenos Aires

Page 3: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 3 -

Programación .NET (Básico) – Manual de introducción al desarrollo de

aplicaciones con C# - Parte I Pablo Pascual Fernández Hinojosa 1a Edición

Buffa Sistemas SRL Alsina 655 4° Piso

Buenos Aires

ISBN Nº 978-987-25214-4-8

Fernández Hinojosa, Pablo Pascual Manual de introducción al desarrollo de aplicaciones con C # I. –

1a ed. - Buenos Aires : Buffa Sistemas, 2010. 300 p. ; 21x15 cm.

ISBN 978-987-25214-4-8

1. Capacitación Informática. I. Título CDD 004.1

Fecha de catalogación: 06/08/2010

(c), 2010 Buffa Sistemas SRL

Queda hecho el depósito que establece la Ley 11.723.

Libro de edición Argentina

No se permite la reproducción parcial o total, el almacenamiento, el

alquiler, la transmisión o la transformación de este libro, en cualquier forma o por cualquier medio, sea electrónico o mecánico, mediante

fotocopias, digitalización u otros métodos, sin el permiso previo y escrito del editor.Su infracción está penada por las leyes 11723 y

25446.-

Page 4: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 4 -

NOTA: El material incluido en el presente puede contener datos y ejemplos

extraídos de sitios web públicos sin restricción de acceso. Los mismos son

utilizados solamente a fines didácticos.

Page 5: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 5 -

Audiencia

Este curso está orientado a aquellas profesionales o estudiantes que quieran

adquirir los conocimientos necesarios de programación web basado en la

plataforma MS .NET, desarrollo de aplicaciones en C# sobre la plataforma

Microsoft Visual Studio. Y para todas aquellas personas que deseen desarrollar e

implementar o convertir sus habilidades a esta tecnología.

Pre-Requisitos

Tener conocimientos sobre la utilización de aplicaciones de Internet. Por ejemplo

navegación de páginas Web, realizar transacciones (home banking) etc.

Tener conocimientos básicos de base de datos relacionales. Por ejemplo teoría de

bases de datos, diferencias entre base de datos y planilla de cálculos.

Nota: Si usted no está seguro de sus conocimientos lo invitamos a tomar los cursos

gratuitos dentro de Microsoft Virtual Academy (MVA).

Al finalizar el curso

Después de completar este curso los alumnos serán capaces de:

Utilizar los conceptos de POO

Explicar las capacidades de Microsoft .NET Framework

Crear aplicaciones MS .Net (con foco en WEB)

Conocimiento básico del Lenguaje de Programación C#

Page 6: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 6 -

Índice

MÓDULO I INTRODUCCIÓN A .NET ......................................................... - 7 -

MÓDULO II - INTRODUCCIÓN AL LENGUAJE C# .................................... - 37 -

MÓDULO III - FUNDAMENTOS DE LA POO ............................................. - 80 -

BIBLIOGRAFÍA ................................................................................... - 197 -

Page 7: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 7 -

Módulo I

Introducción a .Net

Page 8: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 8 -

Que es .NET ?

Microsoft .Net es un conjunto de Tecnologías de software para conectar

información, personas, sistemas y dispositivos. Permitiendo un alto nivel de

integración del software mediante el uso de XML Web Services.

Esta Tecnología se apoya en el .net Framework y en la IDE multi-lenguaje Visual

Studio.net

Page 9: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 9 -

Información general acerca de .NET Framework

.NET Framework es un componente integral de Windows que admite la creación y la

ejecución de la siguiente generación de aplicaciones y servicios Web XML. El diseño

de .NET Framework está enfocado a cumplir los objetivos siguientes:

• Proporcionar un entorno coherente de programación orientada a

objetos.

• Proporcionar un entorno de ejecución de código que reduzca lo

máximo posible la implementación de software y los conflictos de

versiones.

• Ofrecer un entorno de ejecución de código seguro

Page 10: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 10 -

• Información general acerca de .NET Framework (cont.)

• Proporcionar un entorno de ejecución de código que elimine los

problemas de rendimiento de los entornos en los que se utilizan

secuencias de comandos o intérpretes de comandos

• Ofrecer al programador una experiencia coherente entre tipos de

aplicaciones Windows y Web.

• Basar toda la comunicación en estándares del sector para asegurar

que el código de .NET Framework se puede integrar con otros tipos

de código

Page 11: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 11 -

.NET Framework es un componente Windows que soporta el desarrollo y ejecución

de aplicaciones Windows y Web Services. El propósito de este componente es

proveer al usuario con un entorno de programación orientada a objetos consistente,

donde el código pueda estar almacenado localmente o de manera remota.

Intenta minimizar los conflictos con el deploy y versionado de software y promueve

la ejecución de código en forma segura. El esfuerzo es hacer que la experiencia del

desarrollador sea consistente entre una gran variedad de aplicaciones y plataformas

y crear una comunicación estándar que ayude a las aplicaciones .NET Framework a

integrarse con otras aplicaciones web-based.

El .NET Framework tiene dos componentes principales. La Common Runtime (CLR)

y la Class Library

Page 12: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 12 -

.NET Framework contiene dos componentes principales:

• Common Language Runtime

• Biblioteca de clases de .NET Framework.

Common Language Runtime es el fundamento de la tecnología. El motor de tiempo

de ejecución se puede considerar como un agente que administra el código en

tiempo de ejecución y proporciona servicios centrales, como la administración de

memoria, la administración de subprocesos y la interacción remota, al tiempo que

aplica una seguridad estricta a los tipos y otras formas de especificación del código

que fomentan su seguridad y solidez. De hecho, el concepto de administración de

código es un principio básico del motor de tiempo de ejecución. El código destinado

al motor de tiempo de ejecución se denomina código administrado, a diferencia del

resto de código, que se conoce como código no administrado. La biblioteca de

clases, el otro componente principal de .NET Framework, es una completa colección

orientada a objetos de tipos reutilizables que se pueden emplear para desarrollar

aplicaciones que abarcan desde las tradicionales herramientas de interfaz gráfica de

usuario (GUI) o de línea de comandos hasta las aplicaciones basadas en las

innovaciones más recientes proporcionadas por ASP.NET, como los formularios Web

Forms y los servicios Web XML.

.NET Framework puede alojarse en componentes no administrados que cargan

Common Language Runtime en sus procesos e inician la ejecución de código

administrado, con lo que se crea un entorno de software en el que se pueden

utilizar características administradas y no administradas. En .NET Framework no

sólo se ofrecen varios hosts de motor de tiempo de ejecución, sino que también se

admite el desarrollo de estos hosts por parte de terceros.

Page 13: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 13 -

Por ejemplo, ASP.NET aloja el motor de tiempo de ejecución para proporcionar un

entorno de servidor escalable para el código administrado. ASP.NET trabaja

directamente con el motor de tiempo de ejecución para habilitar aplicaciones de

ASP.NET y servicios Web XML, que se tratan más adelante en este tema.

Internet Explorer es un ejemplo de aplicación no administrada que aloja el motor

de tiempo de ejecución (en forma de una extensión de tipo MIME). Al usar Internet

Explorer para alojar el motor de tiempo de ejecución, puede incrustar componentes

administrados o controles de Windows Forms en documentos HTML. Al alojar el

motor de tiempo de ejecución de esta manera se hace posible el uso de código

móvil administrado (similar a los controles de Microsoft® ActiveX®), pero con

mejoras significativas que sólo el código administrado puede ofrecer, como la

ejecución con confianza parcial y el almacenamiento aislado de archivos.

En la ilustración siguiente se muestra la relación de Common Language Runtime y

la biblioteca de clases con las aplicaciones y el sistema en su conjunto. En la

ilustración se representa igualmente cómo funciona el código administrado dentro

de una arquitectura mayor.

Common Language Runtime es el fundamento de la tecnología. El motor de

tiempo de ejecución se puede considerar como un agente que administra el código

en tiempo de ejecución y proporciona servicios centrales, como la administración de

memoria, la administración de subprocesos y la interacción remota, al tiempo que

aplica una seguridad estricta a los tipos y otras formas de especificación del código

que fomentan su seguridad y solidez. De hecho, el concepto de administración de

código es un principio básico del motor de tiempo de ejecución. El código destinado

Page 14: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 14 -

al motor de tiempo de ejecución se denomina código administrado, a diferencia del

resto de código, que se conoce como código no administrado.

La Common Language Runtime es el corazón del .NET Framework. Los

compiladores y herramientas exponen funcionalidad en tiempo de ejecución y

permiten escribir código con el beneficio de un entorno de ejecución administrado.

El código que se desarrolla con un compilador de lenguaje que trabaja con el

runtime se llama código administrado (managed code). Esto permite beneficios

como integración y manejo de excepciones entre distintos lenguajes, seguridad

mejorada, versionamiento y soporte para despliegue. Además de un modelo

simplificado para interacción de componentes y servicios de debugging y profiling.

Para permitir al runtime proveer servicios al código administrado, los compiladores

deben emitir metadata (información adicional) que describe tipos, miembros y

referencias en el código. La metadata se almacena con el código. Cada archivo que

la CLR puede cargar contiene metadata. El runtime la utiliza para localizar y cargar

las clases, mantener las instancias en memoria, resolver el llamado de métodos,

generar código nativo, mejorar la seguridad y definir las fronteras del contexto de

ejecución.

La common language runtime simplifica el desarrollo de aplicaciones, brindando un

entorno de ejecución seguro y robusto, con soporte para múltiples lenguajes, tal

como se detalló en diapositivas anteriores. Este entorno se conoce generalmente

como entorno administrado o managed environment, en el cual son provistos

automáticamente los servicios comunes, como garbage collection y securuty.

Page 15: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 15 -

Biblioteca de clases de .NET Framework

La biblioteca de clases de .NET Framework es una colección de tipos reutilizables

que se integran estrechamente con Common Language Runtime. La biblioteca de

clases está orientada a objetos, lo que proporciona tipos de los que su propio

código administrado puede derivar funciones. Esto ocasiona que los tipos de .NET

Framework sean sencillos de utilizar y reduce el tiempo asociado con el aprendizaje

de las nuevas características de .NET Framework. Además, los componentes de

terceros se pueden integrar sin dificultades con las clases de .NET Framework.

Por ejemplo, las clases de colección de .NET Framework implementan un conjunto

de interfaces que puede usar para desarrollar sus propias clases de colección. Éstas

se combinarán fácilmente con las clases de .NET Framework.

Como en cualquier biblioteca de clases orientada a objetos, los tipos de .NET

Framework permiten realizar diversas tareas de programación comunes, como son

la administración de cadenas, recopilación de datos, conectividad de bases de datos

y acceso a archivos. Además de estas tareas habituales, la biblioteca de clases

incluye tipos adecuados para diversos escenarios de desarrollo especializados. Por

ejemplo, puede utilizar .NET Framework para desarrollar los siguientes tipos de

aplicaciones y servicios:

• Aplicaciones de consola

• Aplicaciones GUI de Windows (Windows Forms)

• Aplicaciones de ASP.NET

• Servicios Web XML

• Servicios de Windows

Page 16: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 16 -

Por ejemplo, las clases de Windows Forms son un conjunto completo de tipos

reutilizables que simplifican enormemente el desarrollo de interfaces GUI para

Windows. Si escribe una aplicación Web Form de ASP.NET, puede utilizar las clases

de Web Forms.

Cuando se compila código soportado en .NET Framework, el compilador convierte el

código fuente en Lenguaje intermedio de Microsoft (MSIL), que es un conjunto de

instrucciones independiente de la CPU que se pueden convertir de forma eficaz en

código nativo.

MSIL incluye instrucciones para cargar, almacenar, inicializar y llamar a métodos en

los objetos, así como instrucciones para operaciones lógicas y aritméticas, flujo de

control, acceso directo a la memoria, control de excepciones y otras operaciones.

Antes de poder ejecutar código, se debe convertir MSIL al código específico de la

CPU, normalmente mediante un compilador JIT.

Common Language Runtime proporciona uno o varios compiladores JIT para cada

arquitectura de equipo compatible, por lo que se puede compilar y ejecutar el

mismo conjunto de MSIL en cualquier arquitectura compatible.

Cuando el compilador produce MSIL, también genera información adicional sobre el

código. Esta información describe los tipos que aparecen en el código, incluidas las

definiciones de los tipos, las firmas de los miembros de tipos, los miembros a los

que se hace referencia en el código y otros datos que el motor de tiempo de

ejecución utiliza en tiempo de ejecución.

El lenguaje intermedio de Microsoft (MSIL) y los datos adicionales, conocidos como

MetaData, se incluyen en un archivo ejecutable portable (PE), que se basa y

Page 17: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 17 -

extiende el PE de Microsoft publicado y el formato Common Object File Format

(COFF) utilizado tradicionalmente para contenido ejecutable. Este formato de

archivo, que contiene código MSIL o código nativo así como metadata, permite al

sistema operativo reconocer imágenes de Common Language Runtime.

La presencia de metadatos junto con el Lenguaje intermedio de Microsoft (MSIL)

permite crear códigos autodescriptivos, con lo cual las bibliotecas de tipos y el

Lenguaje de definición de interfaces (IDL) son innecesarios.

El motor de tiempo de ejecución localiza y extrae los metadatos del archivo cuando

son necesarios durante la ejecución.

Los archivos ejecutables están conformados por

• MSIL

• Datos Adicionales (Metadata)

• El MSIL es independiente del lenguaje en el que se

desarrolla

Page 18: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 18 -

• Microsoft Visual Studio.NET

• Introduction

• Administrando Solucion y Proyectos

• Presentation IDE

Page 19: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 19 -

• Microsoft Visual Studio.NET simplifica el desarrollo de aplicaciones basadas

en .NET proporcionando un entorno de desarrollo simple y unificado

• Características

• Un solo IDE (Integrated Development Environment)

• Soporte para varios lenguajes .NET (VB.NET, C#,...)

• Desarrollo de múltiples tipos de proyectos

• Explorador Web integrado (basado en IE)

• Interfase personalizable

• Posee varias utilidades adicionales: Acceso a datos SQL Server,

Depurador, Intellisense, Emuladores para móviles, etc.

Page 20: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 20 -

Los proyectos son contenedores que se ubican en una solución para administrar,

compilar y almacenar ítems. El contenido de los ítems depende del proyecto que se

está desarrollando y del lenguaje. Pueden ser archivos de código, imágenes,

gráficos, etc..

Page 21: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 21 -

• Todo recurso de una aplicación se ubica dentro de los proyectos.

• El contenido de los ítems depende del proyecto que se está desarrollando y

del lenguaje. Pueden ser archivos de código, imágenes, gráficos, etc..

Page 22: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 22 -

Plantillas de Proyectos

Visual Studio permite acceder a un número predefinido de plantillas o templates. Al

agregar diferentes módulos, estos agregan plantillas. Algunas pueden aparecer en

formas de Wizards, para generar proyectos.

Las plantillas de proyectos permiten a los desarrolladores concentrarse en la

funcionalidad específica que se desea implementar y es desde el proyecto donde se

administra las diversas tareas referidas a la compilación, guardado y apertura.

Archivos de definición de Proyectos

Cada proyecto contiene un archivo de definición que contiene metadata del

proyecto. La extensión de estos archivos de definición y el contenido del archivo se

determina por el tipo de proyecto que define. Generalmente el proyecto almacena

la configuración y los seteos de compilación que se especificaron para el proyecto y

su conjunto de ítems. Algunos proyectos mantienen una lista de archivos asociados

con el proyecto y su ubicación.

Cuando se agrega un ítem a proyecto, la ubicación física del ítem en disco se

guarda en la definición del proyecto. Si el ítem es removido del proyecto, la

información se elimina.

Page 23: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 23 -

Una solución permite a los desarrolladores concentrarse en la tarea de desarrollo y

distribución de los proyectos, en lugar de resolver detalles de administración de los

archivos de proyecto y los componentes.

Una solución de Visual Studio permite:

-Trabajar con varios proyectos en la misma instancia de Visual Studio

-Trabajar con ítmes utilizando seteos y opciones que se aplican a un conjunto de

proyectos

-Utilizar el Solution Explorer para diseñar y compilar la solución

Visual Studio genera automáticamente una solución cuando se crea un nuevo

proyecto. Es posible agregar nuevos proyectos a una solución a medida que se

necesitan.

Para administrar los proyectos y archivos de una solución, el Solution Explorer

provee una vista gráfica de toda la solución. También permite agregar carpetas de

ítems que no pertenecen al proyecto.

La definición de la solución se crea en dos archivos: una definición de solución .sln

y opciones de usuario de la solución .suo

Los archivos de definición de solución almacenan metadata que describe la

solución:

-Los proyectos asociados.

-Ítems asociados

Una solución puede contener varios proyectos que pueden ser abiertos, cerrados y

salvados al mismo tiempo. Cada proyecto en una solución puede contener varios

archivos o ítems. Los tipos de los ítems contenidos en un proyecto dependen del

lenguaje de desarrollo utilizado.

Page 24: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 24 -

La relación lógica entre una solución y sus componentes no reflejan,

necesariamente, la forma en la que la solución y sus componentes son

almacenados en el disco. Si se crea una aplicación que consta de varios proyectos,

es recomendable crear una carpeta de solución donde se almacenen todos los

proyectos.

Cuando se crea una solución multi-proyectos, el primer proyecto se transforma en

el de “start-up” por default. Al compilar la solución, los proyectos se compilar en el

orden en el que fueron agregados.

Page 25: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 25 -

La plantilla de proyectos permite comenzar una nuevo proyecto a partir de

plantillas (Templates), agrupadas según distintos tipos o categorías.

Para acceder a la plantilla de proyectos desde el menú: File->New Proyect…

Una vez seleccionado el tipo de proyecto, se deben completar campos que

determinan ubicación e identificación del proyecto y de la solución que lo contiene.

Name: Determina el nombre del proyecto.

Location: Permite seleccionar la ubicación física de la Solución y Proyecto

Solution: Da la opción de crear una nueva solución contenedora del proyecto o

incluirlo en una solución preexistente

Solution Name: Nombre de la solución que se creará junto al proyecto. Por defecto

es el mismo nombre que el proyecto.

Page 26: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 26 -

El Solution Explorer permite observar los ítems y realizar las tareas de

administración de los mismos desde la solución o desde los proyectos. También

permite utilizar los editores de Visual Studio para trabajar con ítems fuera de la

solución.

Desde el Solution Explorer es posible agregar y eliminar archivos y realizar otras

tareas administrativas. Cada proyecto tiene sus propias carpetas e iconos para

indicar el tipo de ítems en el proyecto.

Display Jerárquico

Una solución y sus proyectos aparecen en un formato jerárquico que provee

información actualizada sobre el estado de la solución, los proyectos y los ítems.

Esto permite al desarrollador trabajar en varios proyectos al mismo tiempo.

Page 27: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 27 -

• Lenguajes en Visual Studio.NET

• Visual Basic .NET

• C#

• C++

• J#

• Elección del lenguaje

Page 28: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 28 -

• Re-escrito desde cero para trabajar bajo .NET. Ahora totalmente OO.

Mejoras s/VB6:

• Características:

• Herencia

• Sobrecarga

• Constructores

• Administración estructurada de excepciones

• Comprobación de Tipos

• Miembros Shared

Page 29: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 29 -

• Fue un lenguaje creado especialmente para .NET. Totalmente OO.

• Características:

• Sintaxis similar a C++, Java

• Tipos seguros

• Case-sensitive

• Atributos accedidos por un punto

• Todo es tratado como objetos

• C# la línea finaliza con un ;

Page 30: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 30 -

http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vcedit/html/vc

grfvisualcppstandardeditionfeatures.asp

Page 31: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 31 -

http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/dv_vjsharp/ht

ml/vjconvisualjoverview.asp

Page 32: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 32 -

• .NET utiliza UN solo runtime (el CLR) y TODO lenguaje para .NET compila a

MSIL

• Prácticamente no hay diferencias de performance entre VB.NET y C#.

• Cual lenguaje usar, en general dependerá de su experiencia previa con otros

lenguajes o decisión personal.

• Si conoce Java, C++, etc. >> C# (nuestra elección)

• Si conoce VB o VBScript >> VB.NET

Page 33: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 33 -

En el siguiente ejercicio, se muestran los pasos para crear diferentes tipos de

proyectos en Visual Studio 2008, crear un método en una biblioteca de clases, y

utilizarlo desde un formulario.

Pasos:

1. Abrir Visual Studio 2008.

2. En el menú File, hacer click en New, y luego en Project.

3. Aparecerá el cuadro de diálogo New Project.

4. Para elegir el tipo de proyecto, expandir Visual C# y hacer click en Web,

seleccionar el template ASP.NET Web Application.

5. Especificar un nombre y una ubicación para el proyecto y presionar OK.

Visual Studio creará el proyecto.

6. Antes de comenzar, veamos básicamente qué contiene el entorno de

desarrollo.

a. A la derecha de la aplicación se encuentra la ventana Solution

Explorer. Ésta nos permite ver y administrar los archivos,

referencias, configuración y recursos del proyecto.

b. En la parte superior izquierda está la ventana Toolbox. Contiene los

controles que se pueden utilizar en el formulario, como botones,

cuadros de texto, etc.

c. La ventana Properties de la parte inferior derecha permite

establecer las propiedades y los eventos de los controles.

d. En la parte central se encuentra el editor de código.

7. Para agregar un web site a la solución, en el menú File, hacer click en Add

Page 34: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 34 -

y luego en New Web Site. En el cuadro de diálogo, seleccionar ASP.NET

Web Site y presionar OK.

8. Para agregar un proyecto de ventanas, hacer click en File, luego seleccionar

Add y New Project. En el árbol de Visual C#, seleccionar Windows

Forms Application como template.

9. Agregar una biblioteca de clases a la solución. En el menú File, hacer click

en Add y luego en New Project. Expandir Visual C# y hacer click en

Windows, seleccionar el template Class Library.

10. En la ventana Solution Explorer, dentro del proyecto de biblioteca de

clases, hacer doble click sobre el archivo Class1.cs y escribir un método que

retorne la cadena “Hello World!”.

11. Para agregar un botón y una etiqueta al formulario, seleccionar el proyecto

WindowsApplicartion Forms1 y hacer doble click en el archivo Form1.cs.

Desde la ventana Toolbox, expandir Common Controls y arrastar un

componente Button al formulario.

12. Modificar la propiedad Text del botón a „Say Hello‟ en la ventana

Properties.

13. Agregar una etiqueta al formulario, del mismo modo que el punto anterior,

seleccionando en este caso un componente Label.

14. Para dar funcionalidad al botón, usando el método creado en la biblioteca de

clases, es necesario agregar la referencia al proyecto.

15. En la ventana Solution Explorer, Hacer click con el botón secundario del

mouse sobre el nodo References perteneciente al proyecto del formulario y

seleccionar Add Reference. En el cuadro de diálogo, hacer click sobre la

solapa Projects y seleccionar ClassLibrary1, presionar OK.

16. La referencia que agregó aparecerá en el nodo References, como se ve en

la siguiente imagen.

Page 35: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 35 -

17. Hacer doble click sobre el botón. En método button1_click, llamar al

método creado en la biblioteca y mostrar el resultado en la etiqueta.

18. En la ventana Solution Explorer, hacer click sobre el proyecto del

formulario con el botón secundario del mouse y seleccionar Set as StartUp

Project.

19. Presionar F5 para ejecutar la aplicación.

20. Una vez cargado el formulario, presionar el botón „Say Hello‟. El texto „Hello

Word!‟ aparecerá en la etiqueta.

Page 36: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 36 -

21. Cerrar el formulario.

22. Agregar los controles y escribir el código necesario para realizar el mismo

funcionamiento en el sitio web, utilizando el método de la biblioteca de

clases.

Page 37: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 37 -

Módulo II

Introducción al lenguaje C#

Page 38: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 38 -

Introducción

Este módulo presenta la sintaxis básica y la estructura de C#. Describe los tipos de

datos, incluyendo variables y constantes, el sistema común de tipos de Microsoft

.NET, sentencias iterativas y condicionales, y explica cómo crear enumeraciones

definidas por usuarios. Comprender la sintaxis del lenguaje es fundamental para

escribir código en C#.

Page 39: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 39 -

Introducción

Esta lección describe la estructura de un programa C#. Esta información se provee

como un recurso para desarrolladores que no tienen experiencia con el estilo del

lenguaje C.

Page 40: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 40 -

Introducción

Antes de escribir sus primeras líneas de código en C#, es de gran ayuda

comprender la estructura del lenguaje.

Definición

La estructura de un lenguaje de programación específica los elementos que debe

incluir en su aplicación y define cómo organizar estos elementos para que el

compilador entienda su código.

Ejemplo de la estructura de C#

El siguiente código muestra la estructura básica de una aplicación C#:

using System;

class HelloWorld

{

static void Main()

{

Console.WriteLine("Hola Mundo");

}

}

Los elementos y los principios de organización que se muestran en las seis líneas de

código anteriores son brevemente descriptas línea por línea en las siguientes

secciones.

Page 41: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 41 -

La palabra reservada using

La palabra reservada using hace referencia a recursos de la biblioteca del .NET

Framework de Microsoft. Típicamente, usted inserta esta palabra clave al comienzo

de un archivo de programa, por lo general, varias veces, para referenciar a

distintos recursos.

El espacio de nombres (namespace) System

System es el espacio de nombres que provee acceso a toda la funcionalidad de

sistema sobre la cual se construye la aplicación.

Clase

Programar en C#, o en cualquier lenguaje orientado a objetos, consiste en escribir

clases, las cuales se usan para crear objetos. En el anterior ejemplo de código, la

clase se llama HelloWorld.

El método Main

Los métodos describen el comportamiento de una clase. En la tercera línea, static

void Main es un método global que le dice al compilador donde comienza la

ejecución de la aplicación. Toda aplicación C# debe incluir un método Main en una

de las clases.

Sentencias

Las sentencias son instrucciones que se completan para realizar acciones en

aplicaciones C#. Las sentencias están separadas entre sí por un punto y coma, para

permitir al compilador distinguir unas de otras.

Algunos lenguajes ubican una sentencia por línea. En C#, usted puede incluir

múltiples sentencias en una línea, o una sentencia en múltiples líneas. Es buena

práctica escribir una sentencia por línea; aunque, por cuestiones de legibilidad, es

mejor dividir una sentencia larga en varias líneas.

Llaves

Las llaves {} se usan para identificar el comienzo y el final de bloques de código en

una aplicación. Cada llave que abre debe tener su correspondiente llave que cierra.

En el ejemplo, las llaves que siguen a “class HelloWorld” encierran los ítems que

están dentro de la clase HelloWorld. Las llaves que siguen a “Main” se usan para

encerrar las sentencias que están en el método Main.

Microsoft Visual Studio® .NET provee varias señales para asegurarse que sus llaves

estén correctamente cerradas. Cuando se tipea una llave que cierra, los elementos

que encierra aparecen en negrita por un instante. También, los indicadores que

están en el margen izquierdo del documento muestran el alcance del grupo de

sentencias.

Page 42: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 42 -

Introducción

Dar formato es otro elemento del programa, diseñado para ayudar a organizar su

código. Se fomenta el uso de convenciones para mejorar la estructura y la

legibilidad de su código.

Ejemplo

El código demuestra cómo aplicar los principios de identación, sensibilidad a

mayúsculas y minúsculas, espacios en blanco y comentarios:

using System;

class HelloWorld

{

static void Main()

{

Console.WriteLine("Hola Mundo");

//escribe Hola Mundo

}

}

Identación

La identación indica que la sentencia se encuentra dentro de un mismo grupo de

sentencias.

Las sentencias que están en un mismo grupo o bloque deberían estar identadas al

mismo nivel.

Page 43: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 43 -

Esta es una convención importante que mejora la legibilidad de su código. Aunque

la identación no es obligatoria, o requerida por el compilador, es una práctica

recomendada.

Sensibilidad a mayúsculas y minúsculas

C# es sensible a mayúsculas y minúsculas, lo que significa que el compilador

distingue entre caracteres en mayúscula y minúscula. Por ejemplo, las palabras

“programa”, “Programa” y “PROGRAMA” se consideran diferentes en una aplicación,

no se puede sustituir una por otras.

Espacio en blanco

El espacio en blanco es ignorado por el compilador. Por eso, se pueden usar

espacios en blanco para mejorar la legibilidad y el formato del código. La única

excepción es que el compilador no ignora los espacios entre comillas.

Comentarios

Se pueden incluir comentarios de una sola línea en una aplicación insertando una

doble barra (//) seguida del comentario.

Alternativamente, si su comentario es muy largo y ocupa múltiples líneas, puede

usar barra asterisco (/*) para indicar el comienzo de un comentario y asterisco

barra (*/) para indicar el final de su comentario. El siguiente ejemplo es un

comentario de múltiples líneas que incluye un asterisco al principio de cada línea.

Estos asteriscos son opcionales y puede incluirlos para hacer que el comentario sea

más fácil de identificar.

Comentario de múltiples líneas

Ejemplo /*

* Comentario de múltiples líneas

* Este ejemplo muestra cómo dar formato a un

* comentario de múltiples líneas en C#

*/

/* uso alternativo de este comentario */

Diseño

Usted puede ubicar la llave que abre al final de la línea en que comienza el grupo, o

puede ubicar la llave en la siguiente línea del método o clase, tal como se muestra

en el siguiente ejemplo:

using System;

class HelloWorld

{

static void Main()

{

Console.WriteLine("Hello, World");

}

}

Ambos diseños son aceptados y correctos. Sin embargo, es importante ser

consistente.

Su organización debería elegir qué diseño usar.

Page 44: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 44 -

Introducción

Esta lección presenta la sintaxis básica del lenguaje C# y el sistema común de

.NET, incluyendo cómo usar tipos, variables, constantes, enumeraciones y cadenas.

Cuando usted escriba cualquier aplicación, debe representar los datos de cierta

forma. Este proceso depende fundamentalmente de trabajar con tipos.

Page 45: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 45 -

Introducción

Cada vez que su aplicación deba almacenar datos temporalmente para usarlos

durante la ejecución, se almacenan en variables. Puede pensar una variable como

si fuera una caja de almacenamiento. Las cajas vienen en diferentes tamaños y

formas, llamados tipos, éstos proveen almacenamiento para varios tipos de datos.

Por ejemplo, el tipo de variable usado para almacenar un nombre es diferente al

que se usa para guardar la edad de la persona.

Page 46: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 46 -

Definición.

Los tipos predefinidos son aquellos provistos por el lenguaje C# y .NET

Framework. La siguiente tabla lista los tipos predefinidos y describe los datos que

están diseñados para almacenar.

Tipo

predefinido

Definición #Bytes

Byte Enteros de 0 a 255 1

Sbyte Enteros de -128 a 127 1

Short Enteros de -32768 y 32767 2

Ushort Enteros de 0 y 65535 2

Int Enteros de -2147483648 y 2147483647 4

Uint Enteros de 0 y 4294967295 4

Long Enteros de -9223372036854775808 y

9223372036854775807

8

Ulong Enteros de 0 y 18446744073709551615 8

Bool Booleano: true o false 1

Float Punto flotante de precisión simple 4

Double Punto flotante de precisión doble 8

Decimal Decimal con 28 dígitos 12

Object Tipo Base para todos otros tipos N/A

Char Caracter Unicode simple entre 0 y 65535 2

String Secuencia ilimitada de caracteres Unicode N/A

Almacenado Datos

Suponga que está escribiendo una aplicación que permite al usuario comprar ítems

por Internet con tarjeta de crédito. Su aplicación debe administrar varias piezas de

información: el nombre de la persona, el monto de compra, el número de la tarjeta

de crédito y la fecha de expiración de la tarjeta. Para representar esta información,

su aplicación usa distintos tipos.

Eligiendo un tipo

Deje que el dato que está representando determine la elección del tipo. Por

ejemplo, si algo puede ser solo verdadero o falso, use bool. Decimal es una buena

elección para dinero. Cuando se trabaje con enteros, un int es la elección típica, a

menos que haya una razón para elegir otro tipo.

Además de los tipos predefinidos, usted puede definir sus propios tipos para

contener cualquier dato que elija.

Page 47: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 47 -

Introducción

Una variable es un espacio de almacenamiento para un tipo en particular. Por

ejemplo, si su aplicación debe procesar un valor de dinero, requiere una variable

que soporte ese valor.

Antes de usar una variable, debe declararla. Al declarar una variable, usted está

reservando espacio de almacenamiento para esa variable en memoria. Después de

declarar una variable, debe inicializarla asignándole un valor.

Sintaxis

La sintaxis para declarar una variable es el tipo de declaración seguido del nombre

de la variable. Por ejemplo:

int miEntero;

bool archivoFueCerrado;

Nombrar variables

La siguiente lista identifica algunas buenas prácticas para nombrar variables:

Asignar nombres significativos a sus variables.

Usar la notación camello. En la notación camello la primer letra del

identificador es minúscula y la primer letra de cada palabra siguiente en el

identificador es mayúscula, como nuevaCuentaBancaria.

Page 48: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 48 -

No usar palabras reservadas de C#.

Aunque C# sea sensible a mayúsculas y minúsculas, no crear variables que

difieran solo en ello.

Inicializando variables

Para inicializar una variable, se le asigna un valor. Para asignar un valor, usar el

operador (=) seguido del valor, y luego un punto y coma, como se muestra en el

siguiente ejemplo:

int miVariable;

miVariable = 1;

Se puede combinar estos pasos, por ejemplo:

int miVariable = 1;

Más ejemplos de declaraciones de variables se muestran en el siguiente código:

int x = 25;

int y = 50;

bool estaAbierto = false;

sbyte b = -55;

Asignando valores literales

Cuando se asigna 25 a x en el código anterior, el compilador asigna el valor literal

25 en la variable x. No obstante, la siguiente asignación genera un error de

compilación:

decimal bankBalance = 3433.20;

// ERROR!

Este código causa un error porque el compilador de C# asume que cualquier

número literal con un punto decimal es un double, a menos que se especifique que

es un decimal. Se especifica el tipo de literal agregando el sufijo, como se muestra

en el siguiente ejemplo:

decimal balance= 3433.20M;

Page 49: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 49 -

Los sufijos de literales que se pueden usar se muestran en la siguiente tabla. Se

permiten minúsculas:

Categoria

Sufijo

Descripción

Entero

U

Sin singo

L

Long

UL

Long sin signo

Número Real

F

Float

D

Double

M

Decimal

L

Long

Caracteres

Un caracter (tipo char) se especifica entre comillas simples:

char miInicial = 'a';

Caracteres de Escape

Algunos caracteres no se pueden especificar usando comillas simples, por ejemplo,

un caracter de nueva línea o un beep o una comilla simple. Para representar estos

caracteres, used debe usar caracteres de escape, los cuales se muestran en la

siguiente tabla:

Secuencia de escape Nombre del character

\' Comilla simple

\" Comilla doble

\\ Barra invertida

\0 Null

\a Alerta

\b Retroceso

\f Avance

\n Línea Nueva

\t Tabulación Horizontal

\v Tabulación Vertical

Por ejemplo, se puede especificar una comilla simple como sigue:

char comillaSimple = '\'';

Examinando variables en Visual Studio .NET

El entorno de desarrollo de Visual Studio .NET provee herramientas útiles para

examinar el valor de las variables mientras su aplicación esta ejecutándose.

Page 50: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 50 -

Para examinar el valor de una variable, ubicar un breakpoint en la variable que

usted desea examinar, corra la aplicación en modo debug, y luego usar la

herramienta de debug para ver los valores.

1. Ubicar un breakpoint haciendo click en el margen izquierdo de la ventana de

código. El breakpoint queda indicado como un punto rojo. Ud. puede ubicar

un breakpoint haciendo click en New Breakpoint en el menú Debug.

2. Ejecutar su aplicación en modo debug haciendo click en Start Debugging en

la barra de herramientas, o haciendo click en Start Debugging en el menú

Debug, o presionando F5.

3. Su aplicación se ejecuta hasta que encuentra un breakpoint. Cuando la

aplicación encuentra un breakpoint, se pausa, y el entorno de desarrollo

marca la línea próxima a ejecutarse.

4. Usar la ventana de debug para ver el valor de la variable. Para abrir las

ventanas de debug, en el menú Debug, seleccionar Windows, y luego hacer

click en Autos o hacer click en Locals, o en This.

La ventana Autos muestra las variables usadas en la sentencia actual y la

próxima. Por defecto, la ventana Autos se visualiza abajo del entorno de

desarrollo cuando se encuentra en modo debug.

La ventana Locals muestra las variables locales, y la ventana This muestra los

objetos asociados al método actual

5. Para pasar al próximo breakpoint, cuando usted esté listo de continuar

ejecutando su programa, puede presionar F5 o hacer click en Continue en el

Page 51: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 51 -

menú Debug. O puede ejecutar el programa paso a paso presionando F10, o

haciendo click en Step Over del del menú Debug.

Introducción

La cadena es uno de los tipos más comúnmente usado.

Definición

Una variable string contiene una secuencia de caracteres alfanuméricos que son

usados como entrada para cálculos o búsquedas.

Nota: No hay límite en el número de caracteres que conforman una cadena.

Sintaxis

Una cadena se declara como cualquier otra variable, se asigna el tipo (string) y se

le da un nombre.

Declarando cadenas literales

Se puede asignar un valor literal a una variable string encerrando el valor entre

comillas dobles.

string saludo = "Hola Mundo";

Usando caracteres de escape

También se pueden incluir caracteres de escape en un string.

Page 52: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 52 -

Por ejemplo, si Ud. desea crear un string escrito en dos líneas, puede incluir un

retorno de línea en el string usando el caracter \n, como se muestra en el siguiente

ejemplo:

string saludo = "Hola\nMundo";

Este código produce la siguiente salida:

Hola

Mundo

Si Ud. quiere insertar una tabulación, use el caracter de escape \t, como se

muestra en el siguiente ejemplo:

string saludo = "Hola\tMundo"; //

string sample = "Hello\tWorld"; // produce Hola Mundo

Para insertar una barra invertida, que es muy útil para rutas de

archivos, usar el caracter de escape \\, como se muestra en el

siguiente ejemplo:

string ruta = "c:\\My Documents\\sample.txt";

// produces c:\My Documents\sample.txt

Usando cadenas verbatim

Una cadena verbatim es un string que es interpretado por el compilador

exactamente como esté escrito, lo que significa que aún cuando la cadena ocupe

múltiples líneas o incluya caracteres de escape, éstos no son interpretados por el

compilador y son incluidos en la salida. La única excepción son las comillas dobles,

que deben ser interpretadas por el compilador para que pueda reconocer dónde

termina la cadena.

Una cadena verbatim se indica con el símbolo (@) seguido de la cadena entre

comillas dobles. Por ejemplo:

string saludo = @"Hola";

string saludo = @"Hola\tMundo"; // produces "Hola\tMundo"

El siguiente código muestra un ejemplo más útil:

string ruta = @"c:\My Documents\sample.txt";

// produce c:\My Documents\sample.txt

Si se desea usar comillas dobles dentro de la cadena verbatim, se debe agregar

otro par de comillas dobles. Por ejemplo, para producir “Hola” se usa es siguiente

código:

string s = @"""Hola"""; // Nota: tres comillas dobles de cada lado

El código anterior produce la salida:

"Hola"

Entendiendo Unicode

El .NET Framework usa Unicode UTF-16 (Unicode Transformation Format,

Page 53: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 53 -

16-bit encoding form) para representar caracteres. C# también codifica caracteres

usando el estándar de Unicode. El estándar de Unicode es el mecanismo universal

actual de codificación que se usa para representar texto en el procesamiento de

computación. El estándar anterior era ASCII. El estándar Unicode representa un

avance significativo sobre ASCII porque Unicode asigna un valor numérico único,

llamado punto de código, y un nombre a cada carácter que se usa en todos los

lenguajes del mundo. ASCII define solo 128 caracteres, lo que significaba que

algunos lenguajes no se podían representar correctamente en una aplicación.

Por ejemplo, el carácter “A” se representa por el código de punto “U+0041” y el

nombre “LATIN CAPITAL LETTER A”. Los valores están disponibles para más de

65.000 caracteres, y hay espacio para soportar hasta un millón más. Para más

información, ver el éstandar Unicode en www.unicode.org.

Introducción

Una constante es una variable cuyo valor permanece constante. Las constantes son

útiles en situaciones donde el valore que se use tienen un significado y es fijo,

como el número pi, el radio de la Tierra, o el porcentaje de impuesto.

Beneficios

Las constantes hacen su código mas legible, mantenible y robusto. Por ejemplo, si

asigna el valor 6378 a la constante llamada radioTierra, cuando use este valor en

cálculos es inmediatamente aparente qué valor se está haciendo referencia, y no es

posible asignarle un valor distinto por otra persona.

Page 54: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 54 -

Sintaxis

Una constante se declara usando la palabra clave y el tipo. Se debe asignar un

valor a la constante en el momento de la declaración.

Ejemplos

const int radioDeLaTierra = 6378;//km

const long distanciaAlSol = 149600000;//km

const double velocidadOrbital = 29.79D;//km seg

Introducción

Una enumeración especifica un grupo de constantes. Una enumeración es un tipo

definido por usuario, lo que significa que usted puede crear un enumeración,

declarar variables de ese tipo y asignar valores a esas variables. El propósito de

una enumeración es representar valores constantes.

Beneficios

Además de proveer todas las ventajas de las constantes, las enumeraciones:

Hacen que su código sea más fácil de mantener asegurando que a sus variables se

asignen solamente valores anticipados.

Permiten que usted asigne nombres fácilmente identificables a sus valores,

haciendo que su código sea más fácil de leer.

Hacen que su código sea más fácil de escribir, porque se asignan valores de la

enumeración., ya que muestra una lista de posibles valores que usted puede usar.

Permiten que especifique un set de valores constantes y defina un tipo que acepte

valores solamente de ese set.

Page 55: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 55 -

Sintaxis

Usted crea una enumeración usando la palabra clave enum, asignando un nombre,

y luego listando los valores que su enumeración puede tomar.

Es recomendable que use la notación Pascal, para el tipo y para cada miembro de la

enumeración. En la notación Pascal, la primera letra de cada palabra del

identificador se escribe con mayúscula, como ListaDePlanetas.

Ejemplo

En el siguiente ejemplo se muestra una enumeración:

enum Planeta

{

Mercurio,

Venus,

Tierra,

Marte

}

El código anterior crea un nuevo tipo, Planeta. Ud. puede crear variables de este

tipo y asignarles un valor de la lista de la enumeración.

Haciendo referencia a un miembro específico.

Cuando usted quiera hacer referencia a un miembro en una enumeración, use el

nombre de la enumeración, un punto y el nombre del miembro.

Por ejemplo: el siguiente código declara una variable planetaInterno de tipo

Planeta, y le asigna un valor:

Planeta planetaInterno = Planeta.Venus;

Usted puede declarar una enumeración en una clase o namespace, pero no en un

método.

Asignando valores

Si los miembros de su enumeración deben tener un valor específico, usted puede

asignar a miembros de una enumeración esos valores en la declaración. El

siguiente código asigna el valor del radio de cada planeta interno:

enum Planetas

{

Mercurio = 2437,

Venus = 6095,

Tierra = 6378

}

Tipo base de enumeración.

Usted puede usar cualquier entero excepto char como tipo base que se usará para

la enumeración especificando el tipo luego del nombre de la enumeración. Por

ejemplo: enum Planetas : uint

{

Mercurio = 2437,

Venus = 6095,

Tierra = 6378

}

Page 56: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 56 -

En esta práctica, se declararán e inicializarás variables y luego se examinarán

usando la herramienta de debug.

1. Abrir una nueva instancia de Visual Studio 2008.

2. En el menú File, hacer click en New, y luego en Project. o hacer click en

Create Project de la ventana Start Page.

3. Aparecerá el cuadro de diálogo New Project.

4. Para elegir el tipo de proyecto, expandir el nodo Visual C# y hacer click en

Windows, seleccionar el template Windows Forms Application.

5. Especificar un nombre y una ubicación para el proyecto y presionar OK.

Visual Studio creará el proyecto.

6. Para agregar una etiqueta al formulario, desde la ventana Toolbox,

expandir Common Controls y arrastar un componente Label al formulario.

7. Declarar, inicializar y mostrar en la etiqueta una variable con el valor Juan

Perez.

8. Declarar, inicializar y mostrar en la etiqueta una variable con el valor

135.20. Se asume que es una variable de tipo double.

9. Crear una enumeracion llamada Planeta, agregar los planetas a la

enumeracion.

10. Declarar una variable Planeta, asignar un valor a Planeta.Tierra y

mostrarlo en la etiqueta.

a. Planeta miPlaneta;

b. Asignar el valor Planeta.Tierra a la variable.

Page 57: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 57 -

11. Usar la herramienta de debug para ver el código paso a paso, y examinar los

valores de las variables, usando la ventana Locals.

12. Guardar y Salir de Visual Studio 2008.

Introducción

Cuando se diseña aplicaciones, a menudo se debe convertir un dato de un tipo a

otro. La conversión puede ser necesaria cuando se realizan operaciones con dos

tipos distintos.

Definiciones

Hay dos tipos de conversiones en el .NET Framework: implícitas y explícitas.

Una conversión implícita es automáticamente realizada por la CLR (Common

Language Runtime) sobre operaciones que garantizan no truncar

información.

En una conversión explícita se solicita explícitamente al compilador a realizar

una conversión, que de otra forma podría perder información o produciría un

error.

¿Por qué convertir?

Por ejemplo, cuando se ingresa un valor numérico en una página web, el tipo de

dato puede ser texto. Un programador debe entonces convertir ese texto a un tipo

numérico.

Page 58: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 58 -

Otra razón para convertir es evitar el desbordamiento u overflow. Si usted trata de

sumar dos bytes, el compilador retorna un int. Retorna un int porque el byte puede

mantener solo 8 bits, hasta un valor de 255, entonces el resultado de sumar dos

bytes podría resultar fácilmente en un número mayor de 255 (int=byte+byte). Por

esta razón, el valor resultante de la suma es convertido por el compilador y

devuelto como un int.

Conversiones implícitas

La siguiente tabla muestra los tipos de conversión implícita que soporta C#:

De A

Sbyte short, int, long, float, double, decimal

Byte short, ushort, int, uint, long, ulong, float, double, decimal

Short int, long, float, double, decimal

Ushort int, uint, long, ulong, float, double, decimal

Int long, float, double, decimal

Uint long, ulong, float, double, decimal

long, ulong float, double, decimal

Float Double

Char ushort, int, uint, long, ulong, float, double, decimal

Notar que las conversiones implícitas pueden ser realizadas desde un tipo pequeño

a otro más grande o desde un entero sin signo a un entero con signo.

Ejemplo

El siguiente ejemplo muestra una conversión implícita:

int x = 123456; // int es un entero de 4 bytes

long y = x; // conversión implícita a un long

Conversión explícita

La sintaxis para realizar una conversión explícita se muestra en el siguiente código:

tipo variable1 = (tipo cast) variable2;

El tipo entre paréntesis indica al compilador que el valor de la derecha (variable2)

es convertido al tipo que está especificado entre paréntesis.

Ejemplo

El siguiente ejemplo muestra una conversión explícita:

int x = 500;

short z = (short) x;

// conversión explícita a un short, z contiene el valor 500

Es importante recordar que las conversiones explícitas pueden resultar en pérdida

de datos. Por ejemplo, en el siguiente código, un decimal es explícitamente

convertido a un int:

decimal d = 1234.56M;

int x = (int) d;

Page 59: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 59 -

El resultado de esta conversión es que a x se le asigna el valor 1234.

Otras conversiones

La biblioteca de clases de .NET Framework provee un soporte para tipos de

conversiones en la clase System.Convert.

Page 60: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 60 -

Introducción

Esta lección explica cómo usar los operadores para crear expresiones.

Introducción

El propósito de escribir una expresión es realizar una acción y retornar un valor. Por

ejemplo, usted puede escribir una expresión para hacer un cálculo matemático,

asignar un valor o comparar dos valores:

Definiciones

Una expresión es una secuencia de operadores y operandos. Un operador es un

símbolo determinador que indica la acción que usted quiere que ocurra en su

expresión. Un operando es el valor sobre el cual la operación es realizada. Un

operador está específicamente diseñado para producir un nuevo valor en base al

operando.

Tipos de operadores:

Algunos de los tipos comunes de operadores que se pueden usar en C# son:

Incremento y decremento: Usados para incrementar o decrementar un valor en una

unidad.

Aritméticos: Usado para realizar cálculos aritméticos como la suma.

De Comparación: Usados para comparar si un valor es mayor, mayor o

igual, menor, menor o igual a otro.

Lógicos: Usados para definir situaciones and/or.

Page 61: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 61 -

Condicional: Usado para realizar una sentencia if.

De Asignación: Usado para asignar un valor a una variable.

La mayoría de los operadores solamente se usan con datos numéricos, pero otros

también se usan para cadenas.

La siguiente tabla lista todos los operadores que se pueden usar en C#:

Tipo de

Operador

Operador

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

checked,unchecked

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

Matemático + , - ,*, /, %

Desplazamiento << , >>

Comparación < , > , <= , >= , is

Igualdad ==

Lógico &,|,^

Condicional && , || , ?

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

Nota

Es importante notar la diferencia entre el operador de asignación y el operador de

igualdad. Notar que “es igual a” se representa con dos signos igual (==) porque un

solo signo (=) se usa para asignar un valor.

int x = 10;

// asignación

int y = 20;

int z = x + y;

// (z == 30) z es igual a 30?

C# hace posible usar una sintaxis concisa para manipular datos en forma compleja.

La siguiente tabla muestra cómo realizar operaciones en una forma más corta.

Forma corta Expresión idéntica

x++ , ++x x=x+1

x--, --x x=x-1

x += y x=x+y

x -= y x=x–y

x *= y x=x*y

x /= y x=x/y

x %= y x=x%y

x >>= y x = x >> y

x <<= y x = x << y

x &= y x=x&y

x |= y x=x|y

x ^= y x=x^y

Page 62: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 62 -

Incremento y decremento

Los operadores de incremento y decremento pueden usarse antes o después del

operando. Por ejemplo, x++ y ++x son ambos equivalentes a x=x+1. Sin

embargo, cuando estos operadores se usan en expresiones, x++ y ++x se

comportan de manera diferente. ++x incrementa el valor de x antes de que la

expresión sea evaluada. Es decir, se incrementa x y luego el nuevo valor de x se

usa en la expresión.

Ejemplo 1

int x = 5;

(++x == 6) // verdadero o falso?

La respuesta es verdadero.

x++ incrementa el valor de x después de que la expresión se ejecuta, entonces, la

expresión se evalúa usando el valor original de x.

Ejemplo 2

x = 5

(x++ == 6) // // verdadero o falso?

La respuesta es falso.

Ejemplo 3

int x = 10

int y = x++; // y es igual a 10

int z = x + y; // z es igual a 21

Una ayuda para mejorar la legibilidad de su código, es ubicar el incremento y el

decremento en sentencias separadas.

Negación lógica

El operador de negación lógica es un signo de admiración (!). Se usa para revertir

el valor de un tipo bool.

Si bool b es falso, !b es verdadero

Si bool b es verdadero, !b es falso

Por ejemplo:

bool estaAbierto = true;

bool estaCerrado = !estaAbierto;

Operadores matemáticos

Además de los operadores obvios + - * y /, existe el operador de resto (%) que

devuelve el resto de una división. Por ejemplo:

int x = 20 % 7;

// x == 6

Operadores lógicos

C# provee operadores lógicos, como se muestra en la siguiente tabla:

Page 63: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 63 -

Tipo de

Operador

Lógico

Operador Descripción

Condicional && x && y retorna verdadero si ambos son

verdaderos. y se evalúa solo si x es verdadero.

|| x || y retorna verdadero si alguno de ellos o

ambos son verdaderos. y se evalúa solo si x es

falso.

Booleano & x & y retorna verdadero si ambos son verdaderos

| x | retorna verdadero si alguno de ellos o ambos

son verdaderos.

^ x ^ y retorna verdadero si alguno de ellos es

verdadero y falso si ambos son verdaderos o

ambos falsos.

Los desarrolladores a menudo usan los operadores lógicos condicionales. Estos

operadores siguen las mismas reglas que los operadores booleanos pero tienen la

característica que solo son evaluados si es necesario.

Con qué usar operadores

Se puede usar también el operador de suma y de igualdad con cadenas. El signo

más concatena cadenas y el de igualdad las compara.

string a = "semi";

string b = "circulo";

string c = a + b;

string d = "cuadrado";

La cadena c tiene el valor semicírculo.

bool mismaForma = ( "circulo" == "cuadrado" );

mismaForma = ( b == d );

El booleano mismaForma es falso en ambas sentencias.

Page 64: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 64 -

Introducción

Los desarrolladores a menudo crean expresiones que realizan más de un cálculo,

comparación o una combinación de ambos. En estas situaciones, la precedencia de

los operadores controla el orden en el cual se evalúan las expresiones. Si se desea

que las operaciones se realicen en un orden diferente, se debe indicar al compilador

el orden usando paréntesis.

Orden de evaluación

El orden en el cual los operadores se evalúan en una expresión se muestra en la

tabla de precedencia.

Tipo de

Operador

Operador

Primario x.y, f(x), a[x], x++, x--, new, typeof, checked, unchecked

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

Multiplicativo *, /, %

Adición +,-

Desplazamiento << , >>

Comparación < , > , <= , >= , is, as

Igualdad == , !=

Lógico &,^,|

Condicional && , || , ?:

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

Page 65: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 65 -

Por ejemplo, el operador mas (+) tiene una precedencia más baja que el operador

de multiplicación (*), entonces a + b * c significa multiplicar b * c y luego sumar a.

Paréntesis

Usar paréntesis para mostrar el orden de evaluación y hacer la evaluación de su

expresión más legible. Los paréntesis extra son eliminados por el compilador y no

hacen su aplicación más lenta.

Por ejemplo, en la siguiente expresión, el compilador multiplica b por c y luego

suma d.

a = b * c + d

Usando paréntesis, en la siguiente expresión, el compilador primero evalúa lo que

está entre paréntesis, (c + d), y luego multiplica por b.

a = b * (c + d)

Los siguientes ejemplos demuestran la precedencia de los operadores y el uso de

paréntesis para controlar el orden de la evaluación.

10 + 20 / 5 (es reultado es 14)

(10 + 20) / 5 (es reultado es 6)

10 + ( 20 / 5 ) (es reultado es 14)

((10 + 20) * 5) + 2 (es reultado es 152)

Asociatividad

Todos los operadores binarios, aquellos que necesitan dos operandos, son

asocitativos a izquierda, es decir, que la expresión se evalúa de izquierda a

derecha, excepto por los operadores de asignación. Los operadores de asignación y

condicionales son asociativos a derecha.

Por ejemplo:

x + y + z se evalúa como (x + y) + z

x = y = z se evalúa como x = (y = z )

Page 66: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 66 -

Esta lección presenta las sentencias condicionales. Usted aprenderá cómo y cuándo

usar sentencias if y switch.

Objetivos de la lección

Luego de completar esta lección usted será capaz de:

Usar la sentencia condicional if...else para controlar el flujo de una

aplicación.

Usar la sentencia condicional switch para controlar el flujo de una

aplicación.

Agenda de la lección

Esta lección incluye las siguientes actividades:

Cómo y cuándo usar la sentencia if.

Cómo y cuándo usar la sentencia switch.

Page 67: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 67 -

En esta práctica basada en papel, examine cada línea de código y luego responda la

pregunta. Asuma que cada codigo se ejecuta en secuencia como esté escrito.

1.

Código:

int x = 10;

int y = x++;

Pregunta:

¿Cuál es el valor de y? ¿Por qué?

2.

Código (continua del anterior)

x += 10;

Pregunta

¿Cuál es el valor de x? ¿Por qué?

3.

Código

int z = 30;

int a = x + y * z;

Pregunta

¿Cuál es el valor de a? ¿Por qué? Escribir esto de una forma más legible.

Page 68: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 68 -

4.

Código (continua del anterior)

int a = 10;

int b = a++;

bool myBool = ( a == b );

Pregunta

¿Qué hace este código? ¿Cuál es el valor de myBool?

Pasos para verificar las respuestas con una aplicación.

1. Abrir una nueva instancia de Visual Studio 2008.

2. En el menú File, hacer click en New, y luego en Project. o hacer click en

Create Project de la ventana Start Page.

3. Aparecerá el cuadro de diálogo New Project.

4. Para elegir el tipo de proyecto, expandir el nodo Visual C# y hacer click en

Windows, seleccionar el template Windows Forms Application.

5. Especificar un nombre y una ubicación para el proyecto y presionar OK.

Visual Studio creará el proyecto.

6. Copiar el código correspondiente y verificar las respuestas realizando

breakpoints con la herramienta de debug y siguiendo el código paso a paso.

7. Guardar y Salir de Visual Studio 2008.

Introducción

Una sentencia condicional permite controlar el flujo de la aplicación seleccionando

las sentencias que serán ejecutadas, basado en el valor de una expresión booleana.

Page 69: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 69 -

Hay tres variaciones de una sentencia condicional:

if, if else, y if else if.

Cuando una expresión que se está evaluando es verdadera, el código siguiente a la

sentencia if será ejecutada.

Declarando un if

La sintaxis para la sentencia if else es la siguiente:

if (expresión booleana) sentencia1 else sentencia2

La sentencia1 se ejecuta si

Statement1 is executed if the expresión booleana is verdadera. Si es falsa se

ejecuta la sentencia2.

Por ejemplo:

if ( ventas > 10000 ) {

bono += .05 * ventas;

}

else {

bono = 0;

}

Evaluación múltiple

Se puede evaluar más de una expresión en una sentencia. Por ejemplo, las

expresiones que siguen a la sentencia if se evalúan como verdaderas si ventas es

mayor a 10000 pero menor a 500000:

if ( (ventas > 10000) && (ventas < 50000) ) {

// ventas esta entre10001 y 49999 inclusive

}

Usando el ternario

El operator ternario (?) es una forma corta de la sentencia if...else. Es útil cuando

se desea realizar una comparación y retornar un valor booleano.

Por ejemplo, la siguiente expresión asigna el valor 0 a bono si el valor de ventas es

menor a 10000:

bono = (ventas > 10000) ? (ventas * .05) : 0

Page 70: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 70 -

Introducción

Una sentencia switch selecciona el código a ejecutar basándose en el valor de una

expresión. Las sentencias switch son útiles para seleccionar una rama de ejecución

de una lista de opciones mutualmente exclusivas.

Usar sentencias switch hacen su aplicación más eficiente y su código más legible

que si se usa sentencias if anidadas.

Sintaxis

Una sentencia switch toma la forma de una expresión seguida de bloques de

opciones, indicando los casos. Cuando la expresión en el argumento equivale al

valor de uno de los casos, el código que sigue a ese caso es ejecutado. Cuando no

equivale a ningún caso, se ejecuta el caso por defecto, si es que hay uno definido.

Break

Se debe incluir una sentencia break al final de cada bloque de opción para que no

se produzca un error de compilación (siempre que exista código en ese caso).

Ejemplo:

La siguiente sentencia switch, asume que x es un entero.

switch (x) { case 0: // x is 0 break;

Page 71: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 71 -

case 1: // x is 1 break; case 2: // x is 2 break; }

Secuencia de ejecución

La secuencia de ejecución es la siguiente:

1. Se evalúa x.

2. Si una de las constantes en el caso es igual al valor de la expresión del switch,

se pasa el control a la sentencia seguida del caso.

3. Si ninguno de los casos equivale al valor de la expresión, el control se pasa al

final de la sentencia switch, o al caso por defecto, el cual es descripto en la

siguiente sección.

Si x tiene el valor 1, las sentencias del caso 1 se ejecutan.

Definiendo un caso por defecto

Si lo desea se puede definir una condición para aquellos valores que no son

manejados en ninguno de los casos.

El siguiente ejemplo muestra cómo definir una condición por defecto.

switch (x) { case 0: // x is 0 break; case 1: // x is 1 break; case 2: // x is 2 break; default: // x no es 0, 1 o 2 break; }

El caso por defecto maneja cualquier valor que no esté contemplado en los casos.

Page 72: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 72 -

En esta práctica completará un código al cual le falta una lógica condicional

apropiada.

Suponga que un zoológico necesita 5000 visitantes por semana para completar un

proyecto. Usted usará una sentencia if para verificar el número de visitantes y

escribir un mensaje indicando si el mismo fue abajo o arriba de la meta de 5000

visitantes.

Pasos

1. Abrir una nueva instancia de Visual Studio 2008.

2. En el menú File, hacer click en New, y luego en Project. o hacer click en

Create Project de la ventana Start Page.

3. Aparecerá el cuadro de diálogo New Project.

4. Para elegir el tipo de proyecto, expandir el nodo Visual C# y hacer click en

Windows, seleccionar el template Windows Forms Application.

5. Especificar un nombre y una ubicación para el proyecto y presionar OK.

Visual Studio creará el proyecto.

6. Para agregar un botón al formulario, desde la ventana Toolbox, expandir

Common Controls y arrastrar un componente Button al formulario.

7. Modificar la propiedad Text del botón a “Validar” en la ventana Properties.

8. Agregar una etiqueta al formulario, del mismo modo que el punto anterior,

seleccionando en este caso un componente Label.

9. Agregar un cuadro de texto al formulario, del mismo modo que el punto

anterior, seleccionando en este caso un componente TextBox.

Page 73: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 73 -

10. Para dar funcionalidad al botón, hacer doble click sobre el mismo. Agregar el

código necesario para que el método button1_click valide si el valor

ingresado en el cuadro de texto es mayor o igual a 5000 y muestre el

resultado en la etiqueta. Ejemplo:”Se ha alcanzado la meta de 5000

visitantes”, o de lo contrario, “No se ha alcanzado a la meta”.

11. Testear el código presionando F5 para compilar y ejecutar la aplicación.

12. Ingresar el valor 5000 en el cuadro de texto y presionar el botón Validar y

verificar que el mensaje en la etiqueta sea el correcto.

13. Ingresar el valor 4999 en el cuadro de texto y presionar el botón Validar y

verificar que el mensaje en la etiqueta sea el correcto.

14. Guardar y Salir de Visual Studio 2008.

Introducción

C# provee varios mecanismos de iteración, lo cual le permite ejecutar un bloque de

código repetidas veces hasta que se cumple una cierta condición. En todos los

casos una sentencia se ejecuta hasta que una expresión booleana se hace

verdadera.

Page 74: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 74 -

Introducción

Una iteración for se usa para ejecutar un código un cierto número de veces. Evalúa

una condición dada, y mientras esa condición sea verdadera, ejecuta el bloque de

sentencias.

La condición se ejecuta antes de que la condición sea evaluada. Si la condición es

falsa no se ejecutan las sentencias.

Se usa un for cuando se conoce por adelantado el número de veces que quiere

repetir la ejecución de un código.

Ejemplo

Por ejemplo, suponga que desea saber el monto de una cuenta bancaria de ahorros

luego de 10 años, y desea saber el total que tendrá al finalizar cada año. Una forma

es escribir la sentencia cuenta *= interés 10 veces, o usar una iteración.

Page 75: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 75 -

Sintaxis

La sintaxis para declarar una iteración for es:

for (inicializador; condición; iterador) {

sentencias;

}

Ejemplo

for ( int i = 0; i < 10; i++ ) {

Console.WriteLine( "i = {0}",i );

}

for ( int j = 100; j > 0; j -= 10 ) {

Console.WriteLine( "j = {0}", j );

}

Esta estructura es muy flexible. Por ejemplo, el contador de iteraciones puede ser

incrementado o decrementado en cada iteración. En este caso, es necesario

conocer la cantidad de iteraciones.

Ejemplo de un for que decrementa

En el siguiente ejemplo, se decrementa la variable i de 10 hasta 1.

for ( int i = 10; i > 0; i-- ) {

sentencias;

}

Ejemplo de un for que incrementa

En el siguiente ejemplo, se incrementa la variable i de 0 hasta 100, con

incrementos de 10.

for ( int i = 0; i <= 100; i = i+10 ) {

sentencias;

}

Declaración múltiple

Las sentencias inicialización e iteración pueden contener más una variable local,

como se muestra en el siguiente ejemplo:

for ( int i = 0, j = 100; i < 100; i++, j-- ) {

Console.WriteLine("{0}, {1}", i, j );

}

Este ejemplo produce la siguiente salida:

0, 100

1, 99

2, 98

.

.

.

99, 1

Page 76: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 76 -

Introducción

Tal como en el caso del for, la iteración while evalúa la condición antes de ejecutar

el código. Se usa cuando no se conoce exactamente cuántas veces debe iterar.

Sintaxis

La sintaxis para declarar una iteración while es la siguiente:

while (condición) {

sentencias;

}

Ejemplo

while ( leerArchivo == true ) {

LeerProximaLinea();

}

Usando la palabra reservada continue

Se puede usar la palabra reservada continue, para iniciar la próxima iteración sin

ejecutar el resto de las sentencias del while. El siguiente ejemplo lee comandos de

un archivo.

while ( leerArchivo == true ) {

string comando = LeerProximaLinea();

if ( comando == "Comentar" ) {

continue; //comienza una nueva iteración

}

Page 77: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 77 -

if ( comando == "Setear" ) {

// sentencias para hacer algo

}

}

Cuando el comando es un comentario, no hay necesidad de procesar el resto de la

línea, entonces se usa la palabra reservada continue para comenzar una nueva

iteración.

Usando la palabra reservada continue

También se puede salir de una iteración. Cuando se encuentra la palabra reservada

break, se termina la ejecución y continúa la siguiente sentencia al while.

while ( leerArchivo == true ) {

string comando = LeerProximaLinea();

if ( comando == "Exit" ) {

break; //sale del while

}

if ( comando == "Setear" ) {

// sentencias para hacer algo

}

}

Page 78: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 78 -

Introducción

En una iteración do, se ejecutan las sentencias del do, se evalúa la condición y si es

verdadera, se ejecutan las sentencias nuevamente. Es útil cuando se desea

ejecutar el código del loop al menos una vez.

Sintaxis

La sintaxis de una iteración do es la siguiente:

do {

sentencias

} while (expresión booleana);

Nota: El punto y coma después de la sentencia do es obligatorio.

Ejemplo

En el siguiente ejemplo, se usa un do para escribir números del 1 al 10 en una

columna: int i = 1;

do {

Console.WriteLine("{0}", i++);

} while ( i <= 10)

En este ejemplo, el operador de incrementos se usa para incrementar el valor de i

después de que es escrito por primera vez.

Page 79: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 79 -

En esta práctica, se usará una iteración for para calcular la suma de los enteros del

1 al 1000.

Pasos

1. Abrir una nueva instancia de Visual Studio 2008.

2. En el menú File, hacer click en New, y luego en Project. o hacer click en

Create Project de la ventana Start Page.

3. Aparecerá el cuadro de diálogo New Project.

4. Para elegir el tipo de proyecto, expandir el nodo Visual C# y hacer click en

Windows, seleccionar el template Windows Forms Application.

5. Especificar un nombre y una ubicación para el proyecto y presionar OK.

Visual Studio creará el proyecto.

6. Para agregar un botón al formulario, desde la ventana Toolbox, expandir

Common Controls y arrastrar un componente Button al formulario.

7. Modificar la propiedad Text del botón a “Calcular” en la ventana

Properties.

8. Agregar una etiqueta al formulario, del mismo modo que el punto anterior,

seleccionando en este caso un componente Label.

9. Para dar funcionalidad al botón, hacer doble click sobre el mismo. Agregar el

código necesario para que el método button1_click sume los enteros del 1

al 1000 con una sentencia for y muestre el resultado obtenido en la

etiqueta.

10. Testear el código presionando F5 para compilar y ejecutar la aplicación.

11. Presionar el botón “Calcular” y verificar que el mensaje en la etiqueta sea el

correcto.

12. Opcional: Realizar la misma funcionalidad que en el punto 9 usando una

sentencia while en lugar de una sentencia for.

13. Opcional: Realizar la misma funcionalidad que en el punto 9 usando una

sentencia do en lugar de una sentencia for.

14. Guardar y Salir de Visual Studio 2008.

Page 80: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 80 -

Módulo III

Fundamentos de la POO

Page 81: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 81 -

Abstracción

Probablemente la abstracción sea la herramienta más poderosa con la que cuenta

el hombre para comprender fenómenos complejos del mundo real. En el mundo

real nos enfrentamos día a día con diferentes fenómenos tales como objetos físicos,

eventos, situaciones y procesos.

La abstracción, en este sentido, es el proceso [intencional] de supresión, u

ocultamiento, de detalles respecto de un fenómeno, entidad o concepto, dejando de

lado el resto, de manera de concentrarnos en otros aspectos que nos son más

significativos en un determinado contexto.

Es importante notar que este proceso de abstracción es completamente subjetivo y

dependiente del contexto; diferentes personas pueden atravesar este proceso de

simplificación de diferentes maneras para un mismo fenómeno o entidad,

eliminando diferentes conceptos y, por tanto, llegando a una caracterización

diferente. Por ejemplo, tomando como objeto de análisis el concepto de automóvil,

un observador interesado en la mecánica podría caracterizarlo como un vehículo

con cierto tipo de motor, mientras que otro observador, en un contexto diferente,

podría caracterizar al mismo automóvil como un medio de trasporte, haciendo

énfasis en su capacidad de trasportar personas o cosas. Notar que en este caso,

deja de importar el tipo de motor que tenga (simplificación).

Diferentes niveles de abstracción

Nuestro mundo está conformado por una enorme cantidad de fenómenos y

entidades, imposibles de representar y manejar sin alguna herramienta que nos

permita caracterizarlos de alguna forma práctica.

Page 82: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 82 -

Una forma de realizar esto es lograr abstraer determinadas características de las

entidades de nuestro dominio, para así modelar un concepto más general que las

abarque. En otras palabras, lo que buscamos es separar efectivamente los objetos

concretos de la idea que queremos representar. Esto, que en principio nos puede

parecer una tarea difícil, es algo que hacemos inconscientemente en el día a día. A

modo de ejemplo, pensemos en la noción de que un objeto se encuentre sobre

otro: si vemos un florero apoyado en una mesa diremos naturalmente que el florero

se encuentra sobre la mesa. Asimismo, podemos decir que un lápiz se encuentra

sobre un escritorio o que el pan se encuentra sobre la mesada. De estos ejemplos

podemos decir que el florero, el lápiz y el pan comparten el concepto de estar sobre

algo. De hecho, una vez que logramos abstraer la idea de estar sobre, no sólo la

podemos extrapolar a otras situaciones sino que podremos hablar en abstracto con

otras personas que comprendan esa noción, sin referirnos a un caso concreto. De

forma similar, podríamos utilizar una pelota, un aro, una rueda, etc., y a partir de

estos objetos explicar lo que significa que un objeto sea redondo. Una vez hecho

esto podemos determinar si una o más entidades pueden ser caracterizadas de esta

manera simplemente por comparación (verificando que el conjunto de propiedades

que define al concepto redondo también son propias de la entidad en cuestión).

Al trabajar con objetos, dos de las más importantes abstracciones con las que

trabajaremos son las nociones es-un y tiene-un:

Page 83: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 83 -

Tipos de abstracciones: es-un y tiene-un [9]

“Las nociones de dividir en partes y dividir en especializaciones representan las dos

formas de abstracción más importantes usadas en la programación orientada a

objetos. Comúnmente se las conoce como las abstracciones es-un y tiene-un.

La idea de división en partes es la abstracción tiene-un. El significado de este

término es fácil de comprender; un auto „tiene-un‟ motor, „tiene-una‟ transmisión,

etc.

Al concepto de especialización nos referimos como la abstracción es-un.

Nuevamente, el término surge de las sentencias que pueden ser usadas para

ilustrar las relaciones. Utilizando este concepto, una bicicleta „es-un‟ vehículo

rodado, el cual a su vez „es-un‟ medio de transporte...”

Buscando el nivel de abstracción correcto [9]

En las etapas tempranas del desarrollo de software uno de los problemas críticos es

encontrar el nivel de abstracción correcto o adecuado. Un error común es hacer

hincapié en los niveles más bajos, preocupándose por los detalles de

implementación de varios componentes claves, en lugar de esforzarse para

asegurar que la estructura organizativa de alto nivel promueva una clara

separación de responsabilidades (concerns).

El programador (o el equipo de diseño en grandes proyectos) debe tratar de

balancear el nivel de abstracción adecuado en cada momento. Por un lado, uno no

quiere ignorar o tirar a la basura demasiados detalles sobre un problema, pero por

otro lado, tampoco uno debe mantener muchos detalles que al fin de cuentas

opaquen y no nos permitan ver ciertas cuestiones importantes.

En el contexto de la programación OO, la abstracción surge como un proceso de

reconocimiento de similitudes entre fenómenos, conceptos y entidades, y la

decisión de concentrarse en estas similitudes e ignorar las diferencias entre ellos.

De esta manera, logramos identificar conceptos generales (persona, auto, pelota,

etc.) que puedan ser mapeados directamente a construcciones básicas (objetos) en

nuestro paradigma.

Page 84: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 84 -

Modelo

Un modelo, es una versión simplificada de algún fenómeno o entidad del mundo

real. El modelado, como proceso, está muy ligado a otro concepto muy importante

que vimos anteriormente: el de abstracción. La forma de construir un modelo, ya

sea mental, físico, etc., es a través de un proceso de abstracción (simplificación),

mediante el cual descartamos aquellas características que no nos sean relevantes y

nos concentramos en aquellas que sí nos interesan. Esas características relevantes

son las que terminarán dando forma a nuestro modelo. En dos líneas, acerca de un

modelo podríamos decir:

Es una abstracción utilizada para entender y razonar sobre entidades y fenómenos

del mundo real.

Debe omitir detalles no esenciales y su grado de granularidad debe estar acorde a

sus propósitos.

Modelado del mundo real

Creamos un sinfín de modelos mentales para poder comprender los fenómenos

interesantes y para poder dominarlos. Un modelo es un artefacto creado por un

propósito; no puede estar bien o mal, sólo puede ser más o menos útil en relación

a su objetivo. La elección de los fenómenos y las preguntas que hacemos sobre los

mismos dependen de nuestros intereses, los paradigmas de modelado a los que

estemos acostumbrados y las herramientas que usemos para expresar nuestras

ideas. Si lo que queremos es comunicar de manera precisa nuestras ideas a un

colega, nuestro paradigma de modelado y notación deben ser similares a su

paradigma y notación. Si lo que queremos es comunicarnos con una computadora,

nuestro paradigma de modelado debe ser consistente con el lenguaje de

Page 85: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 85 -

computación apropiado. A medida que seamos más expertos en un paradigma de

modelado en particular, más difícil será poder realizar preguntas cuyas respuestas

excedan los límites del paradigma.[16]

Como dice Trygve en la referencia anterior, un modelo es creado con un propósito,

y por tanto, podemos inferir que hay una subjetividad implícita agregada por el

observador que crea este modelo, ya que lo hace motivado por un propósito. Es

importante notar que dicho propósito (ya sea propio o inducido) puede ser

completamente diferente al de otro observador. Asimismo, un modelo nuca está

completo, sino que su grado de completitud depende del uso que le demos a dicho

modelo. Las personas creamos modelos justamente para simplificar y generalizar

fenómenos más complejos, con lo cual, en realidad, terminamos ignorando más

detalles de los que incluimos en nuestro modelo.

A pesar de no hacerlo conscientemente, vivimos constantemente utilizando y

creando nuevos modelos de todo tipo para representar los fenómenos de la

naturaleza; los ejemplos abundan y van desde los modelos físicos (utilizados en el

diseño de represas, puentes, puertos y otras construcciones) hasta los modelos

matemáticos (utilizados por ejemplo para realizar simulaciones y optimizaciones

sobre sistemas reales, como en el campo de la hidrología). En astronomía se

utilizan modelos específicos para representar el movimiento de los cuerpos celestes

en el espacio, utilizando elementos de la geometría como son los círculos y las

elipses para representar las órbitas que describen los planetas, junto con otros

modelos matemáticos. Estos modelos permiten a los astrónomos, entre otras cosas,

Page 86: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 86 -

poder estimar la posición de uno de estos cuerpos celestes en el espacio en un

punto determinado en el tiempo y predecir, por ejemplo, las colisiones entre ellos.

Es importante notar que al realizar este tipo de modelos se dejan de lado muchos

detalles; por ejemplo, los planetas no son esferas perfectas, pero son modelados de

esa forma ya que simplifican determinados cálculos y la imprecisión que introducen

en el resultado final es despreciable.

Los modelos también nos permiten poder realizar simulaciones para evaluar o

estimar cuál será el desempeño del sistema en el mundo real, una vez que sea

llevado a la práctica. Este tipo de técnicas es utilizado en la industria del diseño de

vehículos de alta tecnología (automotriz o aeronáutica) para testear, por ejemplo,

las características aerodinámicas de los prototipos, utilizando maquetas a escala y

simulando el desempeño del vehículo dentro de un túnel de viento.

Modelos OO

La ejecución de un programa se puede ver como un modelo físico simulando el

comportamiento de una parte real o imaginaria del Mundo.

La palabra clave aquí es “físico”. El térmico “modelo físico” es utilizado para

distinguir estos modelos de, por ejemplo, los modelos matemáticos. Parte de la

realidad puede ser explicada utilizando ecuaciones matemáticas: las leyes de

Newton son un ejemplo de esto. Un modelo físico es un modelo construido a partir

de algún material físico como pueden ser los ladrillos Lego. Los elementos del

modelo físico representan fenómenos del dominio de aplicación. Los objetos son

como el material “computarizado” que se utiliza para construir modelos físicos

computarizados. Podemos ver a los objetos como un tipo de ladrillos electrónicos de

Lego.

Page 87: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 87 -

Reseña Histórica [9]

Comúnmente se piensa que la programación orientada a objetos es un fenómeno

relativamente reciente dentro de la ciencia de la computación. Por el contrario, en

realidad, casi todos los conceptos principales actualmente asociados con los

programas orientados a objetos, tales como objetos, clases y jerarquías de

herencia, fueron desarrollados en los años 60 como parte de un lenguaje llamado

Simula, diseñado por investigadores en el Centro de Computación Noruego

(Norwegian Computing Center). Como el nombre lo indica, Simula fue un lenguaje

inspirado por los problemas involucrados en la simulación de sistemas de la vida

real. Sin embargo, la importancia de estas construcciones, aún para los propios

desarrolladores de Simula, fue reconocida parcialmente [10].

En la década del 70 Alan Kay organizó un equipo de investigación en Xerox PARC

(Palo Alto Research Center o “Centro de Investigación Palo Alto”). Con una gran

presciencia o previsión, Kay predijo la próxima revolución en la computación

personal que se desarrollaría cerca de una década más tarde (ver, por ejemplo, su

artículo de 1977 en Scientific American [11]). Kay estaba interesado en descubrir

un lenguaje de programación que fuera entendible para aquellos profesionales

ajenos a la computación, para la gente común sin ningún tipo de entrenamiento en

el uso de computadoras. Encontró en las nociones de clases y en la computación

como simulación una metáfora que fácilmente podría llegar a ser comprendida por

los usuarios principiantes, como luego demostraría mediante una serie de

experimentos dirigidos en PARC usando a los chicos como programadores. El

lenguaje de programación desarrollado por su equipo fue llamado Smalltalk. Este

lenguaje evolucionó a través de varias revisiones durante la década. Un artículo

muy popular de la revista Byte de 1981 contribuyó para popularizar en gran medida

los conceptos desarrollados por Kay y su equipo en Xerox.

Casi contemporáneo al trabajo de Kay fue otro proyecto llevado a cabo al otro lado

del continente. Bjarne Stroustrup, un investigador de los Laboratorios Bell que

había aprendido Simula mientras completaba su doctorado en la Universidad de

Cambridge en Inglaterra, se encontraba desarrollando una extensión al lenguaje C

que facilitaría la creación de objetos y clases [12]. Esto se transformaría luego en el

lenguaje C++ [13].

Con la difusión de información sobre estos y otros proyectos similares, comenzó un

aumento vertiginoso de la investigación sobre técnicas de programación orientada a

objetos. Al momento de producirse la primera conferencia importante sobre

programación orientada a objetos, en 1986, hubo literalmente docenas de nuevos

lenguajes de programación compitiendo para ser aceptados. Entre estos incluidos

Eiffel [14], Objective-C [15], Actor, Object Pascal, y varios dialectos de Lisp.

En las dos décadas desde la conferencia de OOPSLA en 1986, la programación

orientada a objetos a pasado de ser revolucionaria a ser el movimiento principal, y

en este proceso ha transformado gran parte de la ciencia de la computación.

Page 88: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 88 -

Simula: Por los años 60, los programadores comprendieron que era necesario

descomponer los sistemas de programación en partes pequeñas más manejables.

La introducción de Simula-67 trajo consigo la primera noción de objetos, las clases,

y una especie de herencia; por lo tanto, Simula es un hito importante en cualquier

debate sobre lenguajes de programación OO. El lenguaje fue diseñado por Ole-

Johan Dahl, Bjørn Myhrhaug y Kristen Nygaard en el Norwegian Computing Center

ubicado en Oslo. La primer versión del lenguaje, Simula-1, fue presentada en 1966.

Los módulos de programación definidos por Simula no se basaron en

procedimientos, sino en objetos físicos tangibles. Simula tuvo una novedosa

manera de plantear los objetos, en donde que cada objeto tiene sus propios datos y

comportamiento.

Smalltalk: Muchos consideran que el primer lenguaje verdaderamente orientado a

objetos fue Smalltalk, desarrollado en el Learning Research Group en Xerox's Palo

Alto Research Center a principios de los 70. En Smalltalk, todo es realmente un

objeto, lo que impone el paradigma OO y hace que sea prácticamente imposible

escribir un programa en Smalltalk que no sea OO.

Smalltalk es en realidad un ambiente de programación interactivo que interpreta

código sobre la marcha (on-the-fly) lo que permite cambiar los parámetros y el

código de un programa mientras el programa está corriendo.

Smalltalk fue el primero en introducir muchos otros conceptos que luego

aparecerían como revolucionarios al ser implementados en otras aplicaciones, como

los buscadores o exploradores (browsers), las ventanas y los menús emergentes

(pop-up menus). El ambiente se basa en una máquina virtual, permitiendo a las

aplicaciones ser migradas entre diferentes plataformas.

Page 89: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 89 -

C++: Tiene su origen en un proyecto para simular software corriendo en un

sistema distribuido. Este simulador, de hecho escrito en Simula, es donde Bjarne

Stroustrup concibió la idea de combinar algunas de las características de Simula

con la sintaxis de C. El concepto de clase en C++ brindaba el mecanismo de

encapsulamiento, que hoy por hoy es un requisito esencial de cualquier lenguaje

OO.

Aunque C brindó una base sólida para C++, también se convirtió en una carga un

tanto pesada. El hecho de hacer a C++ compatible con su predecesor trajo serios

inconvenientes. Aunque C++ proporciona construcciones OO, también es posible

usar técnicas de programación estructurada. Por este motivo, C++ no es

considerado un lenguaje OO puro, si no un lenguaje híbrido.

Java: Los orígenes de Java se encuentran en un lenguaje que se apodó Oak. Su

creador decidió que basaría su lenguaje en el tan exitoso C++, pero que sólo

incorporaría aquellas características de C++ que parecieran valer la pena. Las

características que eliminó de C++ fueron la herencia múltiple, las conversiones

automáticas de tipos, el uso de punteros, y el esquema de administración de

memoria de C++. Pero el proyecto fue archivado por falta de interés en el

mercado.

Con la llegada de la Web y el surgimiento de los browsers, la gente de Sun

comenzó a atar cabos, y así Oak fue rescatado de la inactividad y renombrado

como Java.

C#: Microsoft respondió a la popularidad de Java produciendo una versión de Java

llamada Visual J++. Sin embargo, Microsoft se decidió por una respuesta más

integral. Usando muchas de las innovaciones que implementaba Java, Microsoft

desarrolló un lenguaje denominado C# que se convirtió en la base para la

plataforma .NET. De igual manera que Java, C# se basó fuertemente en los éxitos

y fracasos de lenguajes anteriores.

Page 90: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 90 -

Paradigma

Etimológicamente la palabra paradigma deriva del Griego paradigma, que significa

“patrón” o “ejemplo”. Thomas Kuhn [2] asignó a la palabra paradigma [19] el

significado aceptado hoy en día en la comunidad científica, cuando la adoptó para

referirse al conjunto de prácticas que definen a una disciplina científica durante un

período de tiempo en particular. Kuhn define también el término “cambio

paradigmático”[20], como el proceso y el resultado de un cambio en las hipótesis

establecidas por las teorías científicas reinantes. Un “cambio paradigmático” (o

“revolución científica”, como también lo llama Kuhn) se origina cuando los

científicos encuentran anomalías que no pueden ser explicadas mediante el

paradigma aceptado universalmente sobre el cual debe realizarse el progreso

científico. Todos los paradigmas presentan anomalías pero las hay de distinto tipo e

importancia. Cuando ocurre una serie de anomalías significativas contra un

paradigma actual, la disciplina científica entra en un estado de crisis, en el cual se

prueban nuevas ideas, tal vez descartadas previamente. Eventualmente se forma

un nuevo paradigma, que entrará en conflicto con el actual, enfrentando a los

seguidores de cada corriente. De producirse la transición entre el antiguo

paradigma y el nuevo, se dice que ha sucedido una “revolución científica” o “cambio

paradigmático”, según Kuhn.

Floyd, en “The Paradigms of Programming” [18] de 1978 habla sobre cómo influyen

los paradigmas de programación en el suceso de los diseñadores de programas,

sobre cómo deben ser enseñados y cómo deben ser incorporados en los lenguajes

de programación. Afirma que por aquella época existían problemas en cuanto al

inventario de paradigmas de programación disponible, en la manera en que se

enseñaba estos paradigmas y en la manera en que los lenguajes de programación

soportaban o dejaban de soportar los paradigmas de sus correspondientes

comunidades de usuarios. Se refiere al estado de la programación como un estado

de depresión (lo llama “depresión del software”), en comparación con la “crisis del

software” de la década anterior. Basándose en la visión de Kuhn sobre las

revoluciones científicas y en experiencias llevadas a cabo por él y algunos de sus

colegas, concluye que la probabilidad de que se produzca un avance continuo en

programación, requerirá de una invención continua, elaboración y comunicación de

nuevos paradigmas.

Page 91: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 91 -

Paradigma estructurado [21] [22]: describe la programación en términos del

estado del programa y sentencias que cambian dicho estado. Los programas

estructurados son una secuencia de instrucciones o sentencias que le indican a la

computadora cómo realizar una tarea. Podemos identificar los siguientes tipos de

sentencias básicas sobre las cuales se basa el paradigma: la asignación, la

secuencia, la repetición o iteración y la ramificación condicional. Con estas tres

sentencias se supone que se puede construir cualquier programa dentro del

paradigma estructurado. Dentro del conjunto de lenguajes que soportan el

paradigma estructurado, podemos mencionar: C, PASCAL, ADA, BASIC.

Page 92: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 92 -

El Paradigma Orientado a Objetos

Hasta el momento hemos dado algunas ideas respecto de qué es un paradigma y

de los distintos paradigmas de programación que encontramos hoy en día. Pero…

¿por qué es importante esto? En nuestro caso, poder definir el paradigma orientado

a objetos nos va a permitir entender claramente cuáles son las bases sobre las que

vamos a trabajar. En breve, al definir el paradigma OO estaremos explicitando

cuáles son los conceptos básicos con los que trabajaremos y cuáles son las reglas

válidas que nos permitirán manipular dichos conceptos.

Probablemente Alan Kay es quién ha dado la definición más concisa del paradigma

orientado a objetos. En [27] escribe:

…para este momento la mayoría de los principios de Smalltalk se habían plasmado

en seis ideas principales que estaban en consonancia con las premisas iniciales del

diseño del intérprete. Las primeras tres hablan sobre “que significa” ser un objeto –

cómo son vistos y utilizados desde el “exterior”. Estas premisas no requirieron de

ninguna modificación durante los años. Las últimas tres – los objetos vistos desde

adentro – fueron re-pensadas en cada nueva versión de Smalltalk…

Todo es un objeto.

Los objetos se comunican enviando y recibiendo mensajes.

Los objetos tienen su propia memoria (en términos de objetos).

Cada objeto es instancia de una clase (que también debe ser un objeto).

Las clases contienen el comportamiento compartito por sus instancias.

Para evaluar un programa, el control es pasado al primer objeto y el resto es

tratado como envío de mensajes.

Page 93: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 93 -

• La principal construcción es la noción de objetos.

• Los objetos pueden componerse o conocer otros objetos.

• Los programas están organizados en base a clases y jerarquías de herencia.

• La forma de pedirle a un objeto que lleve a cabo una determinada tarea es

por medio del envío de un mensaje.

Page 94: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 94 -

Programas Orientados a Objetos

Una vez que hemos sentado el paradigma con el cual vamos a trabajar (o sea, las

“reglas del juego”) es interesante detenernos un momento y analizar qué forma

tiene un programa en este paradigma. Al utilizar un paradigma estructurado, un

programa se basa en el diseño de estructuras de datos, los cuales son básicamente

contenedores de información pasivos. Luego, se desarrollan algoritmos que

trabajan sobre dichas estructuras realizando algún tipo de transformación de datos.

Al construir programas orientados a objetos, se deja de pensar en términos de

estructuras de datos pasivas y algoritmos y se piensa en términos de objetos

activos; los objetos son entidades que proveen un comportamiento particular y son

utilizados para modelar el dominio del problema. Bajo esta óptica, nuestro

programa ya no se encuentra dividido entre datos pasivos y algoritmos activos, sino

que es una red de objetos que cooperan (enviándose mensajes) para llevar

determinada tarea a cabo.

Page 95: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 95 -

Page 96: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 96 -

Los objetos son los elementos primarios que utilizaremos para construir programas.

Dichos objetos son básicamente abstracciones de alguna entidad (ya sea tangible o

no) del dominio del problema que estamos atacando. Para resolver un problema

determinado en el paradigma OO sólo tenemos objetos, que se comportan de una

determinada manera (definido por sus mensajes) e interactúan entre ellos

(enviándose de mensajes).

Cada objeto es una construcción caracterizada por: su comportamiento, el cual está

dado por los mensajes a los que puede responder; su estado interno, que,

mediante un conjunto de variables de instancia representa las características

intrínsecas de la entidad; y finalmente su identidad.

El comportamiento que provee puede verse como los servicios que presta y que

determinan su existencia y deben servir para responder preguntas como /¿para qué

quiero a este objeto?/ y /¿qué servicios me puede brindar?/. Por otro lado, como

dijimos antes, el estado interno está representado por variables de instancia que se

utilizan para expresar características del objeto y relaciones de conocimiento con

los otros objetos con que va a colaborar.

Otra de las propiedades importantes de los objetos es el encapsulamiento, que

sostiene que el único que puede manipular el estado interno de un objeto es el

mismo objeto. En otras palabras, un objeto no puede invadir el espacio privado

(estado interno) de otro objeto.

Pero no debemos perder de vista el hecho de que dentro de un sistema coexisten

miles de objetos, lo que conduce a la necesidad de disponer de algún mecanismo

que permita identificarlos unívocamente de modo de poder diferenciarlos. Por este

motivo, los objetos poseen una identidad que, como se presentó anteriormente, es

una propiedad intrínseca de cada objeto y, por tanto, no puede ser modificada por

el programador.

Page 97: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 97 -

Características

Comportamiento bien determinado. Al diseñar un objeto lo que uno hace es

establecer cuáles son las responsabilidades de dicho objeto. Estas

responsabilidades se materializan en un conjunto de mensajes a los que un objeto

puede responder.

Estado interno. A nivel de implementación los objetos poseen una estructura

interna que se define en términos de variables de instancia. Las variables de

instancia se utilizan para representar aquellas características propias del objeto

(como puede ser el número de una cuenta bancaria) y a los objetos con los que

deberá colaborar a lo largo de su vida.

Identidad. Es una propiedad intrínseca que poseen todos los objetos. La definición

de identidad es la siguiente: Un objeto solo es idéntico a si mismo. Notar que

identidad no es lo mismo que igualdad; dos tazas pueden ser iguales, pero cada

taza solo es idéntica a si misma.

Todo objeto es instancia de una clase. Las clases son el siguiente nivel de

abstracción, sobre el cual entraremos en detalle mas adelante. Como dijimos

anteriormente, un objeto es una abstracción de una entidad de nuestro modelo.

Dado que generalmente nos encontramos con un conjunto de objetos que se

comportan en forma similar, el siguiente paso es encontrar una forma de definir el

comportamiento de todos estos en forma general. Pensemos por ejemplo en las

cuentas bancarias: en un banco habrá miles de cuentas bancarias, las que se

Page 98: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 98 -

comportarán de la misma forma. Por este motivo, aparece la noción de clase

“cuenta bancaria”, la cual se utiliza para describir el comportamiento de todas sus

ocurrencias (instancias).

Cuando pensamos en los objetos vistos desde afuera lo que nos interesa es qué es

lo que el objeto puede hacer y no cómo lo hace. A continuación veamos un extracto

del libro de Budd [34]:

Supongamos que un individuo, llamado Chris, desea enviarle flores a una amiga

llamada Robin, que vive en otra ciudad. Debido a la distancia, Chris no puede

simplemente recoger las flores y llevárselas a Robin en persona. No obstante, esta

tarea puede resolverse fácilmente. Chris puede simplemente caminar hasta la

florería más cercana, la cual es atendida por un florista llamado Fred. Chris le dirá a

Fred el tipo de flores que desea enviar a Robin, y la dirección donde deben ser

entregadas. Luego Chris tendrá la seguridad de que las flores serán entregadas de

manera expeditiva y automática.

Corriendo el riesgo de volver innecesariamente a algún punto, enfaticemos el hecho

de que el mecanismo que fue usado para resolver el problema, fue encontrar un

agente apropiado (llamado Fred) y enviarle a este un mensaje con la solicitud. Es

responsabilidad de Fred satisfacer esa solicitud. Existe un método (algún algoritmo

o conjunto de operaciones) usado por Fred para hacer esto. Chris no tiene que

preocuparse en saber las particularidad del método que Fred usará para satisfacer

la solicitud, de hecho, a menudo la persona que hace una solicitud no desea saber

lo detalles. Esta información usualmente se encuentra oculta. Una investigación, sin

embargo, podría mostrar el hecho de que Fred envía un mensaje ligeramente

Page 99: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 99 -

diferente a otro florista en la ciudad donde vive Robin. Ese florista, tal vez tenga un

subordinado que hace los arreglos florales. Este florista entonces le pasa las flores,

junto con otro mensaje a un repartidor, y así sucesivamente. En un principio, el

florista que vive en la ciudad de Robin obtuvo sus flores de un mayorista de flores,

el cual interactuó con los que cultivan las flores, los cuales deben administrar un

equipo de jardineros.

Entonces, nuestra primera observación de la solución orientada a objetos a un

problema, es que la solución a este problema requiere de la ayuda de otros

individuos. Sin su ayuda, el problema no podría ser fácilmente solucionado.

Expresaremos esto de la siguiente manera:

“Un programa orientado a objetos se estructura como una comunidad de agentes

interactuando, llamados objetos. Cada objeto tiene un rol para llevar a cabo. Cada

objeto provee un servicio, o ejecuta una acción, que es usada por otro miembro de

la comunidad.” [34]

En muchos casos el objeto necesitará otros objetos que lo ayuden a llevar a cabo

su tarea. En este caso, al enviar el mensaje, el objeto emisor también le envía un

conjunto de parámetros para que el objeto pueda resolver el pedido. Por ejemplo,

al pedirle al florista que envíe las flores, el objeto emisor (Chris) debe indicarle al

florista el tipo y cantidad de flores que quiere enviar, así como la dirección de

Robin.

• La implementación indica cómo hace el objeto para responder a sus

mensajes.

• Se especifica a través de un conjunto de métodos.

• Es privada del objeto. Ningún otro objeto puede accederla.

Page 100: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 100 -

Estado interno/estructura interna

El estado interno de un objeto está constituido por un conjunto de variables de

instancia. Dichas variables de instancia acompañan al objeto durante todo su ciclo

de vida.

Una variable de instancia puede hacer referencia a una propiedad intrínseca de la

entidad que representa, o bien a otro objeto con el cual pueda colaborar para llevar

a cabo sus responsabilidades. A lo largo de la vida del objeto, las propiedades y

colaboradores pueden cambiar. Por ejemplo, al depositar $100 en una cuenta

bancaria la variable de instancia saldo cambiará su valor.

Este estado interno es privado del objeto. Es una de las características

fundamentales del paradigma y, como veremos más adelante, resulta crucial para

lograr software escalable. Por definición, las variables de instancia (estructura

interna) de un objeto es privado a éste. El único que puede acceder y manipular

sus v.i. es el propio objeto. Si un objeto externo quiere acceder a una v.i. lo tiene

que hacer por medio del envío de un mensaje. Esto le da la posibilidad al objeto de

decidir qué es lo que quiere publicar.

Identidad

La identidad es una propiedad intrínseca que poseen todos los objetos. Por

definición un objeto solo es idéntico a si mismo. Es importante notar que identidad

no es lo mismo que igualdad; dos sillas pueden ser iguales al punto que, si nos

damos vuelta y las cambian de lugar, no podríamos distinguir cual es cual. A pesar

de esto, cada silla sigue manteniendo su identidad.

Page 101: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 101 -

La identidad sirve para poder distinguir objetos individuales dentro de un sistema.

Es decir, dentro de un sistema coexisten una cierta cantidad de objetos, por lo que

es necesario poder identificarlos y diferenciarlos entre ellos.

La identidad, a nivel práctico, no tiene mayor importancia para el programador ya

que los lenguajes orientados a objetos proveen un mecanismo por el cual cada

objeto posee un identificador único y, de hecho, casi nunca es posible obtener dicho

identificador. Indirectamente vamos a estar utilizando este concepto cuando

comparemos dos objetos por igualdad, pero este concepto se ampliarán a

continuación.

Page 102: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 102 -

Identificar objetos y propiedades. Como ejercitación adicional, puede plantearse la

idea de agrupar las propiedades en los objetos que correspondan.

Page 103: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 103 -

Identificar objetos y propiedades. Como ejercitación adicional, puede plantearse la

idea de agrupar las propiedades en los objetos que correspondan.

Page 104: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 104 -

Dijimos que el comportamiento de un objeto se define por medio de los mensajes

que éste entiende y que para poder enviarle un mensaje a un objeto, hay que

conocerlo. Hemos visto también que al enviarle un mensaje a un objeto, éste

responde activando el método asociado al mensaje, siempre y cuando éste exista.

También vimos que un mensaje es enviado a un objeto por otro objeto y como

resultado del envío de un mensaje, siempre se retorna un objeto.

El método, es decir la implementación, especifica qué hace el objeto receptor al

recibir el mensaje. El método no contiene otra cosa que una serie de mensajes

enviados a otros objetos (sólo hay objetos y mensajes). Recordemos también que

los métodos son privados al objeto y que los objetos sólo pueden comunicarse

mediante el envío de mensajes. Veamos en qué consiste la ejecución de

comportamiento ante el envío de un mensaje.

Mostrar la importancia de qué mensajes entiende un objeto y no cómo los realiza.

Poder mostrar la modularidad y separación que existe a la hora de programar en

POO.

Page 105: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 105 -

• Al enviarle un mensaje a un objeto, éste responde activando el método

asociado a ese mensaje (siempre y cuando exista).

• Como resultado del envío de un mensaje puede retornarse un objeto.

Page 106: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 106 -

Por ejemplo, supongamos que contamos con un objeto que representa la torre de

control de un aeropuerto. Si la torre desea avisar al avión LV-YPS que debe

aterrizar, primero debe conocerlo. A su vez, si el avión LV-YPS desea comunicarse

con la torre, también debe conocerla.

Page 107: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 107 -

Cuando un objeto (emisor) le envía un mensaje a otro objeto (receptor), el objeto

receptor responde activando el método asociado a este mensaje, siempre que el

mensaje recibido forme parte del protocolo del objeto receptor. Volviendo al

ejemplo, cuando la torre envíe el mensaje „aterrizar‟ al avión, éste activará un

método que contendrá el procedimiento de aterrizaje.

Podría suceder que el avión no conozca los procedimientos para aterrizar, es decir,

podría no existir un método que se corresponda con el mensaje „aterrizar‟. ¿Qué

ocurre cuando un objeto no entiende un mensaje recibido? Esto depende del

lenguaje: algunos lenguajes pueden evitar esta situación mediante un sistema de

tipos fuerte que chequee estas situaciones en tiempo de compilación, mientras que

otros brindan una mayor libertad en cuanto al envío de mensajes y responden,

eventualmente, con un error en tiempo de ejecución.

Page 108: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 108 -

Otro ejemplo de envío de mensajes, usando una versión simplificada del juego de

rol.

Page 109: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 109 -

• La persona envía el mensaje #dameUnCafe() a la expendedora.

• La expendedora le pide a la cafetera que le sirva el café en el vaso que le

da.

• La cafetera retorna el vaso con el café preparado.

• La expendedora entrega el vaso con café a la persona

Page 110: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 110 -

Siempre se debe contar con dos objetos para poder resolver el envío de un

mensaje, uno cumpliendo el rol de emisor y otro el de receptor (eventualmente

podría tratarse del mismo objeto cumpliendo los dos roles). El emisor envía un

mensaje al receptor, en este caso el mensaje hacerAlgo. El receptor recibe el

mensaje y busca entre sus métodos aquel que coincida con el nombre del mensaje.

Si encuentra el método correspondiente, procede a ejecutarlo (en este caso el

objeto receptor tiene un método asociado al nombre hacerAlgo). La ejecución del

método la veremos en detalle más adelante, en este caso nos interesará saber que

al finalizar la misma, el objeto receptor deberá retornar un objeto como resultado

del envío del mensaje, devolviendo nuevamente el control al objeto emisor.

Page 111: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 111 -

¿Cómo es la manera en que se especifica un mensaje? En primer lugar debemos

asignarle un nombre, el mismo debe tener significado en el dominio del problema,

esto es de vital importancia para el futuro entendimiento del sistema. Por otro lado,

debemos indicar cuáles son los posibles objetos, u otro tipo de parámetro,

requeridos para resolver el mensaje.

Cada lenguaje de programación propone una sintaxis particular para indicar el

envío de un mensaje. A lo largo del curso utilizaremos la siguiente sintaxis:

<objeto receptor>.<nombre de mensaje> (<parámetros>);

Por ejemplo, decirle a una cuenta bancaria que deposite $100 se escribe como:

unaCuenta.depositar(100);

Page 112: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 112 -

Ejemplificar correctamente la diferencia entre método y mensaje.

Mostrar, si es necesario, el #dameCafe(), del ejemplo del juego de rol.

Page 113: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 113 -

Page 114: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 114 -

Veamos como ejemplo la implementación del método depositar del objeto caja de

ahorro.

El comentario nos indica de manera concisa en qué consiste la resolución del

comportamiento representado por el método.

En este caso la resolución es muy sencilla: la variable de instancia saldo de la caja

de ahorro se actualiza con el valor del parámetro unMonto.

Este caso es muy similar, salvo que se reciben dos parámetros: el saldo y el nro.

de cuenta. El cajero conoce al banco por medio de la variable de instancia banco, y

lo que hace es delegar en dicho objeto la responsabilidad de buscar la caja de

ahorro que corresponde al nro. de cuenta que viene como parámetro. Luego, una

vez encontrada la caja de ahorro correspondiente, se le envía el mensaje depositar

con el monto como parámetro.

Page 115: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 115 -

Ahora será necesario especificar el método saldo. El objeto caja de ahorro debe

devolver su saldo actual como respuesta al envío del mensaje saldo, para lo cual

necesitaremos un mecanismo que nos permita indicar cuál es el resultado de

evaluar un método. Para tal fin contamos con una construcción sintáctica especial,

el símbolo flecha hacia arriba. El símbolo va seguido de cualquier objeto e indica

que ese objeto será retornado como resultado de la ejecución del método.

La especificación del método saldo quedaría de esta manera. Simplemente se

indicaría que se debe devolver el colaborador interno saldo, anteponiendo el

símbolo al nombre de la variable de instancia que contiene el valor a retornar.

Page 116: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 116 -

Forma más visual e intuitiva de los envíos de mensajes en los objetos.

Cambio del objeto titular dentro de la caja de Ahorro

Page 117: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 117 -

Este caso, en respuesta al mensaje titular(), esperamos obtener el titular de la caja

de ahorro. Por lo tanto, cuando la caja de ahorro recibe el mensaje titular, activa el

método correspondiente y se retorna el objeto persona Juan Pérez.

Page 118: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 118 -

Realizar el método #extraer(unMonto), utilizando el método #depositar(unMonto)

como ejemplo

Page 119: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 119 -

Modelar el proceso de extracción de dinero de un cajero automático identificando

las principales entidades participantes y el conjunto de mensajes que los

comunica. Para esto utilizaremos diagramas de secuencia UML.

Page 120: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 120 -

Page 121: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 121 -

El ocultamiento de la información es particularmente importante en la

programación orientada a objetos. Los objetos frecuentemente son complejas

estructuras de datos con muchos componentes que no deben ser accedidas por los

clientes. Existen algunas razones para tal encapsulamiento:

- La representación de un objeto está sujeta a cambios. Durante el desarrollo de

una clase puede suceder que un conjunto diferente de variables de instancia resulte

mejor con el propósito de la clase. Si los clientes acceden directamente a las

variables de instancia, éstos deben ser modificados para que queden consistentes

con la nueva representación.

- En contraste con los registros en los programas convencionales, los objetos no

son usados principalmente como contenedores cuyo único objetivo es agrupar

datos elementales. Más bien, las variables de instancia del objeto son utilizadas

para representar el estado del mismo. El objeto en si mismo es una entidad activa

que puede llevar a cabo ciertas operaciones cuando le es requerido. Las variables

de instancia pueden ser consideradas como variables auxiliares que son necesarias

para realizar las operaciones.

- Los objetos frecuentemente poseen otros objetos. La posesión es privada para el

objeto; la relación entre el objeto y los otros objetos que le pertenecen no debe ser

alterada por los clientes.

- Los objetos son accedidos mediante referencias polimórficas. Si un objeto es

accedido a través de una variable v, el objeto referenciado por v puede cambiar

dinámicamente durante la ejecución del programa y no podemos estar seguros si la

variable v siempre hará referencia a un objeto con la misma estructura interna.

Page 122: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 122 -

El encapsulamiento es una de las características fundamentales del paradigma y es

uno de los puntos clave para que el software escale en forma “suave” y se adapte a

los cambios.

Idealmente, en cualquier sistema, intentamos que el acoplamiento entre las partes

que lo componen sea lo más bajo posible. Esto implica que cada parte sabe lo

mínimo indispensable de las otras partes, lo que implica que los cambios en alguna

de esas partes no impactan (o lo hacen en forma muy leve) en el resto de las

partes del sistema.

En un sistema OO las “partes” básicas son los objetos, por lo que nos gustaría que

los cambios en un objeto impacten lo menos posible en el resto de los objetos que

hacen al sistema. Uno de las formas de lograr esto es por medio de la separación

entre lo que es público de un objeto y lo que es privado.

Desde el punto de vista mas puro del paradigma orientado a objetos un objeto se

define por los servicios que puede brindar (o sea, por los mensajes que entiende).

Luego, lo lógico es que estos mensajes sean la parte pública del objeto. Por otro

lado, la implementación de estos mensajes (los métodos, o sea cómo resuelve un

requerimiento el objeto) no es algo que le importe al emisor del mensaje, por lo

que debe ser privado del objeto que implementa el método. De forma similar,

tampoco tiene porque interesarle al resto de los objetos cuál es la estructura

interna de un determinado objeto ni con qué otros objetos éste tiene que colaborar

para llevar a cabo sus responsabilidades. Todo lo que le importa al objeto emisor es

cuál es el mensaje que tiene que enviar, qué parámetros debe enviar y cual es la

semántica asociada al envío del mensaje.

Page 123: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 123 -

El hecho de programar en términos del protocolo de un objeto, sin saber nada de

su estructura interna ni de cómo implementa sus métodos, es lo que ayuda a

mantener los cambios acotados, evitando que un cambio en un objeto se propague

por todo el sistema. De aquí la relación que nombramos anteriormente acerca de

los métodos y el encapsulamiento. Justamente es a través de los métodos que el

objeto publica la única manera de interactuar con él. Nada se podrá hacer que no

esté provisto a través del protocolo.

El mismo gráfico que habíamos visto anteriormente lo vemos ahora desde el punto

de vista del encapsulamiento. Vemos que el titular de la caja de ahorro es sólo

conocido por la misma caja de ahorro y la única forma de accederla es a través del

protocolo del objeto. Lo mismo ocurre con el saldo.

Page 124: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 124 -

Ahora debemos modelar un objeto punto, que represente un punto en el plano,

dando la implementación correspondiente a cada uno de los siguientes mensajes:

getX() “Devuelve la coordenada x del punto”

setX(unNumero) “Cambia la coordenada x del punto por unNumero”

getY() “Devuelve la coordenada y del punto”

setY(unNumero) “Cambia la coordenada y del punto por unNumero”

igualA(otroPunto) “Devuelve si el punto es igual a otroPunto”

Page 125: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 125 -

Mostrar con diagramas de secuencia la interacción entre el pulsador, la vía, la

locomotora. En primera instancia van a modelar el motor con un boolean. Luego el

ejercicio los llevará a que lo modelen con un objeto a parte: Motor

Page 126: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 126 -

En este punto, el nuevo objeto Motor entenderá los tres mensajes:

#haciaAtrás.

Page 127: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 127 -

#haciaAdelante.

#apagado.

Mostrar la escalabilidad del objeto agregando más estados posibles de movimiento.

Si pensamos nuevamente en el ejemplo del banco, es evidente que existirán varios

objetos de tipo caja de ahorro, uno por cada caja de ahorro existente en el banco.

Todos estos objetos deberán tener el mismo comportamiento y es de esperar que si

hay algún cambio en el comportamiento de las cajas de ahorro, el mismo se refleje

por igual en todos los objetos de este tipo. Luego, es necesario contar con algún

mecanismo que permita agrupar el comportamiento común a un conjunto de

objetos, de manera que pueda ser reutilizado sin tener que ser especificado

individualmente. Por otro lado, el estado interno de cada caja de ahorro será

diferente (los saldos no serán los mismos por ejemplo) pero todas compartirán la

misma estructura interna (todas conocen su saldo, titular, etc.). Desde el punto de

vista de la reutilización, es así como surge la noción de clase: como una

herramienta que me permite factorizar y reutilizar estructura y comportamiento en

común.

Page 128: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 128 -

Una clase nos permite describir en un sólo lugar el comportamiento genérico de un

conjunto de objetos. Una vez definido este comportamiento, es posible crear

objetos que lo reutilicen y se comporten de la manera allí descripta. Las clases nos

permiten pensar en un nivel de abstracción más alto. Cuando construimos

programas nos preguntamos constantemente: ¿qué clases de objetos aparecen en

mi sistema?

Una clase entonces puede pensarse como un molde para un tipo específico de

objeto. Molde como medio para definir la forma de los objetos.

Es natural clasificar objetos por determinadas características. En muchos casos nos

encontramos en situaciones en las que un conjunto de objetos se comportan en

forma similar y sólo difieren en sus características básicas o en los objetos con los

que colabora. En estos casos es importante poder abstraer el comportamiento

común de los objetos y especificarlos en forma abstracta, de forma tal de modelar

el concepto subyacente. Como definición de clase se puede tomar la siguiente:

Una clase es una descripción abstracta de un conjunto de objetos.

Las clases describen el formato de los objetos y agrupan comportamiento en

común. Una clase especifica qué forma tendrán sus instancias (sus variables de

instancia) y cómo responderán a los mensajes que se le envíen. De esta forma, una

clase puede ser vista como una descripción de sus instancias y como un repositorio

de comportamiento. Cuando se le envía un mensaje a un objeto, lo que hace el

intérprete es buscar en la clase del objeto receptor un método con el cual

responder al envío del mensaje. De ésta forma, todos los objetos que comparten

una misma clase responden en forma similar al envío de un mensaje.

Page 129: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 129 -

En el caso de la cuenta bancaria, dado que en un banco habrá miles de cuentas, lo

que hacemos es modelar la noción de cuenta bancaria en una clase. Esta clase

definirá qué variables tendrán sus instancias, así como los mensajes a los que

puede responder. En nuestro caso la clase se llamará CuentaBancaria, especificará

que sus instancias tienen dos variables (saldo y titular) y que pueden responder a

los mensajes saldo(), titular(), depositar(unMonto) y extraer(unMonto).

Sabemos que las clases son las encargadas de describir en forma abstracta a sus

instancias, luego es lógico que si necesitamos crear una nueva instancia se lo

pidamos a la clase. Por ese motivo, la clase tiene la responsabilidad de crear sus

instancias. Volviendo al ejemplo de la cuenta bancaria, para crear una nueva

cuenta bancaria lo que debemos hacer es pedirle a la clase CuentaBancaria que nos

retorne una nueva instancia.

Uno de los problemas más comunes es la confusión entre clases e instancias. Es

importante remarcar que una clase es un molde de estructura y comportamiento,

así como la encargada de crear a sus instancias. Una vez que se crea una instancia,

esta tiene sus propias variables. Por ejemplo, si creamos dos cuentas bancarias,

cada una tendrá su saldo y su titular. Lo único que comparten es que ambas son

instancia de la misma clase, lo que implica que al enviarles un mensaje, el método

que se activará se buscará en la clase CuentaBancaria, que es común a las dos.

Page 130: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 130 -

Contamos con una clase CajaDeAhorro, que define el comportamiento y la

estructura común a todas sus instancias. Una CajaDeAhorro sabrá

extraer(unMonto) de su saldo, depositar(unMonto) y devolver su saldo actual.

Además deberá colaborar con un objeto que cumplirá el rol de titular de la cuenta.

Podemos ver en el ejemplo dos instancias de CajaDeAhorro, cada una con su propio

estado interno. Eventualmente podrían llegar a compartir el mismo titular de

cuenta (un persona es titular de ambas cuentas) o bien tener el mismo saldo. Las

dos instancias de la clase CajaDeAhorro comparten el mismo comportamiento,

definido en la propia clase.

De ahora en más cuando queramos referirnos a un método de una clase, lo

haremos utilizando la siguiente sintaxis, por convención:

NombreDeClase>>método(parámentro1, …)

Ejemplo:

CajaDeAhorro>>depositar(unMonto)

saldo := saldo + unMonto

Page 131: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 131 -

Las clases se especifican por medio de un nombre, la estructura interna que

tendrán sus instancias y los mensajes y métodos asociados que definen su

comportamiento. El nombre debe comenzar con mayúscula y no contener espacios.

Las variables de instancia representan el estado o estructura interna de las

instancias de la clase. Por último, se detalla el conjunto de mensajes que entenderá

una instancia de dicha clase, también llamado protocolo.

Page 132: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 132 -

Hasta el momento habíamos visto que un objeto, ante le envío de un mensaje,

buscaba entre sus métodos aquél que correspondiera con el mensaje en cuestión

para proceder con la activación del mismo. Ahora que hemos introducido las clases

como repositorio de comportamiento, la búsqueda del método asociado a un

mensaje ya no será plena responsabilidad de las instancias, sino que este trabajo

será delegado a las clases. En el ejemplo podemos ver cómo el objeto

unaCajaDeAhorro delega la búsqueda del método a su clase (CajaDeAhorro) ante la

recepción del mensaje depositar(unMonto). La clase buscará entre su colección de

métodos aquél que corresponda con el mensaje depositar(unMonto) y se procederá

a ejecutar el método en el contexto del objeto receptor del mensaje

(unaCajaDeAhorro).

Page 133: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 133 -

Muestra la necesidad de generar una instancia nueva de la clase Punto, la cual es el

resultado de las operaciones pedidas.

Page 134: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 134 -

Page 135: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 135 -

Page 136: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 136 -

A la hora de programar existen diversas formas de conocimiento. A esta altura es

bueno recordar que, para que un objeto le envíe un mensaje a otro debe conocerlo,

o sea, nombrarlo. Para esto existen diversas formas de conocimiento:

- Variables de instancia.

- Variables temporales.

- Parámetros.

- Seudo-variables.

Page 137: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 137 -

Son las que más hemos visto hasta el momento. Al definir la clase, se define la

estructura que tendrán sus instancias; esta estructura interna viene dada por un

conjunto de variables de instancia. Las variables de instancia acompañan al objeto

desde su creación hasta que muere.

Page 138: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 138 -

Page 139: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 139 -

Se utilizan para nombrar objetos que el objeto receptor necesita para cumplir un

requerimiento. Por ejemplo, para alquilar una película a un cliente, el video club

debe saber qué película y qué cliente. En este caso la película y el cliente son

parámetros que se envían junto con el mensaje alquilar para poder cumplir el

requerimiento.

Para transferir de una cuenta a otra, el banco necesita el monto, y las dos cuentas.

Page 140: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 140 -

Se definen dentro de un método. Estas variables se utilizan para nombrar objetos

temporalmente. Al finalizar la activación del método dejan de existir.

Page 141: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 141 -

En este caso, la variable cuenta se utiliza sólo como una referencia auxiliar. No es

necesaria más allá de la activación de este método.

Page 142: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 142 -

Así como un objeto necesita conocer a otro objeto para enviarle un mensaje, es

necesario que tenga una forma de nombrarse a si mismo para poder enviarse

mensajes. Esto se hace por medio de la seudo-variable this. Se dice que this es una

seudo-variable ya que funciona similar a una variable de instancia, excepto por dos

motivos: no está definida en ninguna clase y no pude ser asignada (¿qué

significaría hacer algo del estilo this := otherObject?). Si bien la denominación this

es la más correcta para esta situación de “autoreferenciamiento”, en el sentido de

que representa al objeto en sí mismo y la palabra concuerda con este hecho,

existen otros lenguajes donde se ha dado una denominación distinta para esta

misma seudo-variable.

Page 143: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 143 -

En este caso tenemos a un objeto caja de ahorro con un saldo inicial de 400 (de

Juan) y otra con 300 (de Ana). Inicialmente la extracción se hace sobre la caja de

Juan, previo chequeo de ciertas condiciones (por ejemplo que el saldo no quede en

descubierto), para lo cual se utiliza el método sePuedeExtraer(unMonto) con el fin

de realizar esta validación. El objeto caja de ahorro deberá poder mandarse a sí

mismo el mensaje sePuedeExtraer(unMonto) en el contexto de una extracción y en

el caso de resultar positivo el chequeo, procederá a realizar la extracción

actualizando su saldo, en caso contrario se obtendrá un error. Esto queda reflejado

en la especificación del método extraer(unMonto) perteneciente al objeto caja de

ahorro.

En este caso el objeto caja de ahorro hizo las veces de Emisor y Receptor para un

mismo mensaje, pero como al Receptor no le interesa saber quién es el Emisor, es

exactamente lo mismo si el mensaje ha sido enviado por otro objeto o por uno

mismo, no se tratan de manera diferente.

En el segundo caso, el objeto intenta hacer lo mismo con la caja de Ana, pero se

aprecia que la operación falla debido a que no tiene saldo suficiente.

Page 144: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 144 -

Page 145: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 145 -

En este ejercicio debemos dar una implementación para un objeto fecha, que sirva

para representar fechas del tipo 21/6/1999, el cual deberá entender los siguientes

mensajes con su correspondiente semántica:

getDia() “Devuelve el número de día de la fecha”

setDia(unNumero) “Cambia el número de día de la fecha por unNumero”

getMes() “Devuelve el número de mes de la fecha”

setMes(unNumero) “Cambia el número de mes de la fecha por

unNumero”

getAño() “Devuelve el número de año de la fecha”

setAño(unNumero) “Cambia el número de año de la fecha por unNumero”

igualA (otraFecha) “Devuelve true si la fecha es igual a otraFecha, false

en caso contrario”

mayorQue() “Devuelve true si la fecha es posterior a otraFecha, false en

caso contrario”

menorQue() “Devuelve true si la fecha es anterior a otraFecha, false en

caso contrario”

mayorOIgualQue() “Devuelve true si la fecha es posterior o igual a

otraFecha, false en caso contrario”

menorOIgualQue() “Devuelve true si la fecha es anterior o igual a

otraFecha, false en caso contrario”

seEncuentraEntre(unaFecha, otraFecha) “Devuelve true si la fecha se

encuentra entre unaFecha y otraFecha, false en caso contrario”

Page 146: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 146 -

Este ejercicio consiste en modelar un objeto lapso de tiempo que permita

representar un intervalo o lapso de tiempo entre dos fechas. El protocolo a

implementar es el siguiente:

desde() “Devuelve la fecha de inicio del lapso de tiempo”

hasta () “Devuelve la fecha de fin del lapso de tiempo”

desdeHasta(unaFecha, otraFecha) “Cambia la fecha de inicio por

unaFecha y la de fin por otraFecha”

cantidadDeDias() “Devuelve la cantidad de días existentes entre la fecha

de inicio y la de fin”

incluye(unaFecha) “Devuelve true si la fecha unaFecha se encuentra

entre la fecha de inicio y la de fin”

La idea de este ejercicio es mostrar cómo funciona el doble encapsulamiento. Hacer

notar cómo podría cambiar la estructura interna de este objeto y cómo se

resolverían los mismos mensajes si en vez de tener dos fechas como variables

internas se tuviera una fecha desde que comienza el lapso y la cantidad de días en

el cual termina.

Page 147: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 147 -

Page 148: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 148 -

Page 149: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 149 -

Page 150: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 150 -

Cuando se hace referencia al “desacoplamiento interno” se quiere decir que se

puede seguir agregando funcionalidad sin depender de la estructura interna que

tenga el objeto, sino utilizar el protocolo que implementa para llevar a cabo la

nueva funcionalidad querida.

Page 151: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 151 -

Page 152: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 152 -

Aquí se trata de definir qué es realmente UML.

Tomar y pensar en las tres palabras por separado ayudan a la comprensión del

objetivo de este lenguaje y al por qué de su utilidad:

- Modelado: nos llevará a presentar la visión y concepción de MODELOS.

- Unificado: nos llevará a mencionar qué se unificó en UML

- Lenguaje: nos llevará a explicar que para cerrar esta Unificación de Modelado

era importante consensuar un Lenguaje; especificando su sintaxis y

su semántica, indicando también reglas para conformar modelos gráficos válidos

Page 153: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 153 -

Se presenta la idea de modelo porque lo que se va a notar, utilizando UML, es

justamente un modelo.

Se presentan características y ventajas de los modelos.

Page 154: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 154 -

Booch, Rumbaug y Jacobson, son los creadores de UML, llamado inicialmente

Lenguaje de Modelado.

El primer intento de combinar y reemplazar los métodos existentes se dió cuando

Rumbaugh se unió a Booch en Rational Software Corporation en 1994.

Ellos empezaron combinando conceptos de los métodos OMT. La metodología OMT -

Object Modeling Technique - fue creada por James Rumbaugh mientras dirigía un

equipo de investigación en los laboratorios de la Cía. General Electric) y Booch,

obteniendo como resultado una primera propuesta en el año 1995. En ese

momento Jacobson también se unió a Rational y comenzó a trabajar con el dúo

Booch-Rumbaugh.

El Lenguaje Unificado de Modelado fue adoptado en forma unánime por los

miembros de OMG como estándar en noviembre de 1997. Allí OMG asumió la

responsabilidad de futuros desarrollos en el estándar de UML.

Nota:

OMG (Object Management Group) es una organización que promueve estándares

para la industria del software.

Puede ampliar información en: www.omg.org

Page 155: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 155 -

Notar que hubo muchos otros aportes además de lo propuesto por Rumbaugh,

Booch y Jacobson.

Todas estas contribuciones sumaron riqueza al lenguaje y graficamente se

manifiestan en los diferentes tipos de diagramas que tiene UML.

Mencionar las ventajas buscadas y obtenidas con la unificación de diferentes

enfoques. Algunos de ellos son:

• Reunir los puntos fuertes de cada método

• Idear nuevas mejoras

• Proporcionar estabilidad al mercado

• Eliminar ambigüedad en los usuarios

Page 156: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 156 -

Es importante mencionar que la mayoría de las personas somos naturalmente

visuales. Eso explica por qué entendemos mejor y más rápidamente un dibujo que

parte de un texto.

Es por ello que en el criterio de unificación de las metodologías de modelado se

concluyó en un lenguaje gráfico visual para la especificación y construcción de

modelos.

Aquí vale la pena detenerse en semántica y sintaxis.

La sintaxis de UML determina la forma de los elementos básicos sintácticos. Por

ejemplo, un rectángulo con una división y nombre es una clase.

La semántica de UML especifica el significado de cada elemento de modelado.

Siguiendo con el ejemplo de la anterior, la semántica de la clase es la de denotar a

un conjunto de objetos, instancias de la misma, que tienen la misma estructura y el

mismo comportamiento.

Las reglas de construcción o reglas de buena formación determinan la forma en que

los elementos pueden combinarse de manera de obtener modelos correctos. Por

ejemplo, que las clases deben tener obligatoriamente un nombre; o que los

nombres de los mensajes de una clase no pueden repetirse.

Page 157: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 157 -

El Lenguaje Unificado de Modelado se ha convertido en una notación estándar para

el modelado de sistemas con gran cantidad de software.

UML sirve además para el modelado de negocios y sistemas no software [OMG01].

Nota:

Artefacto: es una pieza de información usada o producida por un proceso de

desarrollo de software.

Page 158: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 158 -

En UML 2.0 se definen una serie de diagramas adicionales a los establecidos en

UML 1.x.

Aquí se presentan todos los diagramas UML para que el asistente tenga una idea

global de lo abarcado por el lenguaje.

El conjunto de diagramas se encuentra organizado en torno a dos categorías:

• Diagramas Estructurales (representados en naranja).

• Diagramas Dinámicos o de Comportamiento (representados en azul).

Diferentes diagramas se utilizan durante diferentes etapas dentro del desarrollo de

software. Se puede asociar como ejemplo alguna etapa con algún diagrama, por

ejemplo, la etapa de Análisis con los diagramas de Casos de Uso, de Actividad y de

Estado.

Los diagramas a presentar a continuación se corresponden con la etapa de Diseño

(hay más diagramas para esta etapa) son los de clases y los diagramas de

secuencia.

Page 159: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 159 -

Page 160: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 160 -

El objetivo de este diagrama es el de representar los objetos del sistema,

especificando la estructura de las clases, sus relaciones y su comportamiento.

Si bien el elemento de modelado que será presentado es la CLASE, también pueden

aparecer en el diagrama de Clases, las INTERFACES.

Aparte de esos dos (y la nota), no hay otro elemento de modelado que pueda

participar de este diagrama.

Page 161: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 161 -

Una clase es una plantilla que define una colección de conceptos con las mismas

características.

Estructura de una clase:

Cada uno de los compartimientos es opcional, excepto el del nombre.

• Nombre de la clase: en la práctica, los nombres de clase son nombres cortos

o expresiones nominales extraídos del vocabulario del sistema que se está

modelando. El nombre de la clase se escribe con mayúscula, centrado y en

negrita.

• Atributos: un atributo representa alguna propiedad del elemento que se está

modelando

• Operaciones: son los mensajes que los objetos de la clase entienden

• Responsabilidades: es un contrato o una obligación de una clase. Se utiliza

cuando aún no se ha definido completamente el comportamiento de la clase,

en una etapa previa al diseño.

Page 162: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 162 -

Diferenciar lo sintácticamente correcto de lo semánticamente correcto.

En UML, lo indicado es que el nombre comience con letra mayúscula. Por ej: X o

Clase1.

Según el paradigma OO, el nombre de una clase debe ser lo más representativa

posible del concepto que modela. Por ejemplo: CuentaBancaria,

TarjetaDeClienteVIP

Se muestran dos formas de escribir el nombre de una clase: escribiendo

directamente su nombre y escribiendo su nombre precedido de su ubicación (teatro

es un paquete).

Page 163: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 163 -

La única condición es que el nombre del atributo debe comenzar con minúsculas.

Los corchetes significan que el elemento es opcional, por lo que sólo el nombre es

obligatorio.

La barra “/” indica que el atributo es derivado. Por ejemplo, la edad de una persona

podría derivarse de su fecha de nacimiento.

El atributo subrayado indica que el atributo es “de clase”. Esto significa que este

atributo es compartido por todas las instancias de la clase (también se lo conoce

como “variable de clase”). Por convención, se indica subrayado.

Descripción de las propiedades:

• changeable: no hay restricciones para modificar el valor del atributo.

• addOnly: para los atributos con multiplicidad mayor de uno (colecciones),

se pueden añadir valores adicionales, pero una vez creado, un valor no

puede ser eliminado o modificado.

• frozen: el valor del atributo no se puede modificar tras inicializar el objeto

(una constante)

A menos que se especifique lo contrario, los atributos siempre son changeable.

Page 164: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 164 -

UML ofrece una serie de elementos para especificar detalles para los atributos y las

operaciones. Desde fuera de un objeto sólo se puede manipular los datos por medio

de llamadas a operaciones –métodos- del objeto.

Tipos de visibilidad:

Privado: (-) significa que sólo se puede usar en los objetos donde está definido el

atributo u operación.

Protegido: (#) significa que sólo los objetos de las subclases de la clase a la que

pertenece el atributo u operación pueden utilizarlo.

Paquete: ( ) significa que sólo los objetos del paquete en donde está definida la

clase a la que pertenece el atributo u operación pueden utilizarlo.

Público: (+) significa que los objetos pertenecientes a cualquier clase puede utilizar

el atributo u operación.

No existe un valor por defecto para la visibilidad. Si ésta no se indica, está

indefinida.

Page 165: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 165 -

El nombre del mensaje junto a sus parámetros (incluido el tipo de retorno, si lo

hay) se conoce como signatura de la operación.

Page 166: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 166 -

Al igual que con los atributos, pueden especificarse mensajes a nivel de clase. Éstas

se indican con el subrayado.

Descripción de las propiedades de una operación:

isQuery: indica que la operación no cambia el valor de ningún atributo. La

operación es una función pura sin efectos laterales.

Hay otras tres propiedades relacionadas con la concurrencia, que tienen que ver

con la manera de que un método que implementa una operación responde a los

múltiples hilos de actividad:

• sequential: (sólo puede llegar una llamada por vez). Los invocadores deben

coordinarse para que en el objeto sólo haya un único flujo al mismo tiempo.

• guarded: (pueden llegar varias llamadas simultáneamente, pero sólo puede

atenderse una por vez).

• concurrent: (pueden entrar múltiples llamadas al método provenientes de

otros tantos hilos y todas ellas se atienden concurrentemente).

Page 167: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 167 -

Indicar que no es necesario mostrar todos los atributos y mensajes de la clase.

Para organizar mejor las listas largas de atributos y operaciones, se pueden utilizar

estereotipos para anteponer a cada grupo una categoría descriptiva, sin que estas

estén predeterminadas.

Page 168: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 168 -

Al modelar clases, un buen comienzo consiste en especificar las responsabilidades

de los elementos del vocabulario. Una clase puede tener cualquier número de

responsabilidades, aunque, en la práctica, cada clase bien estructurada tiene al

menos una responsabilidad y a lo sumo unas pocas. Al ir refinando los modelos, se

traducirán esas responsabilidades en el conjunto de atributos y mensajes que mejor

satisfagan las responsabilidades de la clase.

Page 169: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 169 -

Entre las relaciones que pueden aparecer en un diagrama de Clases, no se

menciona aquí a la Realización.

Una realización es una relaciona una interfaz con la clase que la implementa.

Page 170: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 170 -

Page 171: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 171 -

Dada una asociación entre dos clases, se puede navegar desde un objeto de una

clase hasta un objeto de la otra clase, y viceversa.

Es legal que ambos extremos de una asociación estén conectados a la misma clase.

Esto significa que, dado un objeto de la clase, se puede conectar con otros objetos

de la misma clase.

La navegabilidad en las asociaciones es bidireccional.

Page 172: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 172 -

Rol: cuando una clase participa en una asociación, tiene un rol específico que juega

en la asociación.

Un rol es simplemente la cara que la clase de un extremo de la asociación presenta

a la clase del otro extremo. Se puede nombrar explícitamente el rol que juega una

clase en una asociación.

• Nota: la misma clase puede jugar el mismo o diferentes roles en otras

asociaciones.

Navegabilidad: indica qué objeto conoce a quien. En el caso presentado, un

usuario conoce una clave, pero una clave no conoce a un usuario.

Si se quiere bidireccionalidad puede indicarse indistintamente con una flecha en

cada punta de la asociación o sólo con la asociación, sin flechas en los finales.

Page 173: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 173 -

Multiplicidad: el “cuántos” se denomina multiplicidad del rol de la asociación, y se

escribe como una expresión que se evalúa a un rango de valores o a un valor

explícito.

Cuando se indica una multiplicidad en un extremo de una asociación, se está

especificando que cada objeto de la clase conoce a tantos objetos como los

indicados en la multiplicidad en este extremo opuesto.

Notar que * indica 0..*

Page 174: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 174 -

Una asociación entre dos clases representa una relación estructural entre iguales,

es decir, ambas clases están conceptualmente en el mismo nivel, sin ser ninguna

más importante que la otra.

Agregación: sirve para modelar una relación “todo/parte”, en la cual una clase

representa el “todo”, que se compone de otros elementos (las “partes”). Este tipo

de relación se denomina agregación, la cual representa una relación del tipo “tiene-

un”, o sea, un objeto del todo tiene objetos de la parte.

El rombo vacío distingue el “todo” de la “parte”. Esto significa que la agregación

simple no cambia el significado de la navegación a través de la asociación entre el

todo y sus partes, ni liga la existencia del todo y sus partes.

Page 175: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 175 -

Las partes con multiplicidad no fija, se pueden crear después del elemento

compuesto. Pero una vez creadas, viven y mueren con él.

Notar que una parte siempre se asocia a un todo. NO PUDE PASAR que una parte

(una instancia de Parte) se asocie a más de un todo (una instancia de Todo).

Las palabras que mejor definen a este tipo de asociación son:

-exclusividad

-dependencia

Page 176: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 176 -

Las composiciones a Punto indican que cualquier instancia de Punto puede estar en

un Polígono o en un Círculo, pero no en ambos. Sin embargo, una instancia de

Estilo puede ser compartida por muchos Polígonos y Círculos. Es más, esto implica

que el borrado de un Polígono provocaría el borrado de sus Puntos asociados, pero

no del Estilo asociado.

Esta restricción (un Punto puede solamente aparecer en un solo Polígono o Círculo

a la vez) no se puede expresar mediante las multiplicidades, únicamente.

Sugerencia: comparar las diferencias entre composición y agregación en el ejemplo

1. Ésta puede estar claramente determinada por el contexto o dominio del

problema a representar

Page 177: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 177 -

Contexto:

Nombre: Una asociación puede tener un nombre, que se utiliza para describir la

naturaleza de la relación. Para que no haya ambigüedad en su significado, se puede

dar una dirección al nombre por medio de una flecha que apunte en la dirección en

la que se pretende que se lea el nombre.

• Nota: aunque una asociación puede tener un nombre, normalmente no se

necesita incluirlo si se proporcionan explícitamente nombres de rol para la

asociación, excepto si se tiene un modelo con muchas asociaciones y es

necesario referirse a una o distinguir unas de otras. Esto es esencialmente

cierto cuando se tiene más de una asociación entre las mismas clases.

Page 178: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 178 -

• Muchas veces se omite escribir la multiplicidad en un extremo de la

asociación. En dicho caso se asume que la misma corresponde a “1”.

• El modelador puede escribir explícitamente el nombre que juega una clase

dentro de una asociación. Pero si no lo hace, igualmente cada una de las

clases juega un rol en la asociación. Ese rol es el nombre de la clase en

letras minúsculas.

Page 179: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 179 -

La generalización representa a la relación “es-un”: un elemento concreto es-un

elemento más general. La generalización especifica que los objetos hijos se pueden

emplear en cualquier lugar que pueda aparecer el padre, pero no a la inversa. Una

clase hija hereda las propiedades de sus clases padres (atributos, asociaciones y

operaciones). A menudo, no siempre, el hijo añade atributos y operaciones a los

que hereda de sus padres. Una operación de un hijo con la misma signatura que

una operación del padre redefine la operación del padre.

• Nota: Una generalización puede tener un nombre, aunque es raro que se

necesiten los nombres, a menos que se tenga un modelo con muchas

generalizaciones y haya que referirse a ellas o distinguirlas.

En UML, una clase puede tener ninguno, uno o más padres. Una clase sin padres y

uno o más hijos se denomina clase raíz o clase base. Una clase sin hijos se llama

clase hoja. Una clase con un único padre se dice que utiliza herencia simple; una

clase con más de un padre se dice que utiliza herencia múltiple.

Page 180: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 180 -

Una generalización simple, sin adornos, es suficiente para la mayoría de las

relaciones de herencia que aparecen en el modelado. Pero si se quieren especificar

ciertos matices, UML aporta cuatro restricciones que pueden aplicarse a las

generalizaciones.

Descripción de las restricciones:

• complete: especifica que todos los hijos en la generalización se han

especificado en el modelo (aunque puede que algunos se omitan en el

diagrama) y no se permiten hijos adicionales.

• incomplete: especifica que no se han especificado todos los hijos en la

generalización (incluso aunque se omitan algunos) y que se permiten hijos

adicionales. Es la opción por defecto.

• disjoint: especifica que los objetos del padre no pueden tener más de uno de

los hijos como tipo.

• overlapping: especifica que los objetos del padre pueden tener más de uno

de los hijos como tipo.

Nota: disjoint y overlapping se aplican en el contexto de herencia múltiple.

Page 181: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 181 -

Las notas permiten agregar comentarios que se pueden utilizar para describir,

clarificar y hacer observaciones sobre cualquier elemento de un modelo.

Se marca por medio de línea punteada al elemento al cual están ligados y por lo

tanto, comentan.

El comentario puede hacerse en lenguaje coloquial o en un lenguaje formal como lo

es OCL.

Gráficamente, una nota se representa como un rectángulo con una esquina

doblada, junto con un comentario (no puede estar sin texto).

Page 182: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 182 -

Page 183: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 183 -

Page 184: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 184 -

Page 185: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 185 -

Page 186: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 186 -

Descripción:

Dada una instancia de Clase_A, indicar si la misma conoce instancias de Clase_C

Page 187: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 187 -

Nota:

UML permite notar las relaciones como atributos o como relaciones de

conocimiento.

En la práctica se utiliza notar al estado de los objetos como atributos y al

conocimiento con otros objetos, como relaciones de asociación o al menos tomar

una misma postura de notación.

Page 188: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 188 -

Inciso c:

La cardinalidad de la composición debe ser 1

Page 189: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 189 -

Inciso d: es como el ejemplo del punto, el círculo y el polígono.

Page 190: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 190 -

Nota: las clases hijas pueden ocupar el lugar del padre.

Page 191: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 191 -

Page 192: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 192 -

Page 193: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 193 -

Page 194: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 194 -

Page 195: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 195 -

Page 196: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 196 -

Descripción:

Se presenta un ejemplo general de un Diagrama de Clases, modelando parte del

dominio de representaciones artísticas y reserva de entradas.

Notar que la composición indica la carencia de sentido de tener representaciones

sin entradas para el ingreso del público.

Page 197: Programacion NET Basico Manual de Introduccion Al Desarrollo de Aplicaciones Con C

- 197 -

Bibliografía