jueves, 14 de marzo de 2013

UNIDAD 1 - 5to. año


UNIDAD 1
PROGRAMACIÓN ORIENTADA A OBJETOS

1.- CONCEPTOS BÁSICOS

Con la Programación Orientada a Objetos (POO) tenemos que aprender a pensar las cosas de una manera distinta para escribir nuestros programas en términos de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar conceptos y dar una pequeña base que permita soltarnos un poco con este tipo de programación.
Durante años, los programadores se han dedicado a construir aplicaciones muy parecidas que resolvían una y otra vez los mismos problemas. Para conseguir que los esfuerzos de los programadores puedan ser utilizados por otras personas se creó la POO, que es una serie de normas para realizar las cosas de manera que otras personas puedan utilizarlas y adelantar su trabajo, es decir, hacer que el código sea reutilizable.
La POO no es difícil pero es una manera especial de pensar. Aunque podamos hacer los programas de formas distintas, no todas ellas son correctas, lo difícil no es programar orientado a objetos sino programar bien. Programar bien es importante porque así no podemos aprovechar todas las ventajas de la POO.

Cómo se piensa en objetos

Pensar en términos de objetos es muy parecido a cómo lo haríamos en la vida real. Por ejemplo vamos a pensar en un coche para tratar de modelizarlo en un esquema de POO. Diríamos que el coche es el elemento principal que tiene una serie de características, como podrían ser el color, el modelo o la marca. Además tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o estacionar.
En un esquema POO el coche sería el objeto, las propiedades serían las características como el color o el modelo y los métodos serían las funcionalidades asociadas como ponerse en marcha o parar.
Por poner otro ejemplo vamos a ver cómo modelizaríamos en un esquema POO una fracción, es decir, esa estructura matemática que tiene un numerador y un denominador que divide al numerador, por ejemplo 3/2.
La fracción será el objeto y tendrá dos propiedades, el numerador y el denominador. Luego podría tener varios métodos como simplificarse, sumarse con otra fracción o número, restarse con otra fracción, etc.
Estos objetos se podrán utilizar en los programas, por ejemplo en un programa de matemáticas harás uso de objetos fracción y en un programa que gestione un taller de coches utilizarás objetos coche. Los programas orientados a objetos utilizan muchos objetos para realizar las acciones que se desean realizar y ellos mismos también son objetos. Es decir, el taller de coches será un objeto que utilizará objetos coche, herramienta, mecánico, recambios, etc.

Clases en POO

Las clases son declaraciones de objetos, también se podrían definir como abstracciones de objetos. Esto quiere decir que la definición de un objeto es la clase. Cuando programamos un objeto y definimos sus características y funcionalidades en realidad lo que estamos haciendo es programar una clase. En los ejemplos anteriores, un coche en particular es un objeto, mientras que todos esos objetos pertenecen a la clase coche.

Propiedades en clases

Las propiedades o atributos son las características de los objetos. Cuando definimos una propiedad normalmente especificamos su nombre y su tipo. Nos podemos hacer a la idea de que las propiedades son algo así como variables donde almacenamos datos relacionados con los objetos.

Métodos en las clases

Son las funcionalidades asociadas a los objetos. Cuando estamos programando las clases las llamamos métodos. Los métodos son como funciones o procedimientos que están asociadas a un objeto, es decir, acciones que el objeto es capaz de ejecutar.

Objetos en POO

Los objetos son ejemplares de una clase cualquiera. Cuando creamos un ejemplar tenemos que especificar la clase a partir de la cual se creará. Esta acción de crear un objeto a partir de una clase se llama instanciar (que viene de una mala traducción de la palabra instance que en inglés significa ejemplar). Por ejemplo, un objeto de la clase fracción es por ejemplo 3/5. El concepto o definición de fracción sería la clase, pero cuando ya estamos hablando de una fracción en concreto 4/7, 8/1000 o cualquier otra, la llamamos objeto.

Estados en objetos

Cuando tenemos un objeto sus propiedades toman valores. Por ejemplo, cuando tenemos un coche la propiedad color tomará un valor en concreto, como por ejemplo rojo o gris metalizado. El valor concreto de las propiedades de un objeto se llama estado.
Para acceder a un estado de un objeto para ver su valor o cambiarlo se utiliza el operador punto.
Supongamos que CocheDeMiVecino es un objeto que pertenece a la clase Coche. El CocheDeMiVecino es azul, es decir, la propiedad Color del CocheDeMiVecino es azul. Entonces decimos:
CocheDeMiVecino.Color = azul
El objeto es CocheDeMiVecino, luego colocamos el operador punto y por último el nombre de la propiedad a la que deseamos acceder. En este ejemplo estamos cambiando el valor del estado de la propiedad del objeto a azul con una simple asignación.

Mensajes en objetos

Un mensaje en un objeto es la acción de efectuar una llamada a un método. Por ejemplo, cuando le decimos a un objeto de la clase Coche que se ponga en marcha estamos pasándole el mensaje “Arrancar”.
Para mandar mensajes a los objetos utilizamos el operador punto, seguido del método que deseamos invocar.
CocheDeMiVecino.Arrancar
En este ejemplo pasamos el mensaje Arrancar, el cual va a buscar a la clase Coche para ver cómo se realiza.

2.- LOS TRES PILARES DE LA POO

Cualquier lenguaje basado en objetos debe cumplir estos tres requisitos:

  • HERENCIA: La herencia es la cualidad de crear clases que estén basadas en otras clases. La nueva clase heredará todas las propiedades y métodos de la clase de la que está derivada, además de poder modificar el comportamiento de los procedimientos que ha heredado, así como añadir otros nuevos. Supongamos que tenemos una clase Gato que está derivada de la clase Animal. Gato hereda de Animal todas las características comunes a esa clase, además de añadirle algunas características particulares a su condición felina. Podríamos tener otra clase Perro, que también heredaría las propiedades y métodos de Animal. Aunque las clases Gato y Perro son claramente distintas, ambas pertenecen o se derivan de la clase Animal y en ese sentido comparten muchas características.

  • ENCAPSULACIÓN: La encapsulación es la capacidad de separar la implementación de la interfaz del código de una clase, es decir, sabemos cuáles son las propiedades de los objetos, cuáles son sus métodos y qué hacen, pero no nos importa cómo lo hacen. Siguiendo el ejemplo anterior, sabemos que un objeto de la clase Coche tiene como método Arrancar; si queremos utilizar ese método, sólo tenemos que invocarlo para lo cual basta con conocer su nombre pero no nos importa en qué consiste.

  • POLIMORFISMO: El polimorfismo se refiere a la posibilidad de definir múltiples clases con funcionalidad diferente, pero con métodos o propiedades denominados de forma idéntica que pueden utilizarse de manera intercambiable. Por ejemplo, Arrancar puede ser un método de la clase Coche, pero también un método de la clase Moto, y si tenemos dos objetos EsteCoche y EstaMoto, es posible que nos dé lo mismo utilizar el método EsteCoche.Arrancar que EstaMoto.Arrancar

Es bueno tener en cuenta que cuando definimos una clase estamos definiendo dos cosas diferentes: los datos que dicha clase puede manipular o contener (las propiedades) y la forma de acceder a esos datos y trabajar con ellos (los métodos). En cambio, cuando definimos un objeto (sería más exacto hablar de crear un objeto) estamos creando un objeto en particular que pertenece a esa clase. En otras palabras, un objeto es un caso real y concreto de una clase, que sólo describe en forma abstracta un conjunto de objetos.


3.- TRABAJAR CON OBJETOS EN VISUAL BASIC

Para definir una clase, se utiliza la palabra Class y basta con darle un nombre a la clase. Cuando termino de definir todo lo que involucra a la clase, cierro la definición con la palabra End.
   
         Class Coche
      
         End Class

Es decir, todo lo que esté entre Class Coche y End Class, será la definición de la clase Coche. Allí determinaremos sus propiedades (valores que puede tomar) y sus métodos (acciones que puede ejecutar)

Veamos cómo podemos definir algunas propiedades y métodos de la clase Coche:
    
        Class Coche
                        Public Marca as string
                        Public Color as string
                        Public CantidadDePuertas as integer

                        Public Sub Arrancar ()
                                    <aquí se introducen todos los pasos que hacen que un auto
                                   pueda arrancar>
                        End Sub
        End Class

Nótese que las propiedades Marca, Color y CantidadDePuertas y el método Arrancar se definen utilizando la palabra Public, de modo que puedan ser accedidos desde otros códigos.
Vamos ahora a crear un objeto perteneciente a esa clase: primero lo definimos diciendo qué tipo de variable es; Dim en Visual equivale a Var en Pascal, y As vendría a ser los :.

            Dim CocheDeMiVecino As Coche

Y después lo creamos

            CocheDeMiVecino = New Coche()

Si queremos definir una clase que va a pertenecer a otra (como el caso de Gato que pertenece a la clase Animal) podemos hacer que herede todas sus propiedades y métodos. Esto lo hacemos utilizando la palabra Inherits

            Class Gato
                        Inherits Animal
                        <aquí van todas las definiciones propias de la clase Gato que otros
                              elementos de la clase Animal no tienen>
            End Class

Finalmente vamos a decir que un módulo es un archivo en el que se almacenan los códigos correspondientes a las clases que va a utilizar el sistema. Un sistema podría estar conformado por varios módulos, los que a su vez podrían estar conformados por varias clases.


4.- PARÁMETROS DE UN MÉTODO

Los métodos de una clase pueden ser de dos tipos: procedimientos o funciones. Un procedimiento es un conjunto de instrucciones que realizan una acción. Se declara de la siguiente manera

           Sub < nombre del procedimiento> (<lista de parámetros>)
                        <aquí van las instrucciones que realizan la acción>
            End Sub

Una función, además de hacer lo mismo que un procedimiento, puede devolver un valor y termina siendo usada como una variable. Se declara:

            Function <Nombre de la función> (<lista de parámetros>) As <tipo de dato>
                        <aquí van las instrucciones que realizan la acción>
            End Function

Supongamos que tengo un procedimiento que se llama Suma y que recibe dos valores, los cuales suma y devuelve el resultado en un tercer valor. Quedaría como sigue:

            Sub Suma (ByVal Valor1 As Integer, ByVal Valor2 As Integer, ByRef Resultado As Integer)
                        Resultado = Valor1 + Valor2
            End Sub

Valor1 y Valor2 son las variables donde el procedimiento va a guardar los dos números que tiene que sumar. Resultado es la variable donde el procedimiento va a guardar la suma. Valor1 y Valor2 se denominan los parámetros de entrada del procedimiento (para indicarlo se coloca ByVal); mientras que Resultado es el parámetro de salida (por eso está precedido por la expresión ByRef). Así, el procedimiento recibe como entrada dos números que suma y los coloca en una variable que devuelve.

Si esto mismo lo hiciera una función en lugar de un procedimiento, la suma puede devolverse en la misma función

            Function Suma (ByVal Valor1 As Integer, ByVal Valor2 As Integer) As Integer
                        Suma = Valor1 + Valor2
            End Function

Como vemos, en este caso los dos valores se suman y se guardan en la misma función. Desaparece el parámetro de salida y se declara a la misma función Suma como una variable de tipo Integer capaz de devolver el resultado de la suma.

Los parámetros de entrada son variables capaces de guardar valores que reciben para poder procesarlos. Por eso se dice que son parámetros pasados por valor, y todo cambio que se produzca en ellos dentro del procedimiento, no va a salir de ahí. En cambio, los parámetros de salida son variables que después van a seguir siendo usadas por otras porciones de código; por lo tanto es necesario que el parámetro pase la variable entera: su dirección de memoria y su contenido. A este tipo de parámetros se los denomina pasados por referencia.
Dicho de otra manera: los parámetros indicados con ByVal se pasan por valor, es decir, se hace una copia del contenido de la variable o constante y es esa copia la que se pasa al procedimiento. Por otro lado, los parámetros indicados con ByRef se pasan por referencia, es decir se pasa al procedimiento una referencia a la posición de memoria en la que está el contenido de la variable en cuestión, por tano cualquier cambio efectuado a la variable dentro del procedimiento afectará a la variable indicada al llamar al procedimiento. Demás está decir que esta cuestión de los parámetros vale tanto para funciones como para procedimientos.


5.- ÁMBITO DE LAS VARIABLES

El ámbito de una variable se refiere a la porción de código para la cual esa variable puede ser utilizada.
Diferenciamos tres ámbitos distintos:

  • Global: la variable puede ser utilizada por cualquier otra clase de cualquier otro lugar del sistema. Estas son las variables que normalmente llamamos propiedades de las clases. Se declaran utilizando la palabra Public inmediatamente después de denominar a la clase

Class <Nombre de la Clase>
Public <Variable Global> As <Tipo>

<aquí va el resto del código correspondiente a la definición de
la clase>
                       
End Class

  • Privada: la variable puede ser utilizada sólo por la clase donde está declarada. Se declaran con la palabra Private inmediatamente después de denominar a la clase

Class <Nombre de la Clase>
Private <Variable Privada> As <Tipo>

<aquí va el resto del código correspondiente a la definición de
la clase>
                       
End Class

  • Local: la variable puede ser utilizada sólo en el método en el cual se define. Se utiliza la palabra Dim dentro del método

Class <Nombre de la Clase>

Sub <Nombre del método>

             Dim <Variable Local>
             <aquí va el resto del código correspondiente a la
definición del método>
                                    End Sub

                        End Class

Salvo las propiedades que obviamente deben ser variables globales, en la medida de lo posible hay que declarar a todas las variables lo más localmente posibles. Es decir, si se puede se declara local; si es necesario, puede declararse privada; y en última instancia, sólo si es imprescindible, se declara global.


PRÁCTICA 1

1.                    ¿Qué ventajas presenta la técnica de POO con respecto a la programación estructurada?
2.                  ¿Por qué la técnica de POO recibe ese nombre?
3.                  ¿Qué es una clase? ¿Qué es un objeto? ¿Cuál es la diferencia entre ambos?
4.                  ¿Qué son las propiedades de un objeto? ¿A qué equivalen en la tecnología de programación estructurada?
5.                  ¿Cómo me refiero a la propiedad de un objeto?
6.                  ¿Dónde se declaran? ¿De qué manera? ¿Por qué?
7.                  ¿A qué se denomina estado de un objeto?
8.                  ¿Qué es un mensaje para un objeto?
9.                  ¿Qué es un método?
10.              ¿Qué es definir una clase? ¿Qué diferencias presenta con crear un objeto?
11.              ¿Qué es la encapsulación  y cuál es su función?
12.              ¿Qué es la herencia? ¿Qué ventajas presenta?
13.              ¿A qué llamamos polimorfismo?
14.             Definir, según la sintaxis del Visual 2010, una clase Colegio que tiene cinco propiedades: Nombre, Especialidad, CantidadDeAlumnos, ValorDeLaCuota, RequiereUniforme (sí o no); y tres métodos: Inicializar (se encarga de establecer valores iniciales en “Colegio”, “Título”, 0, 0, “No”, respectivamente para cada propiedad), IngresosMensuales (calcula la cantidad de dinero que debe ingresar a la escuela por mes) y IngresoRealPorcentual (dada la cantidad de alumnos morosos, devuelve el porcentaje de dinero real que ingresa al nivel con respecto al total que debería percibir si todos abonaran) ¿Qué tipo de método convendría en cada caso? ¿Por qué?
15.             Definir una clase Nivel que hereda todas las propiedades y métodos de la clase Colegio y agrega dos nuevas propiedades Tipo (Jardín, Primaria, Secundaria) y CantidadDeDivisiones; y un nuevo método PromedioDeAprobados (dada la cantidad total de alumnos aprobados, devuelve el promedio de aprobados por división)
16.             En un formulario FormColegios crear dos objetos distintos que pertenezcan a la clase Colegio: CualquierColegio tendrá los valores iniciales de la clase, y MiColegio, los valores de tu escuela. Mostrar un cartel que diga “Situación de riesgo” en el caso en que el porcentaje de ingresos reales sea inferior al 70%.
17.             En el mismo formulario anterior, crear dos objetos distintos que pertenezcan a esa clase: NivelPrimario para la Primaria y NivelSecundario para la Secundaria. Inicializar las propiedades según los datos de tu colegio. Mostrar en un mensaje cuál es el promedio de alumnos aprobados según el nivel.
18.             Para estos cuatro últimos ejercicios, realizar un diccionario de variables: un listado, objeto por objeto, de todas las variables involucradas, especificando tipo y ámbito.

No hay comentarios.:

Publicar un comentario