Download Programación Orientada a
Document related concepts
no text concepts found
Transcript
CONCEPTOS GENERALES PROGRAMACIÓN ORIENTADA A OBJETOS XAVIER CALDERÓN H. CONCEPTOS Paradigma: Palabra de origen griego que significa modelo o patrón. Paradigma de Programación: Propuesta de una comunidad de programadores para solucionar los problemas. Da una visión o metodología que aplicarán los programadores para resolver diferentes problemas. CONCEPTOS Los lenguajes de programación se basan en estos paradigmas. Tipos de paradigmas: Paradigma declarativo. Paradigma estructurado. Paradigma funcional. Paradigma orientado objetos. Paradigma lógico. PARADIGMA ORIENTADO A OBJETOS Los datos son la parte esencial de un programa. Los datos se los agrupa en objetos. Los objetos pueden modelar cualquier elemento del mundo real. A través de este modelamiento se pueden plantear soluciones a los problemas. La interacción de estos diferentes elementos del mundo real se los puede representar con sus comportamientos. PARADIGMA ORIENTADO A OBJETOS Los comportamientos también se los agrupa en los objetos. Lenguajes basados en este paradigma: Java. SmallTalk. C#. Simula. Ver: http://www.tiobe.com FUNDAMENTOS TEÓRICOS Algunos de los conceptos fundamentales de los lenguajes orientados a objetos son: Clase. Objeto. Método. Atributos. Constructores. Sobrecarga. FUNDAMENTOS TEÓRICOS Encapsulación. Herencia. Sobreescritura. Polimorfismo. Clases Abstractas. Interfaces. CLASE Son patrones que representan grupos de objetos. Describen un conjunto de objetos que tienen similares características. Características como: atributos, métodos y mensajes. “Una clase es un conjunto de objetos que comparte una estructura y comportamientos comunes” Booch G.,1994. CLASE La figura que se usa para representar una clase es un rectángulo con 3 secciones. Las secciones son: Nombre de la clase. Miembros de la clase. (con sus Atributos y Métodos) Nombre Clase Atributos Métodos OBJETO Instancia de una clase. Representa una entidad del mundo real. “Una entidad delimitada precisamente y con identidad, que encapsula estado y comportamiento. El estado se representa mediante sus operaciones, métodos y máquinas de estado. Un objeto es una instancia de una clase” OMG, 2001. Ver: http://www.omg.org OBJETO Relación entre clase y objeto. CONCEPTOS Estado: representa la definición de atributos internos del objeto, sus características. Por ejemplo, un PC tiene un cierto número de puertos, un cierto número de procesadores, un monitor, un disco duro, etc. Comportamiento: representa la definición del comportamiento del objeto, las acciones que éste puede realizar. Por ejemplo, un router puede “encender”, “reiniciar”, “enrutar”, etc. Identidad: Cada objeto tiene una identidad única. ATRIBUTO-MÉTODO Los miembros de un objeto son: atributos y métodos. Atributos: conjunto de características o propiedades de los objetos. Pueden ser variables numéricas, booleanas o referencias a otros objetos. Métodos: Representan el comportamiento de los objetos. Son funciones que operan sobre los atributos de los objetos. POR: XAVIER CALDERÓN H. EJEMPLO Estructura para el código de una clase. Con Java por ejemplo: public class <NombreClase> { // Declaración de atributos <tipo> <variable> ; // Declaración de métodos <tipo> <nombreMétodo> ( <argumentos de entrada> ) { ... } } EJEMPLO Definición Atributo. <tipo_Dato> <nombre_Atributo> ; Donde: <tipo_Dato>: tipo de dato del atributo. (numéricos, booleanos o referencia) <nombre_Atributo>: identificador del atributo EJEMPLO Definición Método. <tipoRetorno> <nombreMétodo> ( <listaArgumentos> ) { <bloqueCódigo> } <tipoRetorno>: tipo de dato que retorna el método (numéricos, booleanos o referencia) Si no devuelve ningún valor, debe ser void <nombreMétodo>: identificador del método <listaArgumentos>: el método admite que le pasen argumentos separados por comas con el formato: [<tipo> <argumento> [, <tipo> <argumento>...]] CREACIÓN OBJETO Se utiliza la palabra reservada new. Por ejemplo: 1. <NombreClase> <refObjeto>; 2. <refObjeto> = new <NombreClase>() ; O también: 1. <NombreClase> <refObjeto>=new <NombreClase>() ; Nota: Recordar que la sintaxis y semántica depende de cada lenguaje. ACCESO A LOS MIEMBROS Se usa el operador punto (.) para acceder a los atributos y a los métodos. Por ejemplo: NOMENCLATURA Se recomienda usar una nomenclatura para los identificadores de clases, atributos y métodos. Por ejemplo en JAVA; se usa: Clases: primera letra en mayúscula de cada palabra. Ejemplo: Redes, AnchoDeBanda, String, etc. Variables: primera letra en minúscula y la primera letra de cada palabra en mayúscula. Ejemplo: trafico, redesLan, interfazEntrada; etc. NOMENCLATURA Constantes: todo en mayúsculas, separando cada palabra por el carácter “_” Ejemplo: Métodos: siguen el mismo formato que las variables seguidas de paréntesis “(“ “)” Ejemplo: PI, ANCHO_BANDA, etc. modulacion(), calculoTrafico() Estructuras de control: utilizar llaves englobando a todas las sentencias de una estructura de control, aunque sólo haya una sentencia. INTERCAMBIO DE MENSAJES Permiten la comunicación entre los objetos. Mensaje: “una llamada a una operación o a un objeto, en el cual se incluye el nombre de la operación y una lista de valores de argumentos” Rumbaugh, J., 1999. Dependiendo del autor se pueden clasificar a los mensajes de varias formas. Tipos de mensajes: INTERCAMBIO DE MENSAJES Modificador Constructor. Destructor. Selector. Iterator. CONSTRUCTOR Construyen objetos a partir de una clase. Métodos que tienen el mismo nombre de la clase. Inicializa el estado de un objeto. El constructor inicializa las variables. Por ejemplo: Socket obj; obj=new Socket(); obj=new Socket(8080,”192.168.1.1”); CONSTRUCTOR Si no se ha definido un constructor; los lenguajes de programación en general definen uno por defecto. CONSTRUCTOR Los constructores asignan la referencia del espacio de memoria en el que se carga el objeto. DESTRUCTOR Operación que destruye el objeto. En algunos lenguajes no se definen los destructores (JAVA). En Java el Garbage Collector libera la memoria. En C++ los destructores son esenciales para liberar la memoria ocupada por el objeto. Ejemplo C++: Coche::~Coche() { cout << "Coche destruido." << endl; } SOBRECARGA Se usa cuando se requieren métodos que realicen la misma tarea pero con diferentes argumentos de entrada. Los métodos sobrecargados tienen el mismo nombre de identificador para todos los métodos. Por ejemplo en Java: SOBRECARGA Permite tener varios métodos con el mismo nombre pero se los diferencia por sus argumentos de entrada. Un método se identifica por su nombre, el tipo de retorno, el número de argumentos que tiene y el tipo de cada uno de los argumentos. En C++ se pueden sobrecargar los operadores. Los constructores se pueden sobrecargar. EJEMPLO JAVA ENCAPSULACIÓN Se refiere al ocultamiento de la información. Característica de encapsular a los datos y métodos. Capacidad de expresar la unidad de los atributos y las operaciones. Nota: En este texto vamos a usar los términos métodos y operaciones; como similares. ENCAPSULACIÓN La encapsulación consiste en el agrupamiento de datos y su tratamiento en una misma estructura. Permite la protección de la manipulación externa de algunas partes de los objetos. La encapsulación se la implementa con ciertas particularidades dependiendo del lenguaje. ENCAPSULACIÓN Un objeto suele tener datos y código privados de acceso restringido. Fuerza al usuario a utilizar una interfaz para acceder a los datos. Hace que el código sea más fácil de mantener. ENCAPSULACIÓN Ejemplo en C++: class Coche { public: Coche(); Coche(char *m,int cil,int cab); ~Coche(); void arranca(); void detiene(); void acelera(); private: char *marca; int cilindrada; int caballos; }; ENCAPSULACIÓN Los modificadores permiten acceder a los datos o al código de manera restringida: ENCAPSULACIÓN HERENCIA Jerarquía de clases basada en agrupar atributos y/o métodos comunes. No todos los lenguajes orientados a objetos definen clases. En términos de objetos la herencia permite que una objetos se puedan basar en otros ya existentes. HERENCIA Se definen las clases padres también llamadas superclases y las clases hijas también denominadas subclases. HERENCIA La idea es la de partir de las situaciones más generales e ir derivando hacia las más particulares. HERENCIA Si una clase hereda de una única clase se considera herencia simple. Si una clase hereda de varias clases se considera herencia múltiple. Dependiendo del lenguaje se puede aplicar la herencia simple y/o múltiple. HERENCIA Herencia simple. Herencia múltiple. HERENCIA Por ejemplo Java solo soporta herencia simple en cambio C++ herencia múltiple. POR: XAVIER CALDERÓN H. HERENCIA Supongamos, por ejemplo (usando Java), que tenemos la clase Aula y la clase Laboratorio definidas como sigue: HERENCIA Entonces se podría reestructurar las clases anteriores aplicando herencia de la siguiente forma: HERENCIA Las partes comunes se pueden agrupar en una misma clase, manteniendo las otras dos clases con las partes no comunes y heredando de esta nueva clase con la palabra reservada extends (con Java). POR: XAVIER CALDERÓN H. SOBREESCRITURA También llamados métodos virtuales. Una subclase puede modificar los métodos que ha heredado de la superclase, manteniendo los mismos nombres, tipo de retorno y lista de argumentos. El objetivo del método sobreescrito en la subclase es modificar la funcionalidad del método definido en la superclase. SOBREESCRITURA Ejemplo en Java: class Router { ... double calcularCosto() {.................} } class RouterCisco extends Router { int numInterfaces; double calcularCosto() {.................} } POLIMORFISMO Polimorfismo indica “muchas formas”. Según Rumbaugh J., 1991; “Toma de varias formas; propiedad que permite a una operación tener distintos comportamientos en distintas clases” El polimorfismo es un concepto fundamental del paradigma orientado a objetos. POLIMORFISMO Una clase sólo tiene una forma. La variable que hace referencia a la superclase de una jerarquía puede tener muchas formas (una por cada subclase). En forma general polimorfismo se puede implementar mediante: Polimorfismo universal. Polimorfismo ad hoc. POLIMORFISMO Dentro del polimorfismo universal tenemos: Polimorfismo paramétrico. Polimorfismo de inclusión. Dentro del polimorfismo ad hoc tenemos: Polimorfismo por sobrecarga de métodos. Polimorfismo de operadores. Dependiendo del lenguaje de programación se implementará un tipo de polimorfismo. POLIMORFISMO Por ejemplo en Java se usa el polimorfismo con: Parámetros polimórficos: se refiere a los argumentos de entrada de los métodos; a los que se les pasa el parámetro polimórfico. Colecciones heterogéneas: se basa en el uso de la sobreescritura de métodos. Para implementar este tipo de polimorfismo es esencial tener una jerarquía de clases. POLIMORFISMO Ejemplo de parámetros polimórficos (Java). class Redes {...} class Lan extends Redes {...} class Wan extends Redes {...} class Gestion { void calcularTrafico ( Redes m ) {...}} ................ …………. Gestion administrar = new Gestion(); Lan obj1 = new Lan(); Wan obj2 = new Wan(); administrar.calcularTrafico(obj1); administrar.calcularTrafico(obj2); ... POLIMORFISMO Ejemplo de colecciones heterogéneas(Java): class Redes {...} class Lan extends Redes {...} class Wan extends Redes {...} Redes[] listaRedes = new Redes[5]; listaRedes[0] = new Redes(); listaRedes[1] = new Lan(); listaRedes[2] = new Wan(); listaRedes[3] = new Wan(); listaRedes[4] = new Lan(); CLASES ABSTRACTAS Clase que no se puede instanciar. Clase de la que no se pueden crear objetos. El objetivo es que las subclases de las clases abstractas (superclase) definan o completen las especificaciones de las mismas; implementando los elementos abstractos de estas superclases. CLASES ABSTRACTAS Ejemplo en Java: abstract class Computador {...} class Servidor extends Computador {...} class Router extends Computador {...} class Switch extends Computador {...} ... Computador m = new Computador (); ERROR Router m = new Router (); CORRECTO CLASES ABSTRACTAS Métodos abstractos: Un método es abstracto si se declara (dentro de una clase abstracta), pero no se lo implementa. Ejemplo con Java. abstract class Servidor { ....................... public abstract void servicio(); } Cada lenguaje OO tiene distintas abstracciones como: clases, métodos y variables virtuales. CLASES ABSTRACTAS Las subclases de una clase abstracta deben implementar los métodos abstractos que tengan declarados. Ejemplo con Java: class ServicioWeb extends Servidor { ................................... public void servicio() {......................} } class ServicioFtp extends Servidor { ... public void servicio() {……………………...} } CLASES ABSTRACTAS Según Martin R., 1994; existe una categoría de clases que se considera más estable; si este grupo de clases se basa en clases abstractas. Una categoría completamente estable debería consistir solo en clases abstractas. Una medida del grado de abstracción es: Grado = A = Nº de clases abstractas / Nº total de clases Rango de A entre 0 a 1. INTERFACES Una interface es un conjunto de declaraciones de métodos. En una interfaz no se implementan los métodos. Ejemplo con Java: public interface <NombreInterfaz> { <tipo> <nombreMétodo1> ( <args> ); <tipo> <nombreMétodo2> ( <args> ); //No existe implementación de los métodos } INTERFACES Las interfaces se usan para: INTERFACES Por ejemplo en Java para implementar una interfaz se usa la palabra implements. public class <NombreClase> implements <NombreInterfaz> { ............................................ <tipo> <nombreMétodo1> ( <args> ) { <código> } <tipo> <nombreMétodo2> ( <args> ) { <código> } ............................................. } INTERFACES-CLASES ABSTRACTAS Se puede realizar una equivalencia entre una interfaz y una clase abstracta. interface Interfaz { <tipo> <método1>(); <tipo> <método2>(); ...................... <tipo> <métodoN>(); } abstract class Interfaz { abstract <tipo> <método1>(); abstract <tipo> <método2>(); ........................ abstract <tipo> <métodoN>(); } THREADS Un thread es un flujo de ejecución secuencial dentro de un proceso. Un thread es un hilo de ejecución de un programa. Un thread tiene asociado: tiempo de CPU, memoria para código y memoria para datos. Un thread se puede comunicar, coordinar y sincronizar con otros hilos. THREADS Un thread de un programa trata de simular a los threads que funcionan en los sistemas operativos. Un thread tiene estados que permiten controlar su ciclo de vida. Los lenguajes de programación tienen métodos para controlar el ciclo de vida de un thread. THREADS Por ejemplo en Java los estados de un thread son: THREADS Estados: Nuevo: el thread ha sido creado, pero no inicializado con el método start(). Ejecutable: el thread puede estar ejecutándose o preparado para ejecutarse. Se inicia con start() Bloqueado: el thread podría estar ejecutándose, pero está esperando que termine alguna otra tarea, p.e., E/S de disco Muerto: terminación del thread al finalizar el método run(). THREADS Ciclo de vida de un thread en Java: THREADS Los threads se pueden sincronizar. Se sincronizan los threads para evitar que se haga más de un acceso simultáneo a una región crítica. Los threads se implementan según cada lenguaje de programación. THREADS En Java se pueden implementar los threads de dos formas: Declarar una clase que implemente la interfaz Runnable. Crear un objeto de tipo Thread a partir de ella. BIBLIOGRAFÍA-FUENTES: Savitch, Walter, "Absolute JAVA", 2nd ed., Pearson, EEUU, 2008. K. Barclay,J. Savage, "Object-Oriented Design with UML and Java",1st ed. Elsevier, Gran Bretaña, 2004. Fco. Javier Alcalá Casado, Programación en Java. Peter Class; Pello Xabier Altadill Izura; Manual C++. Miguel Ángel Abián, Orientación a Objetos: Conceptos y terminología. http://www.javahispano.org/documentacion/ http://www.omg.org