lunes, 19 de mayo de 2008

TECNICA DE PROGRAMACION

PROGRAMACION ORIENTADA A OBJETOS

La Programación Orientada a Objetos (POO u OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas de computadora. Está basado en varias técnicas, incluyendo herencia, modularidad, polimorfismo, y encapsulamiento. Su uso se popularizó a principios de la década de 1990. Actualmente son muchos los lenguajes de programación que soportan la orientación a objetos.

INTRODUCCION:

Los objetos son entidades que combinan estado, comportamiento e identidad:



*El estado está compuesto de datos, serán uno o varios atributos a los que se habrán asignado unos valores concretos (datos).
*El comportamiento está definido por los procedimientos o métodos con que puede operar dicho objeto, es decir, qué operaciones se pueden realizar con él.
*La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras palabras, es su identificador (concepto análogo al de identificador de una variable o una constante).

La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.
De esta forma, un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos que favorecen la comunicación entre ellos. Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separan ni deben separarse el estado y el comportamiento.




ORIGEN:

Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Al parecer, en este centro, trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos.
La programación orientada a objetos tomó posición como el estilo de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++, una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para las cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos.


CONCEPTOS FUNDAMENTALES:


La programación orientada a objetos es una nueva forma de programar que trata de encontrar una solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:

*Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas, (de c a d),Es la facilidad mediante la cual la clase D ha definido en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D.

*Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos). Se corresponde con los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Es una instancia a una clase.

*Método: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

*Evento: un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera.

*Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

*Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método.

*Estado interno: es una variable que se declara privada, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase.
Componentes de un objeto:atributos, identidad, relaciones y métodos.

*Representación de un objeto: un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes.


CARACTERISTICAS:


Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (para más información, seguir los enlaces respectivos):

*Abstracción: Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.

*Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente.

*Principio de ocultación: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.

*Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.
*Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple.


LENGUAJES ORIENTADAS A OBJETOS

Entre los lenguajes orientados a objetos se destacan los siguientes:

*ActionScript
*ActionScript 3
*Ada
*C++
*C#
*Clarion
*Lenguaje de programación D
*Object Pascal (Delphi)
*Harbour
*Eiffel
*Java
*JavaScript (la herencia se realiza por medio de la programación basada en prototipos)
*Lexico (en castellano)
*Objective-C
*Ocaml
*Oz
*Lenguaje de programación R
*Perl (soporta herencia múltiple. La resolución se realiza en preorden, pero puede modificarse al algoritmo C3 por medio del módulo Class::C3 en CPAN)
PHP (en su versión 5)
*Python
*Ruby
*Smalltalk
*Magik (SmallWorld)
*VB.NET
*Visual FoxPro
*XBase++
*Gambas
*Flex builder (adobe)



ENCAPSULAMIENTO Y OCULTACION DE DATOS


La capacidad de presentación de información dentro de un objeto se divide en dos partes bien diferenciadas:


Interna: La información que necesita el objeto para operar y que es innecesaria para los demás objetos de la aplicación. Estos atributos se denominada privados y tienen como marco de aplicación únicamente a las operaciones asociadas al objeto.



Externa :La que necesitan el resto de los objetos para interactuar con el objeto que definimos . Estas propiedades se denominan públicas y corresponde a la información que necesitan conocer los restantes objetos de la aplicación respecto del objeto definido para poder operar.
Podemos imaginarla encapsulación como introducir el objeto dentro de una caja negra donde existen dos ranuras denominadas entrada y salida. Si introducimos datos por la entrada automáticamente obtendrá un resultado en la salida. No necesita conocer ningún detalle del funcionamiento interno de la caja.
El término encapsulación indica l capacidad que tienen los objetos de construir una cápsula a su alrededor, ocultando la información que contienen (aquélla que es necesaria para su funcionamiento interno, pero innecesaria para los demás objetos) a las otras clases que componen la aplicación.
Aunque a primera vista la encapsulación puede parecer superflua, tengamos en cuenta que existen muchas variables utilizadas de forma temporal: contadores y variables que contienen resultados intermedios, etc. D no ser por la encapsulación estas variables ocuparían memoria y podrían interferir en el funcionamiento del resto de los objetos.
La encapsulación no es exclusiva de los lenguajes de programación orientados a objetos. Aparece en los lenguajes basados en procedimientos (PASCAL, C, COBOL, ETC) como una forma de proteger los datos que se manipulan dentro de las funciones.
Los lenguajes OOP incorporan la posibilidad de encapsular también las estructuras de datos que sirven como base a las funciones. Aportan por tanto un nivel superior en cuanto a protección de información.
La encapsulación nos permite el uso de librerías de objetos para el desarrollo de nuestros programas. Recordemos que las librerías son definiciones de objetos de propósito general que se incorporan a los programas. Al ser el objeto parcialmente independiente en su funcionamiento del programa en donde está definido, ya que contiene y define todo lo que necesita para poder funcionar, es fácil utilizarlo en los mas variados tipos de aplicaciones. Si aseguramos , depurando las propiedades y las operaciones dentro de la clase que el objeto función bien dentro de una aplicación, con una correcta encapsulación el objeto podrá funcionar en cualquier otra.
Otra de las ventajas de la encapsulación es que , al definir el objeto como una caja negra con entradas y salida asociadas, en cualquier momento podemos cambiar el contenido de las operaciones del objeto, de manera que no afecte al funcionamiento general del programa.
La encapsulación está en el núcleo de dos grandes pilares de la construcción de sistemas; mantenibilidad y reusabilidad.



Mantenibilidad:

Cualidad que indica que un programa o sistema debe ser fácilmente modificable. Es decir que los cambios en las condiciones externas (como la definición de una nueva variable) implicarán modificaciones pequeñas en el programa / sistema. El concepto de mantenibilidad implica que un programa, al igual que un ser vivo debe ser capaz de adaptarse a un medio ambiente siempre cambiante.

Reusabilidad:

Cualidad que nos indica que partes del programa ( en este caso objetos) pueden ser reutilizados en la confección de otros programas. Ello implica que los objetos definidos en un programa pueden ser extraídos del mismo e implantados en otro sin tener que realizar modificaciones importantes en el código del objeto. El objeto final es que el programador construya una librería de objetos que le permita realizar programas basándose en la técnica de cortar y pegar. Esta extrae (corta) código de otras aplicaciones ya realizadas y las implementa (pega) en la aplicación a realizar donde, tras algunos retoques, la nueva aplicación estará lista para funcionar. Como podrá observar el concepto de reusabilidad, permite reducir el tiempo de realización , ganando en claridad, mantenibilidad y productividad.
La encapsulación de datos se muestra como una herramienta poderosa que nos permite ganar en tiempo de desarrollo y claridad, con el único coste adicional de definir con precisión las entradas y salida de nuestras operaciones.

Poliformismo:

El polimorfismo es una nueva característica aportada por la OOP. Esta propiedad indica la posibilidad de definir varias operaciones con el mismo nombre, diferenciándolas únicamente en los parámetros de entrada. Dependiendo del objeto que se introduzca como parámetro de entrada, se elegirá automáticamente cual de las operaciones se va a realizar.
Ya está habituado al operador <> que está presente en todos los lenguajes de programación. Sin embargo, los operadores <> y <> no existen en casi ningún lenguaje de programación.
Los lenguajes OOP permiten definir un operador <> tal que reconozca que tipo de objeto se le está aplicando, a través de operaciones de objetos. Previamente deberá definir la fracción y el número complejo como una clase y la operación suma como una operación de una clase.
Definiendo adecuadamente las operaciones suma de fracciones y suma de números imaginarios, el operador suma devolverá, en el caso que los operandos sean fracciones, una fracción y , en el caso de los números imaginarios, otros número imaginario.

Herencia:

La herencia es la última de las propiedades relativas a la OOP, Consiste en la propagación de los atributos y las operaciones a través de distintas sub-clases definidas a partir de una clase común.
Introduce, por tanto, una posibilidad de refinamiento sucesivo del concepto de clase. Nos permite definir una clase principal y , a través de sucesivas aproximaciones, cualquier característica de los objetos. A partir de ahora definiremos como sub-clases todas aquellas clases obtenidas mediante refinamiento de una (o varias) clases principales.
La herencia nos permite crear estructuras jerárquicas de clases donde es posible la creación de sub-clases que incluyan nuevas propiedades y atributos. Estas sub-clases admiten la definición de nuevos atributos, así como crear, modificar o inhabilitar propiedades.

Construcción de clases:

Tal como hemos definido con anterioridad, una clase de objeto describe a un grupo de objetos con similares:

*Propiedades (atributos)
*Comportamientos (operaciones)
*Relaciones con otros objetos

La abreviatura clase es utilizada en lugar de clase de objetos. Los objetos difieren en los valores asociados a sus atributos definidos dentro de la clase. Cada objeto <> cuál es su clase. La mayoría de los lenguajes orientados a objetos pueden determinar a que clase pertenece un objeto durante la ejecución del programa.
A continuación expondremos una serie de pasos para definir una clase.
Identificar los objetos.
Para ello examine la aplicación e identifique las distintas estructuras de datos, algunos tips a tener en cuenta son los siguientes:
El nombre de la aplicación a veces nos da la del nombre del objeto principal
Los objetos software pueden imitar el mundo real, modelizando las propiedades de los objetos a través de variables Cualquier propiedad de un objeto puede ser identificada dentro del objeto correspondiente a través de variables.
Los objetos no se han de corresponder siempre con objetos físicos, sino que también pueden ser entidades que se utilizan dentro de la construcción del programa.
Piense en el objeto en <persona>>. Este truco nos puede identificar claramente los atributos y sus operaciones asociadas: <>.
Una clase es un tipo de dato que puede ser usado para declarar objetos, de la misma forma que una estructura es un tipo definido por el usuario que puede utilizarse para declarar variables.
Definir las operaciones
Defina las operaciones a partir de los objetos, examinando las distintas operaciones asociadas a un conjunto de datos. Los atributos del objeto se deben definir de tal manera que éstos satisfagan todos los requerimientos de cada una de las operaciones.
A estas operaciones añada dos más: Crear y Destruir. Estas operaciones nos servirán para inicializar y borrar el objeto dentro de la aplicación.
A partir de la definición de las propiedades, un objeto siempre debe ser capaz de responder a estas tres preguntas: ¿Qué soy ?, ¿Qué hago? ¿Qué dejo ver al resto del mundo?
Algunas de las operaciones sólo se aplicarán a determinados objetos pertenecientes a las clases. Hemos visto que a través de la herencia podemos <> un sub conjunto de objetos creando una sub-clase.
Únicamente aquellas operaciones que sean comunes a todos los objetos de la clase deben incluirse dentro de las operaciones de la clase. El resto, que corresponden a las operaciones de sub-Grupos de objetos, se deben definir dentro de la especializaciones de la clase.
Definir los atributos de los objetos
Una vez identificados los objetos, defina los atributos de la clase. Un atributo es un valor almacenado en los objetos de la clase.
Aplicaciones orientadas a objetos
A lo largo de la historia de la programación, los lenguajes y las metodologías han pasado de una relativa simplicidad a una complejidad creciente. Los lenguajes de programación orientados a objetos pretenden aportar simplicidad a la tarea de programación de grandes aplicaciones.
Cuando se crearon las primeras computadoras todavía no existían los lenguajes de programación, tal como ahora los entendemos. El lenguaje ensamblador puede considerarse como el primer lenguaje de programación propiamente dicho. Permitía al usuario un diálogo más fluido con la máquina a través de instrucciones que tenían relación directa con el conjunto de operaciones que la máquina podía realizar.
A partir de este momento empezó la evolución de los lenguajes de programación. _cada uno tenía su entorno definido y aunque en realidad todos los lenguajes son polivalentes (en teoría, con cualquiera de ellos se puede desarrollar cualquier programa de gestión o científico). Pronto apareció la especialización funcional. Así, COBOL (Common Business Orientated Language) se introdujo como lenguaje mainframe para el diseño de aplicaciones de gestión.; FORTRAN (Formula Translator) para el diseño de aplicaciones científicas; APL (A Programming Language) para el cálculo matemático, etc.
A medida que el software tomaba importancia, aparecieron los primeros problemas relacionados con la programación. Al tiempo que aumenta el volumen de un programa, disminuye el control del mismo por parte del programador y la capacidad de este de dar mantenimiento.
En un intento de solucionar estos problemas aparecen las metodologías de programación. Una metodología es un conjunto de reglas destinadas a simplificar las tareas de diseño, estimación de costes, desarrollo y mantenimiento de un sistema informático. A menudo se ven acompañadas con unas herramientas (CASE: Computer Aided Software Engeneering) que permiten la elaboración estructurada y documentada de los sistemas informáticos.

DISEÑO DE APLICACIONES Y ELECCIÓN DE ENTORNO.

En entorno de programación implica tanto el lenguaje de programación como al empleo de una determinada metodología.
Los lenguajes de programación no se producen por generación espontánea y se ven influidos en gran manera por la forma en la que los profesionales piensan que se debe programar. De esta manera se crea un conjunto de reglas para simplificar la tarea de programación. Generalizadas y codificadas, se convierten en <<principios>> de los que surgen los lenguajes de programación en un afán por darles soporte.
Estos <<principios>> son modelos que proporcionan técnicas que , a su vez, deben aplicarse en el diseño e implementación de los programas. Estas técnicas nos indican la forma de resolver los distintos problemas que surgen a la hora de programar.
Decimos que un lenguaje de programación <> un conjunto de <> si el lenguaje simplifica la aplicación de estas técnicas. A estos <> se les denomina metodologías de programación.
Las metodologías de programación son modelos sobre como diseñar e implementar los programas. Diferentes modelos tienen como resultado diferentes técnicas. Que cada técnica sea distinta no implica que una sea la verdadera y que las demás falsas. Por el contrario, las metodologías se complementan entre sí. Lo que todas las metodologías tienen en común es la premisa de que hay que partir de abstracciones que corresponden a elementos del problema a resolver, y que la implementación de la solución se debe realizar mediante un conjunto de módulos preferiblemente reutilizables.
Las metodologías orientadas a objetos se centran en las estructuras de datos que sin embargo se relegan a un segundo plano en los modelos procedurales. La base de esta metodología es que una estructura de datos debe contener las operaciones que los modifican. La técnica que se utiliza para obtener esta <> es la encapsulación de los mismos en una estructura conocida como clase.
El accesos a los datos contenidos en la clase se realiza mediante las operaciones que la propia clase define. Por tanto, la metodología orientada a objetos complementa el punto de vista procedural de operaciones realizadas sobre un flujo de datos, al asociar a cada dato el conjunto de operaciones que lo modifican. Como podrá ver, ambos enfoques son complementarios.
Para ilustrar las diferencias entre las aproximaciones orientadas a procedimientos y las orientadas a objetos, considere el diseño de un <>
El compilador es un programa que a partir de un conjunto de fichero fuente (programa) construye el código objeto que posteriormente se convierte en programa. Para realizar su trabajo, el compilador lee el fichero fuente y separa de él las variables y las instrucciones. Las variables constituyen la tabla de símbolos del programa, mientras que las instrucciones se organizan en un árbol sintáctico donde se plasman todas la referencias que realizan los mandatos y funciones entre sí.
Un programa procedural simple

Vamos a plantear un ejemplo sencillo. Para ello supondremos un lenguaje imperativo con una sintaxis similar a la de Pascal (usaremos este lenguaje ficticio para simplificar la explicación, en los apéndices al final del artículo podrá encontrar ejemplos equivalentes en PHP, Python y Eiffel).
Supongamos que tenemos el siguiente programa:

program personas;

type persona = record
nombre: string;
apellido: string;
edad: integer
end;

procedure inicializar(n, a: string; e: integer; var p: persona);begin
p.nombre := n;
p.apellido := a;
p.edad :=
eend;
function es_mayor(p: persona):
boolean;begin
return p.edad >= 18
end;
function nombre_completo(p: persona):
string;begin
return p.nombre + ” ” + p.apellido;
end;
var p: persona;
begin inicializar(”Juan”, “Perez”, 25, p);
write(nombre_completo(p));
if (es_mayor(p)) then writeln (” es mayor de edad.”)
else
writeln (” es menor de edad.”)
end.

EJEMPLO:

la relación de herencia del ejemplo de las figuras aunque la clase base “Figura” tiene los métodos “calcularArea” y “calcularPerimetro”, las subclases “Circulo”, “Cuadrado”, “Triangulo” y “Rectangulo” redefinen estos métodos ya que el calculo del área y el perímetro de cada uno de ellos es diferente.
class Figura
{
protected double area;
protected double perimetro;
public Figura()
{
this.area=0;
this.perimetro=0;
}
public double getArea()
{
return area;
}
public double getPerimetro()
{
return perimetro;
}
public void calcularArea(){}
public void calcularPerimetro(){}
}
public class Circulo extends Figura
{ private double radio;
public Circulo()
{
super();
}
public double getRadio()
{
return radio;
}
public void setRadio(double radio)
{
this.radio = radio;
}
public void calcularArea()
{
this.area = Math.PI*Math.pow(this.radio,2.0);
}
public void calcularPerimetro()
{
this.perimetro = 2*Math.PI*this.radio;
}
EJEMPLO:
Vemos que el método “muevete” llama al método mover de un mamífero y aunque el no sabe con qué clase de mamífero trata, funciona y se llama al método correspondiente al objeto específico que lo llama (es decir, primero un gato y luego un perro). Si no existiera la ligadura dinámica tendríamos que crear un método “muevete” para los mamíferos de tipo “Gato” y otro para los de tipo “Perro”.
class Mamifero
{
public void mover()
{
System.out.println("Ahora es un mamifero el que se mueve");
}
}
class Perro extends Mamifero
{
public void mover()
{
System.out.println("Ahora es un perro el que se mueve");
}
}
class Perro extends Mamifero
{
public void mover()
{
System.out.println("Ahora es un gato el que se mueve");
}
}
public class Polimorfismo
{
public static void muevete(Mamifero m)
{
m.mover();
}
public static void main(String[] args)
{
Gato bisho = new Gato();
Perro feo = new Perro();
muevete(bisho);
muevete(feo);
}
}

No hay comentarios: