Está en la página 1de 62

Programacin Orientada a Objeto con Omnis Studio

Puntos a tratar
Qu es orientacin a objeto? Los principios de la orientacin a objeto Orientacin a objeto en Omnis Studio Uso de la herencia y las subclases Invocacin de mtodos y mensajes Uso de Sub-ventanas Uso de la clase objeto

Programacin Estructurada
Acercamiento de arriba hacia abajo Los datos y las funciones se guardan por separado Fragmentacin hacia abajo de los componentes del programa hasta el lmite Mejora en la calidad del software Si el diseo es incorrecto despus de haber comenzado a programar, tendremos que reestructurar todo desde el principio

Qu es Orientacin a Objeto?
Aplicacin basada en objetos de software stos simulan objetos del mundo real Es un modo diferente de construir sistemas Supone un cambio radical del paradigma Es una tecnologa Es una nueva metodologa

Un poco historia de la OO
A finales de los aos 60 se inventa un lenguaje llamado Simula, de Ole-Johan-Johan Dahl y Kristen Nygaard del centro de cmputo noruego en Oslo Al principio de los 70, SmallTalk de Alan Kay en Xerox PARC, fomentaron la idea de usar objetos de software simulando objetos del mundo real y usarlos en el desarrollo de nuevas aplicaciones A mediados de los aos 80, aparecen otros lenguajes de programacin OO, como C++ y Eiffel A ltimos de los 90, hacen su aparicin Java para la Web y Omnis Studio

Objetos
Son "cajas negras" que se comunican entre si, para realizar tareas Combinan el estado (datos) y el comportamiento (procedimientos o mtodos) en una sola entidad Esto acelera y mejora el desarrollo de nuevos programas.
Aporta coherencia, facilita su mantenimiento y su reutilizacin

Principios de la orientacin a objeto

Abstraccin Clases (Class) Encapsulado Casos (Instance) Mensajera Polimorfismo Herencias

Abstraccin
Es la capacidad de un lenguaje para tomar un concepto y crear una representacin abstrada del mismo dentro de un programa Implica identificar o abstraer las caractersticas comunes de los objetos y procedimientos para despus combinarlos en una sola entidad que pueda representarlos Por ejemplo, un programador utilizara la abstraccin para observar que dos funciones casi realizan la misma tarea y se puede combinar en una sola funcin Cada objeto en el sistema es un "actor" que puede realizar un trabajo, informar, cambiar su estado y "comunicarse" con otros objetos del sistema Por ejemplo, el objeto alumno, es una representacin abstrada de un alumno del mundo real

Clases (Class)
Se puede pensar en una clase como una fbrica que produce un objeto de una clase determinada Un objeto es definido por su clase y determina todo lo que es Proporciona las especificaciones que marcaran el comportamiento y los atributos de los objetos Es una abstraccin de una entidad del mundo real

Caso (Instance)
Los objetos son Casos individuales de una clase Cada objeto posee un identificador nico Por ejemplo, se puede crear un objeto llamado Rintintn de la clase perro Los lenguajes orientados a objeto cuentan con la capacidad, (generalmente llamada factory), para "fabricar" objetos de una clase determinada Es posible crear ms de un objeto de la clase perro, y llamarlos Pluto, Tintn, etc. Los Casos se comunican entre s mediante mensajes

Encapsulado
Podemos pensar en un objeto como algo que posee un interfaz externo y un medio interno que permanece oculto al mundo exterior Este procedimiento de ocultar la informacin es lo que se conoce como encapsulado Los elementos que oculta son:
Datos (variables) y procedimientos o mtodos privados

Los datos as ocultados estn protegidos Los elementos que no se ocultan son:
Procedimientos o mtodos pblicos

Todo el contenido pueden ser modificado sin que afecte al mundo exterior

Mensajera
Los casos se comunican entre si mediante mensajes Los mensajes vlidos son definidos en la clase Cuando un caso recibe mensajes que puede entender, realiza una operacin Por ejemplo, la clase perro define lo que este va a ser, de modo que los objetos de perro entiendan, y puedan actuar ante mensajes como "hueso", "trae", "gira", etc. Un mensaje se compone de:
Nombre de la operacin (nombre del mtodo) y de cualquier informacin adicional que requiera la operacin (parmetros)

Una operacin puede devolver datos:


Constituye un modo de tener acceso a datos encapsulados

Lo ltimo la direccin
Los lenguajes tradicionales utilizan direccionamiento esttico para unir una referencia a una variable o a un procedimiento, determinados durante la fase de diseo Con el direccionamiento dinmico se deja la decisin ltima en cuanto a que variable o mtodo utilizar al tiempo de la ejecucin A menudo resulta imposible determinar durante la fase de diseo, exactamente qu variable o mtodo ser necesario

Polimorfismo
Cada clase de objeto que responde a un mensaje tiene su propio mtodo con un nombre que puede no ser nico Cuando el mtodo es invocado cada objeto responde con el suyo propio El objeto invocado no necesita saber de qu clase es para recibir el mensaje

Herencias
Es la capacidad de definir una clase como perteneciente a otra Es jerrquica Una subclase hereda caractersticas de la clase superior A menudo el tipo de clase determina el tipo de su adyacente ya sea subclase o clase superior La relacin entre la subclase y la clase superior se referencia como: "es una clase de" Por ejemplo, un tigre es una clase de gato Las jerarquas pueden ser expresadas de diferentes modos

Software, Clase y Herencia


Cmo se prepara una clase para que pueda responder a diversos mensajes? Que puedo hacer para crear una nueva clase, similar a otra pero agregando algo ms? Tengo que re-escribir la clase entera? La herencia proporciona a una manera simple y elegante de reutilizar cdigo y de modelar el mundo real de manera agradable Es posible crear mtodos adicionales para ampliar las capacidades de una clase

Qu se hereda?
Atributos visuales Ciertas variables Interfaz externo
Mtodos pblicos

Propiedades y mtodos que se otorgan (Overriding)


Crear subclases para especializar Combinar partes de clases tomadas de una base comn "Overriding" es el trmino usado en los lenguajes de OO para otorgar un mtodo especializando su uso Las propiedades o el mtodo en una subclase cambian su herencia

Herencia simple
En una herencia simple, la subclase nio puede heredar solamente una clase superior padre Cualquier clase superior puede tener mltiples subclases Es un mecanismo claro y sencillo

Herencia mltiple
Ocurre cuando una clase hereda ms de una clase superior "padre" Qu dificultades se plantean? A. Se producen paradojas con la herencia, las propiedades y mtodos, e.g.
2 clases B y C heredan de la clase A y hay otra clase D que est heredando A, B y C Ahora, si la clase A tiene un mtodo "fred()" tambin B y C, pero ambas heredan la clase D que a su vez hereda de A, B y C Qu mtodo "fred()" se ejecutar? Si D es llamado, que "fred" se ejecutar, es decir el de a, el de b o el de c?

Asociar y Empacar
Una alternativa al problema de la herencia jerrquica es la de empacar componentes No se produce la herencia (un motor no es una clase especial de coche) Los objetos asociados son empacados y ahora todos ellos "trabajan" como una unidad Los paquetes son como las cestas de la compra que pueden contener muchas y diversas clases de objetos Los objetos en un paquete se juntan libremente, pero cada objeto resulta til por si solo

Cundo un lenguaje es orientado a objeto?


En 1987 Peter Wenger propuso una definicin Para que un lenguaje de programacin sea orientado a objeto se requiere lo siguiente:
Significa que se puedan confeccionar fcilmente objetos encapsulados o empacados en el programa Significa que cada objeto pertenece a o es creado de una clase determinada Significa que las clases se pueden disponer en modo jerrquico con clases superiores y subclases

Orientacin a objeto en Omnis Studio


Ahora vamos a ver las caractersticas de Omnis Studio que permiten a los desarrolladores construir aplicaciones orientadas objeto
Clases (Classes) Herencias (Inheritance) Casos (Instances) Mensajes (Messaging)

Clases en Omnis Studio


Clases GUI (Interface con el usuario)
Window*, menu*, toolbar*, remote form*, report*

Clases de datos
Schema, query, table*, file, search

Clases, lgicamente no visibles


Object*, task*, remote task*, code

* OO Clase que requieren ser instaladas Schema y query son creadas a partir de clases table

Qu hereda una subclase?


Omnis Studio slo soporta herencia simple Mtodos o procedimientos pblicos Variables de clase (Class variables) Variables asociadas a un caso (Instance variables) Propiedades (Properties) Objetos subordinados
Campos en una Window Class Herramientas en una Toolbar Class Lneas en un Menu Class

Mtodos pblicos y privados


Los mtodos pblicos se distinguen por llevar el prefijo $ Cualquier otro mtodo es privado Para invocar un mtodo privado se utiliza el comando Do e. g.
Do method fred(p1,p2,p3) los parmetros se pasan entre parntesis (No se trata de una llamada basada en mensaje)

No se puede usar el comando Do para llamar a mtodos pblicos, si estn en la misma clase Los mtodos pblicos se deben invocar usando mensajes

Disponiendo una clase


Usando un comando 4GL
Open window instance myWind/Cen (p1,p2)

Usando un comando de referencia


Do $windows.myWind.$open(*,kWindowCenter,p1,p2)

Se hace referencia a una clase por su nombre El 1er parmetro es el nombre del caso, un * asignar uno por defecto El mtodo $construct ser invocado en el momento que el caso ocurre o se dispone

Otros ejemplos en que se hace disponible una clase


Cuando desde una opcin de un men se despliega un sub-men Cuando un men o barra de mens en una ventana se muestran al mismo tiempo que la ventana que los contiene Cuando se despliega un men contextual como consecuencia de pulsar botn derecho sobre un objeto en la ventana En casos que son informes: Usando un comando 4GL Set report name myRep Prepare for print {* (#1,#2)} Usando un comando de referencia Do $reports.myRep.$open(*,p1,p2) El siguiente comando tambin hace disponible un informe pero acta de manera diferente Print report {* (p1,p2)}

Grupos de Objetos
Existen comandos para referirse al conjunto de objetos de una clase en uso (hecha disponible) Se identifica un slo miembro para cada grupo Casos de Ventanas en uso o abiertas - $iwindows Objetos de Mtodos o tareas - $itasks Name, es lo mismo que Library Name Mens instalados - $imenus Slo mens instalados o situados en la barra de mens Barras de herramientas instaladas - $itoolbars Slo herramientas instaladas o la barra de herramientas de Omnis Las ventanas en uso tambin pueden contener estos grupos de objetos instalados en su interior $iwindows.myWind.$menus.myMenu $iwindows.myWind.$toolbars.myToolbar

Removiendo un caso
Usando un comando 4GL
Close window instance myWind

Usando un comando de referencia o notacin


Do $iwindows.myWind.$close()

Se hace referencia a los casos por nombre El mtodo $destruct es automticamente invocado cuando el caso desaparece excepto si se trata de Tablas y Objetos

Enviando mensajes
El comando "Do" permite el envo de mensajes a objetos Slo se puede enviar un mensaje a un caso Debe incluirse una referencia que identifique al objeto e.g.
Do $iwindows.myWind.$fred(p1,p2,p3)

Es como la direccin en un correo postal Los parmetros se indican entre parntesis $iwindows.myWind constituye la referencia

No es posible enviar un mensaje a un men contextual, puesto que no es referenciable por este medio

Enviando el mismo mensaje hacia muchos objetos


$sendall permite el envo de un mismo mensaje al conjunto de objetos referenciados e.g.
Do $iwindows.$sendall($ref.$close())

Esta referencia afectar a todos los objetos del grupo $ref ir alternando la referencia que identifique a cada objeto

Este mtodo permite un segundo parmetro booleano opcional, con el que podr ser ms selectivo
Do $iwindows.$sendall($ref.$close(),$ref.$class() .$name=myClass

Este mensaje ser enviado nicamente a los objetos que cumplan la condicin expresada en el segundo parmetro (kTrue)

Creando una clase superior


Identificar caractersticas y comportamientos anlogos Crear una abstraccin con los contenidos comunes Obtener la base para una clase superior

Creando una subclase


Pulse botn-derecho sobre la clase superior en la ventana de navegacin Seleccione Make Subclass Asgnele un nombre Vea que la clase superior, aparece reseada en la ventana de navegacin

Creando una subclase especializada


Aada las caractersticas que hacen de esta una clase especializada para la clase superior Aada campos Aada propiedades y mtodos

Adquiriendo propiedades

Puede otorgar (override) o adquirir (overload) propiedades heredadas en la ventana Property Manager Las propiedades heredadas aparecen en azul Seleccione un objeto en la ventana de edicin Pulse botn-derecho sobre la propiedad requerida y luego Overload Property Ahora puede alterar su valor como habitualmente lo hace

Lo que no se puede adquirir


No se pueden otorgar las propiedades de los objetos, contenidos en una clase heredada Por ejemplo las propiedades de posicin (top, left, height y width) o los botones no pueden ser adquiridos Nota: Puede usar el atributo de campos flotantes para alterar su posicin de forma automtica, cuando una ventana de subclase cambia de tamao. Esto puede hacerse con un procedimiento de referencia incluido en el mtodo $construct

Propiedades heredadas
Cuando una propiedad ha sido previamente adquirida, (overloaded) podr ser heredada de una clase superior usando la ventana Property Manager Las propiedades que se muestran en negro, no pueden ser heredadas Seleccione un objeto en la ventana de edicin Pulse botn-derecho sobre la propiedad y seleccione Inherit Property El valor heredado se mostrar en azul a la derecha

La propiedad clase superior


Un mtodo alternativo para establecer una subclase es mediante la propiedad $superclass Pulse botn-derecho sobre una clase en el navegador y seleccione Properties Seleccione ahora la clase superior que desee en la lista desplegable Esta tcnica no es muy recomendable, ya que las propiedades no se heredan de forma automtica (deber

Mtodos heredados
Slo mtodos pblicos (prefijo $) pueden ser heredados Los mtodos heredados se muestran siempre en azul Un mtodo se ejecuta al ser invocado por un mensaje

Asegrese de que los mtodos han sido abstrados


Los mtodos en la clase superior deben ser abstrados El cdigo que se refiera a objetos especficos debe ser quitado y llevado a una subclase y debe ser otorgado overridden en la subclase Tambin puede aadir variables al caso (instance) en la clase superior, sern valores especficos que comunicar a la subclase

Sub-rutinas
En ocasiones se necesita invocar a un mtodo de una subclase durante la ejecucin de otro en una clase superior Cree un mtodo pblico simulado que no contenga ningn cdigo, defnalo en la clase superior e invquelo desde otra clase superior Se requiere haber otorgado (Override) el mtodo en la subclase

Otorgando mtodos
Se puede otorgar (override) un mtodo heredado en una subclase Pulse botn-derecho sobre el mtodo elegido en la ventana Method Editor y seleccione Override Method Introduzca el nuevo cdigo como lo hace habitualmente El mtodo es ejecutado al recibir un mensaje

Se puede invocar un mtodo de clase superior otorgado (overridden) mediante el comando:


Do inherited
Los parmetros que se obtienen son los habituales en ambos mtodos Con esta tcnica no se puede pasar parmetros Sin embargo ambos puede usar Campos de Referencia como parmetros para referirse a los mismos datos

Invocando mtodos de clase superior

Si se necesita otorgar parmetros para enviarlos a una clase superior puede usar el siguiente mtodo:
Do $inherited.$myMethod(p7,p8,p9)

Herencia de mtodos
Un mtodo otorgado en una subclase puede ser heredado Pulse botn-derecho sobre el mtodo en la ventana Method Editor y seleccione Inherit Method Observe que al hacer esto desaparece el mtodo de la subclase y se pierden todas las lneas de cdigo

Variables de referencia dinmicas y estticas


Referencias estticas
Calculate iCust as 'Fred' Calculate myVar as iCust
Cambia el modo en se referencia a iCust (tokenized)

Referencias dinmicas
Calculate $cinst.iCust as 'Jill' Calculate myVar as $cinst.iCust
La referencia a iCust se crea en el momento de la ejecucin

La diferencia es que en el segundo caso, la variable iCust, puede no existir lo que no supondr un error sintctico, en ese caso la variable myVar tendra un valor Null

Otorgando variables
Las variables heredadas se muestran en azul Pulse botn-derecho sobre la variable en la ventana Method Editor y seleccione Override Variable Slo puede hacerse con variables de clase y de caso (Instance) Evite copiar y pegar campos y lneas de cdigo, pueden otorgar automticamente variables
- Para evitar esto puede pegar la lnea sobre una comentada y luego descomentarla

Acceso a variables otorgadas


Las variables otorgadas pueden ser utilizadas Para acceder a una variable de clase superior, desde una subclase use el siguiente mtodo: $inherited.myVar
- Observe que tendr acceso siempre a la variable de nivel inmediato superior en el rbol de herencia

No es posible acceder a una variable de subclase desde una clase superior pero puede pasar valores a la misma mediante el uso de parmetros

Herencia de variables
Una variable otorgada en una subclase puede ser heredada Pulse botn-derecho sobre la variable en la ventana Method Editor y seleccione Inherit Variable La variable es eliminada de la subclase y todas las referencias a la misma se vern afectadas (se cambiaran por #???)

Orden de la herencia
Los campos heredados aparecen en primer lugar (en orden de tabulacin) El orden puede ser cambiado usando la propiedad $inheritedorder Se requiere cambiar el orden para cada nivel heredado

Sub-ventanas
Una sub-ventana es una agregacin Es una clase "ventana" y puede contener los objetos habituales como campos, fondo, etc. Puede contener muchos campos o slo alguno Una sub-ventana puede ser utilizada en un nmero indeterminado de clases "ventana" Es un mecanismo alternativo al uso de la herencia Es la versin Omnis Studio de ActiveX

Creando una sub-ventana


Cree una ventana normal Site un campo de modo que llene la ventana Cambie la propiedad $issubwindow a kTrue Nota: En sub-ventanas que usan meta-campos, use la propiedad de flotante en los objetos, para asegurarse de que se ajustarn automticamente

La interfaz de una sub-ventana


Una sub-ventana necesita comunicarse con su ventana padre y viceversa Necesitamos construir un interfaz con mtodos pblicos Acceder a un mtodo localizado en un campo de la sub-ventana dentro de la ventana padre - $cfield referencia al caso sub-ventana Acceder a un mtodo localizado en un caso sub-ventana - $cwind referencia al caso ventana padre - $cinst referencia al caso sub-ventana

Usando una sub-ventana


Seleccione el icono de sub-ventana en la herramienta "Component Store" Arrastre el icono sub-ventana y depostelo en la ventana elegida Ponga cualquier llamada que requiera la interfaz desde la ventana padre a la sub-ventana

Iniciando una sub-ventana


Inicio de una sub-ventana invocando a un mtodo pblico (empacado en un campo), desde el mtodo $construct de la ventana padre Se pasan los datos iniciales como parmetros Estos datos pueden ser usados para indicar que se visualizar dentro de la sub-ventana as como otros aspectos como por ejemplo, el color de campos, los que estarn activados o desactivados, etc.

Mtodo Callback en una sub-ventana


Cuando un evento ocurre dentro de un caso sub-ventana, no es accesible desde el gestor de eventos de la ventana padre Es entonces cuando necesitamos implementar un "callback" sobre la ventana padre Cuando la sub-ventana es iniciada, se pasa el path para indicar el mtodo ("Callback") que deber ser ejecutado cada vez que se produzca un evento en la sub-ventana El "path" al mtodo de "callback" es ocultado en una variable de caso (instance) por el mtodo $construct El mtodo de "Callback" puede recibir datos desde la sub-ventana mediante el uso de parmetros

Combinando sub-ventanas
Las sub-ventanas se pueden combinar con otros campos sobre la misma ventana Otros objetos se comunican con la subventana va interfaz pblico La sub-ventana puede comunicarse con otros objetos va "callback"

Clases Tabla
Dispuestas como variables de la fila (row) o de la lista (list) - Los casos tabla (table), fila (row) o lista (list) son equivalentes El caso es creado cuando se define la "row" o la lista (list) Do myRow.$definefromsqlclass(myTab,,p1,p2 - Definido desde una clase "table", no de "schema" o "query" - Se pueden pasar parmetros al mtodo $construct, note ',,' Incorpora una interface de datos va "row" o "list" Los mtodos proporcionan una abstraccin SQL Permite separar la lgica de los datos del entorno de usuario Mtodos pblicos aplicados a tablas, disponibles va "list" o "row" Do myRow.$select(con(where myCol = ,myRow.myCol,)) El mtodo de tabla $cinst referencia a un caso y a una variable "row" o "list" El caso desaparece cuando la variable se - El mtodo $destruct no se ejecuta de modo automtico

Clases objeto
Posee caractersticas similares a los casos de clase Tabla, pero sin interface de datos (variables "list" o "row") Disponibles como variables de tipo objeto Pueden ser definidos como estticos o como dinmicos El caso desaparece cuando la variable es limpiada
- El mtodo $destruct no se ejecuta de modo automtico

Casos objeto
Definicin esttica
- Defina una variable - Desgnela como tipo objeto y ponga como sub-tipo una clase objeto - El mtodo $construct se ejecutar la primera vez que el objeto sea invocado

Definicin dinmica
- Defina una variable - Desgnela como tipo objeto y deje el sub-tipo en blanco Do $clib.$objects.myObj.$new() Returns myVar - El mtodo $new ejerce la misma funcin que el $open - El mtodo $construct es ejecutado, cuando se crea el caso mediante $new

Guardando objetos en una base de datos


Puesto que un objeto es un tipo de dato estndar, todos los casos objeto pueden ser almacenados en una base de datos No es posible identificar el contenido especfico de un caso objeto, sin antes hacer una lectura de todo su contenido Por defecto:
- Los objetos de datos (variables de caso o instance) son almacenados en una base de datos - Los mtodos son dispuestos por la clase objeto y pueden ser modificados en ese momento

Guardar mtodos en la base de datos


- Ponga la propiedad $selfcontained del la clase objeto a kTrue - Cree una copia espejo de los mtodos de la clase - Los objetos guardados ocupan ms espacio

Sumario
Aplicacin basada en objetos de software Es un modo diferente de construir sistemas Es un cambio radical del paradigma Es una tecnologa Ms importante, es una metodologa Beneficios: - Re-utilizacin - Consistencia - Mantenimiento - RAD (una clase superior en el desarrollo de sistemas)

También podría gustarte