Вы находитесь на странице: 1из 53

[ estándares de desarrollo ]

ESTÁNDARES DE PSEUDOCÓDIGO ORIENTADO A OBJETOS Y EVENTOS

oLoop

oLoop 1.2 Lenguaje de Pseudocódigo Orientado a Objetos y a Eventos

Elaborado por Ángel Augusto Velásquez Núñez

Contenido

Introducción

1

Objetivos

1

Definición del Lenguaje de Pseudocódigo

2

¿Pseudocódigo orientado a objetos?

2

Expresiones

3

Sintaxis de las expresiones

3

Expresiones simples

4

Operadores

5

Sentencias

6

Sentencias simples

6

Sentencias de asignación de Valores

6

Sentencias de mensaje

6

Sentencias de entrada/salida

7

Sentencias compuestas

7

Sentencias de decisión o condicionales

7

Iteraciones

8

Clases y Objetos

10

Declarar Clases

10

Declaración de Instancias de Clases (Objetos)

11

Declaración de definición de Métodos

11

Declaración de propiedades

14

Bibliotecas de clases

15

Polimorfismo

15

Comentarios

17

Jerarquía de Clases predefinidas

18

La clases Componentes

19

Atributos comunes (CComponente)

19

Visualizar y editar texto

19

Permitir que el usuario haga elecciones simples

20

Controles especializados

23

Manejo de Listas

24

Fichas (CFicha)

25

La clase CFormulario

26

La clase CAplicación

26

Tratamiento de Eventos

29

Implantar eventos estándar

29

Excepciones

31

Protección de Sentencias

31

Tratamiento de Excepciones

31

Generación manual de Excepciones

33

Excepciones predefinidas

33

Objetos Especiales

35

Arreglos

35

Apuntadores

36

Estructuras

37

Enumeraciones

37

Interfaces

38

Archivos

39

Ejemplos de uso de oLoop

40

Declaración de Clases y Métodos

40

Implantación de Métodos

41

Herencia y Extensión de Clases

42

Bibliografía

46

Sugerencias para la escritura de Pseudocódigo

47

Indentación

47

Idioma de Trabajo

47

Notación de Identificadores

47

Índice de Tablas

Tabla .1. Precedencia de operadores

3

Tabla .2. Atributos comunes para los componentes en general

19

Tabla .3. Atributos de CEtiqueta

19

Tabla .4. Atributos de CEdición

20

Tabla .5. Atributos de CCasilla

21

Tabla

.6.

Atributos

de

CBotónRadio

22

Tabla

.7.

Atributos

de

CBotónAcción

22

Tabla

.8.

Atributos

de

CBarraDesp

23

Tabla .9. Atributos de Cficha

25

Tabla .10. Eventos estándar comunes a las Clases componentes

29

Tabla .11. Eventos de las Clases componentes estándar

30

Tabla .12. Eventos clave para las Clases componentes

30

Tabla

.13.

Clases derivadas de CExcepción

34

Tabla .14. Ejemplo de uso de Prefijos

48

Índice de Ilustraciones

Ilustración .1. Sintaxis de factor

 

3

Ilustración .2. Sintaxis de valor constante sin signo

3

Ilustración .3. Sintaxis de término

4

Ilustración .4. Sintaxis de expresión simple

4

Ilustración .5. Sintaxis de expresión

4

Ilustración .6. Sintaxis de factor de dirección

5

Ilustración .7. Sintaxis de sentencia

6

Ilustración

.8.

Sintaxis

de sentencia

simple

6

Ilustración .9. Sintaxis de sentencia de asignación

6

Ilustración .10. Sintaxis de sentencia compuesta

7

Ilustración .11. Sintaxis de sentencia

7

Ilustración

.12. Sintaxis de sentencia Si

 

7

Ilustración .13. Sintaxis de sentencia Caso

8

Ilustración .14. Sintaxis de sentencia repetitiva o iteración

8

Ilustración .15. Sintaxis de sentencia Mientras

8

Ilustración .16. Sintaxis de sentencia repetir

8

Ilustración

.17. Sintaxis de sentencia Para

9

Ilustración .18. Sintaxis de declaración de Clase

10

Ilustración .19. Sintaxis de declaración de Objeto

11

Ilustración .20. Sintaxis de declaración de definición de Método

11

Ilustración .21. Sintaxis de Lista formal de Parámetros

12

Ilustración .22. Sintaxis de Envío de Mensaje

14

Ilustración .23. Ejemplo de Etiqueta

19

Ilustración .24. Ejemplo de Caja de edición

20

Ilustración .25. Ejemplo de Casilla de verificación

21

Ilustración .26. Ejemplos de Botón de radio

21

Ilustración .27. Ejemplos de Botón de acción

22

Ilustración .28. Ejemplo de Barra de desplazamiento

23

Ilustración .29. Ejemplo de Barra de dial

24

Ilustración .30. Ejemplo de Control Arriba Abajo

24

Ilustración .31. Ejemplo de Lista desplegable

24

Ilustración .32. Ejemplo de Ficha

25

Ilustración .33. Ejemplo de un Formulario en blanco

26

Introducción

Objetivos

Este documento tiene por finalidad que establecer los estándares de programación y nomenclatura de objetos de programación en pseudocódigo a utilizar en las sesiones de clase y los proyectos de desarrollo de software.

Definición del Lenguaje de Pseudocódigo

¿Pseudocódigo orientado a objetos?

El pseudocódigo se presta para un buen diseño descendente. En el mundo del desarrollo orientado a objetos, diseño descendente significa describir cómo se comportan los objetos y luego utilizar la descripción para identificarlos más detalladamente o identificar objetos subordinados. En cada nivel de abstracción, los objetos se van detallando más hasta que el diseño alcanza los objetos existentes (ya sea en bibliotecas o predefinidos en el lenguaje mismo), o bien el comportamiento descrito no implica la existencia de nuevos objetos.

El lenguaje de pseudocódigo que vamos a especificar contiene las herramientas que permiten especificar el flujo del control de un algoritmo, la creación y modificación de la información y la relación entre los diferentes objetos que forman el universo de la solución. Para dar un enfoque más claro optamos por subrayar las palabras reservadas del lenguaje.

Expresiones

Las expresiones están compuestas por operadores y operandos. La mayoría de operadores son binarios, es decir utilizan dos operandos. Los demás son unarios y necesitan sólo un operando. Los operadores binarios utilizan la forma algebraica que conocemos (por ejemplo, A + B). Los operadores unarios siempre preceden a sus operandos (por ejemplo, -B).

En expresiones más complejas, las reglas de precedencia de operadores aclaran el orden en que se realizan las operaciones.

Operadores @, No *, /, div, mod, Y +, -, O =, <>, <, >, <=, >=

Precedencia

Categorías

primera (más alta)

operadores unarios

segunda

operadores de multiplicación/división

tercera

operadores de suma/resta

cuarta (última)

operadores relacionales

Tabla .1. Precedencia de operadores.

Para la precedencia hay tres reglas básicas:

Un operando entre dos operadores de precedencia diferente actúa primero con el operando de mayor precedencia.

Un operando entre dos operadores iguales actúa primero con el de la izquierda.

Las expresiones entre paréntesis se evalúan primero para ser tratadas como un sólo operando.

Las operaciones de igual precedencia se efectúan normalmente de izquierda a derecha.

A

nivel de pseudocódigo esto es bastante simple, pero en un lenguaje de programación,

el

compilador podría reordenar los operandos para optimizar el código.

Sintaxis de las expresiones

Las reglas de precedencia se basan en la sintaxis de las expresiones, que se componen de factores, términos y expresiones simples. La sintaxis de un factor es:

Factor --> Identificador | Constante | (Expresión) | no Factor | LlamadaMétodo | FactorDirección Identificador --> ReferenciaArreglo |ReferenciaApuntador | ReferenciaVariable ReferenciaVariable --> Letra { Letra | Dígito | _ } Constante --> Dígito { Dígito } | ‘CadenaCaracteres’

Ilustración .1. Sintaxis de factor.

Una llamada a método activa un método y denota el valor que éste retorna. Esto lo veremos en la sección de llamada a métodos.

Un valor constante sin signo tiene la siguiente sintaxis:

ConstanteSinSigno --> Constante | ‘CadenaCaracteres’ Ilustración .2. Sintaxis de valor constante sin signo.

Un factor de dirección calcula la dirección de una variable o método. Lo ampliaremos en

la sección de apuntadores.

Aquí presentamos algunos ejemplos de factores:

X

{referencia a una variable}

@X

{apuntador a una variable}

15

{constante}

(X

+ T + Z)

{subexpresión}

Seno(X/2)

{llamada a un método}

No Fin

{negación de un valor lógico o booleano}

Los términos aplican los operadores de multiplicación y división a los factores:

Término --> Factor [ OperadorFactor Factor] OperadorFactor --> * | / | div | mod | y

Ilustración .3. Sintaxis de término.

Aquí algunos ejemplos de términos:

X

* Z

Z

/ (1 - Z)

(X

<= A) Y (X < Z)

Expresiones simples

Las expresiones simples aplican los operadores de suma/resta a los términos:

ExpresiónSimple --> [+ | -] Término [ OperadorTérmino Término] OperadorTérmino --> + | - | O

Ilustración .4. Sintaxis de expresión simple.

Como ejemplos de expresiones simples podemos mencionar:

X + Z

-X

Valor1 + Valor2

I

* J +

1

Una expresión aplica los operadores relacionales a las expresiones simples:

Expresión --> ExpresiónSimple [OperadorRelacional ExpresiónSimple] OperadorRelacional --> = | <> | < | > | <= | >=

Ilustración .5. Sintaxis de expresión

Aquí algunos ejemplos de expresiones:

X = 1.5

Fin <> Error

(I < J) = (J < K)

Operadores

A nivel de pseudocódigo, podemos dividir a los operadores en operadores numéricos,

lógicos, de texto, apuntadores y relacionales.

Los operadores numéricos son muy conocidos por nosotros (+, -, *, /, div, mod); de éstos, el operador + también se usa para concatenar textos (cadenas). Los operadores numéricos + y - también pueden ser operadores unarios. Los operadores + y - también se aplican a variables o constantes que contienen valores de direcciones, obteniendo como resultado otro valor de dirección.

El valor de I div J es el cociente de I / J redondeado. Ocurre un error en ambos tipos de

división si J es cero.

El

El

operador mod retorna el resto de la división de sus operandos, es decir:

I mod J = I - (I div J) * J

signo del resultado es el mismo que el de I. Ocurre un error si J es cero.

Los operadores No, Y , y O son operadores lógicos/booleanos. Cabe mencionar que los lenguajes de programación que soportan la manipulación de operandos a nivel de bits, consideran a estos operadores como lógicos además de sus aplicaciones booleanas.

El operador @ se utiliza en un factor de dirección para calcular la dirección de una variable. Este operador retorna la dirección de su operando, es decir construye un apuntador hacia el operando (vea más adelante apuntadores).

FactorDirección --> @Identificador

Ilustración .6. Sintaxis de factor de dirección.

Sentencias

Las sentencias describen las acciones que puede ejecutar el algoritmo. Hay dos tipos principales de sentencias: las sentencias simples y las sentencias compuestas.

Sentencia --> SentenciaSimple | SentenciaCompuesta

Ilustración .7. Sintaxis de sentencia.

Sentencias simples

Una sentencia simple es aquella que no puede contener otras sentencias. Tenemos los siguientes tipos: sentencias de entrada/salida, sentencias de asignación de valores y sentencias de mensaje.

SentenciaSimple --> SentenciaAsignación | SentenciaEntradaSalida | SentenciaRetorno | Mensaje | Retorno

Ilustración .8. Sintaxis de sentencia simple.

Sentencias de asignación de Valores

La sentencia de asignación reemplaza el valor actual asociado a un identificador con un nuevo valor especificado por una expresión o especifica una expresión cuyo valor lo retorna un método.

Identificador --> Expresión

Ilustración .9. Sintaxis de sentencia de asignación.

Algunos ejemplos de sentencias de asignación:

X Z + U

Fin (I > J) y (I <= 100)

I Seno(X) * M

Sentencias de mensaje

Una sentencia de mensaje activa un método especificado por un identificador de método, si la declaración del método contiene una lista de parámetros formales, entonces la sentencia de mensaje debe tener una lista concordante de parámetros (en la sección de declaración, a los parámetros se les conoce como parámetros formales, al momento del paso de mensajes se les conoce como parámetros reales). Trataremos este tipo de sentencias en la sección de Mensajes.

Sentencias de entrada/salida

Todo lenguaje de pseudocódigo debe permitir mecanismos que comuniquen nuestra solución con el usuario. La mayoría de aplicaciones necesitan una interacción con el usuario de la misma. Nuestro lenguaje cuenta con dos primitvas básicas para dicho fin. La primitiva Leer permite recibir un valor del exterior y almacenarlo en la variable con el nombre que se coloca en la sección de interfaz. La primitiva Escribir nos proporciona un mecanismo para emitir expresiones y resultados para que puedan ser apreciados por nuestro usuario. La manera como se escriben es la siguiente:

leer ( Identificador ) escribir ( Identificador | Expresión )

Como veremos más adelante, éstos son métodos de dominio público, por tanto entran en la categoría de métodos de biblioteca.

Sentencias compuestas

Las sentencias compuestas son construcciones compuestas por otras sentencias que se ejecutarán en secuencia, condicionalmente (sentencias condicionales), o repetidamente (sentencias iterativas).

SentenciaCompuesta --> SentenciaCondicional | SentenciaRepetitiva | Excepción

Ilustración .10. Sintaxis de sentencia compuesta.

Sentencias de decisión o condicionales

Las sentencias de decisión o condicionales seleccionan la ejecución de una secuencia de acciones.

SentenciaCondicional --> SentenciaSi | SentenciaCaso

Ilustración .11. Sintaxis de sentencia condicional.

Decisión con hasta dos Alternativas (Sentencia Si)

La sintaxis de una sentencia de decisión con hasta dos alternativas es:

si ExpresiónBooleana entonces Secuencia de “n” acciones [ sino Secuencia de “m” acciones ]

fsi

Ilustración .12. Sintaxis de sentencia Si.

La expresión debe tomar un valor lógico de verdadero o falso. Si la expresión toma el valor de verdadero la secuencia a continuación de la cláusula Entonces se ejecuta.

Si la expresión produce un valor de falso y está presente la parte de Sino , se ejecuta la secuencia de acciones a continuación de Sino ; si la parte Sino no se encuentra presente, no se ejecuta nada.

Decisión Múltiple (Sentencia Caso)

La sentencia Caso está conformada por una expresión (el selector) y una relación de sentencias, cada una precedida por una constante ó por la palabra Otro. Las constantes en Caso deben ser únicas.

caso Expresión vale

Alternativa1:

Secuencia de “n” acciones Alternativa2 :

Secuencia de “m” acciones

[ otro:

Secuencia de “x” acciones ]

fcaso Valor { , Valor } | Valor

Valor

Ilustración .13. Sintaxis de sentencia Caso.

La sentencia Caso ejecuta la secuencia de acciones precedida por la constante de valor

Otro, la

igual al del selector.

secuencia de acciones que sigue a Otro se ejecuta. Si no hay parte Otro, no se ejecuta

nada.

Si no existe tal constante y está presente la parte

Iteraciones

SentenciaRepetitivas --> SentenciaRepetir | SentenciaMientras | SentenciaPara

Ilustración .14. Sintaxis de sentencia repetitiva o iteración.

Iteración condicional de cero o más ciclos

Una sentencia Mientras contiene una expresión que controla la ejecución de una secuencia de acciones.

Mientras ExpresiónBooleana hacer Secuencia de “n” acciones fmientras

Ilustración .15. Sintaxis de sentencia Mientras.

La expresión que controla la repetición debe tomar un valor de verdadero o falso. Esta se evalúa antes que se ejecute la secuencia de acciones contenida. La secuencia de acciones se ejecuta en forma repetida en tanto la expresión sea verdadero. Si la expresión da falso al inicio, ya no se ejecuta la secuencia de acciones.

Iteración condicional de uno o más ciclos.

La sentencia Repetir contiene una expresión que controla la ejecución repetida de una secuencia de acciones dentro de esa sentencia Repetir.

Repetir Secuencia de “n” acciones hasta ExpresiónBooleana frepetir

Ilustración .16. Sintaxis de sentencia repetir.

La expresión debe producir un resultado de verdadero ó falso. Las secuencia de acciones entre las palabras Repetir y Hasta se ejecutan en secuencia hasta que, al final de la secuencia , la expresión toma un valor de verdadero. La secuencia se ejecuta por

lo menos una vez porque la expresión se evalúa después de la ejecución de cada iteración.

Iteración con número definido de ciclos.

La sentencia Para hace que se ejecute una secuencia de acciones mientras que se asigna una progresión de valores a un identificador de control.

Para VariableControl desde ValorInicial a ValorFinal [inc {+ | -} ValorIncremento] hacer Secuencia de “n” acciones fpara

Ilustración .17. Sintaxis de sentencia Para.

La secuencia de acciones contenida en la sentencia Para se ejecuta una vez para cada valor entre Val_Inic y Val_Fin en incrementos Valor_incremento. El identificador de control siempre comienza en el valor Valor_Inic. Cuando la sentencia Para usa Desde, el valor del identificador se incrementa o decrementa (según el signo especificado) en Valor_incremento si está presente o en su defecto se incrementa en uno, esto por cada repetición. Si el incremento es positivo y Val_Inic es mayor que Val_Fin entonces no se ejecuta la secuencia de acciones. Si el incremento es negativo y Val_Inic es menor que Val_Fin, la secuencia de acciones no se ejecuta.

Clases y Objetos.

Una clase es, al igual que los números, el texto y los booleanos, un tipo especial de datos. En su caso consiste de un número fijo de componentes. Una clase puede estar compuesta por atributos y métodos.

Una instancia de una clase es conocida comúnmente como objeto. Los objetos se crean utilizando los constructores y se destruyen utilizando los destructores. Cada objeto tiene su copia de los atributos declarados en la clase, pero todos comparten los mismos métodos.

Declarar Clases.

Las clases se declaran de la siguiente manera:

Clase IdentificadorClase [viene-de IdentificadorClase { , IdentificadorClase }] Atributos IdentificadorAtributo { IdentificadorAtributo } Métodos secuencia de “m” declaraciones de métodos

fclase

IdentificadorMétodo [ ( ListaFormalParámetros ) ] [ --> ] [ abstracto | sobreescribir | sobrecargar | estático | sincronizado ]

Constructor [ ( ListaFormalParámetros ) ]

Destructor

ListaFormalParámetros --> [ @ ] Identificador {, [ @ ]Identificador

}

Ilustración .18. Sintaxis de declaración de Clase.

La declaración de un atributo en una clase define un elemento de dato que existe en cada instancia u objeto de la clase.

Parte de la

llamada a un método (mensaje) especifica el objeto sobre el que debe operar el

Un método es una rutina que realiza una operación sobre un objeto.

método.

La declaración de un método dentro de una clase implica la implantación posterior del método mediante una declaración de definición.

Dentro de la implantación de un método, el identificador Este representa un parámetro implícito que referencia al objeto por el cual fue invocado el método. Los constructores y destructores son métodos especiales que controlan la construcción y destrucción de los objetos.

Un constructor define las acciones asociadas con la creación de objetos. Cuando se invoca éste retorna una referencia a una instancia inicializada de una clase.

Un destructor define las acciones asociadas con la destrucción de un objeto. Cuando se invoca, el destructor libera los recursos asignados al objeto.

Una clase puede heredar componentes de otra clase. Si C2 hereda de C1, entonces C2 es un descendiente de C1 y C1 es un ancestro de C2. La herencia es transitiva; es decir, si C3 hereda de C2 y C2 hereda de C1, entonces C3 también hereda de C1. El dominio de una clase está conformado por ella y todos sus descendientes.

Una clase descendiente contiene en forma implícita todos los componentes definidos por sus clases ancestro. Una clase descendiente puede agregar nuevos componentes a los ya heredados. Sin embargo, no puede eliminar la definición de un componente declarado en una clase ancestro.

Seleccionar atributos

La manera como podemos accesar a los atributos de una clase es similar a lo anteriormente visto con las variables, excepto que necesitamos especificar a que clase pertenece este atributo.

Identificador_de_Clase.Identificador_Atributo

Esta herramienta del lenguaje de pseudocódigo nos es útil para accesar a los atributos de una clase dentro de la definición de un método amigo de ésta. Llamamos método amigo al método que recibe como parte de su interfaz un identificador de otra clase del cual se puede accesar directamente a los valores de los atributos de la clase. El concepto de amigo se entiende como un grado de confianza entre clases, pues una clase confía su intimidad (se supone que los atributos deben encapsularse para el exterior) a otra esperando que la receptora no de un uso indebido a los valores de sus atributos.

Dentro de los métodos de una clase, el acceso a sus atributos propios y heredados no necesita la especificación del identificador de clase, pues la pertenencia está sobreentendida.

Declaración de Instancias de Clases (Objetos)

Las instancias de una clase se conocen como los objetos de la clase. Por medio de las clases definimos en nuestro pseudocódigo la estructura y el comportamiento de los objetos que pertenezcan a esa clase, es decir los ejemplares de la clase. Para poder definir objetos en forma clara necesitamos establecer un identificador para el objeto y especificar de qué clase es ejemplar.

Objeto IdentificadorObjeto ejemplar_de IdentificadorClase

Ilustración .19. Sintaxis de declaración de Objeto.

Hay que tomar en cuenta que con esta herramienta del lenguaje de pseudocódigo estamos declarando ante el entorno que el uso de Ident_objeto denota el uso de un objeto de la clase Ident_Clase, pero aún no hemos asignado recursos ni inicializado los valores para los atributos propios de su clase. Para esto contamos con los constructores, de los cuales continuaremos hablando más adelante.

Declaración de definición de Métodos

Esta parte especifica cómo se implanta el propósito para el cual fue creado el método. Su estructura es similar a una rutina. Aquí utilizamos la palabra Método seguida del identificador y la interfaz (si existiera). El punto (.) nos indica una selección de la Clase como entidad global y clarifica la pertenencia del método a dicha Clase.

Método IdentificadorClase.IdentificadorMétodo [ ( ListaFormalParámetros ) ] [ --> ] secuencia de “n” acciones fmétodo

Ilustración .20. Sintaxis de declaración de definición de Método.

Para los constructores y destructores, la declaración es similar a la de los métodos, excepto que la palabra Constructor o Destructor se utiliza como identificador del método.

Dentro de un bloque de método, la palabra reservada Heredado se puede utilizar para acceder a identificadores de métodos sobreescritos o extendidos. Por ejemplo, en la implantación del método CEtiquetaConMarco.Dibujar, podemos utilizar heredado para invocar la implantación heredada del método Dibujar. Cuando un identificador está precedido por heredado, la búsqueda se inicia con el ancestro inmediato de la clase que contiene el método.

Veamos: Clase CEtiquetaConMarco viene-de CEtiqueta Métodos Dibujar

fclase

Método CEtiquetaConMarco.Dibujar heredado Dibujar Color <-- clTextoVentana Estilo <-- stSólido fmétodo

Parámetros (Interfaz)

La declaración de un método especifica una lista formal de parámetros o interfaz. Cada parámetro que se declara en una lista formal de parámetros es local al método en que se declara y se le puede hacer referencia utilizando su identificador en el bloque asociado con el método.

ListaFormalParámetros --> [ @ ] Identificador {, [ @ ]Identificador }

Ilustración .21. Sintaxis de Lista formal de Parámetros.

A nivel de pseudocódigo, podemos distinguir dos tipos de parámetros, por valor y por

referencia. Los parámetros por valor sólo requieren el identificador del parámetro, mientras que los parámetros por referencia necesitan ser precedidos del operador @.

Un parámetro formal por valor actúa como una variable local a la rutina, sólo que

obtiene su valor inicial de su correspondiente parámetro real al momento de invocarse

al método. Los cambios que se realicen al parámetro formal por valor no afectan el

valor del parámetro real.

El correspondiente parámetro real de un parámetro formal por valor en una sentencia

de método debe ser una expresión y su tipo de valor debe concordar con el determinado por el contexto de utilización del parámetro.

Un parámetro formal por referencia se utiliza cuando se debe pasar un valor desde el método a quién lo invocó. El parámetro formal por referencia representa la variable real durante la invocación al método, por lo que cualquier cambio al valor del parámetro formal por referencia se reflejan en el parámetro real.

Dentro del método, cualquier referencia al parámetro formal por referencia accesa al parámetro real mismo. El parámetro real debe coincidir en tipo de valor con el parámetro formal por referencia.

Cabe recalcar que si bien en el lenguaje de pseudocódigo no se está considerando en forma explícita la existencia de tipos de valores, ésta queda determinada por el contexto de utilización de las variables, al momento de asignación de valores y aplicación de operadores.

Constructores y destructores

Como hemos adelantado, los constructores y destructores son métodos que controlan

la construcción y destrucción de objetos de una clase. Ellos se especifican como

componentes de la clase como un método estándar, excepto que la palabra constructor se utiliza como identificador del método. Al igual que los métodos, éstos se pueden heredar. Los constructores se usan para crear e inicializar nuevos objetos. Por lo general, la inicialización se basa en los valores que se pasan como parámetros al constructor. Normalmente la primera acción que realiza un constructor es invocar al constructor heredado de su padre.

Los destructores se usan para retirar del entorno objetos. Cuando se invoca a un

destructor, se ejecutan las acciones definidas por el usuario para el destructor y luego

se libera los recursos asignados al objeto. Por lo general las acciones de un destructor

son destruir cualquier objeto contenido en él y liberar cualquier recurso solicitado por el objeto. Típicamente la última acción que realiza un destructor es llamar al destructor heredado para deshacerse de los atributos heredados del objeto.

Clase CFigura viene-de CObjeto Atributos Largo Ancho Objeto Lápiz ejemplar-de Clápiz Objeto Brocha ejemplar-de Cbrocha Métodos Constructor(QueLargo, QueAncho) Destructor

fClase

Método CFigura.Constructor(QueLargo, QueAncho) heredado Constructor Ancho <-- QueLargo Largo <-- QueAncho Lápiz.Constructor Brocha.Constructor fmétodo

Método CFigura.Destructor Lápiz.Destructor Brocha.Destructor heredado Destructor fmétodo

Acceso a los atributos

Para poder mantener la integridad de la información que maneja nuestra solución lógica, debemos disciplinarnos en el acceso a los atributos definidos en las clases. Conforme utilice el enfoque orientado a objetos para realizar sus algoritmos, coincidiremos en que la manera de evitar que el cliente de un objeto acceda directamente a los valores de los atributos propios de su clase, es necesario definir

métodos especiales cuya función sean obtener el valor del atributo o alterar éste valor.

A estos métodos especiales los denominamos métodos de lectura y métodos de

escritura.

Continuando con la sana política de establecer convenciones, a partir de ahora acordaremos que los identificadores de métodos de lectura, es decir los que retornan el valor de un atributo, estén conformados por la palabra Obtener seguida del nombre del atributo; así mismo, los métodos de escritura se denotarán por la palabra Colocar seguida del nombre del atributo y tendrán como parámetro por lo menos el valor con el que se desea alterar el atributo.

Clase CFigura viene-de CObjeto Atributos Largo Ancho Objeto Lápiz ejemplar-de Clápiz

Objeto Brocha ejemplar-de Cbrocha Métodos Constructor(QueLargo, QueAncho) Destructor ObtenerLargo --> ObtenerAncho --> ColocarLargo(NuevoLargo) ColocarAncho(NuevoAncho)

fClase

Envío de Mensajes

Un método se activa mediante el envío de un mensaje a un objeto consistente de un identificador de método seguido por una lista real de parámetros. Este tipo de llamada se conoce como invocar un método ó enviar un mensaje.

IdentificadorObjetoIdentificadorObjeto

IdentificadorMétodoIdentificadorMétodo

[[((ListaRealParámetrosListaRealParámetros))]]

Ilustración .22. Sintaxis de Envío de Mensaje.

El identificador de objeto expresado arriba debe denotar una referencia a un objeto existente. La instancia especificada al momento del envío del mensaje se convierte en forma implícita en un parámetro real para el método; corresponde con un parámetro real llamado Este, que tiene el conocimiento de la clase a la que corresponde el método que se está invocando.

Cuando invocamos a métodos de una clase dentro de la declaración de definición de otro método de la misma clase se omite la referencia al objeto, quedando sólo el identificador del método y la lista real de parámetros.

Para el caso de los métodos estáticos, aquellos métodos que se invocan directamente de la clase, se utiliza el nombre de la clase seguido del identificador del método y la lista real de parámetros.

IdentificadorClaseIdentificadorClase

IdentificadorMétodoIdentificadorMétodo

[[((ListaRealParámetrosListaRealParámetros))]]

El identificador de clase especificado debe hacer referencia a una clase existente y debe separarse por un punto del identificador del método del mensaje.

Declaración de propiedades

Las propiedades son una característica presente en muchos lenguajes de programación. Para declarar propiedades en oLoop se utiliza la siguiente sintaxis.

Propiedad IdentificadorPropiedad

[

obtener IdentificadorAtributo | IdentificadorMétodo ]

[

colocar IdentificadorAtributo | IdentificadorMétodo ]

Por ejemplo:

Clase CCliente Atributos Nombres Apellidos fechaÚltimaCompra Métodos ObtenerNombres -> ColocarNombres(pNombres) ObtenerApellidos -> ColocarApellidos(pApellidos) ObtenerNombreCompleto -> Propiedad NombreCompleto obtener ObtenerNombreCompleto Propiedad ÚltimaCompra

fclase

Bibliotecas de clases

obtener fechaÚltimaCompra colocar fechaÚltimaCompra

Las clases en una aplicación pueden organizarse en bibliotecas. oLoop permite la especificación y uso de bibliotecas de clases en el pseudocódigo.

Especificación de bibliotecas

Para especificar que una clase pertenece a un biblioteca determinada, basta con utilizar la sentencia Biblioteca.

Biblioteca IdentificadorBiblioteca

Esta sentencia se coloca como primera línea de la declaración de clase, indicando que la clase a declarar estará formando parte de la biblioteca indicada. Varias clases pueden pertenecer a la misma biblioteca.

En la nomenclatura de identificadores de biblioteca, puede utilizarse el símbolo de punto para delimitar los niveles de organización en el nombre de la biblioteca.

Por ejemplo:

Biblioteca com.empresa.aplicacioncompras.entidadesnegocio

Clase CCompra viene-de CEntidadNegocio

fclase

Uso de bibliotecas

Para indicar que una clase puede hacer uso de las clases públicas en una biblioteca, se utiliza la sentencias Usar.

Usar IdentificadorBiblioteca

La sentencia Usar se aplica para cada biblioteca cuyas clases e interfaces vaya a utilizar la clase a declarar. Por ejemplo:

Biblioteca com.empresa.aplicacioncompras.cliente

Usar com.empresa.aplicacioncompras.entidadesnegocio Usar com.empresa.utilidades

Clase CComprasAplicacion viene-de CAplicacion

fclase

Polimorfismo

Una de las características importantes del paradigma orientado a objetos es el polimorfismo. El mismo nombre nos da una idea clara del concepto de polimorfismo, pues poli significa múltiple y morfismo viene de formas, esto implica que un mismo objeto puede tomar diversas formas. En oLoop, el polimorfismo se contempla en la instancia de objetos y en la consulta de tipos.

Durante la creación de instancia de clases, puede aplicarse el polimorfismo, declarando una clase como ejemplar de una clase genérica, e invocando al constructor de una clase hija más específica al momento de crear la instancia. En la siguiente sección daremos un ejemplo de este tipo de instancia.

Consulta de tipo

oLoop implementa la consulta de tipo de un objeto por medio de la palabra reservada es-instancia-de.

IdentificadorObjeto es-instancia-de IdentificadorClase

La combinación de estos elementos constituye una expresión booleana que puede ser verdadera o falsa. Por lo general se utiliza en combinación con la sentencia Si

En el siguiente ejemplo, se asume la existencia de tres clases, una clase genérica CEmpleado y dos clases descendientes denominadas CEmpleadoTiempoParcial y CEmpleadoTiempoCompleto. La variable Empleado se declara como ejemplar de la clase CEmpleado, pero al momento de crear la instancia, se utiliza el método constructor de la clase CEmpleadoTiempoCompleto. Posteriormente, se consulta en una sentencia Si para saber si el objeto es una instancia del tipo CEmpleadoTiempoCompleto.

Objeto Empleado ejemplar-de CEmpleado

Empleado ← CEmpleadoTiempoCompleto.constructor(cod, salario)

Si(Empleado es-instancia-de CEmpleadoTiempoCompleto) entonces

fsi

Casting de tipo

El término casting proviene de la palabra cast que significa en español molde, por lo que una traducción literal nos llevaría a algo como hacer un molde. oLoop implementa en su sintaxis la especificación de casting de un objeto, anteponiendo al identificador de objeto el nombre de la clase cuya forma se desea que asuma, encerrada entre paréntesis.

(IdentificadorClase) IdentificadorObjeto

Esto puede ser de utilidad en las operaciones de asignación. En caso se desee invocar

a un método que pertenece a la clase objeto del casting, se encierra la expresión de casting entre paréntesis y se invoca al método deseado.

((IdentificadorClase) IdentificadorObjeto).IdentificadorMétodo

Continuando con el ejemplo expuesto líneas arriba, se envía un mensaje al objeto Empleado para que invoque al método obtenerSalario, método accesor que pertenece a

la clase CEmpleadoTiempoCompleto y no a la clase CEmpleado.

salario ← ((CEmpleadoTiempoCompleto)Empleado).obtenerSalario

Comentarios

Los comentarios son construcciones que no forman parte de la descripción de la lógica, pero son valiosos elementos para explicar y hacer más claro nuestro algoritmo. Para insertar un comentario, basta con escribir dos símbolos de división seguidos (//) y a continuación el texto que se desee colocar. Se considera comentario hasta el final de la línea.

// Este es un ejemplo de un comentario // que ocupa varias líneas.

Jerarquía de Clases predefinidas

La mayoría de herramientas de la actualidad nos proporcionan una jerarquía de clases predefinidas que podemos tomar como punto de partida para desarrollar nuestra aplicación y para crear nuestras propias clases. Nosotros no tenemos que consumir tiempo en crear clases que cumplan estas funciones. Basta con crear instancias de sus clases. Acorde con esto, nuestro lenguaje de pseudocódigo también pone a disposición del creador de aplicaciones un conjunto de clases que tienen los atributos y métodos básicos para concebir nuestra solución. Se ha tratado de no incluir los atributos o métodos que están estrechamente relacionados con los aspectos visuales o físicos, dejando sólo los que nos ayuden a definir el comportamiento de nuestro algoritmo.

La clase raíz de nuestra jerarquía es CObjeto, la cual es una clase completamente abstracta y que sólo sirve de punto de partida del árbol. La clase que desciende ésta es CComponente, de la cual descienden todas las demás clases de nuestra jerarquía. Es con ella que comenzamos nuestra descripción.

La clases Componentes

Atributos comunes (CComponente)

La lista de atributos varía entre componentes, pero algunos son comunes a todos:

Atributo

Función

Activado

Determina si el componente reaccionará ante las acciones del usuario.

Visible

Determina si el componente se mostrará sobre el formulario durante la ejecución.

Tabla .2. Atributos comunes para los componentes en general.

Clase CComponente viene-de CObjeto Atributos Activado Visible

Métodos

ObtenerActivado --> ObtenerVisible --> ColocarActivado ColocarVisible

fclase

Existen, como veremos más adelante, dos clases que definen dos niveles de profundidad en la jerarquía, CControl y su hijo, CControlWindows. Las clases que describiremos a continuación son descendientes directas de CControlWindows.

Visualizar y editar texto

Posiblemente la tarea más común en un programa es mostrar y editar texto. Las capacidades de texto se utilizan para obtener información del usuario y retornar resultados al mismo. Para facilitarnos esta labor, contamos con tres componentes básicos para manejar texto: Etiquetas, Cajas de Edición y Cajas de Memo.

El componente Etiqueta (CEtiqueta)

Info rm a c ió n d e l E nto rno

Ilustración .23. Ejemplo de Etiqueta.

El componente etiqueta nos permite mostrar texto, pero no permite al usuario ingresar información. El texto que muestra este componente está contenido en el atributo Título del componente.

Atributo

Función

Título

Contiene el texto que muestra la Etiqueta

Tabla .3. Atributos de CEtiqueta.

Clase CCEtiqueta viene-de CControlWindows Atributos

Título

Métodos

ObtenerTítulo --> ColocarTítulo

fclase

El componente Caja de Edición (CEdición)

N o m b re

N o m b re

Ilustración .24. Ejemplo de Caja de edición.

Un componente relacionado con la Etiqueta es la caja de Edición. Este componente le permite visualizar información, pero a su vez permite al usuario ingresar información que puede ser utilizada por nuestro programa. El texto de la Caja de Edición está contenido en el atributo Texto del componente. Como es de suponerse, el texto se ingresa digitando, pero a manera de comentario, agrego que la Caja de Edición soporta las operaciones estándares de cortar, copiar y pegar. Aunque al momento de la concepción del algoritmo, suponemos la existencia de recursos ilimitados, debemos tomar en cuenta que la mayoría de herramientas permiten que se ingrese textos de hasta 255 caracteres. Los atributos clave para un componente de este tipo son los siguientes:

Atributo

Función

Texto

Contiene el texto que visualiza la caja de Edición o que ingresa el usuario.

Modificado

Indica si el texto ha sido modificado por el usuario. Esta propiedad puede verificarse para ver si se necesita algún procesamiento para el texto.

SoloLectura

Si está en Verdadero, prohibe al usuario la edición del texto.

Tabla .4. Atributos de CEdición.

Clase CCEdición viene-de CControlWindows Atributos Texto Modificado SóloLectura

Métodos

ObtenerTexto --> ColocarTexto ObtenerModificado --> ColocarModificado ObtenerSóloLectura --> ColocarSóloLectura

fclase

Permitir que el usuario haga elecciones simples

Tan útil como la capacidad de ingresar texto, a menudo deseamos restringir lo que el usuario ingrese a unas cuantas alternativas. Por ejemplo, si deseamos obtener el estado civil de una persona, podríamos colocar una Etiqueta como ¿Es usted casado(a)? y utilizar una Caja de Edición para obtener la respuesta. Sin embargo, no sabemos cómo nos puede responder el usuario. Puede ingresar Sí o No, o puede sólo

ingresar S o N. Y como usted y yo sabemos, siempre existe la posibilidad de un ingreso erróneo.

Las herramientas de la actualidad nos proporcionan componentes estándares para manejar las alternativas simples. La primera es la Casilla de Verificación que se utiliza para proporcionar al usuario elecciones del tipo Sí o No. El otro componente es el Botón de Radio, que se utiliza para brindar al usuario un conjunto muy limitado de alternativas.

La Casilla de Verificación (Ccasilla)

e rific a r o rto g ra fíactiva r g uio ne s uto co rre cció n V A A

ctiva r g uio ne se rific a r o rto g ra fía uto co rre cció n V A

uto co rre cció ne rific a r o rto g ra fía ctiva r g uio ne s V

V

A

A

Ilustración .25. Ejemplo de Casilla de verificación.

La Casilla de verificación es muy fácil de configurar. Sólo debe asignarse valor al atributo Título para visualizar lo que se desee que aparezca junto a la casilla. El Título debe ser una oración o proposición que tiene una respuesta obvia de Sí o No. Cuando el usuario encuentra una Casilla de Verificación, una marca de verificación ( ) indica una respuesta de Sí o Verdadero. Si no hay marca alguna, la respuesta será No o Falso. El usuario puede cambiar el estado de la Casilla de Verificación haciendo clic sobre la Casilla o presionando la barra espaciadora mientras que este componente tiene el foco. Para determinar qué respondió el usuario, tenemos que examinar el atributo Verificada de la Casilla. Un uso muy frecuente de las Casillas de Verificación es para establecer las opciones de un programa. Si la Casilla está Verificada, la opción está activa.

Atributo

Función

Título

Determina el texto que aparece junto a la casilla.

Verificada

Determina si el usuario activó la casilla de verificación.

Tabla .5. Atributos de CCasilla.

Clase CCasilla viene-de CControlWindows Atributos Título Verificada

Métodos

ObtenerTítulo --> ColocarTítulo ObtenerVerificada --> ColocarVerificada

fclase

Botones de Radio (CbotónRadio)

Im p re s o ra lo c a lIm p re s o ra d e re d U n Archivo e n

Im p re s o ra d e re dIm p re s o ra lo c a l U n Archivo e n d

U n Archivo e n d is coIm p re s o ra lo c a l Im p re s o ra

Ilustración .26. Ejemplos de Botón de radio.

Los Botones de Radio son otro medio para presentar al usuario un número limitado de alternativas, donde cada Botón de Radio corresponde con una posibilidad. El término Botón de Radio tiene su origen en la idea de las radios de los carros que tenían varios botones que se presionaban para elegir una estación. El botón permanecía hundido

luego de presionarse. Uno elegía otra estación presionando un botón y el anterior se levantaba. Los Botones de Radio en un programa funcionan de la misma manera. Sólo uno de los “Botones” puede estar presionado en un instante dado. La elección de un Botón hace que todos los demás se deseleccionen. En la pantalla cada Botón de Radio se presenta como un círculo. El Botón seleccionado tiene un punto negro en el interior, mientras que todos los demás están vacíos.

Atributo

Función

Título

Determina el texto que aparece junto al Botón de Radio.

Verificada

Determina si el usuario eligió esta alternativa.

Tabla .6. Atributos de CBotónRadio.

Configurar los Botones de Radio es tan simple com con las Casillas de Verificación. Basta con establecer el atributo Título para que el usuario conozca la alternativa representada por el Botón. Durante la ejecución examinamos el atributo Verificada de cada Botón para determinar cuál fue seleccionada por el usuario.

Clase CBotónRadio viene-de CControlWindows Atributos Título Verificada

Métodos

ObtenerTítulo --> ColocarTítulo ObtenerVerificada --> ColocarVerificada

fclase

Botones para presionar (CBotónAcción)

< B ack Next > OK Cancel Ilustración .27. Ejemplos de Botón de acción.
<
B ack
Next >
OK
Cancel
Ilustración .27. Ejemplos de Botón de acción.

Otro componente ampliamente utilizado es el componente Botón de Acción. Este componente proporciona al usuario un medio para iniciar alguna acción en un programa, como grabar un registro o realizar un cálculo. El atributo clave para este componente es Título y es un texto que le dice al usuario qué acción se llevará a cabo cuando presione el Botón de Acción.

Atributo

Función

Título

Contiene el texto que muestra el Botón de Acción

Cancelar

En Verdadero si se desea que que el Botón reaccione cuando el usuario presione Esc.

PorDefecto

En Verdadero si queremos que la tecla Enter haga que el Botón reaccione, aún si éste no tiene el foco.

Tabla .7. Atributos de CBotónAcción.

Clase CBotónAcción viene-de CControlWindows Atributos Título Cancelar PorDefecto

Métodos

ObtenerTítulo --> ColocarTítulo ObtenerCancelar --> ColocarCancelar

ObtenerPorDefecto

ColocarPorDefecto

fclase

Controles especializados

Los siguientes controles proporcionan alternativas para la captura de datos.

La Barra de Desplazamiento se utiliza para seleccionar valores en un rango continuo.

La Barra de Dial es útil para dar un mayor efecto de barra de desplazamiento.

El Arriba Abajo ayuda a conectar un spinner con una caja de edición.

Barras de Desplazamiento (CBarraDesp)

una caja de edición. Barras de Desplazamiento (CBarraDesp) Ilustración .28. Ejemplo de Barra de desplazamiento. Esta
una caja de edición. Barras de Desplazamiento (CBarraDesp) Ilustración .28. Ejemplo de Barra de desplazamiento. Esta
una caja de edición. Barras de Desplazamiento (CBarraDesp) Ilustración .28. Ejemplo de Barra de desplazamiento. Esta

Ilustración .28. Ejemplo de Barra de desplazamiento.

Esta es la barra de desplazamiento de Windows, que se utiliza para desplazar el contenido de una ventana; formulario o control. En la tabla podemos apreciar sus principales atributos.

Atributo

Función

VariaciónGrande

Determina cuanto se mueve cuando el usuario hace clic sobre la barra a cualquiera de los lados.

VariaciónPequeña

Determina cuanto se mueve cuando el usuario hace clic sobre las flechas a los extremos de la barra o utiliza las flechas de desplazamiento en el teclado. Su valor por defecto es 1.

Mín/Máx

Indican cuántas posiciones están disponibles en la barra de desplazamiento.

Posición

Informan de cuánto se ha desplazado en la barra.

Tabla .8. Atributos de CBarraDesp.

Clase CBarraDesp viene-de CControlWindows Atributos VariaciónGrande VariaciónPequeña Mín Máx Posición

fclase

Barra de Dial (Cdial)

Métodos

ObtenerVariaciónGrande --> ColocarVariaciónGrande ObtenerVariaciónPequeña --> ColocarVariciónPequeña ObtenerMín --> ColocarMín ObtenerMáx --> ColocarMáx ObtenerPosición --> ColocarPosición

Ilustración .29. Ejemplo de Barra de dial. Este tipo de barra es conveniente cuando se

Ilustración .29. Ejemplo de Barra de dial.

Este tipo de barra es conveniente cuando se desea establecer o ajustar valores numéricos sobre un rango continuo, como el volumen o el brillo. Dicho componente consiste de una barra que define la extensión o rango de ajuste y un indicador que muestra el valor actual del control y proporciona los medios para modificar el control.

El usuario mueve el indicador arrastrándolo a una ubicación en particular o haciendo clic sobre una zona específica de la barra, lo que mueve el indicador directamente a esa posición. Sus propiedades son básicamente similares a los de la barra de desplazamiento.

Control Arriba Abajo (CarribaAbajo)

Lo ng itud :

33.40
33.40

Ilustración .30. Ejemplo de Control Arriba Abajo.

Los controles ArribaAbajo son cajas de texto que aceptan un conjunto limitado y ordenado de valores discretos que varían en forma cíclica.

Cuando el usuario hace clic sobre la caja de texto o los botones, el foco pasa a la caja de texto del control. El usuario puede escribir un valor directamente en la caja de texto o utilizar los botones para incrementar o decrementar el valor.

Uilice Asociar parta conectar el control con una caja de texto. Uilice Máx y Mín para establecer los límites sobre los que puede fluctuar el valor del control. El atributo Posición almacena el valor conforme el control va incrementándose o decrementándose. Este atributo se establecer con un valor por defecto.

Por defecto, este control se detiene en su valor máximo. Si deseamos que el control regrese al valor mínimo cuando llega al máximo, coloque Circular en Verdadero.

Manejo de Listas

al máximo, coloque Circular en Verdadero. Manejo de Listas E s tilo : N o rm

E s tilo :

E s tilo : N o rm a l
E s tilo : N o rm a l

N o rm a l

E s tilo : N o rm a l
E s tilo : N o rm a l
E s tilo : N o rm a l
E s tilo : N o rm a l

Ilustración .31. Ejemplo de Lista desplegable.

Las listas se utilizan para presentar al usuario con una colección de elementos de los que se puede seleccionar uno o más de ellos. Acorde con las herramientas de hoy, distinguimos varias clases predefinidas.

Una Caja de Lista se utiliza para mostrar un lista de textos de las que se puede seleccionar uno o más.

La Lista Combinada muestra un lista que se despliega, y es útil para ahorrar espacio. Las Vista en Árbol muestra los elementos en forma jerárquica.

Atributos comunes para los controles de Lista

Para agregar columnas adicionales a un control de lista, contamos con el atributo Columnas, que almacena el número de columnas que se desee.

La propiedad Elementos es en realidad un conjunto de cadenas texto que se llenan con valores.

El atributo Indice seleccionado.

de

Elemento indica cuál de los

elementos en la lista

se

ha

Se puede permitir a los usuarios seleccionar más de un elemento a la vez estableciendo la propiedad Multielección en verdadero. Los usuarios pueden entonces utilizar la tecla Ctrl para seleccionar elementos en posiciones discontinuas, o Shift para seleccionar un rango de elementos.

El atributo Ordenada determina si la lista se ordenará el orden alfabético.

Cajas de Lista (CCajaLista)

Una caja de lista muestra una relación de la que los usuarios pueden seleccionar uno o más elementos. Las cajas de lista basan su comportamiento en los valores de los tributos especificados en la sección anterior.

Listas combinadas (CListaCombinada).

Una lista combinada es un control que combina una caja de texto con una lista. Los usuarios pueden digitar texto o seleccionar un elemento de la lista, con lo que el valor de Texto se actualiza.

Por defecto la lista desplegable muestra 8 elementos. Para incrementar o decrementar dicho valor colóquelo en el atributo CantidadDesplegada.

Fichas (CFicha)

en el atributo CantidadDesplegada. Fichas (CFicha) G ra b a r Co m p ila d
G ra b a r Co m p ila d o r Ilustración .32. Ejemplo
G ra b a r
Co m p ila d o r
Ilustración .32. Ejemplo de Ficha.

Este componente es un conjunto de páginas que se utiliza para crear diálogos de varias páginas. En la siguiente tabla se muestran sus propiedades.

Atributo

Función

PáginaActiva

Especifica cuál es la ficha seleccionada en ese momento.

Multilínea

Es Verdadero si hay varias líneas de fichas.

NúmeroDePáginas

Especifica el número de páginas.

Páginas

Nos permite acceso a las fichas.

Tabla .9. Atributos de Cficha.

La clase CFormulario

Formulario en Blanco

Formulario en Blanco
Formulario en Blanco
Formulario en Blanco

Ilustración .33. Ejemplo de un Formulario en blanco.

La clase componente CFormulario es por lo general el centro de toda aplicación. Sobre un formulario colocamos otros elementos, y los podemos utilizar como simples formularios, ventanas, cajas de diálogo o formularios de entrada de datos.

Para mostrar un formulario que no está activo en este momento en nuestra aplicación, utilizamos los métodos Mostrar y MostrarModal (el término modal indica que no se puede seleccionar otras áreas de la aplicación mientras está activo el formulario). El atributo ControlActivo es una apuntador que tiene la dirección del control activo sobre el formulario.

Puede utilizar el método de tratamiento de evento AlCrear para establecer valores iniciales para los atributos y hacer cualquier proceso que se desee ocurra antes que el usuario comience a interactuar con el formulario.

Además de estos atributos y métodos, esta clase tiene todos los atributos y métodos de los controles de Windows pues es un descendiente de la clase CcontrolWindows.

Clase CFormulario viene-de CControlWindows Atributos Apuntador ControlActivo ResultadoModal Métodos Constructor AlCrear Mostrar MostrarModal Destructor

fclase

La clase CAplicación

Todo algoritmo que representa una aplicación utiliza una clase que desciende de CAplicación. Cuando ejecuta su aplicación, se invoca al método Principal. El método Terminar finaliza la ejecución de la aplicación. El atributo FormularioPrincipal es una apuntador que debe tener el valor de la dirección del formulario que aparece como base de la aplicación.

Dado que los entornos actuales existe la propiedad de minimizar y restaurar la aplicación, hemos incluido estos métodos para que puedan invocarse por programación. Así mismo los puede extender para que realice otras acciones aparte.

Podemos especificar cómo se manejarán las excepciones utilizando los métodos ManejarExcepción, AlOcurrirExcepción y MostrarExcepción.

CAplicación tiene varios métodos de tratamiento de eventos que permiten especificar cómo la aplicación procesa la ocurrencia de eventos especiales. Para especificar qué ocurre cuando la aplicación se activa o inactiva utilizamos los métodos AlActivar y AlDesactivar. Cuando la aplicación entra en estado de espera (conocido como idle) podemos especificar que ocurra algo por medio del método AlEsperar.

Además de estos atributos y métodos, el componente CAplicación tiene también los atributos y métodos que se aplican a todos los componentes, pues es un descendiente directo de CComponente. Ejemplo.

Clase CAplicación viene-de CComponente Atributos Arreglo aEntorno nEntorno Apuntador FormularioPrincipal Título Métodos Constructor(aEntorno, nEntorno) Principal Terminar Minimizar Restaurar ManejarExcepción AlOcurrirExcepción MostrarExcepción AlEsperar AlActivar AlDesactivar Destructor fclase

Observe que el método constructor tiene dos parámetros: aEntorno y nEntorno. Estos son respectivamente un arreglo de cadenas de texto y un número respectivamente. Contienen los parámetros que nos envía el entorno del sistema y el número de parámetros que estamos recibiendo.

El siguiente ejemplo es un uso muy sencillo de esta clase. El objetivo de esta aplicación

es mostrar un mensaje en la pantalla.

Clase CMiAplicación viene-de CAplicación Métodos Constructor(aEntorno, nEntorno) Principal

fclase

Método Constructor(aEntorno, nEntorno) de CMiAplicación Heredado Constructor(aEntorno, nEntorno) Título <-- ‘Aplicación de Ejemplo’ FormularioPrincipal <-- Nulo fmétodo

Método Principal de CMiAplicación heredado Principal MostrarMensaje(‘Pertenezco a la clase CMiAplicación’) fmétodo

Observe que nosotros estamos creando un descendiente de la clase CAplicación, pero en ningún momento estamos creando una instancia de CMiAplicación. Estos es debido

a que estamos utilizando el concepto de que el sistema es quien ejecuta nuestra

aplicación, y por tanto la creación de la instancia y la llamada a los métodos Constructor

y Principal depende del sistema, no del programador. En la implantación no siempre ocurre lo mismo. Algunas herramientas cuentan con un programa principal que necesita que creemos la instancia de la aplicación y llamemos a los métodos Constructor y Principal (o sus equivalentes).

Tratamiento de Eventos

Los eventos son parte importante de las clases, aunque el desarrollador por lo general no necesita mayor esfuerzo con ellos. Un evento es un enlace entre una ocurrencia en el sistema (como una acción del usuario o un cambio en el foco) a la que una clase podría necesitar responder y una sección de código que responde a esa ocurrencia. El bloque de código de respuesta es el gestor del evento, y mayormente lo escribe el creador de la clase.

Al utilizar los eventos, los desarrolladores de aplicaciones pueden personalizar el comportamiento de las clases sin tener que cambiar las clases en sí. Como creadores de clases, utilizamos los eventos para que los desarrolladores de aplicaciones personalicen el comportamiento de nuestras clases.

Los eventos para la mayoría de las acciones del usuario (como por ejemplo las acciones del ratón) ya están incorporadas en las clases predefinidas de nuestro lenguaje, pero proporcionamos los mecanismos para definir nuevos eventos y asociarlos con las clases.

En nuestro lenguaje de pseudocódigo, las clases predefinidas tiene incorporados métodos que responden a cietros eventos estándares. Por ejemplo la clase CBotónAcción tiene un método AlClic. La capa de administración de eventos es el conjunto de mecanismos que toda herramienta de desarrollo orientada a objetos y eventos tiene y que debemos suponer como existente. El lenguaje de pseudocódigo proporciona los mecanismos para la escritura del código que responde a los eventos, pero es durante la ejecución que se va transfiriendo el control a los métodos correspondientes, y esta labor la realiza la capa de administración de eventos, la cual está fuera del contexto de nuestro lenguaje.

Implantar eventos estándar

Eventos estándar para todos los controles

Los eventos básicos se definen en la clase CControl. Todos los controles, sean de Windows, gráficos o personalizados, heredan estos eventos. La siguiente tabla lista los eventos disponibles para todos los controles:

Evento

Ocurre cuando

Método asociado

Clic

El usuario presiona una vez el botón izquierdo del ratón.

AlClic

DobleClic

El usuario presiona dos veces seguidas el botón izquierdo del ratón.

AlDobleClic

ArrastrarSoltar

El usuario arrastra el objeto con el ratón.

AlArratrarSoltar

FinArrastrar

Finaliza la oparción de arrastrar, es decir, suelta el ratón.

AlFinArrastrar

MoverRatón

Se desplaza por la pantalla el puntero del ratón.

AlMoverRatón

ArratrarSobre

El puntero del ratón está pasando sobre un objeto.

AlArrastrarSobre

UndirRatón

Presionar el botón del ratón.

AlUndirRatón

SoltarRatón

Levantar el dedo del botón del ratón.

AlSoltarRatón

Tabla .10. Eventos estándar comunes a las Clases componentes.

Todos los eventos estándar tienen sus correspondientes métodos declarados en la clase CControl, con el mismo nombre que el evento, pero precedidos por el prefijo Al.

Aquí expresamos de otra manera lo anteriormente dicho:

Clase CControl viene-de CComponente Métodos AlClic AlDobleClic AlArrastrarSoltar AlMoverRatón AlArrastrarSobre AlUndirRatón AlSoltarRatón

fclase

Eventos estándar para los controles estándar

Además de los eventos comunes a todas las clases de componentes, los controles estándar (de Windows) tiene los siguientes eventos:

Evento

Ocurre cuando

Método asociado AlEntrar

Entrar

se pasa el foco al componente

SoltarTecla

el usuario deja de presionar una tecla

AlSoltarTecla

UndirTecla

el usuario realiza presión sobre una tecla

AlUndirTecla

PresionarTecla

la combinación de las dos anteriores

AlPresionarTecla

Salir

perder el foco

AlSalir

Tabla .11. Eventos de las Clases componentes estándar.

Al igual que los eventos estándar de la sección anterior, los eventos para los controles de Windows (CControlWindows) tiene sus métodos correspondientes.

Clase CControlWindows viene-de CControl Métodos AlEntrar AlSoltarTecla AlUndirTecla AlPresionarTecla AlSalir

fclase

Eventos clave

Clase

Evento

Ocurre cuando

CEdición

Cambiar

El usuario modifica el texto en la Caja.

CBotónAcción

Clic

El usuario hace clic sobre el Botón.

CCasilla

Clic

El usuario hace clic sobre la Casilla de Verificación.

CBotónRadio

Clic

El usuario hace clic sobre el Botón de radio

Tabla .12. Eventos clave para las Clases componentes.

De todos estos eventos clave, el único que no está ya contemplado por las clases es el evento Cambiar. Para este evento, el método asociado en la clase CEdición sería AlCambiar.

Excepciones

Una excepción es por lo general una condición de error u otro evento que interrumpe el flujo normal de ejecución en una aplicación. Cuando se provoca una excepción, ésta hace que el control se transfiera del punto actual de ejecución a un gestor de excepciones. El soporte de manejo de excepciones del lenguaje de pseudocódigo proporciona una manera estructurada de separar la lógica normal del algoritmo de la lógica de manejo de errores, facilitando así el mantenimiento y fortaleciendo la solución.

Para representar las excepciones optamos por utilizar objetos. Las ventajas principales son:

Las excepciones se pueden agrupar en jerarquías utilizando la herencia.

Se pueden introducir nuevas excepciones sin afectar el código existente.

Un objeto de excepción puede llevar información (como un mensaje de error o un código de error) desde el punto donde se provocó hasta el punto donde se maneja.

Las excepciones se manejan con las sentencias ProtegerExcepción.

Protección de Sentencias

Las excepciones se manejan usando la sentencia ProtegerExcepción.

Proteger lista de sentencias protegidas Excepción Bloque de excepciones Sino Bloque a ejecutar cuando no coincide con las listadas fproteger

Una sentencia ProtegerExcepción ejecuta las sentencias en la lista de sentencias en orden secuencial. Si las sentencias se ejecutan sin que se provoquen excepciones, el bloque de excepciones se ignora, y el control se pasa a la sentencia que sigue a la palabra reservada fproteger que finaliza la sentencia ProtegerExcepción.

Tratamiento de Excepciones

Cuando identificador-clase-excepción Hacer Secuencia de acciones para tratar la excepción fcuando

El bloque de excepciones en la sección Excepciónfproteger define los manejadores de excepciones para la lista de sentencias protegidas. Un manejador de excepciones sólo se puede invocar por una sentencia Provocar ejecutada en el la lista de sentencias protegidas o por un método invocado en la lista de sentencias protegidas.

Cuando se provoca una excepción, el control se transfiere al manejador más próximo que puede tratar las excepciones de esa clase. La búsqueda de un manejador de excepción se inicia con la sentencia ProtegerExcepción ingresada más recientemente y de la que aún no hemos salido. Si esa sentencia ProtegerExcepción no puede tratar la excepción, se examina la siguiente sentencia ProtegerExcepción a la que se ha ingresado recientemente. La propagación de la excepción continúa hasta que se encuentra el manejador adecuado, o hasta que no hay más sentencias ProtegerExcepción. En el último caso se emite un mensaje de error y el algoritmo finaliza.

Para determinar si el bloque de excepción de una sentencia ProtegerExcepción

puede manejar una excepción en especial, los manejadores Cuandofcuando se examinan en orden de aparición. El primer manejador de excepciones que lista la clase excepción o la clase base de la excepción se considera una coincidencia. Si un bloque de excepción contiene una parte Sino y si ninguno de los manejadores de excepciones

una

Cuandofcuando concuerda

coincidencia. Un bloque de excepciones que contiene sólo una lista de sentencias se

considera una coincidencia para cualquier excepción.

con

la

excepción, la parte

Sino se

considera

Luego de la ejecución de un manejador de excepciones, el objeto se destruye automáticamente invocando al método Destructor, y así el control se pasa a la sentencia que sigue a la palabra clave fproteger la cual finaliza la sentencia Protegerfproteger.

En el siguiente ejemplo, el primer Cuandofcuando maneja la excepción de división por cero y el segundo maneja la excepción de sobreflujo.

Proteger

Excepción Cuando CDivisiónPorCero Hacer ManejarDivisiónPorCero fcuando Cuando CSobreflujo Hacer ManejarSobreflujo fcuando fproteger

Un

declaración de un objeto excepción en vez de sólo el identificador de la clase. Así podemos utilizar esta instancia dentro de las sentencias del bloque Cuandofcuando. Por ejemplo

la

manejador

Cuandofcuando

puede

especificar

opcionalmente

especificar

Proteger

Excepción Cuando Objeto E ejemplar-de CExcepción Hacer MostrarMensaje(ObtenerMensaje de E) fcuando fproteger

El ámbito de un identificador de objeto que se declara en un manejador de excepción son las sentencias que están dentro del Cuandofcuando.

Si la sentencia Protegerfproteger especifica una parte Sino, entonces cualquier excepción que no se trata en los manejadores Cuandofcuando será tratada por la parte Sino. Por ejemplo

Proteger

Excepción Cuando CDivisiónPorCero Hacer ManejarDivisiónPorCero

fcuando Cuando CSobreflujo Hacer ManejarSobreflujo fcuando Sino ManejarOtras fproteger

Un bloque de excepción que no contiene manejadores Cuandofcuando, pero contiene un grupo de sentencias, manejará todas las excepciones.

Proteger

Excepción

ManejarExcepción

fproteger

Aquí cualquier excepción que ocurra como resultado de la ejecución de las sentencias de las sentencias entre Proteger y Excepción serán manejadas por el método ManejarExcepción.

Generación manual de Excepciones

Una excepción se provoca con la sentencia Provocar.

Provocar identificador-objeto-excepción

El argumento de la sentencia Provocar debe ser un objeto. Cuando se provoca una excepción, la lógica de tratamiento de excepciones toma se apropia del objeto excepción. Una vez que la excepción se maneja, el objeto excepción se destruye automáticamente invocando a su destructor. Nosotros no debemos tratar de destruir manualmente el objeto excepción.

Método IngresarNúmero (Número, Mín, Máx) de Biblioteca EErrorRango ejemplar-de CErrorRango Leer(Número) Si (Número < Mín) o (Número > Máx) entonces

Provocar EErrorRango

fsi

fmétodo

Excepciones predefinidas

// llama al constructor

Para el lenguaje de pseudocódigo propuesto hemos definido ciertas clases de excepción, incluyendo una clase CExcepción que sirve de raíz para todas las clases de excepción. Debemos tomar en cuenta que al tratarse de un lenguaje para especificar algoritmos, hay ciertas excepciones que no aparecerán a este nivel (por ejemplo las de acceso a direcciones de memoria inválida).

Clase CExcepción viene-de CObjeto Atributos Mensaje ContextoDeAyuda Métodos Constructor(UnMensaje, UnContextoDeAyuda) ObtenerMensaje --> ObtenerContextoDeAyuda --> fclase

La clase CExcepción establece dos propiedades, Mensaje y ContextoDeAyuda, que todo objeto de excepción hereda. Esto significa que cualquier objeto de excepción cualquiera puede por lo menos proporcionar un mensaje descriptivo de la condición de excepción y posiblemente un contexto de ayuda que haga referencia a una ayuda del tópico.

A continuación se listan las excepciones que contempla el lenguaje de pesudocódigo y las situaciones en que se pueden provocar. A menos que se especifique otra cosa, las excepciones son descendientes directos de Cexcepción.

Clase de Excepción CSinMemoria

Descripción

Surge cuando no hay suficiente memoria para una operación en particular.

CErrorES

Surge cuando una operación de entrada/salida genera un error.

CErrorMatemático

La clase padre de todas las excepciones de operaciones matemáticas.

CDivisiónPorCero

Surge cuando se intenta una división que tiene por divisor un valor de cero. Desciende de CErrorMatemático.

CSobreflujo

Surge cuando una operación produce un sobreflujo (overflow). Está más orientada a la implantación, pero es tan frecuente que cabe su inclusión. Desciende de CErrorMatemático.

CSobreflujoDePila

Aparece cuando la pila de nuestra aplicación no puede expandirse, o si el tamaño de la pila alcanza su límite superior. Esta excepción presupone un límite en la pila, una restricción física, pero su frecuencia amerita incluirla.

Tabla .13. Clases derivadas de CExcepción.

Objetos Especiales

Arreglos

Los arreglos tienen un número fijo de componentes del mismo tipo de valor.

Declarar

Para declarar un arreglo en el pseudocódigo, necesitamos especificar un nombre o identificador para el arreglo. Así mismo tenemos que indicar el rango de valores para cada una de las dimensiones del arreglo. Para indicar el rango de valores de uno de los subíndices, simplemente especificamos los límites inferior y superior del rango y colocamos entre ellos puntos suspensivos ( ). El número de elementos del arreglo es el producto de los valores máximos de cada subíndice.

nomb_de_arreglo [ Dimensión rango1, CArreglo

Por ejemplo:

, rangon ] Ejemplar-de

aMatriz1 Dimensión 1…10, 1…20 Ejemplar-de Carreglo

Aquí definimos un arreglo llamado aMatriz1 cuyo número de elementos es 10*20. Noten que estamos colocando el prefijo a en el nombre del arreglo, lo que indica que el identificador corresponde a un arreglo.

Referencia

Podemos acceder a uno de los componentes proporcionando el identificador del arreglo con el índice correspondiente encerrado entre corchetes. Si no incluimos la referencia a un componente en particular, el identificador del arreglo referencia a la totalidad de éste.

nombre_de_arreglo [índice] // Un elemento del arreglo

nombre_de_arreglo

// Todo el arreglo

En el siguiente ejemplo mostramos el uso de ambas posibilidades.

aAlumnoA Dimensión 1…20, 1…10 Ejemplar-de CArreglo aAlumnoB Dimensión 1…10 Ejemplar-de CArreglo aAlumnoC Dimensión 1…10 Ejemplar-de CArreglo

aAlumnoC <-- aAlumnoB

aAlumnoA[5] <-- aAlumnoB // referencia global a una dimensión aAlumnoA[3, 2] <-- ‘Arturo López’// referencia a un componente

// referencia a todo el arreglo

Iteración sobre colecciones

Para el caso de las colecciones de elementos, se utiliza una variante de la sentencia para, la cual especifica cómo se identificará al elemento actual en cada iteración y a la colección que se recorrerá.

La sintaxis es la siguiente.

para cada IdentificadorElemento en IdentificadorColección hacer Secuencia de “n” acciones fpara

Por ejemplo:

objeto arregloPersonas ejemplar-de CArregloPersonas

para cada persona en arregloPersonas hacer Escribir(persona.obtenerNombre) fpara

Apuntadores

Los apuntadores son variables que almacenan un tipos especial de valor: direcciones de memoria. En esas direcciones se guardan valores relevantes para nuestro algoritmo.

Reservar espacio

La operación de reservar espacio para el apuntador podría compararse con la acción de declarar al sistema que el identificador especificado se referirá a un apuntador.

Reservar identificador_apuntador | Reservar identificador_apuntador*Cantidad_Elementos

La sentencia Reservar asigna un bloque de memoria libre para el apuntador y almacena la dirección de ese bloque en el apuntador. Cuando se desea reservar un arreglo de bloques contiguos de memoria, se multiplica por la cantidad de bloques requeridos. La palabra reservada nulo denota un valor que significa que nuestra variable apunta a ninguna parte.

Asignar valor

Reservar pCuenta pCuenta <-- nulo

// Reserva espacio para el apuntador // apunta a ninguna parte

Los apuntadores pueden recibir direcciones como valores válidos. Para obtener la dirección de una variable basta con colocar el símbolo @ antes del identificador de la variable y esto denotará su dirección de memoria. Otra manera de asignar valor es colocar direcciones específicas ya sea en notación decimal o hexadecimal (ambas muy conocidas por nosotros), o en su defecto utilizando nulo.

identificador_apuntador <-- @ identificador ó identificador_apuntador <-- expresión_de_dirección

Liberar espacio

La sentencia Liberar nos permite devolver al sistema el bloque de memoria que fuera asignado al apuntador con la sentencia Reservar.

Liberar identificador_apuntador

Por ejemplo:

Liberar pCuenta

Acceder al valor apuntado

// Libera la memoria asignada a pCuenta

Para poder acceder al bloque de memoria apuntado, se utiliza el operador delante del nombre del apuntador.

identificador_apuntador <-- valor

Por ejemplo:

pCuenta <-- '15307863'

Desplazamiento con apuntadores

En los casos de apuntadores a arreglos de bloques, para avanzar a un bloque específico del arreglo se utiliza la siguiente sintaxis, se incrementa el valor del apuntador en la cantidad de posiciones que se desea desplazar.

identificador_apuntador <-- identificador_apuntador + n

Por ejemplo:

pNumeros <-- pNumeros + 15 // Se desplaza 15 bloques

Estructuras

A fin de cubrir la existencia de tipos estructura existentes en algunos lenguajes (struct en C++ o C#), oLoop permite la declaración de estructuras, muy similares a las clases, pero con la diferencia de que no poseen constructor ni son capaces de participar en una jerarquía. Son básicamente un tipo de valor compuesto para declaración de variables, más que una clase que pueda aceptar creación de instancias.

La sintaxis para declarar estructuras se presenta a continuación.

Estructura IdentificadorEstructura

Atributos IdentificadorAtributo { IdentificadorAtributo } Métodos secuencia de “m” declaraciones de métodos festructura

Por ejemplo:

Estructura SFigura Atributos Largo Ancho Objeto Lápiz ejemplar-de CLápiz Objeto Brocha ejemplar-de CBrocha Métodos ObtenerLargo --> ObtenerAncho --> ColocarLargo(NuevoLargo) ColocarAncho(NuevoAncho)

festructura

Para declarar variables de estructura, se utiliza la siguiente sintaxis.

identificador_variable ejemplar-de IdentificadorEstructura

Por ejemplo:

Estructura SInformaciónPedido Atributos NúmeroPedido FechaPedido festructura

informaciónPedido ejemplar-de SInformaciónPedido informaciónPedido.NúmeroPedido <-- 450

Enumeraciones

En muchos lenguajes de programación se implementa el concepto de enumeraciones o tipos enumerados. En oLoop se puede declarar tipos para enumeraciones con la siguiente sintaxis.

Enumeración IdentificadorEnumeración [ valor1 {, valor2, , valorN }]

Enumeración EEstadoPedido [ PENDIENTE, APROBADO, RECHAZADO ]

Para declarar una variable de un tipo enumerado, se utiliza la siguiente sintaxis.

identificador_variable ejemplar-de IdentificadorEnumeración

Por ejemplo:

pedido ejemplar-de EEstadoPedido pedido <-- EEstadoPedido.Pendiente

Interfaces

Para declarar interfaces en oLoop se utiliza la siguiente sintaxis.

Interfaz IdentificadorInterfaz Atributos IdentificadorAtributo { IdentificadorAtributo } Métodos secuencia de “m” declaraciones de métodos finterfaz

IdentificadorMétodo [ ( ListaFormalParámetros ) ] [ --> ] [ virtual | virtual abstracto | sobreescribir | sobrecargar ]

ListaFormalParámetros Identificador }

--> [ @ ] Identificador {, [ @ ]

Por ejemplo:

Interfaz IManejadorCliente Métodos obtenerInstancia -> registrarCliente(cliente) ->

fclase

Para declarar que una clase implementa una interfaz, se utiliza la siguiente sintaxis.

Clase IdentificadorClase implementa IdentificadorInterfaz Atributos IdentificadorAtributo { IdentificadorAtributo } Métodos secuencia de “m” declaraciones de métodos

fclase

Por ejemplo:

Clase CClienteNegocio implementa IManejadorCliente Metodos obtenerInstancia -> registrarCliente(cliente) ->

fclase

Método CClienteNegocio.obtenerInstancia -> Objeto cliente ejemplar-de CClienteNegocio cliente.constructor retornar cliente fmétodo

Método CClienteNegocio.registrarCliente(cliente) IAccesoDatos facade = InfraestructuraFacade.obtenerInstancia retornar facade.insertarCliente( cliente.obtenerCodigo, cliente.obtenerNombre, cliente.obtenerUsuario, cliente.obtenerContrasena,

cliente.obtenerCorreo,

cliente.obtenerTelefono,

cliente.obtenerFax,

cliente.obtenerPais)

Archivos

fmétodo

oLoop permite el uso de archivos secuenciales o aleatorios. Para ello cuenta con la clase predefinida CArchivo. Esta clase encapsula la funcionalidad genérica para el manejo de archivos. La declaración de la clase CArchivo se especifica a continuación.

Clase CArchivo Atributos Nombre Ruta ModoAcceso

Tipo

// Nombre del archivo // Ruta de directorio del archivo // 'Lectura' | 'Escritura' | // 'Lectura-Escritura' | 'Adición' // 'Secuencial' | 'Aleatorio'

Métodos Crear -> Abrir -> Cerrar -> Leer -> Leer(pPosicion) -> Escribir(Objeto) Escribir(Posicion, Objeto) ObtenerNombre -> ColocarNombre(NuevoNombre) ObtenerRuta -> ColocarRuta(NuevaRuta) ObtenerModoAcceso -> ColocarModoAcceso(NuevoModoAcceso) ObtenerTipo -> ColocarTipo(NuevoTipo) FinDeArchivo ->

fclase

Ejemplos de uso de oLoop

Declaración de Clases y Métodos

El siguiente ejemplo ilustra de manera sencilla la declaración de una Clase. Definimos una clase Punto, que entendemos por un pixel en la pantalla. Para definirlo necesitamos sus coordenadas X e Y.

Clase CPunto Atributos

X

Y

Métodos

ObtenerX

ObtenerY

Constructor(NuevoX, NuevoY)

fclase

Implantación de Métodos

Continuando con nuestro ejemplo del punto, demostramos como declarar las definiciones de los métodos de la clase arriba definida.

Método CPunto.Constructor(NuevoX, NuevoY)

X <-- NuevoX

Y <-- NuevoY

fmétodo

Método CPunto.ObtenerX Retornar X fmétodo

Método CPunto.ObtenerX Retornar Y fmétodo

Herencia y Extensión de Clases

En este ejemplo que presentamos a continuación aplicaremos el mecanismo de la herencia para extender la clase CPosición.

Clase CPosición

Atributos

X

Y

Métodos

Constructor(NuevoX, NuevoY)

ObtenerX -->

ObtenerY -->

fclase

Clase CPunto viene-de CPosición

Atributos

Visible

Métodos

Constructor(NuevoX, NuevoY)

Mostrar

Ocultar

ObtenerVisible

MoverHacia(QueX, QueY)

fclase

// Métodos de la Clase CPosición

Método CPosición.Constructor(NuevoX, NuevoY)

X <-- NuevoX

Y <-- NuevoY

fmétodo

Método CPosición.ObtenerX Retornar X fmétodo

Método CPosición.ObtenerY Retornar Y fmétodo

// Métodos de la Clase CPunto Método CPunto.Constructor(NuevoX, NuevoY) Heredado Constructor(NuevoX, NuevoY) Visible <-- Falso fmétodo

Método CPunto.ObtenerVisible Retornar Visible fmétodo

Método CPunto.Mostrar Visible <-- Verdadero DibujarPixel(X, Y, ObtenerColorPrimerPlano) // Dibuja un pixel en la pantalla (blanco sobre negro) fmétodo

Método CPunto.Ocultar Visible <-- Falso DibujarPixel(X, Y, ObtenerColorFondo) // Dibuja un pixel en la pantalla (negro sobre negro) fmétodo

Método CPunto.MoverHacia(QueX, QueY)

Ocultar

X <-- QueX

// Oculta el punto

// Asigna las nuevas coordenadas

Y <-- QueY

Mostrar

fmétodo

// Muestra el punto

// La clase CCírculo será un hijo de CPunto. Clase CCírculo viene-de CPunto

Atributos

Radio

Métodos

Constructor(NuevoX, NuevoY, NuevoRadio) Mostrar Ocultar Expandir MoverHacia Contraer

fclase

Método CCírculo.Constructor(NuevoX, NuevoY, NuevoRadio) Heredado Constructor(NuevoX, NuevoY) Radio <-- NuevoRadio fmétodo

Método CCírculo.Mostrar Visible <-- Verdadero DibujarCírculo(X, Y, Radio, ObtenerColorPrimerPlano) // Dibuja un círculo en la pantalla (blanco sobre negro) fmétodo

Método CCírculo.Ocultar Visible <-- Falso DibujarCírculo(X, Y, Radio, ObtenerColorFondo) Dibuja un círculo en la pantalla (negro sobre negro) fmétodo

//

Método CPunto.MoverHacia(QueX, QueY)

Ocultar

X <-- QueX

Y <-- QueY

Mostrar

fmétodo

Método CCírculo.Expandir(FactorExpansión)

Ocultar

Radio  Radio + FactorExpansión

Mostrar

fmétodo

Método CCírculo.Contraer(FactorContracción) Expandir(-FactorContracción) fmétodo

Método CCírculo.MoverHacia(QueX, QueY)

Ocultar

X <-- QueX

Y <-- QueY

Mostrar

fmétodo

Este sencillo ejemplo nos muestra la simulación de una pequeña (muy pequeña) conversación entre dos objetos de la Clase CPersona.

Clase CSegmento

Atributos

Lugar

nuSegmento

Métodos

Constructor(NuevoSegmento, NuevoLugar) ImprimirEncabezado

Acción

ImprimirCorte

fclase

Método CSegmento.Constructor(NuevoNúmero, NuevoLugar) Lugar <-- NuevoLugar nuSegmento <-- NuevoSegmento fmétodo

Método CSegmento.ImprimirEncabezado LíneaTexto <-- ‘Segmento # ‘ + nuSegmento + ‘ ‘ + Lugar Escribir(LíneaTexto) fmétodo

Método CSegmento.Acción fmétodo

Método CSegmento.ImprimirCorte Escribir(‘------------------‘) fmétodo

Clase CPersona Atributos nmPersona

// Nombre de persona

LíneaEtiqueta Métodos Constructor(NuevoNombre, NuevaLínea) ColocarLíneaEtiqueta(QueLínea) ObtenerLíneaEtiqueta --> Decir(Línea)

fclase

Método CPersona.Constructor(NuevoNombre, NuevaLínea) nmPersona <-- NuevoNombre LíneaEtiqueta <-- NuevaLínea fmétodo

Método CPersona.ObtenerLíneaEtiqueta Retornar LíneaEtiqueta fmétodo

Método CPersona.ColocarLíneaEtiqueta(QueLínea) LíneaEtiqueta <-- QueLínea fmétodo

Método CPersona.Decir(Línea) LíneaTexto <-- nmPersona + ‘: ”’ + Línea + ‘”’ Escribir(LíneaTexto) fmétodo

Clase CDiálogo viene-de CSegmento Atributos Objeto PersonaA ejemplar-de CPersona Objeto PersonaB ejemplar-de CPersona Métodos Constructor(NuevoNúmero, NuevaLínea, nmActor1, nmActor2)

Acción

Saludos

Conversar

Despedirse

fclase

Método CPersona.Constructor(NuevoNúmero, NuevoLugar, nmActor1,

nmActor2)

Heredado Constructor(NuevoNúmero, NuevoLugar) PersonaA.Constructor(nmActor1, ‘’) PersonaB.Constructor(nmActor2, ‘’) fmétodo

Método CDiálogo.Acción

Agradecimientos

Conversar

Despedirse

fmétodo

Método CDiálogo.Saludos PersonaA.Decir(‘Hola’) PersonaB.Decir(‘Que tal’) PersonaA.ColocarLíneaEtiqueta(‘Si que hace calor’) PersonaB.ColocarLíneaEtiqueta(‘Y que lo digas’) fmétodo

Método CDiálogo.Conversar PersonaA.Decir(PersonaA.ObtenerLíneaEtiqueta) PersonaB.Decir(PersonaB.ObtenerLíneaEtiqueta) fmétodo

Método CDiálogo.Despedirse PersonaA.Decir(‘Chau’) PersonaB.Decir(‘Nos vemos’) fmétodo

Bibliografía

VOSS, Greg (1994); Programación Orientada a Objetos: Una Introducción., McGraw Hill, México. Orig. Object-Oriented Programming: An Introduction.

BUDD, Timothy (1994); Introducción a la Programación Orientada a Objetos. Addison Wesley Iberoamericana. Wilmington, Delaware.

GALLARDO OTERO, Manuel - PÉREZ CABREL, Teodomiro (1995); Estructura de Datos: Un enfoque Algorítmico. Lima. Universidad Nacional Mayor de San Marcos - Facultad de Ciencias Matemáticas, Escuela Académico Profesional de Computación.

HEKMATPOUR, Sharam (1992); C++ : Guía para Programadores en C. México. Prentice Hall Inc.

WEISKAMP, Keith - HEINY, Loren - FLAMING, Bryan (1993); Programación Orientada a Objetos con Turbo C++. México. Editorial Limusa S.A. de C.V. Grupo Noriega Editores.

RUBENKING, Neil (1995); Delphi Programming Problem Solver. IDG Books Worldwide Inc. ISBN 1-56884-795-5.

Sugerencias para la escritura de Pseudocódigo

Indentación

Para facilitar la comprensión, lectura y revisión del pseudo-código, se creó el concepto de indentación en la escritura de los mismos. Esta consiste en el desplazamiento hacia la derecha de un subconjunto de la secuencia de acciones. Aunque los bloques están

fsi , etc.). Es recomendable desplazar dos o

tres posiciones el bloque para facilitar la comprensión del flujo lógico.

denotados por palabras subrayadas, ( Si

Idioma de Trabajo

La nomenclatura de identificadores de variables, acciones, funciones, estructuras, etc., debe estar regida por un idioma único para lograr la uniformidad en el pseudo-código. Esto produce una sensación de armonía y ayuda a la fácil comprensión del mismo. Algunos autores utilizan el idioma inglés porque les brinda mayor versatilidad en la nomenclatura (una expresión en español puede significar una sola palabra en inglés) o armonía con el lenguaje de programación en que implementarán el pseudo-código. Otros prefieren el español por comodidad y para lograr una mayor claridad y comprensión por parte del lector. Para elegir el idioma de nomenclatura debe tenerse en cuenta la comodidad personal, el grado de difusión del pseudo-código (en el caso de trabajo en grupo o para presentarlo a terceros) y la fluidez que poseemos sobre un idioma. Esta última nos permitirá utilizar el término exacto que ayude a captar el significado del valor, acción o función.

Notación de Identificadores

Los identificadores son cadenas de texto que permiten hacer referencia a valores determinados. Muchas veces, por falta de costumbre o por "rapidez", no aprovechamos las propiedades informativas de los identificadores. El nombre de una variable nos puede dar información sobre el significado del valor al que referencia (nombre de una persona, contador, acumulador de totales, etc.), el tipo de valor (numérico, cadena de caracteres, estructura, etc.) o la categoría de valor (posibles estados civiles por ejemplo).

Uso de mayúsculas y minúsculas en Identificadores

El uso de mayúsculas y minúsculas nos brinda un mayor rango de posibilidades en la notación y además incrementa la legibilidad del identificador. Es mas claro escribir ClaseDeDato que CLASEDEDATO, u ObtenerCodigoDeFactura que OBTENERCODIGODEFACTURA.

Notación Húngara

Un tipo de notación muy conocida en el ambiente informático es el de la notación húngara, en el cual una letra denota el tipo de valor con que trabaja la variable, así:

Prefijo

Descripción

Ejemplo

b

Valor booleano

bEsCasado

n

Valor numérico

nEdad

a

Arreglo o Matriz

aAlumnos

ch

Carácter

chRespuesta

c

Cadena de caracteres

cNombre

p

Apuntador

pNodo

S

Estructura

SPersona

m_

Miembro de la Estructura

m_cNombre

Tabla .14. Ejemplo de uso de Prefijos.

Notación de Constantes

Para la notación de constantes, es decir identificadores asociados a valores que no cambian en el tiempo, existen la notación de prefijos, que consiste en la utilización de uno o dos caracteres que se anteponen al identificador e indican el tipo de valor (con respecto al significado) asociado. Por ejemplo:

Prefijo

Descripción

Ejemplo

ec

Tipo de Estado Civil

ecSoltero, ecCasado,

ev