lunes, 10 de abril de 2017

EJEMPLOS

UNIVERSIDAD NACIONAL DEL ALTIPLANO 



                  ESCUELA PROFESIONAL:

                                                    INGENIERÍA DE SISTEMAS 


                                       TRABAJO DE INVESTIGACIÓN

                         DOCENTE

                                             ALDO HERNAN ZANABRIA GALVEZ

                         ALUMNA:

                                           JHENERY ANYELA CARBAJAL PARI


PROGRAMACION ORIENTADA A OBJETOS


Características principales


Una de las ideas fundamentales del paradigma de programación orientada a objetos es el concepto de objeto como una entidad que engloba datos y funciones.

El enfoque de la POO permite modelar un dominio (problema a programar, un simulador de deportes, por ejemplo) de una forma muy cercana a la realidad. Los objetos del programa simulan los objetos (sustantivos) del dominio (por ejemplo, bicicleta, marchas, carretera, etc.). Y los métodos de los objetos permiten modelar perfectamente las acciones (verbos, por ejemplo cambiar de marcha, pedalear, etc.) que pueden realizar. Entre las características de la POO podemos indicar los siguientes conceptos:

• Objetos (dinámicos/tiempo de ejecución) y clases (estáticas/tiempo de compilación).
• Los objetos agrupan datos (variables de instancia) y funciones (métodos), realizando de esa forma una ocultación de la información.
• Los métodos de los objetos se invocan mediante mensajes.
• Dispatch dinámico: cuando una operación es invocada sobre un objeto, el propio objeto determina qué código se ejecuta. Dos objetos con la misma interfaz pueden tener implementaciones distintas.
• Herencia: las clases se pueden definir utilizando otras clases como plantillas y modificando sus métodos y/o variables de instancia.

Historia de la Programación Orientada a Objetos

Podemos considerar como inicio del paradigma de Programación Orientada a Objetos (Object Oriented Programming) el lenguaje de programación Simula desarrollado por Kristen Nygaard y Ole-Johan Dahl en la mitad de los años 60 en el Centro de Computación Noruego (The Norwegian Computing Center). Simula se definió como un lenguaje de programación orientado a la simulación de procesos, con el que se podían definir distintos tipos de actividades. En este lenguaje aparecen por primera vez los conceptos de clases y objetos.


POLIMORFISMO


Definición


Capacidad de una entidad de referenciar distintos elementos en distintos instantes de tiempo.

El polimorfismo nos permite programar de manera general en lugar de programar de manera específica.

Hay cuatro técnicas, cada una de las cuales permite una forma distinta de reutilización de software, que facilita a su vez el desarrollo rápido, la confianza y la facilidad de uso y mantenimiento.

  • Sobrecarga 
  • Sobreescritura 
  • Variables polimórficas 
  • Genericidad


Tipos de polimorfismo


  • Sobrecarga (Overloading, Polimorfismo ad-hoc): un solo nombre de método y muchas implementaciones distintas.                                                                                                         Las funciones sobrecargadas normalmente se distinguen en tiempo de compilación por tener distintos parámetros de entrada y/o salida.                                                                                                                                                                                                                                            
    Factura::imprimir()                                                                                                     Factura::imprimir(int numCopias)
    ListaCompra::imprimir()
                                                                                                                                                               
  • Sobreescritura (Overriding, Polimorfismo de inclusión): Tipo especial de sobrecarga que ocurre dentro de relaciones de herencia.                                                                                         En este caso la signatura es la misma (refinamiento o reemplazo del método del padre) pero los métodos se encuentran en dos clases distintas relacionadas mediante herencia.                                                                                                                                                                                       Cuenta::abonarInteres()                                                                             CuentaJoven::abonarInteres()                                                                                                                                                                    
  • Variables polimórficas (Polimorfismo de asignación): variable que se declara como de un tipo pero que referencia en realidad un valor de un tipo distinto.                                                   Cuando una variable polimórfica se utiliza como argumento, la función resultante se dice que exhibe un polimorfismo puro.                                                                                                                                                                                                                                                                   Cuenta *pc=new CuentaJoven();                                                                                                                                                             
  •  Genericidad (plantillas o templates): forma de crear herramientas de propósito general (clases, métodos) y especializarlas para situaciones específicas.
           Lista <cliente>
           Lista <articulo> 

           Lista <alumno>
           Lista <habitación>


Implementación interna en C++

Las funciones virtuales son algo menos eficientes que las funciones normales.

  • Cada clase con funciones virtuales dispone de un vector de punteros llamado v_table. Cada puntero corresponde a una función virtual, y apunta a su implementación más conveniente (la de la propia clase o, en caso de no existir, la del ancestro más cercano que la tenga definida) 
  • Cada objeto de la clase tiene un puntero oculto a esa v_table.

Ejemplos

  1. Todos los vehículos "corren" (por decirlo así) pero no todos "corren" igual. Así, por ejemplo, una carcochita viaja a 20 km/h mientras un lamborghini lo hace a más de 100 km/h (por decir algo simple):                                                                                                                                                                                                                                                                                       clase vehiculo { 
    metodo run() 


    clase carcochita => es un vehículo { 
    redefine metodo run() { corre a 20km/h } 


    clase lamborghini => es un vehículo { 
    redefine metodo run() { corre a 150km/h } 


    Y el polimorfismo: 

    vehiculo carrito1, carrito2 /* ambos son vehículos */ 
    carrito1 = new lamborghini 
    carrito2 = new carcochita 
    competir: carrito1.run() vs. carrito2.run() /* ambos llaman a run */                                                                   
  2.    
                                                                                                                           
  3.  Cree un programa para que tenga un método llamado  imprimirInfo  que reciba un objeto que pueda ser de cualquiera de las siguientes clases (Fruta, Manzana y Naranja) , e imprima el nombre y las características del objeto.
    Public class InfoFrutas{
                    Public void imprimirInfo(Fruta fr){
                                   System.out.print(“La fruta se llama: “);
                                   fr.escribeNombre();
                                   fr.escribeCaracteristicas();
                    }
                    Public static void main(String[] args){
                                   //se crean unos cuantos  objetos de la clase Fruta, Manzana y Naranja.
                                   //Ademas se inicializan sus valores.
                                   Fruta frutal = new Fruta(“Mango”);

                                   Naranja fruta5 = new Naranja();
                                   fruta5.cambiaOrigen(“Valencia”);

                                   Naranja fruta6 = new Naranja();
                                   fruta6.cambiaOrigen(“Marruecos”);

                                   //Se imprime su función
    //Se crea un objeto de la clase que imprime Informacion, en este caso es esta propia clase donde está el main.

    InfoFrutas imp = new Infofrutas();
    imp.impimirInfo(fruta6);
    imp.impimirInfo(fruta1);
    imp.impimirInfo(fruta3);
    imp.impimirInfo(fruta4);
    imp.impimirInfo(fruta5);
    imp.impimirInfo(fruta2);
                   
                    }
    }                                                                                                                                                        
  4.                                                                               
         
  5.      
                                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                             
  6.  Todos los animales comen algo, pero algunos comen carne, otros hierbas, otros se comen entre si, etc.

    class animal {
    metodo comer()
    }

    class carnivoro => es un animal {
    redefine metodo comer() { come carne }
    }

    class herbivoro => es un animal {
    redefine metodo comer() { come hierba }
    }

    class omnivoro => es un animal {
    redefine metodo comer() { como de todo }
    }

    animal leon, tortuga
    leon = new carnivoro
    tortuga = new herbivoro
    leon.comer
    toruga.comer

                                                                                                             
  7.  
                                                             
                                                                                                                                                 
  8. Todas las personas tienen un color de piel, pero algunos son negritos, otros amarillos, otros blancos, otros rojos, otros verdes, otros azules, otros color #548762, etc.

    class personita {
    metodo colordepiel()
    }

    class negrito: es una personita {
    redefine metodo colordepiel() { es negrito }
    }

    class indito: es una personita {
    redefine metodo colordepiel() { es un indito }
    }

    personita manuel, juan, pepita, lulu
    lulu = new negrito
    pepita = new indito
    ...
    manuel.colordepiel, etcétera.                                                                                                  

ENCAPSULAMIENTO

El acceso a las responsabilidades de los objetos tiene múltiples aristas. Por una parte el acceso a los métodos
en principio siempre es de la misma forma:


<objeto>.<método>([<valores de los parámetros>])

Situación de análisis

Suponga la existencia de una clase Consola con un método Imprimir que permite mostrar por pantalla
una cadena de caracteres como se muestra a continuación:

Consola
...
Imprimir(cadena mensaje)
...
Consola
...
Imprimir(cadena mensaje)
...
Consola
...
Imprimir(cadena mensaje)
...


Existen tres niveles de acceso para el encapsulamiento, los cuales son:


Público (Public):
Todos pueden acceder a los datos o métodos de una clase que se definen con este nivel, este es el nivel más bajo, esto es lo que tu quieres que la parte externa vea.

Protegido (Protected):
Podemos decir que estás no son de acceso público, solamente son accesibles dentro de su clase y por subclases.

Privado (Private): En este nivel se puede declarar miembros accesibles sólo para la propia clase.



EJEMPLOS

  1. De un televisor, el usuario conoce su apariencia y parte de su funcionamiento. Sólo le importa que funcionen el selector de canales, el video y el audio; no le interesa saber cómo funciona cada una de las partes internas del aparato, ese detalle sólo le interesan al fabricante y al técnico de servicio.   
  2. De un animal no sólo es necesario conocer su apariencia; también se requiere conocer qué sabe hacer y cómo reacciona ante determinadas situaciones.         
  3. Se necesita que cualquiera pueda acceder a el color de un vehículo, entonces:

    Opción a: Declaro entonces COLOR como Privado

    Opción b: Declaro entonces COLOR como Protegido

    Opción c: Declaro entonces COLOR Como Público                                                           ¡Claro!, Sí escogiste la Opción C, te has Ganado un pase al siguiente ejemplo…, de lo contrario vuelve a darle un repaso a los niveles de acceso. 
  4. Se necesita qué color se pueda acceder a través no sólo de vehículo, sí no ahora también de Buses, y como todos sabemos un bus es un tipo de vehículo, entonces también deberá tener acceso a color.

    Opción a: Declaro entonces COLOR como Privado
    Opción b: Declaro entonces COLOR como Protegido
    Opción c: Declaro entonces COLOR Como Público                                                                Correcta Opción b  
                                                  

  5.   Se necesita que color se pueda acceder solamente para vehículo.

    Opción a: Declaro entonces COLOR como Privado

    Opción b: Declaro entonces COLOR como Protegido

    Opción c: Declaro entonces COLOR Como Público                                                               Correcta Opción a                                                                                                                                                 
  6.      
                                                                                                                                                        
  7.  
                                                                                                                                                                    
  8.      
                                                                                                                                                            
                                                                                                                                                                 
  9.    
                                                                                                                                    

OBJETO

Un objeto es una encapsulación de un estado (valores de los datos) y comportamiento (operaciones).
Un objeto es un elemento individual e identificable, ya sea real o abstracto, el cual contiene una serie de datos que lo definen y las descripciones de cómo pueden ser manipulados dichos datos (Armstrong, 1996). Un objeto también es llamado instancia de una clase.

DECLARACIÓN DE UN OBJETO

Uno o varios objetos pueden ser declarados como sigue:

Nombre_de_clase: objeto1, objeto2, ..., objeton

Donde: 
• Nombre_de_clase es el identificador de la clase a la cual pertenecen los objetos declarados.
• objeto¡ (1 <= i <= n) es un identificador válido para un objeto perteneciente a la clase.

CREACIÓN DE UN OBJETO

La creación de un objeto consiste en asignarle al mismo un nuevo espacio en memoria para ser almacenado. En NASPOO esta creación se realiza de forma implícita al declarar un objeto, mediante un método predefinido llamado "crear", el cual no tiene parámetros y retorna una referencia al objeto creado. Tiene la siguiente sintaxis:

func crear():NOmbre_de_clase

Este método debe ser usado explícitamente para asignar memoria a un objeto de tipo Apuntador para asignar memoria al objeto al cual apunta.

INICIALIZACIÓN DE UN OBJETO

La inicialización de un objeto consiste en asignar valores iniciales válidos a los atributos de un objeto después de haber sido creado. Esta acción es realizada por el constructor de la clase a la cual pertenece el objeto. Para inicializar un objeto de una clase es posible utilizar el constructor de la clase ("construir") o el constructor copia de la clase ("copiar"). La sintaxis es la siguiente:

Cuando se invoca al constructor de la clase:

objeto.construir( [A1; A2; ... ; An] ) 
Cuando se invoca al constructor copia de la clase:
 objeto2.copiar(objeto)

Donde:
• objeto es el identificador de un objeto. 
• construir es el identificador por defecto del constructor de la clase a la cual pertenece el objeto. 
• Cada A¡ (1 <= i <=n) es un grupo de parámetros actuales, a1, a2, ... , am, donde aj (1 <= j  <= m) es el identificador del parámetro actual correspondiente al j-ésimo parámetro formal del i-ésimo grupo. 
• objeto2 es el identificador de un objeto de la misma clase que "objeto".


ATRIBUTOS

Los atributos constituyen la estructura interna de los objetos de una clase (Ceballos, 2003); son un conjunto de variables que describen el estado de un objeto (Joyanes, 1996).

DECLARACIÓN DE UN ATRIBUTO

Para declarar uno o varios atributos de una clase, se coloca el nombre de la clase seguido de dos puntos (:) y la lista de identificadores pertenecientes a dicha clase separados por comas, de la siguiente forma:

Nombre_de_clase: atribut01, atribut02 , ... , atributon

Donde: 
• Nombre_de_clase es el nombre de la clase a la cual pertenecen los atributos. 
• Cada atributo¡ (1<= i <=n) es un atributo de la clase Nombre_de_clase.





HERENCIA

La herencia permite que las propiedades de la superclase se propaguen a las subclases en una jerarquía de clases (Poo, Kiong y Swarnalatha, 2008), por lo tanto, es un mecanismo que permite a una clase de objetos compartir la representación y los métodos de otra clase de objetos (LaLonde y Pugh, 1990). Es una forma de reutilización de software, en la cual para crear una nueva clase se absorben los datos y comportamientos de una clase existente y se mejoran con capacidades nuevas (Deitel y Deitel, 2009). Existen dos tipos de herencia: simple y múltiple.

Herencia Simple 
La herencia simple se da cuando una clase se deriva de una sola clase base (Deitel y Deitel, 2009). Para representar la herencia en NASPOO se utiliza la palabra reservada hereda_de luego del identificador de la clase derivada, seguido del identificador de la clase base de la siguiente forma:
clase Subclase hereda_de Superclase II Declaración de los atributos y métodos de la clase fclase
Donde: • Subclase es el identificador de la clase derivada. • Superclase es el identificador de la clase base.

Herencia Múltiple

La herencia múltiple se da cuando una clase derivada hereda de varias clases base (posiblemente no relacionadas) (Deitel y Deitel, 2009). Este tipo de herencia no es soportado por todos los lenguajes de programación orientados a objetos (por ejemplo, Java), sin embargo teóricamente es importante conocer este mecanismo, su uso, ventajas y desventajas.

clase Subclase hereda_de Superclase1, Superclase2, ... , Superclasen II Declaración de los atributos y métodos de la clase fclase
Donde: • Subclase es el identificador de la clase derivada.• 
Superclase¡ (1 <= i <= n), es el identificador de una de las clases base.

EJEMPLOS

  1.  
                                                                                                                                                                                     
  2.      
                                                                                                                                                                     
  3.          
                                                                                                                                                             
                                                                                                                                                                     
  4.    
                                                                                                                                                                      
  5.    
                                                                                                                                                                  
  6.    
                                                                                                                                                                                     
                                                                                                                                                            
  7.  
                                                                                                                                                                                      
  8.  
                                                                                      

CLASE

Una clase es una descripción de la organización y las acciones compartidas por uno o más objetos similares (Armstrong, 1996). De acuerdo a esta definición, una clase está estructurada por la abstracción de las características y funcionalidades relevantes compartidas por un conjunto de objetos que representan parte de un sistema. Las características comunes a todos los objetos se conocen como atributos de la clase, y las funcionalidades se conocen como los métodos de la clase.

La estructura general de una clase es la siguiente:

clase Nombre de clase 
        atributos: 
               // Declaración de los atributos de la clase                                                                                           métodos: 
              // Declaración de los métodos de la clase fFclase

Donde Nombre de clase debe ser un identificador válido para la clase. Un identificador válido debe contar con las siguientes características: 

• Debe ser una única palabra, es decir, no debe contener espacios. 
• Debe estar compuesto únicamente por letras (mayúsculas o minúsculas), números, o los símbolos guión ('-') o piso ('_').
• No puede comenzar por un número o un símbolo. 
• No puede coincidir con ninguna palabra reservada del lenguaje pseudoformal. 

Nótese que además de las características previamente mencionadas, por convención, la primera letra del identificador de una clase se debe colocar en mayúsculas. En NASPOO todos los elementos son objetos derivados de una clase y todas las clases se derivan de una única clase base llamada Objeto.

CLASES PREDEFINIDAS 


Se asume la existencia de una serie de clases predefinidas que corresponden a los tipos de datos definidos previamente en NASPI (Martínez y Rosquete, 2009). Estas clases predefinidas son:

• Primitivas o Elementales: Ordinal, Entero, Real, Lógico, Símbolo.
• Compuestas: Cadena, Apuntador, Arreglo, Enumerado, Intervalo, Archivo_s (archivo de acceso secuencial), Archivo_d (Archivo de acceso directo).

ESTRUCTURA DE UNA CLASE 


Como se había mencionado anteriormente, una clase está formada por atributos y métodos.

EJEMPLOS

  1.  
                                                                                                                                                                       
  2.    
                                                                                                                                                                       
  3.    
                                                                                                                                                                     
  4.        
                                                                                                                                                                  
  5.    
                                                                                                                                                                                      
                                                                                        

METODO

Los objetos se comunican unos con otros mediante el envío de mensajes, los cuales son llamadas a métodos, hechas por un objeto emisor hacia un objeto receptor. Un objeto responde a un mensaje mediante la ejecución de un método (Poo, Kiong y Swarnalatha, 2008). 

Según lo expresado anteriormente, un método es una colección de sentencias que ejecutan una tarea específica, se implementa en una clase y determina cómo debe actuar un objeto cuando recibe un mensaje vinculado con ese método (Ceballos, 2003).


DEFINICIÓN DE UN MÉTODO

Para definir un método, se aplica la misma sintaxis definida para NASPI (Martínez y Rosquete, 2009). La definición de una función tiene la siguiente sintaxis:

[estático | const | virtual] func metodo ([F1; ... ; Fn]) : Nombre_de_clase
[// Declaraciones locales] 
inicio 
     // Instrucciones 
     retornar(expr) 
ffunc

La definición de un procedimiento tiene la siguiente sintaxis:

[estático | const | virtual] proc metodo ([F1; ... ; Fn])
[11 Declaraciones locales] 
inicio 
      //Instrucciones
fproc

Donde: 
• método es el identificador de un método (función o procedimiento). 
• Cada F¡ (1 :::; i :::; n) es un grupo de parámetros formales definidos de la siguiente forma: {val I ref} Nombre_de_Clase¡: P1, P2, ... , Pm, donde: 
• val o ref indican si el paso de parámetros se realiza por valor o por referencia, respectivamente. 
• Nombre_de_clase¡ es la clase de los parámetros formales que forman el i-ésimo grupo. 
• Pi (1 :::; j :::; m) es el identificador del j-ésimo parámetro formal del i-ésimo grupo. Además, en el caso de una función: 
• Nombre_de_clase es la clase del objeto que retorna la función. 
• expr es el valor de retorno de la función. El valor resultante de expr debe pertenecer a la clase Nombre de clase.


BIBLIOGRAFIA