Sunteți pe pagina 1din 45

PLANTEAMIENTO DEL PROBLEMA.

En la actualidad, la programacin utiliza un paradigma orientado a objetos, este se popularizo a principios de 1990 y consiste en organizar los programas de modo que reflejen la forma en que los objetos en el mundo real se encuentran organizados. Quiz diariamente estamos en contacto con un equipo de cmputo, asiendo uso de sus aplicaciones y programas, para facilitar nuestras tareas. Pero pocas beses nos ponemos a pensar en la forma que fue creado y programado dichos software. Este es un buen motivo para conocer lo importante que es la programacin Orientada a objetos. Aqu nace el inters por conocer este paradigma de programacin, que actualmente es la ms utilizada. OBJETIVOS. Objetivo general Conocer los fundamentos del paradigma orientado a objetos. Objetivos especficos. Identificar las caractersticas de la Programacin Orientada a Objetos (POO). Relacionar la estructura de la POO con objetos del mundo real para su mejor comprensin. Estimular curiosidad o inters por conocer a profundidad la POO. INTRODUCCIN El presente escrito es una Investigacin documental, titulada: Paradigma Orientado a Objetos en l se presenta parte de la informacin recabada sobre el tema a investigar. La Programacin 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 mdulos ms fciles de escribir, mantener y reutilizar. Est basado en varias tcnicas, incluyendo herencia, modularidad, polimorfismo y encapsulamiento. De manera sencilla se presentan ejemplos que explican cmo est integrada la POO y la forma tan estrecha, en que se relaciona con nuestro mundo real. La Programacin Orientada a Objetos es una maravilla, actualmente son muchos los lenguajes que estn basados en esta paradigma de programacin. Contina leyendo amigo lector, e incrementa tu curiosidad y deseo por conocer ms informacin de la POO. 1. PARADIGMAS DE PROGRAMACIN Un paradigma de programacin es una propuesta tecnolgica que es adoptada por una comunidad de programadores cuyo ncleo central es incuestionable en cuanto a que unvocamente trata de resolver uno o varios problemas claramente delimitados. La resolucin de estos problemas debe suponer consecuentemente un avance significativo en al menos un parmetro que afecte a la ingeniera de software. Tiene una estrecha relacin con la formalizacin de determinados lenguajes en su momento de definicin. Un paradigma de programacin est delimitado en el tiempo en cuanto a aceptacin y uso ya que nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial o totalmente. Los programas se pueden clasificar por el paradigma del lenguaje que se use para producirlos. Los principales paradigmas son: imperativos, funcionales, lgicos, declarativos y orientacin a objetos. Tipos de paradigmas de programacin ms comunes

Imperativo o por procedimientos: es considerado el ms comn y est representado, por ejemplo, por C o BASIC. Funcional: est representado por Scheme o Haskell. Este es un caso del paradigma declarativo. Lgico: est representado por Prolog. Este es otro caso del paradigma declarativo. Declarativo: por ejemplo la programacin funcional, la programacin lgica, o la combinacin lgico-funcional. Orientado a objetos: est representado por Smalltalk, un lenguaje completamente orientado a objetos. Si bien puede seleccionarse la forma pura de estos paradigmas al momento de programar, en la prctica es habitual que se mezclen, dando lugar a la programacin multiparadigma. Actualmente el paradigma de programacin ms usado es el de la programacin orientada a objetos. 2. PROGRAMACIN ORIENTADA A OBJETOS. La programacin orientada a objetos o POO (OOP segn sus siglas en ingls) es un paradigma de programacin que usa objetos y sus interacciones, para disear aplicaciones y programas informticos. Est basado en varias tcnicas, incluyendo herencia, abstraccin, polimorfismo y encapsulamiento. Su uso se populariz a principios de la dcada de los aos 1990. En la actualidad, existe variedad de lenguajes de programacin que soportan la orientacin a objetos. La programacin orientada a objetos, intenta simular el mundo real a travs del significado de objetos que contiene caractersticas y funciones. Los lenguajes orientados a objetos se clasifican como lenguajes de quinta generacin. Como su mismo nombre indica, la programacin orientada a objetos se basa en la idea de un objeto, que es una combinacin de variables locales y procedimientos llamados mtodos que juntos conforman una entidad de programacin. 2.1. Origen de la POO. Los conceptos de la programacin orientada a objetos tienen origen en Simula 67, un lenguaje diseado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cmputo Noruego en Oslo. En este centro, se trabajaba en simulaciones de naves, que fueron confundidas por la explosin combinatoria de cmo las diversas cualidades de diferentes naves podan 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 comportamientos. Fueron refinados ms tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (cuya primera versin fue escrita sobre Basic) pero diseado para ser un sistema completamente dinmico en el cual los objetos se podran crear y modificar "en marcha" (en tiempo de ejecucin) en lugar de tener un sistema basado en programas estticos. La programacin orientada a objetos tom posicin como el estilo de programacin dominante a mediados de los aos ochenta, en gran parte debido a la influencia de C++, una extensin del lenguaje de programacin C. Su dominacin fue consolidada gracias al auge de las Interfaces grficas de usuario, para las cuales la programacin orientada a objetos est particularmente bien adaptada. En este caso, se habla tambin de programacin dirigida por eventos. Las caractersticas de orientacin a objetos fueron agregadas a muchos lenguajes existentes

durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, entre otros. La adicin de estas caractersticas a los lenguajes que no fueron diseados inicialmente para ellas condujo a menudo a problemas de compatibilidad y en la capacidad de mantenimiento del cdigo. Los lenguajes orientados a objetos "puros", por su parte, carecan de las caractersticas de las cuales muchos programadores haban venido a depender. Para saltar este obstculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en mtodos orientados a objetos, pero permitiendo algunas caractersticas imperativas de maneras "seguras". El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparicin de Internet, y a la implementacin de la mquina virtual de Java en la mayora de navegadores. PHP en su versin 5 se ha modificado, soporta una orientacin completa a objetos, cumpliendo todas las caractersticas propias de la orientacin a objetos. 2.2. Ventajas de la POO. Fomenta la reutilizacin y extensin del cdigo. Permite crear sistemas ms complejos. Relacionar el sistema al mundo real. Facilita la creacin de programas visuales. Construccin de prototipos Agiliza el desarrollo de software Facilita el trabajo en equipo Facilita el mantenimiento del software Lo interesante de la POO es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible. Modelos: La POO permite realizar un modelo de sistema casi independientemente de los requisitos del proyecto. La razn es que en la POO, la jerarqua la establecen los datos, en cambio en la programacin estructurada la jerarqua viene definida por los programas. Este cambio hace que los modelos se establezcan de forma similar al razonamiento humano y, por lo tanto, resulte ms natural. Modularidad: Un programa es modular si se compone de mdulos independientes y robustos. Esto permite la reutilizacin y facilita la verificacin y depuracin de los mismos. En POO, los mdulos estn directamente relacionados con los objetos. Los objetos son mdulos naturales ya que corresponden a una imagen lgica de la realidad. Extensibilidad: Durante el desarrollo de sistemas, ocurre la aparicin de nuevos requisitos, por eso es deseable que las herramientas de desarrollo permitan aadirlos sin modificar la estructura bsica del Diseo. En POO es posible lograr esto siempre y cuando se hayan definido de forma adecuada la jerarqua de clases, los atributos y mtodos. Eliminacin de redundancia: En el desarrollo de sistemas se desea evitar la definicin mltiple de datos y funciones comunes. En POO esto se logra mediante la herencia (evita la definicin mltiple de propiedades comunes a muchos objetos) y el polimorfismo (permite la modificacin de mtodos heredados). Solo hay que definir los atributos y los mtodos en el antepasado ms lejano que los comparte. Reutilizacin: La POO proporciona un marco perfecto para la reutilizacin de las clases. El encapsulamiento y la modularidad nos permiten utilizar una y otra vez las mismas clases en aplicaciones distintas. En efecto, el aislamiento entre distintas clases significa que es posible

aadir una nueva clase o un modulo nuevo (extensibilidad) sin afectar al resto de la aplicacin. 2.3 CONCEPTOS FUNDAMENTALES. La programacin orientada a objetos es una forma de programar que trata de encontrar una solucin a estos problemas. Introduce nuevos conceptos, que superan y amplan conceptos antiguos ya conocidos. Entre ellos destacan los siguientes: 2.3.1. Objeto. Entender que es un objeto es la clave para entender cualquier lenguaje orientado a objetos. Existen muchas definiciones que se le ha dado al Objeto. Primero empecemos entendiendo que es un objeto del mundo real. Un objeto del mundo real es cualquier cosa que vemos a nuestro alrededor. Digamos que para leer este artculo lo hacemos a travs del monitor y una computadora, ambos son objetos, al igual que nuestro telfono celular, un rbol o un automvil. Analicemos un poco ms a un objeto del mundo real, como la computadora. No necesitamos ser expertos en hardware para saber que una computadora est compuesta internamente por varios componentes: la tarjeta madre, el chip del procesador, un disco duro, una tarjeta de video, y otras partes ms. El trabajo en conjunto de todos estos componentes hace operar a una computadora. Internamente, cada uno de estos componentes puede ser sumamente complicado y puede ser fabricado por diversas compaas con diversos mtodos de diseo. Pero nosotros no necesitamos saber cmo trabajan cada uno de estos componentes, como saber que hace cada uno de los chips de la tarjeta madre, o cmo funciona internamente el procesador. Cada componente es una unidad autnoma, y todo lo que necesitamos saber de adentro es cmo interactan entre s los componentes, saber por ejemplo si el procesador y las memorias son compatibles con la tarjeta madre, o conocer donde se coloca la tarjeta de video. Cuando conocemos como interaccionan los componentes entre s, podremos armar fcilmente una computadora. Qu tiene que ver esto con la programacin? La programacin orientada a objetos trabaja de esta manera. Todo el programa est construido en base a diferentes componentes (Objetos), cada uno tiene un rol especfico en el programa y todos los componentes pueden comunicarse entre ellos de formas predefinidas. Todo objeto del mundo real tiene 2 componentes: caractersticas y comportamiento. Por ejemplo, los automviles tienen caractersticas (marca, modelo, color, velocidad mxima, etc.) y comportamiento (frenar, acelerar, retroceder, llenar combustible, cambiar llantas, etc.). Los Objetos de Software, al igual que los objetos del mundo real, tambin tienen caractersticas y comportamientos. Un objeto de software mantiene sus caractersticas en una o ms "variables", e implementa su comportamiento con "mtodos". Un mtodo es una funcin o subrutina asociada a un objeto. Para redondear estas ideas, imaginemos que tenemos estacionado en nuestra cochera un Ford Focus color azul que corre hasta 260 km/h. Si pasamos ese objeto del mundo real al mundo del software, tendremos un objeto Automvil con sus caractersticas predeterminadas: Marca = Ford Modelo = Focus Color = Azul Velocidad Mxima = 260 km/h

Cuando a las caractersticas del objeto le ponemos valores decimos que el objeto tiene estados. Las variables almacenan los estados de un objeto en un determinado momento. Definicin terica: Un objeto es una unidad de cdigo compuesto de variables y mtodos relacionados. Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (mtodos) los mismos que consecuentemente reaccionan a eventos. 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. 2.3.2. Clases. En el mundo real, normalmente tenemos muchos objetos del mismo tipo. Por ejemplo, nuestro telfono celular es slo uno de los miles que hay en el mundo. Si hablamos en trminos de la programacin orientada a objetos, podemos decir que nuestro objeto celular es una instancia de una clase conocida como "celular". Los celulares tienen caractersticas (marca, modelo, sistema operativo, pantalla, teclado, etc.) y comportamientos (hacer y recibir llamadas, enviar mensajes multimedia, transmisin de datos, etc.). Cuando se fabrican los celulares, los fabricantes aprovechan el hecho de que los celulares comparten esas caractersticas comunes y construyen modelos o plantillas comunes, para que a partir de esas se puedan crear muchos equipos celulares del mismo modelo. A ese modelo o plantilla le llamamos CLASE, y a los equipos que sacamos a partir de ella la llamamos OBJETOS. Esto mismo se aplica a los objetos de software, se puede tener muchos objetos del mismo tipo y mismas caractersticas. Definicin terica: La clase es un modelo o prototipo que define las variables y mtodos comunes a todos los objetos de cierta clase. Tambin se puede decir que una clase es una plantilla genrica para un conjunto de objetos de similares caractersticas. Por otro lado, una instancia de una clase es otra forma de llamar a un objeto. En realidad no existe diferencia entre un objeto y una instancia. Slo que el objeto es un trmino ms general, pero los objetos y las instancias son ambas representacin de una clase. Definicin Terica: Una instancia es un objeto de una clase en particular. Definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciacin es la lectura de estas definiciones y la creacin de un objeto a partir de ellas. 2.3.3. Herencia. Por ejemplo, herencia de la clase C a la clase D; es la facilidad mediante la cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos mtodos y variables pblicas declaradas en C. Los componentes registrados como "privados" (private) tambin se heredan, pero como no pertenecen a la clase, se mantienen escondidos al programador y slo pueden ser accedidos a travs de otros mtodos pblicos. Esto es as para mantener hegemnico el ideal de OOP. 2.3.4. Mtodo. Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecucin se desencadena tras la recepcin de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un mtodo puede producir un cambio en las propiedades del objeto, o la generacin de un "evento" con un nuevo mensaje para otro objeto del sistema. 2.3.5. Evento.

Es un suceso en el sistema (tal como una interaccin del usuario con la mquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. Tambin se puede definir como evento, a la reaccin que puede desencadenar un objeto, es decir la accin que genera. 2.3.6. Mensaje. Una comunicacin dirigida a un objeto, que le ordena que ejecute uno de sus mtodos con ciertos parmetros asociados al evento que lo gener. Un objeto es intil si est aislado. El medio empleado para que un objeto interacte con otro son los mensajes. Hablando en trminos un poco ms tcnicos, los mensajes son invocaciones a los mtodos de los objetos. 2.3.7. 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 caractersticas predeterminadas, y cuyo valor puede ser alterado por la ejecucin de algn mtodo. 2.3.8. Estado interno. Es una variable que se declara privada, que puede ser nicamente accedida y alterada por un mtodo 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. 2.3.9. Componentes de un objeto. Atributos, identidad, relaciones y mtodos. Identificacin de un objeto: un objeto se representa por medio de una tabla o entidad que est compuesta por sus atributos y funciones correspondientes. 2.4. CARACTERSTICAS DE LA POO. Existe un acuerdo acerca de qu caractersticas contempla la "orientacin a objetos", las caractersticas siguientes son las ms importantes: 2.4.1. Abstraccin. Denota las caractersticas esenciales de un objeto, donde se capturan sus comportamientos. 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 cmo se implementan estas caractersticas. Los procesos, las funciones o los mtodos pueden tambin ser abstrados y cuando lo estn, una variedad de tcnicas son requeridas para ampliar una abstraccin. El proceso de abstraccin permite seleccionar las caractersticas relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real. La abstraccin es clave en el proceso de anlisis y diseo orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar. Por ejemplo, volvamos al ejemplo de los automviles, Qu caractersticas podemos abstraer de los automviles? O lo que es lo mismo Qu caractersticas semejantes tienen todos los automviles? Todos tendrn una marca, un modelo, nmero de chasis, peso, llantas, puertas, ventanas, etc. Y en cuanto a su comportamiento todos los automviles podrn acelerar, frenar, retroceder, etc. En los lenguajes de programacin orientada a objetos, el concepto de Clase es la representacin y el mecanismo por el cual se gestionan las abstracciones. Por ejemplo, en Java tenemos: public class Automovil { // variables

// mtodos } 2.4.2. Encapsulamiento. Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstraccin. Esto permite aumentar la cohesin de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultacin, principalmente porque se suelen emplear conjuntamente. El encapsulamiento consiste en unir en la Clase las caractersticas y comportamientos, esto es, las variables y mtodos. Es tener todo esto es una sola entidad. En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se logra gracias a la abstraccin y el ocultamiento que veremos a continuacin. La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas negras donde slo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos interesar ser conocer qu hace la Clase pero no ser necesario saber cmo lo hace. 2.4.3. Modularidad. Se denomina Modularidad a la propiedad que permite subdividir una aplicacin en partes ms pequeas (llamadas mdulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicacin en s y de las restantes partes. Estos mdulos que se puedan compilar por separado, pero que tienen conexiones con otros mdulos. Al igual que la encapsulacin, los lenguajes soportan la Modularidad de diversas formas. 2.4.4. Principio de ocultacin. Cada objeto est aislado del exterior, es un mdulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especfica cmo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificacin por quien no tenga derecho a acceder a ellas, solamente los propios mtodos 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 abstraccin. La aplicacin entera se reduce a un agregado o rompecabezas de objetos. Es la capacidad de ocultar los detalles internos del comportamiento de una Clase y exponer slo los detalles que sean necesarios para el resto del sistema. El ocultamiento permite 2 cosas: restringir y controlar el uso de la Clase. Restringir porque habr cierto comportamiento privado de la Clase que no podr ser accedido por otras Clases. Y controlar porque daremos ciertos mecanismos para modificar el estado de nuestra Clase y es en estos mecanismos dnde se validarn que algunas condiciones se cumplan. En Java el ocultamiento se logra usando las palabras reservadas: public, private y protected delante de las variables y mtodos. 2.4.5. 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 invocacin de un comportamiento en una referencia producir el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto

ocurre en "tiempo de ejecucin", esta ltima caracterstica se llama asignacin tarda o asignacin dinmica. Algunos lenguajes proporcionan medios ms estticos (en "tiempo de

compilacin"

de polimorfismo, tales como las plantillas y la sobrecarga de operadores de

C++. 2.4.6. Herencia. Las clases no estn aisladas, sino que se relacionan entre s, formando una jerarqua de clasificacin. 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 volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en rboles o enrejados que reflejan un comportamiento comn. Cuando un objeto hereda de ms de una clase se dice que hay herencia mltiple. La herencia es uno de los conceptos ms cruciales en la POO. La herencia bsicamente consiste en que una clase puede heredar sus variables y mtodos a varias subclases (la clase que hereda es llamada superclase o clase padre). Esto significa que una subclase, aparte de los atributos y mtodos propios, tiene incorporados los atributos y mtodos heredados de la superclase. De esta manera se crea una jerarqua de herencia. Por ejemplo, imaginemos que estamos haciendo el anlisis de un Sistema para una tienda que vende y repara equipos celulares.

En el grfico vemos 2 Clases ms que posiblemente necesitemos para crear nuestro Sistema. Esas 2 Clases nuevas se construirn a partir de la Clase Celular existente. De esa forma utilizamos el comportamiento de la SuperClase. 2.4.7. Recoleccin de basura La recoleccin de basura o garbage collector es la tcnica por la cual el entorno de objetos se encarga de destruir automticamente, y por tanto desvincular la memoria asociada, los objetos que hayan quedado sin ninguna referencia a ellos. Esto significa que el programador no debe preocuparse por la asignacin o liberacin de memoria, ya que el entorno la asignar al crear un nuevo objeto y la liberar cuando nadie lo est usando. En la mayora de los lenguajes hbridos que se extendieron para soportar el Paradigma de Programacin Orientada a Objetos como C++ u Object Pascal, esta caracterstica no existe y la memoria debe desasignarse manualmente. 2.5 LENGUAJES ORIENTADOS A OBJETOS. En 1985, E. Stroustrup extendi el lenguaje de programacin C a C++, es decir C con conceptos de clases y objetos, tambin por esas fechas se cre desde sus bases el lenguaje EIFFEL. En 1995 apareci el ms reciente lenguaje OO, Java desarrollado por SUN, que hereda conceptos de C++. El lenguaje de desarrollo ms extendido para aplicaciones Web, el PHP 5, trae todas las caractersticas necesarias para desarrollar software orientado a objetos. Adems de otros lenguajes que fueron evolucionando, como el Pascal a Delphi. Finalmente tambin otros lenguajes script como el ActionScript que si bien no es totalmente orientado a objetos pero s posee las caractersticas. Algunos ejemplos de lenguajes Orientados a Objeto son los siguientes: C++

Objective C Java Smalltalk Eiffel Lxico (en castellano) Ruby Python OCAML Object Pascal CLIPS Visual .net Actionscript COBOL Perl C# Visual Basic.NET PHP Simula Delphi PowerBuilder 3. SINTAXIS A la forma visible de un lenguaje de programacin se le conoce como sintaxis. La mayora de los lenguajes de programacin son puramente textuales, es decir, utilizan secuencias de texto que incluyen palabras, nmeros y puntuacin, de manera similar a los lenguajes naturales escritos. Por otra parte, hay algunos lenguajes de programacin que son ms grficos en su naturaleza, utilizando relaciones visuales entre smbolos para especificar un programa. La sintaxis de un lenguaje de programacin describe las combinaciones posibles de los smbolos que forman un programa sintcticamente correcto. El significado que se le da a una combinacin de smbolos es manejado por su semntica (ya sea formal o como parte del cdigo duro de la referencia de implementacin). Dado que la mayora de los lenguajes son textuales, este artculo trata de la sintaxis textual. 3.1. Sintaxis de una clase C++. Class nombre_clase [: [public/protected/private] clase_madre] { [lista de atributos]; [lista de metodos]; }; 3.2. Sintaxis de una clase Java. [final/abstract] class nombre_clase [extends clase_madre] [implements interface1, [interface2,...]...] { [lista de atributos]; [lista de metodos]; };

3.3. Modificadores de acceso a miembros de clases. Existen 3 tipos de usuarios de una clase: La propia clase. Usuarios genricos (otras clases, metodos, etc.) Clases derivadas. Cada usuario tiene distintos privilegios o niveles de acceso. C++: Private: Por defecto todo lo declarado dentro de la clase es privado y solo puede ser accedido por funciones miembro o por funciones amigas. Public: Pueden ser accedidos por funciones miembro y no miembro de una clase. Protected: Pueden ser accedidos por funciones miembro, por funciones amigas o por funciones miembro de sus clases derivadas. Java: Private: Solo puede ser accedida por metodos propios de la clase. Private-protected: Pueden ser accedidos por las sub-clases, sin importar el paquete al que pertenezcan. Sin embargo, las sub-clases solo pueden modificar estos atributos para objetos de la sub-clase, no de la clase madre. Protected: Permite el acceso a las sub-clases y a las clases del mismo paquete. Friendly: Es el valor por defecto. Permite el acceso solo a clases del mismo paquete. Public: Pueden ser accedidas por todos. CONCLUSIN Al terminar de redactar esta investigacin documental, puedo concluir a manera de resumen con las siguientes ideas: En un programa orientado a objetos tendremos a un conjunto de objetos colaborando entre ellos. La orientacin a objetos es el paradigma que est de moda para el desarrollo de software. Un objeto es una abstraccin conceptual del mundo real que se puede traducir a un lenguaje de programacin orientado a objetos. Un objeto del mundo real tiene caractersticas y comportamientos, y de la misma manera, un objeto del mundo del software tiene variables y mtodos. Los objetos se comunican entre ellos usando los mensajes. Un mensaje es la invocacin de un mtodo del objeto. La orientacin a objetos requiere de una metodologa que integre el proceso de desarrollo y un lenguaje de modelamiento con herramientas y tcnicas adecuadas. Sin embargo; en lo personal, considero que la investigacin ha cumplido con sus objetivos, ya que me brindo los fundamentos bsicos del paradigma orientado a objetos, conozco las principales caractersticas de la POO y la forma en que se relaciona con los objetos de nuestro mundo real. Pero lo ms importante de todo, es que me ha motivado a conocer ms sobre este paradigma de la programacin, ya que actualmente es muy utilizada y es muy interesante. REFERENCIAS. http://es.kioskea.net/contents/langages/langages.php3# http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n http://es.wikipedia.org/wiki/Paradigma_de_programaci%C3%B3n

http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos http://pdf.rincondelvago.com/lenguajes-de-programacion_8.html http://www.monografias.com/trabajos14/paradigma/paradigma.shtml http://es.wikipedia.org/wiki/Lenguaje_orientado_a_objetos http://www.lenguajes-de-programacion.com/programacion-orientada-a-objetos.shtml http://www.articulandia.com/premium/article.php/25-09-2006Lenguajes-de-programacionorientada-a-objetos.htm#ixzz16Q8YjRiU http://java.ciberaula.com/articulo/tecnologia_orientada_objetos/ UNIDAD IV. MODELADO ORIENTADO A OBJETOS ESTUDIO DE FACTIBILIDAD. El Paradigma Orientado a Objetos Un paradigma es un conjunto de teoras, metodos y estandares que juntos representan un medio de organizacin del conocimiento. La orientacin a objetos puede describirse como el conjunto de disciplinas que desarrollan y modelizan software que facilitan la construccin de sistemas complejos a partir de componentes. El paradigma orientado a objetos se basa en la nocin de clases y objetos. Un Objeto es una entidad que combina: Conjunto de propiedades o atributos (datos) Conjunto de metodos (comportamiento o funcionalidad ) Estado: Es lo que lo hace diferente de otros objetos de la misma clase. El estado se describe a travs de las variables de la instancia Un Objeto es la instancia de una clase. Clase: Representacin abstracta de un concepto en el mundo real, proporciona la base a partir de la cual creamos instancias de objetos especficos. Una clase es esencialmente un proyecto, a partir del cual puede crear objetos. Una clase define las caractersticas de un objeto. Incluyendo las propiedades que definen los tipos de datos que ese objeto puede contener y los mtodos que describen el comportamiento del objeto. * Elementos del paradigma orientado a objetos * Abstraccin * Encapsulamiento * Modularidad * Jerarqua * Polimorfismo * Abstraccin: Es la propiedad que permite representar las caractersticas esenciales de un objeto, sin preocuparse de las restantes caractersticas.

* Una abstraccin se centra en la vista externa de un objeto, de modo que sirva para separar el comportamiento esencial de un objeto de su implementacin. * Una clase se puede definir como una descripcin abstracta de un grupo de objetos, cada uno de los cuales se diferencia por su estado especfico y por la posibilidad de realizar una serie de operaciones.

El paradigma orientado a objetos


Indice 1. Introduccion 2. Herencia y polimorfismo 3. El Paradigma Concurrente 4. El Paradigma Logico 5. El paradigma funcional 1. Introduccion 1-programacion orientada a objetos (p.o.o.). Un proyecto de software es complejo. Las gui, acceso transparente a datos y capacidad de trabajo En red, lo hacen mas complejo aun. Para enfrentarse a esta complejidad nace la poo. 2-que es la poo?. Es una tecnica o estilo de programacion que utiliza objetos como bloque fundamental de Construccion. 3-elementos basicos de la poo. Bloques Son un conjunto complejo de datos (atributos) y funciones (metodos) que poseen una determinada Estructura y forman parte de una organizacion. Los atributos definen el estado del objeto; los metodos, su comportamiento. Metodos Es un programa procedimental que esta asociado a un objeto determinado y cuya ejecucion solo Puede desencadenarse a traves del mensaje correspondiente. Mensajes Es simplemente una peticion de un objeto a otro para que este se comporte de una manera Determinada, ejecutando uno de sus metodos. Los mensajes comunican a los objetos con otros y con el mundo exterior. A esta tecnica de enviar Mensajes se la conoce como paso de mensajes. Clases Es un tipo definido por el usuario que determina la estructura de datos y las operaciones Asociadas con ese tipo.

4-caracteristicas. Abstraccion Significa extraer las propiedades esenciales de un objeto que lo distinguen de los demas tipos de Objetos y proporciona fronteras conceptuales definidas respecto al punto de vista del observador. Es la capacidad para encapsular y aislar la informacion de diseno y ejecucion. Encapsulamiento Es el proceso de almacenar en un mismo compartimiento (una caja negra) los elementos de una Abstraccion (toda la informacion relacionada con un objeto) que constituyen su estructura y su Comportamiento. Esta informacion permanece oculta tanto para los usuarios como para otros objetos Y puede ser accedida solo mediante la ejecucion de los metodos adecuados. Herencia Es la propiedad que permite a los objetos construirse a partir de otros objetos. La clase base contiene todas las caracteristicas comunes. Las sub-clases contienen las Caracteristicas de la clase base mas las caracteristicas particulares de la sub-clase. Si la sub-clase hereda caracteristicas de una clase base, se trata de herencia simple. Si hereda de dos o mas clases base, herencia multiple. Polimorfismo Literalmente significa "cualidad de tener mas de una forma". En poo, se refiere al hecho que una Misma operacion puede tener diferente comportamiento en diferentes objetos. En otras palabras, Diferentes objetos reaccionan al mismo mensaje de modo diferente. 5-ventajas. Modelos La poo permite realizar un modelo de sistema casi independientemente de los requisitos del Proyecto. La razon es que en la poo la jerarquia la establecen los datos, en cambio en la Programacion estructurada la jerarquia viene definida por los programas. Este cambio hace que los modelos se establezcan de forma similar al razonamiento humano y, por lo Tanto, resulte mas natural. Modularidad Un programa es modular si se compone de modulos independientes y robustos. Esto permite la Reutilizacion y facilita la verificacion y depuracion de los mismos. En poo, los modulos estan Directamente relacionados con los objetos. Los objetos son modulos naturales ya que corresponden A una imagen logica de la realidad.

Extensibilidad Durante el desarrollo de sistemas, ocurre la aparicion de nuevos requisitos, por eso es deseable Que las herramientas de desarrollo permitan anadirlos sin modificar la estructura basica del Diseno. En poo es posible lograr esto siempre y cuando se hayan definido de forma adecuada la Jerarquia de clases, los atributos y metodos. Eliminacion de redundancia En el desarrollo de sistemas se desea evitar la definicion multiple de datos y funciones comunes. En poo esto se logra mediante la herencia (evita la definicion multiple de propiedades comunes a Muchos objetos) y el polimorfismo (permite la modificacion de metodos heredados). Solo hay que Definir los atributos y los metodos en el antepasado mas lejano que los comparte. Reutilizacion La poo proporciona un marco perfecto para la reutilizacion de las clases. El encapsulamiento y la Modularidad nos permiten utilizar una y otra vez las mismas clases en aplicaciones distintas. En Efecto, el aislamiento entre distintas clases significa que es posible anadir una nueva clase o Un modulo nuevo (extensibilidad) sin afectar al resto de la aplicacion. 6-lenguajes en poo. Puros Son los que solo permiten realizar programacion orientada a objetos. Ej: smalltalk, java. Hibridos Son los que permiten la poo con la programacion estructurada. Ej: c++, pascal. 7-poo en c++ y java. A)tipos de clases Una de las principales decisiones al trabajar con poo es la de seleccion de clases. Existen 4 Tipos:

Manejadoras de datos o de estados: su responsabilidad principal es mantener informacion

De datos o estado. Se reconocen como los sustantivos en la descripcion de un problema y Generalmente son los bloques de construccion mas importantes de un diseno.

Pozos o fuentes de datos: estas clases generan datos o los aceptan para procesarlos mas

Adelante. A diferencia de los anteriores, estas clases no retiene los datos por un periodo de Tiempo sino que los genera sobre demanda o los procesa cuando se le llama.

Vistas: se encargan de la presentacion de la informacion. Auxiliares o de ayuda: guardan poca o ninguna informacion de estado, pero que asisten en

La ejecucion de tareas complejas. B)sintaxis de una clase C++: Class nombre_clase [: [public/protected/private] clase_madre] { [lista de atributos]; [lista de metodos]; };

Java: [public] [final/abstract] class nombre_clase [extends clase_madre] [implements interface1, [interface2,...]...] { [lista de atributos]; [lista de metodos]; }; C)modificadores de acceso a miembros de clases Existen 3 tipos de usuarios de una clase:

La propia clase. Usuarios genericos (otras clases, metodos, etc) Clases derivadas.

Cada usuario tiene distintos privilegios o niveles de acceso. C++: Private Por defecto todo lo declarado dentro de la clase es privado y solo puede ser accedido por Funciones miembro o por funciones amigas. Public Pueden ser accedidos por funciones miembro y no miembro de una clase. Protected Pueden ser accedidos por funciones miembro, por funciones amigas o por funciones miembro de sus Clases derivadas. Java: Private

Solo puede ser accedida por metodos propios de la clase. Private-protected Pueden ser accedidos por las sub-clases, sin importar el paquete al que pertenezcan. Sin embargo, Las sub-clases solo pueden modificar estos atributos para objetos de la sub-clase, no de la clase Madre. Protected Permite el acceso a las sub-clases y a las clases del mismo paquete. Friendly Es el valor por defecto. Permite el acceso solo a clases del mismo paquete. Public Pueden ser accedidas por todos. D)atributos Las variables declaradas dentro de un metodo son locales a el; las declaradas en el cuerpo de la Clase son miembros de ella y son accesibles por todos los metodos de la clase. Los atributos miembros de la clase pueden ser: atributos de clase (declarado como static) o Atributos de instancia. C++: [static]tipo_dato nombre_dato; (no se puede inicializar un dato miembro de una clase) Java: [modificador_de_acceso] [static] [final] [transient] [volatile] tipo_dato nombre_dato [= valor]; Final Implica que un atributo no puede ser sobreescrito o redefinido, es decir que no se trata de una Variable sino de una constante. Transient Son atributos que no se graban cuando se archiva un objeto, o sea no forman parte permanente del Estado de este. Volatile Se utiliza cuando la variable puede ser modificada por distintos threads. Basicamente implica que Varios threads pueden modificar la variable en forma simultanea, y volatile asegura que se vuelva A leer la variable, por si fue modificada, cada vez que se la vaya a usar. E)metodos Dentro de los metodos pueden incluirse:

Declaraciones de variables locales. Asignaciones a variables. Operaciones matematicas. Llamados a otros metodos. Estructuras de control. Excepciones.

C++: Se puede declarar y definir dentro de la clase: Class nombre_clase { tipo_dato dato; [modificador_de_acceso]: tipodato_devuelto nombre_metodo(parametros) { cuerpo_metodo; }; } Tambien, se puede declarar dentro de la clase y definirlo fuera: Class nombre_clase { tipo_dato dato; [modificador_de_acceso]: tipodato_devuelto nombre_metodo(parametros); }; Tipodato_devuelto nombre_clase :: nombre_metodo(parametros) { cuerpo_metodo; } Java: En java se debe declarar y definir la funcion dentro de la clase: Class nombre_clase { tipo_dato dato; [modificador_de_acceso] [static] [abstract] [final] [native] [syncronized] tipodato_devuelto nombre_metodo (parametros)[throws exepcion1 [,exepcion2]] { cuerpo_metodo; } } Static Al igual que con los atributos, un metodo declarado como static es compartido por todas las Instancias de la clase. Abstract Son aquellos de los que se da la declaracion pero no la implementacion, para generar una clase Abstracta. Final Es un metodo que no puede ser redefinido por las sub-clases herederas. Native Es un metodo que esta escrito en otro lenguaje que no es java. Syncronized Permite sincronizar varios threads para el caso en que dos o mas quieran acceder en

forma Concurrente. Throws Sirve para indicar que la clase genera determinadas execpciones. Llamada a metodos Se llama a un metodo de la misma clase simplemente con el nombre del metodo y los parametros Entre parentesis. Cuando se necesita llamar a un metodo de un objeto de otra clase, se utiliza: Nombre_objeto.nombre_metodo(parametros) F)metodos o funciones miembros Funciones simples (c++ y java) Son los vistos anteriormente, se pueden definir dentro o fuera de la clase. Funciones en linea (inline) (c++) Se crean definiendo la funcion dentro de la clase (declaracion implicita) o definiendo la funcion Fuera de la clase pero anteponiendo la palabra reservada inline (declaracion explicita). Funciones constructores (c++ y java) Es una funcion especial que sirve para inicializar objetos de una clase. En general, tienen el Mismo nombre de la clase que inicializa, no devuelven valores, pueden admitir parametros, pueden Existir mas de un constructor (e incluso no existir), si no se define ningun constructor el Compilador genera uno por defecto, se llaman al momento de crear un objeto.

Constructores por defecto: es un constructor que no acepta argumentos. Si no se define,

El compilador genera uno que asigna espacio de memoria y lo pone en cero.

Constructores con argumentos: inicializan un objeto con los valores del argumento. Pueden

Existir varios que se diferencian por la cantidad y tipo de argumentos.

Constructores copiadores: crea un objeto a partir de uno existente. Toma como unico

Parametro otro objeto del mismo tipo. Si no se declara el compilador genera uno por defecto Asignandole al nuevo objeto los valores del objeto a la izquierda del operador =. En java se puede inicializar el objeto tras la creacion fisica del mismo, asignandole los valores Que se le dara. Funcion destructor (c++) Cumplen la funcion inversa a la del constructor eliminando el espacio de almacenamiento que Ocupo el objeto al ser creado. Caracteristicas: tienen el mismo nombre de la clase, van Precedidos por el caracter ~, solo existe un destructor por clase, no admiten argumentos, no

Retornan ningun valor, el compilador llama a un destructor cuando el objeto sale fuera de ambito. Funciones amigas (c++) Es una funcion no miembro que puede acceder a las parte private de una clase. Se declaran Anteponiendo la palabra reservada friend. Tambien se pueden declarar como amigas a las clases. En este caso todas las funciones de la clase Amiga pueden acceder a las partes privadas de la otra clase. Funciones sobrecargadas (c++ y java) Es una funcion que tiene mas de una definicion. Las funciones sobrecargadas tienen el mismo Nombre, pero deben tener un numero distinto de argumentos o diferentes tipos de argumentos. Las Definiciones operan sobre funciones distintas. Las unicas funciones miembro que no se pueden sobrecarga son los destructores. Funciones operador (c++) Permiten sobrecargar un operador existente (ej: suma) para utilizarlos con objetos. Se declara Poniendo la palabra reservada operator seguida por el operador especifico y la lista de Argumentos y el cuerpo de la funcion. Restricciones:

El operador debe ser uno valido para c++ y no se puede cambiar el simbolo. Funciona solo al utilizar objetos de clase. No se puede cambiar la asociatividad de los operadores, es decir para que sirven. No se puede cambiar un operador binario para funcionar con un unico objeto. No se puede cambiar un operador unario para que funcione con dos objetos.

G)objetos C++: Se pueden crear en forma estatica (nombre_clase objeto1) o dinamica (nombre_clase *objeto2; Objeto2= new nombre_clase;) Java: Solo se crean los objetos en forma dinamica: nombre_clase objeto1=new nombre_clase(); H)arrays de objetos Se pueden crear arrays de objetos de la misma forma que se crea un array normal. C++: Estatico: nombre_clase objeto[10]; Dinamico: nombre_clase *objeto; Objeto=new nombre_clase[10]; Java: Nombre_clase objeto=new nombre_clase[10]; I)puntero this Es un puntero al objeto asociado con la invocacion de una funcion miembro. Normalmente no se

Explicita ya que el lenguaje realiza esta operacion transparente y en forma automatica. Igualmente hay casos en los que se debe usar el puntero this explicitamente:

Como argumento en una llamada a una funcion para pasar un puntero al objeto asociado con

La invocacion de la funcion miembro. Ej: f(this);

Hacer una copia del objeto asociado con la invocacion o asignar un nuevo valor al objeto.

Ej: void t::g (t &a, t &b) { ... a= *this; ... *this= b; }

Devolver una referencia al objeto asociado con la invocacion de la funcion miembro o

Constructor. Ej: t& t::f (int a) { ... return *this; } C++: This->nombre_objetomiembro Java: This.nombre_objetomiembro 2. Herencia y polimorfismo 1-herencia. Herencia es la propiedad de que los ejemplares de una clase hija extiendan el comportamiento y los datos asociados a las clases paternas. La herencia es siempre transitiva, es decir que una sub-clase hereda caracteristicas de superclases alejadas muchos niveles. 2-beneficios de la herencia. Reusabilidad del software Cuando el comportamiento se hereda de otra clase, no es necesario reescribir el codigo que lo define. Comparticion de codigo} Muchos usuarios o proyectos distintos pueden usar las mismas clases. Por otro lado, la herencia reduce el tiempo de escritura y el tamano final del programa. Consistencia de la interfaz} El comportamiento de una clase madre que heredan todas sus clases hijas sera el mismo,

de esta manera se asegura que las interfaces para objetos seran similares y no solo un conjunto de objetos que son parecidos pero que actuan e interactuan de forma diferente. Componentes de software La herencia nos permite escribir componentes de software reutilizables. Modelado rapido de prototipos Cuando un sistema se construye casi totalmente de componentes reutilizables, se puede dedicar mas tiempo a la realizacion de aquellas partes nuevas. A este estilo de programacion se lo conoce como modelado rapide de prototipos o programacion exploratoria. Ocultacion de informacion Un programador puede reutilizar un componente conociendo solamente la naturaleza e interfaz del mismo y sin la necesidad de conocer los detalles tecnicos empleados para su realizacion. Polimorfismo Permite al programador generar componentes reutilizables de alto nivel que puedan adaptarse a diferentes aplicaciones mediante el cambio de sus partes de bajo nivel. 3-heuristicas para crear sub-clases. Para saber si una clase debe convertirse en una subclase de otra mediante la herencia hay que aplicar la regla del es-un y es-parte-de. Es-un Se dan entre dos conceptos cuando el primero (la sub-clase) es un ejemplar especificado del segundo (la clase base). Ej: un avion es un transporte. Es-parte-de Se da entre dos conceptos cuando el primero (la sub-clase) es una parte del segundo (la clase base), sin ser ninguno, en esencia, la misma cosa. Ej: un motor es parte de un auto. Distintos tipos de herencia A)especializacion Es la forma de herencia mas comun y cumple en forma directa la regla es-un. B)especificacion Se trata de un caso especial de sub-clasificaion por especializacion, excepto que las subclases no son refinamientos de un tipo existente, sino mas bien realizaciones de una especificacion incompleta. Es decir, que la superclase describe un comportamiento que sera implantado solo por las sub-clases. C)construccion Se da cuando la sub-clase ha heredado casi completamente su comportamiento de la superclase y solo tiene que modificar algunos metodos o los argumentos de cierta manera. D)generalizacion Esta es la opuesta a la creacion de sub-clases por especializacion. Se debe evitar; solo

deben aplicarse cuando no se pueden modificar las clases existentes o se deben anular metodos de las mismas. E)extension Agrega una capacidad totalmente nueva a un objeto existente. Se distingue de la generalizacion, ya que esta debe anular al menos un metodo de la clase base, mientras que la extension solo agrega metodos nuevos. F)limitacion Es una variante de la especificacion en donde el comportamiento de la sub-clase es mas reducido o esta mas restringido que que el comportamiento de la superclase. Tambien se da en situaciones en las que las clases existentes no pueden modificarse. G)variacion Se da cuando do o mas clases tienen implantaciones similares, pero no parece haber ninguna relacion jerarquica entre los conceptos representados por las clases. Ej: codigo del mouse y de la placa de video. H)combinacion Se da cuando una sub-clase resulta de la combinacion de caracteristicas de dos o mas clases. 4-herencia y jerarquia de clases C++ y java utilizan un sistema de herencia jerarquica.una clase hereda de otra, creando asi muevas clases a partir de clases existentes. Solo se pueden heredar clases, no funciones ordinarias ni variables. Una sub-clase deriva de una clase base. La clase derivada puede a su vez ser utilizada como clase base para derivar mas clases, conformandose asi la jerarquia de clases. Caracteristicas de las clases derivadas Una clase derivada o sub-clase:

Puede a su vez ser una clase base, dando lugar a la jerarquia de clase. Los miembros heredados por una clase derivada, pueden a su vez ser heredados por mas clases derivadas a ella. Hereda todos los miembros de la clase base, pero solo podra acceder a aquellos que los especificadores de acceso de la clase base lo permitan. Las clases derivadas solo pueden acceder a los miembros public, protected y private-protected (en java) de la clase base, como si fueran miembros propios. No tienen acceso a los miembros private de la calse base. Pueden anadir sus propios datos y funciones miembros.

Los siguientes elementos de la clase base no se heredan:


Constructores y destructores. Funciones y datos estaticos de la clase. Funciones amigas y operadores sobrecargados (solo c++).

Sintaxis de una clase derivada C++:

Class clase_derivada : [public / protected / private] clase_base [, [public / protected / private]clase_base2] { cuerpo clase derivada; }; Java: Class nombre_derivada extends nombre_base { cuerpo clase derivada; } Especificadores de acceso C++: Si no se especifica el tipo de derivacion, c++ supone que el tipo de herencia es private. Si en la derivacion especificamos:

Public

Los miembros public pasan a ser public en la clase derivada. Los miembros protected pasan a ser protected. Y los privados permanecen privados en la clase base. Clase base public protected Private Clase derivada Public Protected Private

Protected

Todos los miembros public y protected de la clase base son miembros protected en la derivada. Clase Public Protected Private Clase public

protected Private

Private

Todos los miembros public y private son miembros private en la clase derivada. Clase public protected Private Clase Public Protected Private Java: Para analizar los tipos de herencia en java hay que tener en cuenta que existen 5 distintos tipos de clases:

Clase base. Clases derivadas del mismo paquete. Clases derivadas en distinto paquete. Clases del mismo paquete. Clases en distinto paquete.

Miembros declarados como Private Clase base. Clases derivadas del mismo paquete. Clases del mismo paquete. Clases derivadas en distinto paquete. Clases en distinto paquete. Tipo de acceso:

Privateprotected S R N R N

Protected S S S R N

Friendly S S S N N

Public S S S S S

S N N N N

S: acceso posible. N: acceso denegado. R: reservado a las subclases. Acceso posible si el miembro se refiere a un objeto de la

subclase y no a uno de la clase base.

Redefinicion de metodos Cuando se hace heredar una clase de otra, se pueden redefinir ciertos metodos a fin de refinarlos, o bien de modificarlos. El metodo lleva el mismo nombre y la misma signatura, pero solo se aplica a objetos de la sub-clase o sus descendientes. Constructores Cuando se construye una calse hija, es necesario tambien llamar al constructor de la clase madre. Esta invocacion puede ser implicita o explicita. Es implicita si el constructor de la madre no toma parametros. En este caso, ya sea que el constructor de la hija sea implicito o no, la llamada al constructor de la madre es automatica. Si el constructor de la madre necesita parametros, hay que pasarselos. Es necesario definir un constructor en la hija y este debe llamar al constructor de la madre enviando los parametros. Para realizarlo se sigue el siguiente ordem:

Llamar al constructor de la clase madre. Construir los miembros de la clase hija. Ejecutar las instrucciones contenidas en el cuerpo del constructor de la clase hija.

C++: Derivada :: derivada (tipo1 x, tipo2 y) : base (x,y) [, base2 (x,y) ] { cuerpo del constructor; } En herencia multiple, el orden real de invocacion de constructores se da de acuerdo al orden en que fueron declaradas las clases. C++ utiliza el siguiente orden de inicializacion:

Primero, se inicializan todas las clases bases virtuales. Las clase bases no virtuales se inicializan en el orden en que aparecen en la declaracion de clases. Por ultimo, se ejecuta el constructor de la clase derivada.

Java: En la definicion del constructor de la clase derivada se utiliza la palabra super para simbolizar la llamada al constructor de la clase base. Class hija extends madre

{ public hija (tipo1 x) { super (y); cuerpo del constructor; ] } Destructores Al contrario que con los constructores, una funcion destructor de una clase derivada se ejecuta antes que el destructor de la clase base. (los destructores no se heredan) Clases bases virtuales Es una clase que es compartida por otras clases base con independencia del numero de veces que esta se produce en la jeraquia de derivacion. Supongamos que la clase base a, la cual tiene sus propios miembros. Definimos dos clases derivadas de esta b y c, tambien con sus propios metodos y los heredados. Definimos tambien una clase d, derivada de b y c (derivacion multiple). Este tipo de jerarquia puede dar lugar a problemas ya que la clase d heredara las funciones miembro de b y c, pero tambien derivara las de a dos veces. Para evitar este problema, debemos definir a las clases clases base como como clases vituales, lo cual significa que solo una copia de los miembros ambiguos pasara a la clase derivada. Class a {} Class b : virtual public a {} Class c : virtual public a {} Class d : public b , public c {} 5-polimorfismo Consiste en llamar a un metodo segun el tipo estatico de una variable, basandose en el nucleo para llamar a la version correcta del metodo. El polimorfismo se realiza por estos metodos:

Sobrecarga de funciones (c++ y java)

En este caso el compilador determina que funcion debe utilizarse en tiempo de compilacion ya que conocera el objeto implicado. Este tipo de ligadura, se la conoce como ligadura temprana, estatica o previa.

Cuando existen punteros implicados, el compilador no sabe a que objeto se esta referenciando. En este caso se produce una ligadura dinamica.

Con funciones virtuales (c++)

Cuando varias sub-clases derivan de una clase base, estas pueden emplear las funciones que heredan de la misma forma, pero otras pueden requerir elementos adicionales o incluso formatos totalmente nuevos. Para enfrentar esto, existen 3 soluciones posibles:

Definir las funciones con distintos nombres. (es facilmente realizable peron no es ideal porque genera complejidad) Sobrecargar la funcion. Esto es util cuando la jerarquia de clases es pequena. Identificar aquellas funciones miembro de la clase base que se puedan llegar a utilizar en clases derivadas y declararlas como virtuales.

En este ultimo caso, la ligadura se lleva a cabo en tiempo de ejecucion. La funcion debe ser declarada como vitual en la primer clase en la que esta presente. La palabra clave virtual permite definir la funcion bajo el mismo nombre tanto en la clase base como en la derivada. Al utilizar funciones virtuales se pueden utilizar punteros a la clase base para referenciar objetos de una clase derivada. Funcion virtual pura Es una funcio virtual declarada en una clase base que no esta definida y no tiene cuerpo. Deben definirse luego en la clase derivada. C++: Virtual tipo nombre_funcion (parametros) = 0; Java: Se llaman metodos abstractos y se declaran pero no se escribe su implementacion. Abstract metodoabstracto (); Clases abstractas Son clases que se disenan para ser heredadas y solo se pueden utilizar como clases base. No pueden ser instanciadas.} C++: Una clase es abstracta si tiene al menos una funcion virtual pura. Java: Deben declararse como abstract. Abstract nombre_clase { abstract void metodo_abstracto (); } Pasos para obtener polimorfismo en c++

Crear una jerarquia de clases con las funciones miembro importantes definidas como virtuales. Si las clases base son tales que no se pueden implementar estas funciones en ellas, declarar funciones virtuales puras.

Proporcionar implementaciones concretas de clases virtuales en las clases derivadas. Cada clase derivada tiene su propia version de las funciones. Manipular instancias de las clases derivadas a traves de punteros.

3. El Paradigma Concurrente Concurrencia Se dice que dos o mas procesos son concurrentes si estan construidos de manera tal que pueden ejecutarse al mismo tiempo y compartiendo rescursos. Considerando un entorno multi-thread, cada hilo representa un proceso individual ejecutandose en un sistema. Generalmente, cada hilo controla un unico aspecto dentro de un programa. Todos los hilos comparten los mismos recursos. Hay que distinguir multi-hilo de multi-proceso. El multi-proceso se refiere a dos o mas programas que se ejecutan "aparentemente" a la vez, bajo el control del sitema operativo. Los programs no necesitan tener relacion unos con otros. Multi-hilo se refiere a dos o mas tareas que se ejecutan "aparentemente" a la vez, dentro de un mismo programa. Programas de flujo unico Un programa de flujo unico (single-thread) utiliza un unico flujo de control (thread) para controlar su ejecucion. Programas de flujo multiple La utilizacion de hilos en java permite una gran flexibilidad a la hora de plantearse el desarrollo de aplicaciones. La simplicidad para crear, configurar y ejecutar hilos de ejecucion permite que se puedan implementar aplicaciones muy poderosas y portables. Mientras un programa de flujo unico realiza su tarea ejecutando instrucciones en forma secuencial, un programa de flujo multiple permite que cada hilo comience y termine tan pronto como sea posible. 1-planificacion de hilos. Cada hilo tiene asociada una prioridad que es utilizada por el sistema (en tiempo de ejecucion)como ayuda para determinar que hilo debe ejecutarse en un instante determinado. Un hilo en ejecucion, continua ejecutandose hasta que realiza una operacion de bloqueo, o hasta que es desalojado. Un hilo puede ser desalojado por otro hilo de mayor prioridad que se hace ejecutable, o porque el planificador de hilos provoca un crecimiento en un hilo de baja prioridad para que este tome algunos ciclos del cpu, evitando asi la inanicion. Un hilo tiene inicialmente la prioridad del hilo que lo creo. Estos valores pueden modificarse mediante: setpriority() con un valor de parametros entre las constantes min_priority y max_priority de la clase thread. El metodo getpriority() devuelve el valor de la prioridad de un hilo. 2-la clase thread. Es la clase que encapsula todo el control necesario sobre los hilos. Un objeto de la clase thread actua como el panel de control de un hilo de ejecucion (el thread propiamente dicho).

Metodos de clase Se utilizan para saber el estado del hilo y para replanificarlo. Public static void currentthread() Devuelve el objeto thread que representa al hilo en ejecucion. Public static void sleep(long milisegs) throws interruptedexception Duerme al hilo por el tiempo indicado en ms. Si el hilo se interrumpe mientras duerme, se lanza una excepcion. Public static void yield() Dice a la jvm que el hilo actual no necesita ejecutarse en el presente momento. La maquina puede o no acatar esta sugerencia. Metodos de instancia

Creacion de un hilo

Thread objeto = new thread(); Luego de crear un hilo, se puede configurar seteando su prioridad inicial y nombre.

Arranque de un hilo

Objeto.start(); El metodo lanza un nuevo hilo basado en los datos del objeto thread. Luego llama al metodo run del hilo, con lo que el hilo se activa, y en donde se ejecutan todas las tareas del hilo.

Otros

Suspend() Detiene al hilo sin destruirlo. Resume() Activa a un hilo suspendido. Interrupt() Se utiliza para detener a un hilo cuando se requiere gestionar su finalizacion. Setname(string) Permite nombrar a un hilo. Getname() Devuelve un string con el nombre del hilo. Isalive() Devuelve un 1 si el hilo esta ejecutando su metodo run(). Como obtener hilos de ejecucion Existen dos formas de hacerlo:

Extender la clase thread, redefiniendo el metodo run:

Class mihilo extends thread {

atributos; public void run() { se redefine el metodo run; } }

Implementando la interfaz runnable:

Las interfaces proporcionan un forma de agrupar el trabajo de infraestructura de una clase. La interfaz define el trabajo y la clase lo implementa. Una interfaz solo puede contener metodos abstractos y variables estaticas y finales. Tambien una interfaz tiene la propiedad de poder heredar en forma multiple de otras interfaces. Interfaz runnable: Public interface runnable { public abstract void run(); } Una clase que implementa una interfaz debe implementar todos los metodos definidos en la interfaz. La interfaz runnable fuerza a que se redefina el metodo run(). Para poder ejecutar el proceso como hilo, se requiere crear una instancia de thread primero: Public class mihilo implements runnable { thread h; public void run() { redefinicion del metodo run(); } }

A diferencia del primer caso, utilizando este metodo queda disponible la herencia simple (extends) que podemos utilizar para heredar alguna otra clase. 3-grupos de hilos. Todo hilo de ejecucion en java debe pertenecer a un grupo. Es la clase threadgroup la que define e implementa la capacidad de un grupo de hilos. Los grupos de hilo permiten que se pueda manejar un conjunto de hilos como un solo objeto.cuando se crea un hilo, es decir en el constructor, debe indicarse el grupo al que pertenecera. Si no se indica un grupo, el sistema asigna uno por defecto, el mismo grupo en que se encuentra el hilo que lo creo. Si no se especifica ningun grupo, todos seran miembros del grupo "main". La clase thread cuenta con constructores que permiten especificar el grupo del hilo que se esta creando en el mismo momento de instanciarlo. Tambien existe el metodo setthreadgroup(). 4-scheduling. Es un metodo que utiliza una lista de procesos que monitoriza a todos los hilos que se estan ejecutando en todos los programas y decide cuales deben ejecutarse y cuales deben encontrarse preparados para su ejecucion. El scheduler utiliza dos caracteristicas de los hilos para decidir: la prioridad del hilo y el indicador de hilo demonio. Existen dos tipos de scheduling:

Preemptivo

Proporciona un periodo fijo de tiempo de cpu a los hilos que estan corriendo en el sistema. El scheduler decide cual sera el hilo a ejecutarse y lo llama con resume(). Cuando pasa su periodo de tiempo, llama a suspend() y ejecuta el siguiente hilo de la lista.

No preemptivo

Decide que hilo debe correr y lo ejecuta hasta que finalice. El hilo tiene el control total del cpu mientras este en ejecucion. Hilos demonios Son hilos de prioridad baja y proporcionan un servicio basico a los programas cuando la actividad de la maquina es reducida. Son utiles cuando un hilo debe ejecutarse en segundo plano durante largos periodos de tiempo. Setdaemon() Pone a un hilo de usuario como demonio. Isdaemon() Devuelve si un hilo es o no demonio. Regla basica Si solamente hay hilos demonios ejecutandose, la aplicacion termina. 5-sincronizacion. Cuando dos o mas hilos necesitan utiliza el mismo objeto, existe la posibilidad de que

sus operaciones se interfieran y se corrompan los datos. Esas operaciones potencialmente interferentes se denominan zonas criticas. La interferencia puede evitarse sincronizando al acceso a esas zonas criticas. Todos los objetos tienen un bloqueo asociado que puede ser adquirido y liberado para evitar la interferencia mediante el uso de metodos y sentencias synchronized. Metodos synchronized Una clase cuyos objetos se deben proteger de interferencias en un entorno con multiples hilos declara generalmente sus metodos modificadores como synchronized. Si un hilo invoca a un metodo synchronized sobre un objeto, en primer lugar se adquiere el bloqueo de ese objeto, se ejecuta el cuerpo del metodo y despues se libera el bloqueo. Si otro hilo quiere invocar un metodo synchronized sobre un objeto bloqueado, debe esperar (bloqueado) hasta que el bloqueo del objeto se libere. La posesion de los bloqueos es unica por hilo. Esto impide que un hilo se bloquee por un bloqueo que posee, es decir cuando llama a un metodo synchronized sobre un objeto cuyo bloqueo posee por haber invocado a otro metodo synchronized con anterioridad. El bloqueo se libera porque:

Se llega a una sentencia return. Se alcanza el final del cuerpo del metodo. Se lanza una excepcion.

Public class ejemplo { tipo atrib1; public synchronized tipo metodo1() { cuerpo metodo; } } Metodos estaticos sincronizados Es una segunda forma de obtener sincronizacion. Todos los objetos tienen asociado un objeto class. Los metodos estaticos sincronizados adquieren el bloqueo del objeto class de su clase. Dos hilos no pueden ejecutar metodos estaticos sincronizados de la misma clase al mismo tiempo. Si se comparten datos estaticos entre hilos, su acceso debe ser protegido utilizando metodos estaticos sincronizados. El bloqueo entre metodos de instancia y estaticos es independiente, es decir que se puede seguir invocando a metodos sincronizados de un objeto mientras un hilo tiene el bloqueo del objeto class en un metodo estatico sincronizado.

La sentencia synchronized Una tercera opcion. La sentencia synchronized nos permite ejecutar codigo sincronizado que adquiere el bloqueo de cualquier objeto. Tiene dos partes: un objeto cuyo bloqueo se va a adquirir y una sentencia que se ejecuta cuando se adquiere el bloqueo. La forma general de la sentencia es: Synchronized (expr) { sentencias; } La expresion expr debe tener el valor de una referencia a objeto. Cuando se obtiene su bloqueo, se ejecutan las sentencias y luego, al terminar el cuerpo, se libera. Si se produce una excepcion en el interior, tambien se libera. La sentencia synchronized tiene varias ventajas. En primer lugar, permite definir una region de codigo sincronizada mas pequena que un metodo sincronizado. En segundo lugar, la sentencia synchronized permite sincronizarnos sobre objetos distintos de this. Es decir, que podemos trabajar sobre bloqueos distintos al actual. Disenos de sincronizacion

Sincronizacion en la parte cliente

Requiere que todos los clientes de un objeto compartido utilicen sentencias synchronized para adquirir el bloqueo del objeto compartido antes de acceder a el.

Sincronizacion en la parte del servidor

Es mejor hacer que los objetos compartidos protejan su propio acceso marcando sus metodos como synchronized. Esto hace imposible que un cliente utilice un objeto de forma no sincronizada. 6-comunicacion entre hilos. Lo que torna posible la comunicacion entre hilos es la sincronizacion al evitar la interferencia. El mecanismo de bloqueo de synchronized es suficiente para evitar que los hilos se interfieran y corrompan objetos, pero tambien necesitamos una forma de comunicacion entre ellos. Wait, notify y notifyall Con este fin, el metodo wait() deja a un hilo esperando hasta que ocurre alguna condicion, y los metodos de notificacion notify() y notifyall() indican a los hilos que esperan que ha ocurrido algo que podria satisfacer esa condicion. Estos tres metodos se definen en la clase object y son heredados por todas las clases pero se aplican a objetos particulares. Al aplicar estos metodos hay que tener en cuanta:

Todo debe ejecutarse dentro de codigo sincronizado. Cuando se aplica un wait() sobre un hilo, se libera simultaneamente el bloqueo sobre el objeto. La condicion de prueba debe estar siempre en un bucle. Los metodos de notificacion son invocados por codigo sincronizado.

Al utilizar notifyall(), se despiertan todos los hilos en espera. Notify(), selecciona a un hilo solo para despertarlo. Puede haber multiples hilos esperando sobre el mismo objeto. Si estos hilos esperan por condiciones diferentes, hay que utilizar notifyall(). Si usamos notify() corremos el riesgo de despertar a un hilo que esta esperando por una condicion diferente a la satisfecha por el hilo. El uso de notify() es un optimizacion que solo se puede aplicar cuando:

Todos los hilos estan esperando por la misma condicion. Solo un hilo como mucho se puede beneficiar de que la condicion se cumpla. Esto es valido para todas las posibles subclases.

7-finalizacion de la ejecucion de un hilo. Un hilo que ha empezado a ejecutarse es un hilo vivo. Un hilo continua vivo hasta que termina, lo cual puede ocurrir de 4 maneras:

El metodo run retorna normalmente. El metodo run finaliza bruscamente. El metodo destroy se invoca sobre el hilo. Cuando el programa termina.

Interrupcion de un hilo Al interrumpir un hilo, mediante interrupt hacemos que el hilo ponga atencion, generalmente para detener su ejecucion, si bien una interrupcion no fuerza al hilo a detenerse. Interrumpir un hilo normalmente no afectara a lo que esta haciendo, pero algunos metodos (como sleep y wait) lanzaran una excepcion. Espera a que un hilo finalice Utilizando el metodo join logramos que un hilo espere a que otro finalice para ejecutarse o continuar su ejecucion. Se usa generalmente en el main para que este espere mientras se ejecutan los hilos lanzados; una vez finalizados los hilos, se continua con la secuencia del main. 8-applets. Es una aplicacion accesible en un servidor de internet, que se transporta por la red, se instala automaticamente y se ejecuta como parte de un documento web. Appletviewer Un applet es una minima aplicacion java disenada para ejecutarse en un navegador web. Por lo tanto, no necesita preocuparse por donde se realizan las llamadas. El applet

asume que el codigo se esta ejecutando dentro de un navegador. Appletviewer es el minimo navegador que crea un espacio de navegacion en donde se ejecutara el applet. El navegador espera como argumento el nombre del fichero html que debe cargar, ya que no se le puede pasar un programa java directamente. Este fichero contiene una marca en donde se especifica el codigo que se debe cargar. Ej: <html> <applet code=holamundo.class width=300 height=100> </applet> </html> Ciclo de vida de un applet Primero se carga el applet en el navegador. Luego se carga la clase que implementara el applet. Despues se crea el marco o el area grafica en donde actuara el applet. Se llama a los metodos que hacen funcionar al applet. Y por ultimo se destruye el applet. Metodos para escribir applets

Init()

Se llama al crearse el applet (solo una vez). La clase applet no hace nada con este metodo. Las clases derivadas deben sobrecargarlo para cambiar todos las inicializaciones que deban realizarse solo una vez. Estas pueden ser: cargar imagenes y sonido, el resize del tamano del applet, asignacion de valores a las variables globales, creacion de hilos, etc.

Destroy()

Las clases derivadas deberian sobrecargar este metodo para hacer una limpieza final. Los applet multithread debera usarlo para matar a los hilos que quedasen activos del applet.

Start()

Llamada para activar el applet. Se realiza cada vez que el usuario visita el applet o se cambia su tamano.

Stop()

Llamada para detener definitivamente el applet. Se llama cuando el usuario sale de la pagina, reduce la ventana a un icono o cierra la ventana del navegador.

Resize (int width, int height)

Se utiliza para modificar el tamano del applet.

Paint (graphics g)

Se llama para refrescar el area de dibujo del applet.

Update (graphics g)

Se llama cuando se necesita actualizar la pantalla realmente. Se limpia el area y se llama a paint().

Repaint ()

Se utiliza para redibujar la pantalla. El metodo no deberia ser sobrecargado, y puede o no llevar parametros. Si se encuentra sin parametro, se llama internamente al update(). Y si tiene parametros, se dibuja lo que digan.

Getparameter(string param)

Devuelve los valores cargados al applet via la marca applet de html.

Getdocumentbase()

Devuelve la ruta en donde se ha recogido el html que contiene al applet.

Getcodebase()

Indica la ruta en donde se ha cargado el codigo bytecode del applet.

Print(graphics g)

Saca por impresora el mapa de bits del dibujo. Componentes awt El awt proporciona varios componentes utiles para construir una gui para un applet o una aplicacion comun. Entre ellos: controles basicos, manejo de texto, despliegue de graficos e imagenes, toma de decisiones, presentacion de menues y conduccion de dialogos, entre otros. Todos los componentes (excepto los menues) son subclases directas o indirectas de la clase component de awt. Podemos clasificarlos en :

Componentes estandar

Son integramente preelaborados y con un aspecto bien definido. Requieren de poco control para que realicen su tarea correctamente.

Componentes no estandar o personalizados Contenedores

Pueden abarcar y controlar otros componentes colocados en ellos. Ej: scrollpane. 4. El Paradigma Logico 1-introduccion. Una forma de razonar para resolver problemas en matematicas se fundamenta en la logica de primer orden. El conocimiento basico de las matematicas se puede representar en la logica en forma de axiomas, a los cuales se la agregan reglas formales para deducir

cosas verdaderas (teoremas). Los lenguajes que utilizan esta logica se llaman lenguajes declarativos, porque todo lo que tiene que hacer el programador para solucionar un problema es describirlo via axiomas y reglas de deduccion. Este concepto de programacion logica esta ligado historicamente a prolog (programmation en logique), desarrollado por la universidad de marseille en 1972. Prolog es utilizado para el desarrollo de aplicaciones de ia debido a su forma de representar el conocimiento, facilitando las busquedas en bd, la escritura de compiladores, la construccion de sistemas expertos, el procesamiento de lenguaje natural, busqueda de patrones y programacion automatica. 2-logica proposicional. Utiliza una unica regla de inferencia llamada principio de resolucion, mediante la cual la prueba de un teorema se puede hacer automaticamente. Esta regla se aplica sobre las formulas surgidas de la logica de primer orden (lpo) y la demostracion de teoremas mediante esta regla de inferencia se lleva a cabo por la reduccion al absurdo. Esta logica utiliza preposiciones y nexos para expresar verdades o conocimiento. Cuenta con un lenguaje formal medianete el cual es posible representar los predicados, que describen fragmentos de comnocimiento; y cuenta con un conjunto de reglas de inferencia que aplicadas a los predicados permiten derivar en nuevo conocimiento. 3-conceptos elementales. Constantes individuales Son simbolos (nombres) que se usan para referir a un objeto individual fijo. Tambien son llamados sujetos logicos y deben cumplir que:

Todo nombre debe referir a un objeto. Ningun nombre puede referir a mas de un objeto. Un objeto puede tener mas de un nombre.

Simbolos de predicado Denotan una propiedad o una relacion entre objetos. Ej: juan es padre de ana. Los sujetos logicos son llamados los argumentos del predicado. En prolog: es_padre_de(juan,ana) Aridad Numero de constantes individuales que necesita el predicado para formar una oracion. Si la aridad es 1, entoces el predicado es una propiedad.(ej: mujer(ana)). Si la aridad es 2 o mas, el predicado es una relacion entre sus argumentos. Enunciados atomicos Es un enunciado formado por un predicado de aridad n seguido por n-argumentos. Ej: mayor(juan, ana) Enunciados atomicos combinados Son enunciados atomicos simples unidos por conectivos logicos para generar enunciados mas complejos. Los conectivos logicos pueden ser: and, or, not, sientonces (implicacion).

Predicados con consecuente Una conclusion s a partir de las premisas p, q, r,es una demostracion paso a paso que muestra que s debe ser verdadera cuando p, q, r,son todas verdaderas. 4-introduccion a prolog. Prolog es un lenguaje declarativo, no imperativo. Es decir, que cada linea del programa es una declaracion y no una orden. Fue hecho para representar y utilizar el conocimiento que se obtiene sobre determinado dominio. Prolog forma un lenguaje a partir de un alfabeto que contiene solo dos tipos de simbolos:

Simbolos logicos: entre los que se encuentran los simbolos proposicionales (true y false); los simbolos para los conectores logicos and(, coma), or (; punto y coma), not (~) y if(:- dos puntos y coma) y los simbolos auxiliares de escritura ([], (), ,). Simbolos no logicos: agrupados en el conjunto de simbolos constantes; el conjunto de variables individuales; el conjunto de simbolos de relaciones y funciones n-arias.

Calculo de relaciones Prolog trabaja con relaciones. Para definirlas se utilizan las clausulas de horn. Estas constan de dos partes: consecuente (representa el objetivo que se quiere probar o demostrar) y antecedente (la/s condicion/es que se tienen que verificar para que se cumpla el consecuente).

Estructura: conclusion si condicion. La resolucion de estas clausulas se da invocando a un procedimiento que se encarga de comprobar que valor de verdad tiene la condicion y luego asignar el resultado logico de esa evaluacion al objeto que se halla a la izquierda de la implicacion si. Tipos:

Afirmacion s hecho Solo tiene conclusion. Implica que estamos afirmando algo que no necesita ser probado. Implicacion s p, q, r, regla Es un predicado con consecuente. Cuando escribimos esto manifestamos que un objeto puede poseer cierta propiedad o que puede existir cierta relacion con otros objetos , si se cumple con la condicion. Negacion p, q, r, objetivo

Es en realidad la clausula que queremos probar del conjunto de sentencias del programa. Para hacerlo, se niega la clausula que se desea probar y se la agrega a las clausulas del programa. Lugo se aplican las reglas de resolucion y, al derivarse una clausula nula, queda demostrado que la clausula original es verdadera. 5-control en prolog. Por control se entiende la forma en que el lenguaje busca las respuestas. En prolog el control respeta 2 normas:

Orden de metas: escoger la meta del extremo izquierdo. Orden de reglas: seleccionar la primer regla aplicable.

Para cumplir con cada submeta, estas son reemplazadas por todas y cada una de las reglas que la satisfagan. Backtracking Es un mecanismo de busque que utiliza prolog. Para obtener las soluciones a los objetivos, prolog utiliza esta tecnica de borrado que consiste en reemplazar cada submeta por los consecuentes de todas las reglas que la satisfacen. Lo que hace es lo siguiente: primero toma la submeta del extremo izquierdo (p) y la borra, esto quiere decir que la reemplaza por la primer regla aplicable que la satisfaga (p1). Luego toma la siguiente submeta (s) y la reemplaza por la primer regla aplicable (s1); y asi con todas las submetas hasta que se llega a un hecho o se alcanza una contradiccion (exito o fracaso). Si se llega a un exito, prolog devuelve ese resultado. Luego de esto, o si se produce un fracaso, prolog vuelve al paso anterior , es decir recupera la submeta original (s), y la reemplaza por la segunda regla aplicable que la satisfaga (s2). Cuando se terminan todas las reglas de esa submetas, prolog retrocede otro paso (vuelve a p) y comienza a aplicar todo el ciclo ahora con la segunda regla aplicable a p (p2). p p1 s s1 s2 ... sn p2 s s1 s2 ... sn

El corte Prolog devuelve los resultados en forma no determisnista, es decir que devuelve todos los resultados posibles. Esto significa que se tienen en reserva en todo momento los diversos puntos de eleccion que se superaron para unposible retroceso posterior. El corte ( ! ) es una regla que permite suprimir puntos de eleccion, e incluso, hacer un programa totalmente determinista. El borrado de la meta del corte devuelve verdadero y suprime todos los puntos de eleccion que estaban almacenados, impidiendo el backtracking a las submetas anteriores a su aparicion. 6-estructura de un programa en prolog. Domains Aqui se definen los objetos y los tipos de datos correspondientes. Tipos de datos

Symbol: secuencia de caracteres. Pueden estar encerrados o no entre comillas. Si no estan encerrados, deben comenzar con minuscula. Char: acepta cualquier caracter. Debe estar encerrado entre comillas simples. Integer: acepta numeros desde el 32768 al +32767. Real: acepta numeros con signo y decimales. Tambien puede contener numeros en notacion cientifica. String: acepta una secuencia de caracteres encerrados entre comillas dobles. La diferencia con symbol es que la forma de almacenamiento de los string hace que su busqueda sea mas rapida.

Domains persona=symbol Predicates Aqui se definen como seran las relaciones entre los objetos del domain y el valor que se les asignara a las clauses Predicates sabe(persona) trabaja(persona) inteligente(persona) Clauses Aqui se definen las reglas y hechos que evaluara prolog para encontrar las soluciones pedidas en el goal. Clauses sabe(jose) sabe(ana)

inteligente(ana) inteligente(carlos) inteligente(silvia) tiene_lindas_piernas(silvia) trabaja(x) if sabe (x) Goals Es la meta u objetivo a buscar. Existen dos tipos"

Internos: se especifica en el program y este se detiene al encontrar el primer valor que los cumpla. Devuelve solo valores true o false. Externos: se trabaja a traves de la ventana de dialogos buscando resultados en forma interactiva. Devuelve todos los valores que verifiquen el objetivo.

Goal trabaja (x) and write ("la persona que trabaja es: ", x) and n1 7-objetos compuestos. Se usan cuando se requiere mas detalle o informacion. Los hechos con objetos compuestos son de la forma: Predicado(argumento, functor(componente1, componente2)) Un functor es un predicado que actua como argumento de otro predicado. A los argumentos del functor se le dicen componentes. Trabaja(juan, panaderia(sucursal, 12)) Cuando se trabaja con objetos compuestos hay que declarar cada functor y los dominios de todos sus componentes. Ej: Domains lugar = panaderia(nombre_area, numero) taller (nombre_area, numero, categoria) nombre, nombre_area, categoria = symbol numero = integer Predicates trabaja(nombre, lugar) Clauses trabaja(juan, panaderia(sucursal, 12))

trabaja (ricardo, taller (seccion, 97, c)) 8-listas. Es un conjunto de elementos encerrados entre corchetes y separados por comas. [elem1, elem2,..., Elem-n] Tambien se la puede encontrar como: [h, t] en donde h (head)es el primer elemento de la izquierda; y t (tail), el resto de la lista. Asi las maneja prolog a las listas con h y t. Identificacion de la cabeza y la cola En un primer lugar el sistema busca una clausula que identifica el objetivo. Debe coincidir el predicado, el numero de argumentos tiene que ser el mismo y los propios argumentos deben coincidir directamente o a traves de las instanciaciones correctas. Cuando la encuentra, devuelve la clausula con los valores instanciados y luego parte la lista en cabeza y cola. Ej: Empresa ([gerentes, contadores, secretarios]) Agregamos mas detalles... Empresa([ruiz, gomez, rodriguez], [wazowsky, baggins], [dupont, salinas, lione]) Mas detalles...(utilizamos functores) Empresa ( gerentes ([ruiz, gomez, rodriguez]) contadores ([wazowsky, baggins]) secretarios ([dupont, salinas, lione]) ) Para manejar listas es conveniente usar funciones recursivas. Funciones recursivas Si del lado derecho de una clausula aparece un predicado que tambien figura en el lado izquierdo, se dice que la clausula tiene llamado recursivo, es decir se llama a si misma para verificar que se cumple esa misma propiedad como parte de la condicion que define la regla, y sobre algun valor posible de sus variables. Ej: Ruta(ciudad1, ciudad2) :- ruta(ciudad2, ciudad1) 5. El paradigma funcional 1-la programacion funcional en pocas palabras. La programacion funcional tiene como objeto imitar las funciones matematicas lo mas posible. Un lenguaje funcional posee la propiedad matematica de transparencia referencial, lo que significa que una expresion representa siempre el mismo valor. Esto permite razonar sobre la ejecucion de un programa y demostrar matematicamente que es correcto. Las variables de un lenguaje funcional son como las variables en algebra. Inicialmente

representan un valor desconocido que, una vez calculado, ya no cambia. En un programa funcional, el orden de evaluacion de las subexpresiones no afecta al resultado final, por lo tanto las subexpresiones pueden ejecutarse en forma paralela para hacer mas eficiente el programa. Cuando se aplica una funcion, los argumentos que esta toma pueden ser:

Evaluados antes de llamar la funcion (evaluacion estricta). Evaluados dentro e la funcion hasta el ultimo momento y solo si se requieren para calcular el resultado final (evaluacion postergada).

2-conceptos basicos del lenguaje scheme. Es un lenguaje de alto nivel, de proposito general, que soporta operaciones sobre datos estructurados, asi como operaciones sobre datos convencionales. Es aplicado en ia, compiladores, editores de pantalla, paquetes graficos, etc. Esta formado por un pequeno nucleo de formas sintacticas (una biblioteca de procedimientos primitivos) con las que se construyen todas las otras formas. Cuenta con administracion automatica de memoria, facilidades de alto nivel de e/s y un sistema de programacion interactivo. Los programas son de alta transportabilidad y ejecutables en maquinas de poco poder. 3-bases de la programacion funcional. Funciones matematicas Son una correspondencia entre un dominio y un rango. Una definicion de funcion especifica el dominio y rango, de manera implicita o explicita, junto con una expresion que describe lacorrespondencia. Las funciones son aplicadas a un elemento del dominio y devuelven, uno del rango. Las funciones matematicas no producen efectos laterales. Dado un un mismo conjunto de argumentos, una funcion matematica producira siempre el mismo resultado. Calculo lambda Separa la tarea de definir una funcion de la de darle un nombre. Una funcion lambda en una funcion anonima en la que se especifica los parametros y la expresion de correspondencia. Ej: la siguiente expresion representa el cubo de 2: ((x)x.x.x)(2) Funciones de orden mayor En matematica, algunas funciones complejas se definen en base a otras funciones. Se dice que una funcion es de orden mayor si toma alguna funcion como argumento y/o regresa una funcion como resultado. Scheme soporta este tipo de expresiones ya que los procedimientos son objetos de primera clase. Un objeto de primera clase es aquel que cumple con lo siguiente:

Puede ser almacenado en estructuras de datos. Puede ser enviado como argumento a una funcion. Puede ser devuelto como argumento de una funcion.

Leer ms: http://www.monografias.com/trabajos14/paradigma/paradigma.shtml#ixzz2KcQ09dUN

S-ar putea să vă placă și