50
Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintos la introducción de ambigüedad 1. Objetos y estructurado, dos pensamientos distintos Índice 1. Objetos y estructurado, dos pensamientos distintos....1 Sobre el capítulo.....................................2 Motivaciones........................................2 Objetivos...........................................2 Contenido...........................................2 1.1 El enfoque estructurado, una manera de pensar el software................................................3 Ejemplo, pintar un círculo............................3 Un programa estructurado para pintar un círculo.......7 Ampliar la solución, pintar varios círculos y recordarlos........................................... 9 Ampliar el programa, pintar varios círculos..........12 1.2 Los objetos, otra manera de pensar el software.....14 Una solución orientada a objetos para pintar varios círculos............................................. 19 Definición de los conjuntos de objetos.............19 Definición de las operaciones......................20 La orden de inicio.................................21 Un programa orientado a objetos para pintar varios círculos............................................. 23 1.3 Recapitulando, contrastes y semejanzas.............27 La diferencia de pensamiento, de conceptos.........27 La diferencia de organización. La alotropía........28 La diferencia para expresar ambigüedad.............29 Ninguno es más natural que otro....................32 Se amplía la idea de variable software, pero…......32 El dilema de las bases de datos....................33 1

01Curso OO Objetos ObjetosYEstructurado

  • Upload
    nenus1

  • View
    233

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

1. Objetos y estructurado, dos pensamientos distintos

Índice

1. Objetos y estructurado, dos pensamientos distintos......................................................1Sobre el capítulo........................................................................................................2

Motivaciones.........................................................................................................2Objetivos................................................................................................................2Contenido..............................................................................................................2

1.1 El enfoque estructurado, una manera de pensar el software...................................3Ejemplo, pintar un círculo.........................................................................................3Un programa estructurado para pintar un círculo......................................................7Ampliar la solución, pintar varios círculos y recordarlos..........................................9Ampliar el programa, pintar varios círculos............................................................12

1.2 Los objetos, otra manera de pensar el software.....................................................14Una solución orientada a objetos para pintar varios círculos..................................19

Definición de los conjuntos de objetos................................................................19Definición de las operaciones..............................................................................20La orden de inicio................................................................................................21

Un programa orientado a objetos para pintar varios círculos..................................231.3 Recapitulando, contrastes y semejanzas................................................................27

La diferencia de pensamiento, de conceptos.......................................................27La diferencia de organización. La alotropía........................................................28La diferencia para expresar ambigüedad.............................................................29Ninguno es más natural que otro.........................................................................32Se amplía la idea de variable software, pero…...................................................32El dilema de las bases de datos............................................................................33

1

Page 2: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Sobre el capítulo

Motivaciones

En el mundo software, por lo general, se acostumbra a cambiar de lenguaje de programación sin cambiar de forma de pensar el software. Siguiendo esta costumbre los objetos se perciben como otro cambio más de lenguaje. Es decir, como lo mismo que antes, pero con ropaje (sintaxis) distinto. Sin embargo, no es así. Los objetos son una manera cualitativamente distinta de pensar el software. Este hecho se ignora o se confunde porque el arraigo del pensamiento estructurado, en términos de funciones y datos, se niega a cambiar de perspectiva, consciente o inconscientemente. Cualquier idea acerca de los objetos se traduce al terreno estructurado de forma que los objetos se interpretan en términos estructurados y se pierden las ventajas de ambos enfoques.

Objetivos

El presente capítulo contrasta el enfoque de objetos y el enfoque estructurado. Sus objetivos principales son que los alumnos:

1) Comprendan las diferencias principales en forma de pensar el software.

2) Conozcan las diferencias en la capacidad de expresar ambigüedad.

Contenido

La primera parte “El enfoque estructurado, una manera de pensar el software” describe cómo se aborda la solución de un problema, tomando como caso particular el dibujo de figuras geométricas en la pantalla del ordenador.

La segunda parte “Los objetos, otra manera de pensar el software” describe cómo se aborda la solución al mismo problema desde la perspectiva de los objetos.

Y, por último, “Contrastes y semejanzas” se dedica a resumir las cualidades de cada manera de pensar el software y las compara.

2

Page 3: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

1.1 El enfoque estructurado, una manera de pensar el software

Se podría denominar enfoque estructurado a la forma particular de pensar el

software en términos de funciones de transformación de datos. El universo de discurso

se disocia en funciones y datos, y cualquier tarea se interpreta como una transformación

de datos.

Ejemplo, pintar un círculo

Por ejemplo, el enfoque estructurado resuelve el problema de pintar círculos en

la pantalla de la siguiente manera:

1. Utiliza como universo de discurso una definición de círculo que esté acorde con los

recursos del software; en particular, utiliza la expresión algebraica que define los

puntos de un círculo. Figura 1. 1.

R2 ≤ (x – x0)2 + (y – y0)2 [1]

donde el radio R, y las coordenadas del centro x0 e y0 son las constantes que

especifican un círculo en concreto.

Figura 1. 1 Definición algebraica de círculo

2. Disocia la definición de círculo en dos partes y las reinterpreta:

3

R

X0, y0

Círculo

Circunferencia

R2 > (x – x0)2 + (y – y0)2

R2 = (x – x0)2 + (y – y0)2

R2 ≥ (x – x0)2 + (y – y0)2

Page 4: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Considera que las constantes R, x0, y0 son datos para pintar el círculo y añade

uno más, el color del círculo.

Convierte la expresión declarativa [1] en una función operativa que transforma

el conjunto de datos precedentes en el conjunto de datos (x, y, color) de todos

los píxeles para pintar el círculo en la pantalla.

Como resultado final se obtiene un sistema software capaz de pintar un círculo, en

términos de un proceso de transformación de datos. Figura 1.2.

Figura 1.2 Sistema software como una función de transformación de datos

El sistema software se expresa como una función F(x) que transforma el

conjunto de datos “X” (radio, centro y color) de un círculo, en el conjunto de datos “Y”

de puntos (píxeles) que constituyen la figura del círculo en la pantalla: y = f(x). A este

tipo de esquema se le denomina diagrama de flujo de datos.

Detrás del esquema subyace la disociación de la definición algebraica de círculo

y la conversión de la expresión declarativa en un mecanismo de cálculo: la función

software PintarCírculo(R, x0, y0, color), que transforma las constantes del círculo en los

valores de los puntos del círculo en la pantalla.

4

PintarCírculo(R…)

X: {R, x0, y0, C}

puntos del círculo

función de transformación de datos

datos de entrada

datos de salida

F(X)

(x2, y2, color)

(xn, yn, color)

(x1, y1, color)

…Y:

constantes del círculo

Y = F(X)

Page 5: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

El software, en general, apela a la definición algebraica de círculo porque es un

recurso compatible con los medios que dispone; carece de los recursos usuales de la

geometría (compás, cuerda, etc.) para pintar un círculo.

La particularidad del enfoque estructurado consiste en pensar la solución como

una función que transforma datos y disociar la definición algebraica de círculo para que

se acomode a esta forma de pensar.

Si los datos del círculo se deben recibir del exterior del sistema software

entonces se utiliza una función adicional para la recepción y transformación de los

datos. Esta función recibe los datos R’, x0’, y0’, C’, provenientes de los equipos

periféricos (teclado, ratón,…), transforma su formato y los almacena en forma de

variables software: R, x0, y0, C. Figura 1.3.

LeerDatos(R…)

PintarCírculo(R…)

R, x0, y0, C

sistema softwarepuntos del círculo

función

función

almacén de datosR’, x’0, y’0, C’

Figura 1.3 Solución del software estructurado

La Figura 1.3 muestra la síntesis de la función principal del sistema software a

través de dos funciones: LeerDatos(R, x0, y0,C) y PintarCírculo(R, x0, y0,C).

El sistema está formado por las funciones de lectura y de dibujo, y el almacén de

datos del círculo (variables software). Ningún elemento software representa, por sí solo,

el concepto de círculo.

5

Page 6: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Los diagramas de flujos de datos definen la función y el funcionamiento del

sistema software. Es decir, definen que la función del sistema es la transformación de un

conjunto datos de entrada en datos de salida y además, definen cómo se sintetiza esta

función mediante otras funciones. El diagrama de flujo de datos es un esquema

asíncrono (no expresa secuencias); las flechas sólo indican los flujos de datos, no el

orden de ejecución.

Figura 1.4. Definición y síntesis del sistema software

La Figura 1.4 muestra la definición de la función del sistema software en

términos de entrada y salida, y la síntesis de esta función mediante dos funciones. Por

razones históricas, a menudo se utiliza la palabra “análisis” para referirse a esta síntesis.

En términos de pseudocódigo, el sistema software podría expresarse de la

siguiente manera:

Variables: radio, x0, y0, color

LeerDatos (radio, x0, y0, color)

PintarCírculo (radio, x0, y0, color)

La secuencia de ejecución se aprecia directamente de la lectura del

pseudocódigo: primero se leen los datos y después, se pinta el círculo.

6

Definición inicial del sistema software

puntos del círculo

constantes del círculo

F(x)

y

x

puntos del círculo

F(x)y

x

zf1(x)

f2(z)

y = f1(x) + f2(z)

constantes del círculo

Síntesis del sistema software

y = F(x)

Page 7: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Un programa estructurado para pintar un círculo

Los sistemas estructurados se programan en lenguajes estructurados, pero

también se programan en lenguajes de objetos, como Java. Programar en Java no

asegura programar con el enfoque de objetos. A continuación se muestra la

programación del sistema estructurado precedente usando el lenguaje Java. El entorno

gráfico de ventanas distorsiona un poco la simplicidad de la idea de pintar un círculo

porque obliga a trabajar con las ventanas, pero se mantiene la esencia. El pseudocódigo

sería algo así:

Variables: radio, x0, y0, color

CrearVentana

PintarVentana “vacía”

LeerDatos(radio, x0, y0, color) “datos del círculo que se pintará dentro de la ventana”

RepintarVentana “función que invoca a PintarCírculo (radio, x0, y0, color)”

El código completo puede verse en el Anexo. Seguidamente se muestra el

código del programa principal. Las notas en negrita se corresponden con el

pseudocódigo.

import javax.swing.*;import java.awt.*;import java.awt.event.*;

public class PintarCirculoEstructurado extends JFrame { private int centrox, centroy, radio; private Color color; private boolean haydatos=false; public PintarCirculoEstructurado() { } //Asignar el Look&Feel de la ventana private void asignarLookAndFeel() { //Forzar el Look and Feel de la ventana al del sistema operativo String laf = UIManager.getSystemLookAndFeelClassName(); try { UIManager.setLookAndFeel(laf); } catch (UnsupportedLookAndFeelException exc) {System.err.println("Unsupported: " + laf);} catch (Exception exc)

7

Declaramos las variables radio, x0,y0 y color. (A x0 le hemos llamado centrox y a y0 centroy)

haydatos es una variable auxiliar

Función para asignar a la ventana el look&feel o apariencia que tenga el sistema operativo (p.ejm: en Windows las ventanas tienen la barra de títulos en azul con texto en blanco y el panel tiene el fondo gris)

Importamos el API swing de Java para construir interfaces gráficas

Page 8: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

{System.err.println("Error cargando: " + laf);} }

//Incluir botón cerrar ventana private void setCloseClick() { //Controlar el cierre de la ventana addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} });}

public void paint (Graphics g) { super.paint(g); //Si el usuario ha introducido los datos pinta el círculo if (haydatos){ g.setColor(color); g.drawOval(centrox-radio, centroy-radio,2*radio,2*radio); g.fillOval(centrox-radio, centroy-radio,2*radio,2*radio); g.dispose(); } } public static void main(String[] args) {

// 1. Crear la ventana y pintarla vacía PintarCirculoEstructurado ventana = new PintarCirculoEstructurado(); ventana.setTitle("Pintar Circulo Estructurado"); ventana.asignarLookAndFeel(); ventana.setCloseClick(); ventana.setExtendedState(MAXIMIZED_BOTH); ventana.setVisible(true);

// 2. Mostrar el formulario para obtener los datos del circulo FormularioCirculo formulario= new FormularioCirculo(); JDialog dialog=new JDialog(ventana, "Introduzca los datos del circulo", true); dialog.setContentPane(formulario); dialog.pack(); dialog.show(); // 3. Obtener los datos introducidos por el usuario ventana.centrox=formulario.obtenerCentrox(); ventana.centroy=formulario.obtenerCentroy(); ventana.radio=formulario.obtenerRadio(); ventana.color=formulario.obtenerColor(); ventana.haydatos=true;

//4. Repintar la ventana con el circulo ventana.setExtendedState(MAXIMIZED_BOTH); ventana.repaint(); //repaint invoca internamente al método "paint(Graphics g)" } }

8

Función para incluir en la ventana el botón para cerrarla

Función para pintar la ventana. Para usar el API swing, el nombre de la función tiene que ser obligatoriamente “paint(Graphics g)”

Programa principal

CrearVentanaPintarVentana “vacía”

LeerDatos (radio, x0, y0, color)

RepintarVentana

Page 9: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Ampliar la solución, pintar varios círculos y recordarlos

Las consecuencias de la disociación que produce el enfoque estructurado sobre

los elementos del discurso se aprecian mejor cuando se añaden más elementos, por

ejemplo círculos. Ahora se quiere pintar varios círculos y después, actuar sobre ellos de

forma selectiva, digamos borrar el segundo círculo que se pintó.

El sistema para pintar un círculo podría pintar varios círculos si se le añade un

mecanismo de bucle, pero sólo recordaría las constantes (datos) del último círculo

porque los datos se rescribirían unos sobre otros.

Para recordar todos círculos habría que añadir tantas variables como círculos se

quiera recordar con el objetivo de retener cada conjunto de constantes. El siguiente

sistema (expresado en pseudocódigo) es capaz de pintar y recordar dos círculos:

Variables: radio1, x10, y10, color1,

radio2, x20, y20, color2

LeerDatos (radio1, x10, y10, color1)

PintarCírculo (radio1, x10, y10, color1)

LeerDatos (radio2, x20, y20, color2)

PintarCírculo (radio2, x20, y20, color2)

Se leen los datos de un círculo y se pinta el círculo, después se leen los datos del

segundo y se pinta.

El nuevo sistema software es una duplicación del sistema para un círculo. Por

tanto, comparte la misma esencia. El diagrama de flujo de datos sólo ha engrosado el

almacén de datos como se aprecia en la Figura 1.5.

9

Page 10: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Figura 1.5. Solución estructurada para más de un círculo

Gracias a la capacidad de recordar las constantes de varios círculos, el sistema

nuevo permite actuar selectivamente sobre los círculos pintados, por ejemplo borrar,

ampliar y mover, agregando funciones destinadas a tal fin. Para ampliar el segundo

círculo se haría actuar la función Ampliar(zoom, radio, x0, y0, color) sobre las constantes

del segundo círculo (radio2, x20, y20, color2). Para borrar el primero se haría actuar la

función Borrar(radio, x0, y0, color) sobre las constantes del primer círculo.

Y también, gracias a esta capacidad para recordar las constantes de varios

círculos se aprecia mejor la disociación de los círculos. El almacén de datos contiene las

constantes de los círculos en forma de variables software y la función PintarCírculo

contiene el mecanismo para pintar un círculo. Una vez más, a ningún elemento del

sistema se le pueden asociar por completo las propiedades de un círculo en particular.

En general, cualquier concepto que no encaje directamente con dato o función de

transformación de datos tendrá que ser ajustado (distorsionado) para su tratamiento

software desde la perspectiva del enfoque estructurado. El caso de los círculos, sólo es

un caso más. Pero este hecho pasa inadvertido porque el uso frecuente del enfoque

estructurado, o de cualquier otro enfoque, se convierte en unas gafas automáticas que

transforman todo en términos del enfoque habitual, sin tener conciencia de la

transformación.

10

LeerDatos(R…)

PintarCírculo(R…)

sistema software

puntos del círculo

función

función

almacén de datos

R2’, x2’0, y2’0, C2’

R1’, x1’0, y1’0, C1’

R1, x10, y10, C1

R2, x20, y20, C2

Page 11: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

La disociación de los conceptos provoca la mezcla de partes de distintos

conceptos. Por ejemplo, se pueden mezclar datos de círculos, triángulos, rectángulos,

con funciones para pintar cada una de estas figuras. De manera que conviene distinguir,

con nombres diferentes, los datos y las funciones que actúan sobre unos u otros datos.

Figura 1.6.

Figura 1.6. Mezcla de partes de conceptos

Por ejemplo, el color del círculo debe ser Cc, para distinguirlo del color del

rectángulo Cr. Los vértices de los rectángulos deberán denominarse VR, para

distinguirlos de los vértices de los triángulos VT. Las funciones también deberán tener

distintos nombres: PintarCírculo(radio, x0, y0, Cc), PintarRectángulo(VRs, VRi, Cr),

BorrarTriángulo(VT1, VT2, VT3 ), etc.

Pero, como sucede siempre, no todo es malo. La disgregación de los conceptos

en datos y funciones tiene efectos benéficos. Por ejemplo, permite trabajar directamente

con la idea de base de datos o archivo, que existe en el mundo mucho antes de la

informática. La colección permanente de datos desempeña el papel de base de datos.

11

LeerDatosCírculo(R,…)

PintarCírculo(R,…)

sistema software

R, x0, y0, Cc

LeerDatosRectángulo(VRs,…)

PintarRectángulo(VRs,…)

VRs, VRi, Cr

Page 12: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Ampliar el programa, pintar varios círculos

Veamos el código Java del programa para pintar dos círculos. Los cambios sobre

el programa anterior aparecen resaltados en negrita. En las notas, los textos en negrita

corresponden al pseudocódigo.

import javax.swing.*;import java.awt.*;import java.awt.event.*;

public class PintarDosCirculos extends JFrame{ private int centrox1, centroy1, radio1, centrox2, centroy2, radio2; private Color color1, color2; private boolean haydatos1=false; private boolean haydatos2=false; public PintarDosCirculos() { } private void asignarLookAndFeel() { //Forzar el Look and Feel de la ventana al del sistema String laf = UIManager.getSystemLookAndFeelClassName(); try { UIManager.setLookAndFeel(laf); } catch (UnsupportedLookAndFeelException exc) {System.err.println("Unsupported: " + laf);} catch (Exception exc) {System.err.println("Error cargando: " + laf);} } private void setCloseClick() { //Controlar el cierre de la ventana addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} });}

public void paint (Graphics g) { super.paint(g); //Si el usuario ha introducido los datos pintar el circulo1 if (haydatos1){ g.setColor(color1); g.drawOval(centrox1-radio1, centroy1-radio1,2*radio1,2*radio1); g.fillOval(centrox1-radio1, centroy1-radio1,2*radio1,2*radio1); }

//Si el usuario ha introducido los datos pintar el circulo2 if (haydatos2){

12

Declaramos las variables radio1, x10,,y10, y color1 de circulo1 y las variables radio2, x20,,y20, y color2 de circulo2)

Ahora necesitamos dos variables auxiliares haydatos1 y haydatos2.

Page 13: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

g.setColor(color2); g.drawOval(centrox2-radio2, centroy2-radio2,2*radio2,2*radio2); g.fillOval(centrox2-radio2, centroy2-radio2,2*radio2,2*radio2); } g.dispose(); } public static void main(String[] args) { // 1. Crear la ventana y pintarla vacía PintarDosCirculos ventana = new PintarDosCirculos(); ventana.setTitle("Pintar Dos Circulos"); ventana.asignarLookAndFeel(); ventana.setCloseClick(); ventana.setExtendedState(MAXIMIZED_BOTH); ventana.setVisible(true); // 2. Mostrar el formulario para obtener los datos del primer círculo FormularioCirculo formulario= new FormularioCirculo(); JDialog dialog=new JDialog(ventana, "Introduzca los datos del primer circulo", true); dialog.setContentPane(formulario); dialog.pack(); dialog.show(); // 3. Obtener los datos introducidos por el usuario ventana.centrox1=formulario.obtenerCentrox(); ventana.centroy1=formulario.obtenerCentroy(); ventana.radio1=formulario.obtenerRadio(); ventana.color1=formulario.obtenerColor(); ventana.haydatos1=true; //4. Repintar la ventana con el primer círculo ventana.setExtendedState(MAXIMIZED_BOTH); ventana.repaint(); //repaint invoca internamente al método "paint(Graphics g)"

// 5. Mostrar el formulario para obtener los datos del segundo círculo formulario= new FormularioCirculo(); dialog=new JDialog(ventana, "Introduzca los datos del segundo circulo", true); dialog.setContentPane(formulario); dialog.pack(); dialog.show(); // 6. Obtener los datos introducidos por el usuario ventana.centrox2=formulario.obtenerCentrox(); ventana.centroy2=formulario.obtenerCentroy(); ventana.radio2=formulario.obtenerRadio(); ventana.color2=formulario.obtenerColor(); ventana.haydatos2=true; //7. Repintar la ventana con el segundo círculo ventana.setExtendedState(MAXIMIZED_BOTH); ventana.repaint(); //repaint invoca internamente al método "paint(Graphics g)" } }

13

Programa principal

RepintarVentana

LeerDatos (radio1, x10, y10, color1)

RepintarVentana

LeerDatos (radio2, x20, y20, color2)

Page 14: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

1.2 Los objetos, otra manera de pensar el software

Se podría denominar enfoque de objetos a la forma particular de pensar el

software en términos de cosas que colaboran entre sí para realizar tareas. Es una forma

de pensar más abstracta que facilita expresar cualquier elemento sin necesidad de

disociarlo o clasificarlo en datos o funciones. Para quienes aprecian el software como

funciones y datos, el enfoque de objetos presenta la dificultad de un cambio radical de

pensamiento.

Volviendo al ejemplo de los círculos, el enfoque de objetos tiene los mismos

recursos y restricciones que el enfoque estructurado para pintar los círculos. Pero piensa

la solución de una forma diferente y en vez de disgregar las propiedades de los círculos

asocia íntegramente cada círculo a un elemento software. Hace lo mismo con el resto de

elementos del discurso.

Figura 1.7. Elementos del discurso asociados a elementos software

La Figura 1.7 muestra los elementos software que se asocian a elementos del

discurso: la ventana, los dos círculos y los formularios que recogen las constantes de los

círculos desde el exterior del sistema software. Cada elemento software contiene las

propiedades íntegras de cada elemento del discurso. El elemento círculo1 contiene sus

constantes y los mecanismos para pintarse y crearse como elemento. Igual sucede con el

14

radiocentro colorPintarCrear

círculo1

formularioCir

CrearLeer

radiocentro colorPintarCrear

círculo2

formularioCir

CrearLeer

ventana

círculo1círculo2CrearPintar

Elementos software

Page 15: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

círculo2, ventana y los formularios. Estos elementos software son variables software en

un sentido más amplio que las variables del enfoque estructurado.

En el caso del problema de pintar los círculos, el enfoque de objetos piensa:

1. en variables software capaces de recordar las constantes de un círculo,

capaces de pintar el círculo y, además, capaces de crearse a sí misma como

variables. Es decir, piensa en unas variables cualitativamente distintas de las

variables estructuradas que sólo recuerdan datos. A estas nuevas variables se

le podría denominar círculo1 y círculo2, definidas a través del nombre y sus

propiedades:

círculo1 ≡ {radio, centro, color, crear, pintar}

círculo2 ≡ {radio, centro, color, crear, pintar}

2. que la ventana, que contiene los círculos, y los formularios, para leer las

constantes, podrían ser otras variables software denominadas,

respectivamente, ventana y formulario:

ventana ≡ {círculo1, círculo2, crear, pintar}

formulario ≡ {crear, leer}

3. el sistema software en términos de la interacción de estas variables, dadas

sus respectivas capacidades para ejecutar operaciones. Es decir, cómo

relacionar todas las variables para conseguir que se realice la tarea de pintar

círculos.

La Figura 1.8 muestra el sistema software. Se aprecian las relaciones entre las

variables software que ejecutan la tarea de pintar círculos. Este sistema realiza la misma

tarea que el sistema estructurado, aplica el mismo algoritmo, pero está organizado de

forma diferente. Por tanto, tiene propiedades diferentes. Algo semejante a lo que sucede

con las sustancias alotrópicas, por ejemplo el diamante y el grafito que son

químicamente iguales, pero físicamente muy diferentes. Después se estudiarán con

detalle las diferencias de propiedades.

15

Page 16: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Figura 1.8. Sistema software con enfoque de objetos

El enfoque de objetos amplía la idea de variable software y la hace más

abstracta, con capacidad para expresar cualquier cosa, incluso una operación. A estas

variables software, capaces de ejecutar operaciones, se les denomina objetos y a la

forma de pensar el software en objetos, se le denomina en general, enfoque orientado a

objetos.

Como sucede frecuentemente en el universo software (donde existen muchas

palabras para el mismo significado), también hay otras formas de referirse o clasificar el

mundo de los objetos, pero carecen de utilidad, al menos, a los efectos del curso.

La Figura 1.8 utiliza símbolos próximos a la notación estándar UML, pero sin

rigor por razones de simplicidad y conveniencia pedagógica. Las cajas indican objetos y

las flechas relaciones entre ellos. En ningún caso señalan secuencias, ni flujos de datos,

entradas o salidas. Las diferencias entre flechas continuas y discontinuas serán vistas

con posterioridad.

El sistema software de la Figura 1.8 podría funcionar de la siguiente manera.

Comienza creando una variable (objeto) ventana que establece sus propias

particularidades y se pinta. Después, este objeto ventana solicita la creación de los

objetos círculo1 y círculo2. Cada objeto círculo, a su vez, crea un objeto formulario que

solicita en la pantalla los valores de radio, centro, color, y los asigna al objeto círculo

16

radiocentro colorPintarCrear

círculo1

ventana

círculo1círculo2CrearPintar

formularioCir

CrearLeer

radiocentro colorPintarCrear

círculo2

formularioCir

CrearLeer

sistema software

Page 17: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

que lo creó. Al final, el objeto ventana se pinta a sí mismo y le solicita a los objetos

círculo1 y círculo2 que se pinten.

Se denomina mensaje a la solicitud a un objeto para que ejecute una operación o,

como también se dice, realice un servicio. Por ejemplo, la solicitud que hace el objeto

ventana a los objetos círculo1 y círculo2 para se pinten. Un mensaje es la invocación de

una rutina contenida en un objeto, que a su vez es una variable. Por tanto, un mensaje

manifiesta una carga de ambigüedad que lo diferencia profundamente de la invocación

tradicional a una rutina. Los mensajes constituyen el mecanismo de interacción de los

objetos y la clave del funcionamiento del sistema.

A la luz estructurada, el funcionamiento del sistema de objetos parece raro, pero

como se dijo, el sistema de objetos hace la misma tarea (pintar círculos) y aplica el

mismo algoritmo que el sistema estructurado. Exteriormente, no hay diferencias entre el

sistema estructurado y el sistema de objetos; ambos muestran el mismo

comportamiento. La diferencia es interior, en la forma de pensar y diseñar el software,

cualitativamente distinta, que organiza el sistema y lo hace funcionar de otro modo.

Las gafas de visión estructurada podrían hacer creer que pensar en objetos es lo

mismo que pensar en módulos; que el sistema de Figura 1.8 es un sistema estructurado

dividido en módulos, pero las gafas engañan. Los módulos estructurados no son

variables software. Mientras que ventana, círculo1, círculo2 y formulario son variables

software que se crean y destruyen dinámicamente; son variables con capacidad para

actuar y recordar.

La idea de objeto software extiende la idea de variable software tradicional,

restringida a la capacidad de recordar y al concepto de dato. El objeto software es una

variable software que recuerda, pero que además, tiene la capacidad adicional de

ejecutar operaciones. Un objeto software, no es ni dato, ni función, ni la suma de datos y

funciones. Un objeto es un elemento software cualitativamente distinto capaz de

expresar un concepto más amplio, más ambiguo: cosa.

Gracias a la ambigüedad del significado (capacidad para expresar alternativas),

los objetos software pueden representar o estar asociados con cualquier cosa: círculo,

ventana, cuenta bancaria, vuelo, habitación, regla de negocio,… Los objetos software

son variables software mucho más libres, gracias a la ambigüedad, que las variables

17

Page 18: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

software estructuradas, limitadas a la idea de dato. Las operaciones en los objetos

también son más libres porque son variables, mientras que en el enfoque estructurado

son constantes.

La libertad de interpretación de las variables software, que ofrece el enfoque de

objetos, se utiliza a menudo para decir que los objetos “copian mejor la realidad”, como

si copiar la realidad fuese una cualidad importante del software. Durante el curso se

demostrará que la expresión “copiar la realidad” carece de sentido en términos absolutos

y que además, puede ser contraproducente.

En general, el software resuelve problemas, no los modela, salvo que el objetivo

sea la simulación. La forma que el software resuelve los problemas difiere, por lo

común, de la forma que se resuelven los problemas en el mundo exterior al software,

porque el software y ese mundo tienen propiedades distintas. Por ejemplo, en el mundo

de la geometría los círculos carecen de la propiedad de dibujarse, ni tampoco son datos

o funciones de transformación de datos.

Los objetos círculo1 y círculo2, son piezas de la solución software al problema

de pintar círculos. Cada uno de estos objetos software está asociado con un círculo

particular, pero no lo representa porque un objeto software es distinto de un círculo

geométrico. Los objetos círculo1 y círculo2 son piezas del engranaje software para

resolver el problema de pintar círculos.

Si se piensa que un objeto software representa a un elemento del discurso se

puede pensar en imitar propiedades que no convienen o no se pueden conseguir en el

software. Es preferible pensar que un objeto software se asocia a un elemento del

discurso porque, si conviene, se puede asociar cualquier cosa, mientras que la

representación (modelado) exige imitar las cualidades de lo representado. Más adelante

se volverá sobre este controvertido tema en el universo software.

La ausencia de los conceptos de dato y función de transformación de datos, en el

mundo de los objetos, tiene una consecuencia desfavorable. La idea de base de datos no

encaja directamente en ese mundo porque no existe el concepto de dato; sólo hay

objetos y mensajes. Por tanto, se ha inventado la idea de objeto persistente, para

conseguir un efecto equivalente al que ofrece la colección permanente de datos del

enfoque estructurado. Pero esto es otra historia, para más adelante.

18

Page 19: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Una solución orientada a objetos para pintar varios círculos

La diferencia en la forma de pensar el software de objetos se refleja en los

diagramas de diseño y en el código. El enfoque estructurado organiza el sistema según

el flujo de transformación de datos; su código realza la secuencia de pasos de la tarea.

El enfoque de objetos organiza el sistema según los elementos que participan en la

ejecución de la tarea. Su código realza estos elementos; la secuencia de pasos para la

realización de la tarea queda disuelta en la definición de las operaciones

(comportamientos) de los objetos.

Por ejemplo, el programa de los círculos, consistiría en:

1. definir los conjuntos de objetos que participan en la realización de la tarea,

2. definir las operaciones que pueden ejecutar los objetos,

3. dar la orden de iniciar la acción.

Visto en detalle:

Definición de los conjuntos de objetos

La mayoría de los lenguajes comerciales de programación de objetos, exigen la

definición de conjuntos de objetos, en vez de definir los objetos uno por uno. En el caso

de los círculos, los conjuntos de objetos serían, por ejemplo, Círculo, Ventana y

Formulario (para leer las constantes de los círculos).

En cada definición se enuncian las propiedades particulares del conjunto en

términos de atributos y operaciones. Los atributos pueden ser objetos o variables

software tradicionales. Las operaciones son rutinas, funciones, procedimientos, en fin,

código capaz de ejecutar acciones. Se acostumbra denominar clase a la definición de un

conjunto de objetos y método a una operación.

Círculo ≡ {

radio, x0, y0 : reales “atributos de tipo real”

color : texto “atributo de tipo texto”

Círculo “operación para crear objetos círculos; equivale al Crear de la Figura 1.8”

Pintar “operación para pintar el círculo”

19

Page 20: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Leer “operación para leer los atributos”

}

Ventana ≡ {

círculo 1, círculo 2 : Círculo “los atributos pertenecen al conjunto Círculo”

Ventana “operación para crear objetos ventana; equivale al Crear de la Figura 1.8”

Comienzo “operación que inicia el funcionamiento del sistema”

Pintar “operación para pintar la ventana”

}

Formulario ≡ {

Formulario“operación para crear objetos formulario; equivale al Crear de la Figura 1.8”

Obtener_radio “operación para leer radio”

Obtener_x0 “operación para leer x0”

Obtener_y0 “operación para leer y0”

Obtener_color “operación para leer color”

}

Las operaciones homónimas con los conjuntos (Círculo, Ventana y Formulario),

son operaciones especializadas en la creación dinámica de objetos. Tienen el mismo

nombre de los conjuntos para facilitar la lectura del código. Por ejemplo, v

nuevoFormulario es una línea de pseudocódigo que crea un objeto del conjunto

Formulario y lo asigna a la variable v.

Definición de las operaciones

Las operaciones o métodos de los objetos se definen asociadas al conjunto. Por

ejemplo,

Círculo::Círculo ≡ {

Leer “se invoca el método Leer del propio objeto”

}

Círculo::Leer ≡ {

v es Formulario “el atributo v es un objeto (por concretar) del conjunto Formulario”

v nuevoFormulario “se crea un objeto formulario y se asigna a v”

20

Page 21: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

radio v.Obtener_radio “se pide al formulario que obtenga el radio y se asigna a radio”

x0 v.Obtener_x0 “se pide al formulario que obtenga x0 y se asigna a x0”

y0 v.Obtener_y0 “se pide al formulario que obtenga y0 y se asigna a y0”

color v.Obtener_color “se pide al formulario que obtenga el color y se asigna a color”

}

La línea radio v.Obtener_radio expresa un mensaje de un objeto círculo a un

objeto formulario para que suministre el valor del radio y lo asigne a la variable radio.

El resto de líneas sucesivas también expresan mensajes, de un objeto círculo a un objeto

formulario representado por la variable v. Para mantener el hilo de la explicación se ha

simplificado el pseudocódigo.

La orden de inicio

El sistema inicia el funcionamiento cuando el intérprete o el ejecutor del

lenguaje activa la operación Comienzo. En este curso se ha usado la palabra Comienzo

para denominar a la operación de inicio, pero en general debe ser una palabra clave

designada de antemano en el lenguaje. Por ejemplo, los lenguajes C++ y Java utilizan la

palabra Main.

La operación Comienzo contiene sólo el código que inicia el funcionamiento del

sistema. Por ejemplo:

Ventana::Comienzo ≡ {

nuevaVentana “crear una ventana”

}

Al crearse el objeto ventana se ejecuta el código definido en la siguiente

operación:

Ventana::Ventana ≡ {

caracterizar y pintar la ventana vacía “ instrucciones internas”

círculo1 nuevoCírculo “crear el objeto círculo1”

círculo2 nuevoCírculo “crear el objeto círculo2”

repintar la ventana “pinta el contenido de la ventana llamando a la operación pintar”

}

Al llamar a la operación pintar se ejecuta el código para pintar los círculos

21

Page 22: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Ventana::Pintar ≡ {

pintar fondo ventana “ instrucciones internas”

círculo1.pintar “se pide a círculo1 que se pinte”

círculo2.pintar “se pide a círculo2 que se pinte”

}

En este caso se ha colocado la operación de comienzo en el objeto ventana, pero

podría estar situado en otro objeto, destinado específicamente a iniciar del sistema. A

menudo este objeto de inicio recibe el nombre de Principal por rémora o confusión del

enfoque estructurado, pero su única tarea es dar comienzo al funcionamiento del sistema

software; no contiene el algoritmo principal, como sucede en el enfoque estructurado.

Pensando en el teatro, los objetos son los actores de la obra y los mensajes son

los diálogos entre ellos. El programa describe a los actores, lo que tienen que decir y

hacer. El desarrollo de la obra, que resalta el enfoque estructurado, queda aquí disperso

entre los guiones de los objetos. Es más difícil ver la secuencia de pasos en un sistema

software de objetos que en un sistema estructurado. Volviendo al teatro, la única tarea

del mal llamado objeto principal es convocar al público y a los actores para que

comience la función.

El enfoque de objetos utiliza una forma de programar muy distinta a la forma

tradicional. Y, efectivamente, es mucho más complicada, al menos para los que piensan

en términos estructurados. El cambio del modo de pensar el software es un reto difícil

como advierte la literatura software y como se aprecia en la experiencia diaria. Pero es

un reto necesario si lo importante del software son los actores. Y un reto conveniente, si

se quiere aprovechar la ambigüedad del mundo de los objetos para simplificar la

complejidad y facilitar los cambios en el software, como se verá después.

22

Page 23: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Un programa orientado a objetos para pintar varios círculos

Veamos como se implementaría el pseudocódigo anterior en lenguaje Java.

import javax.swing.*;import java.awt.*;import java.awt.event.*;

public class Ventana extends JFrame{ private Circulo circulo1; private Circulo circulo2;

//Crea una nueva instancia de ventana public Ventana() { //Pintar la ventana vacía setTitle("Pintar Circulos "); asignarLookAndFeel(); setCloseClick(); setExtendedState(MAXIMIZED_BOTH); setVisible(true); //Crear un circulo y añadirlo a la ventana circulo1=new Circulo(); getContentPane().add(circulo1); //Crear otro circulo y añadirlo a la ventana circulo2=new Circulo(); getContentPane().add(circulo2); //Repintar la ventana con los dos circulos pack(); setExtendedState(MAXIMIZED_BOTH); repaint(); //repaint invoca internamente al método paint(g) } private void asignarLookAndFeel() { //Forzar el Look and Feel de la ventana al del sistema String laf = UIManager.getSystemLookAndFeelClassName(); try { UIManager.setLookAndFeel(laf); } catch (UnsupportedLookAndFeelException exc) {System.err.println("Unsupported: " + laf);} catch (Exception exc) {System.err.println("Error cargando: " + laf);} } private void setCloseClick() { //Controlar el cierre de la ventana addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} });

23

Definición de Ventana

atributos de Ventana

operación para crear

Mensaje a circulo1 para que se cree

Mensaje a circulo2 para que se cree

Page 24: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

} public void paint (Graphics g) { super.paint(g); if (circulo1!=null) circulo1.paint(g); if (circulo2!=null) circulo2.paint(g); } public static void main(String[] args) { new Ventana(); } }

public class Circulo extends JComponent{ //Coordenada x del centro private int centrox; //Coordenada y del centro private int centroy; //Radio private int radio; //Color private Color color; private boolean haydatos=false; // Crea una nueva instancia de Circulo public Circulo() { // Mostrar el formulario para obtener los datos del circulo FormularioCirculo formulario= new FormularioCirculo(); JDialog dialog =new JDialog(); dialog.setTitle("Introduzca los datos del circulo"); dialog.setModal(true); dialog.setContentPane(formulario); dialog.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE); dialog.pack(); dialog.show(); // Obtener los datos introducidos por el usuario centrox=formulario.obtenerCentrox(); centroy=formulario.obtenerCentroy(); radio=formulario.obtenerRadio(); color=formulario.obtenerColor(); haydatos=true; } public void paint (Graphics g) { //Si el usuario ha introducido los datos pintar el círculo if (haydatos){ g.setColor(color); g.drawOval(centrox-radio, centroy-radio,2*radio,2*radio); g.fillOval(centrox-radio, centroy-radio,2*radio,2*radio); } }}

24

Mensaje a circulo1 para que se pinte

Mensaje a circulo2 para que se pinte

operación para pintar

operación comienzo

Definición de Círculo

atributos de Círculo

operación para crear

operación para pintar

Page 25: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

public class FormularioCirculo extends JPanel { //Valores de los cuadros de texto private int centrox; private int centroy; private int radio; private Color color; //Etiquetas de los campos de texto private JLabel centroxLabel; private JLabel centroyLabel; private JLabel radioLabel; private JLabel colorLabel; //Textos de las etiquetas private static String centroxString = "Coordenada x del centro: "; private static String centroyString = "Coordenada y del centro: "; private static String radioString = "Radio: "; private static String colorString = "Color: "; //Campos de texto y combo para introducir los datos private JTextField centroxTextField; private JTextField centroyTextField; private JTextField radioTextField; private JComboBox colorField; //Crea una nueva instancia de FormularioCirculo public FormularioCirculo() { //crear las etiquetas centroxLabel = new JLabel(centroxString); centroyLabel= new JLabel(centroyString); radioLabel= new JLabel(radioString); colorLabel= new JLabel(colorString); //crear los campos de texto centroxTextField = new JTextField(5); centroyTextField= new JTextField(5); radioTextField= new JTextField(5); //crear el combo de colores String [] colorValues= {"Azul","Naranja","Verde","Rojo","Amarillo","Gris"}; colorField = new JComboBox(colorValues); colorField.setEditable(false); //Asignar las etiquetas a los campos de texto centroxLabel.setLabelFor(centroxTextField); centroyLabel.setLabelFor(centroyTextField); radioLabel.setLabelFor(radioTextField); colorLabel.setLabelFor(colorField); //Distribuir las etiqueta en un panel JPanel labelPane = new JPanel(); labelPane.setLayout(new GridLayout(0, 1)); labelPane.add(centroxLabel); labelPane.add(centroyLabel); labelPane.add(radioLabel); labelPane.add(colorLabel); //Distribuir los campos de texto en otro panel. JPanel fieldPane = new JPanel(); fieldPane.setLayout(new GridLayout(0, 1)); fieldPane.add(centroxTextField); fieldPane.add(centroyTextField); fieldPane.add(radioTextField);

25

Definición de Formulario

atributos de Formulario

operación para crear

Page 26: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

fieldPane.add(colorField); //Poner los dos paneles en un nuevo panel, las etiquetas a la izquierda, //los campos de texto a la derecha. JPanel contentPane = new JPanel(); contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); contentPane.setLayout(new BorderLayout()); contentPane.add(labelPane, BorderLayout.CENTER); contentPane.add(fieldPane, BorderLayout.EAST); add(contentPane); } //Obtiene el Color seleccionado por el usuario public Color obtenerColor() { String string=(String)colorField.getSelectedItem(); Color color; if (string.equals("Azul")) color=Color.BLUE; else if (string.equals("Verde")) color=Color.GREEN; else if (string.equals("Naranja")) color=Color.ORANGE; else if (string.equals("Rojo")) color=Color.RED; else if (string.equals("Amarillo")) color=Color.YELLOW; else if (string.equals("Gris")) color=Color.GRAY; else color=Color.BLACK; return color; } //Obtiene la coordenada x del centro introducida por el usuario public int obtenerCentrox(){ if (centroxTextField.getText()!= null) return Integer.parseInt(centroxTextField.getText()); else return 0; } //Obtiene la coordenada y del centro introducida por el usuario public int obtenerCentroy(){ if (centroyTextField.getText()!= null) return Integer.parseInt(centroyTextField.getText()); else return 0; } //Obtiene el Radio introducido por el usuario public int obtenerRadio(){ if (radioTextField.getText()!= null) return Integer.parseInt(radioTextField.getText()); else return 0; }}

26

operación para leer color

operación para leer xo

operación para leer yo

operación para leer el radio

Page 27: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

1.3 Recapitulando, contrastes y semejanzas

El enfoque estructurado y el enfoque de objetos se confunden por el arraigo

estructurado y por la libertad de expresión de los objetos, sin embargo son radicalmente

distintos.

La diferencia de pensamiento, de conceptos

Los enfoques estructurado y de objetos son dos formas distintas de pensar los

sistemas software. En este curso se considera estructurado a la forma de pensar el

software en términos de datos y funciones de transformación de datos. Y se considera

objetos a la forma de pensar el software en términos de objetos software y mensajes.

Figura 1. 9.

Figura 1. 9. Enfoque estructurado y enfoque de objetos

Desde la perspectiva del enfoque estructurado, cualquier sistema software es una

función F(X) que transforma un conjunto X de datos de entrada en otro conjunto Y de

datos de salida. Aunque F(X) es más bien una relación, se le acostumbra a llamar

función en el universo software. Las funciones y los datos son los elementos esenciales

del enfoque estructurado. Se acostumbra a expresar los requisitos del sistema a través de

de los conjuntos de entrada y salida de datos. La idea de procesar datos deviene de la

saga de ábacos y calculadoras que produjo los ordenadores o computadoras para obtener

cartas marinas y otros productos similares

27

ventana

círculo1

círculo2

sistemaX

f1

f2F(X)

X’

Y

estructurado objetos

Page 28: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

El enfoque de objetos supone un sistema software como un grupo de objetos

(cosas) que se interrelacionan para realizar tareas. La interacción se realiza mediante

mensajes, es decir, mediante la solicitud de servicios u operaciones variables de un

objeto a otro. Los objetos y los mensajes son los elementos software esenciales del

enfoque de objetos. Los requisitos del sistema software se acostumbran a expresar

mediante tareas en sentido general, no necesariamente de procesar datos. La idea, más

amplia, de cosas que realizan tareas nació asociada con la simulación por ordenador,

pero ha desbordado ese marco por la necesidad de afrontar problemas más complejos.

La diferencia de organización. La alotropía

Cada uno de estos enfoques organiza (diseña) los sistemas software de forma

diferente y obtiene, por tanto, sistemas con propiedades diferentes aun cuando apliquen

el mismo algoritmo. La Figura 1.10 muestra dos figuras compuestas de los mismos tipos

de elementos, pero organizadas de manera distinta.

Figura 1.10. Propiedades de las formas alotrópicas

El cuadrado se aproxima a la organización interna del grafito y el triángulo a la

organización del diamante. En este caso, y también en el software, las propiedades

cambian porque cambian las relaciones entre los elementos. El cuadrado es deformable,

sin rotura, en las direcciones de incertidumbre donde los elementos se desconocen (no

se relacionan de forma directa), por ejemplo en las diagonales. Sin embargo, no es

posible deformar el cuadrado en las direcciones de certeza donde los elementos se

28

F

F

F

F

Plasticidad del cuadrado

Rigidez del triángulo

F

FF

propiedades de las formas alotrópicas

Page 29: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

conocen, por ejemplo, en los lados. El triángulo no se puede deformar en ninguna

dirección porque todos sus componentes se conocen entre ellos. Esto es lo que sucede,

aproximadamente, en el diamante.

El grafito y el diamante son variedades alotrópicas del carbono. Ambos

materiales tienen las mismas propiedades químicas, por ejemplo ambos arden, porque

están compuestos del mismo elemento químico. Pero, desde el punto de vista físico, sus

propiedades son diferentes.

Por analogía, se podría decir que un diseño estructurado y un diseño de objetos

son variantes alotrópicas de un mismo algoritmo. El diseño estructurado se asemeja al

diamante y el diseño de objetos al grafito. Desde el punto de vista de la facilidad de

modificación, conviene diseñar software con la plasticidad del cuadrado y no con la

rigidez del triángulo. La plasticidad y otras propiedades “alotrópicas” de los diseños

software son, generalmente, más importantes para los productores que para los clientes,

aunque éstos también se benefician o perjudican con esas propiedades.

Un diseño estructurado y un diseño de objetos son diferentes, aun cuando

ejecuten el mismo algoritmo, porque tienen propiedades tan diferentes como el

diamante y el grafito. No se trata sólo de ropaje o del lenguaje de programación.

La diferencia para expresar ambigüedad

Una de las diferencias prácticas más importantes entre el enfoque estructurado y

el enfoque de objetos es la capacidad superior de los objetos para expresar alternativas o

significados diversos, es decir, ambigüedad. Durante el curso se estudiarán las diversas

causas de esta profunda, aunque inadvertida, diferencia. La causa primaria está en la

semántica de los elementos que se derivaron del origen de cada enfoque.

El enfoque estructurado utiliza dato y función de transformación de datos como

elementos del sistema software, mientras el enfoque de objetos utiliza los elementos

objeto, con el significado de cosa, y mensaje con el significado de solicitud de servicio a

una variable.

El significado ambiguo de cosa, que tienen los objetos, admite el diseño

estructurado con ropaje de objetos. Sin embargo, no es posible hacer lo contrario, es

decir, un diseño de objetos con ropaje estructurado. Ni los datos, ni las funciones de

29

Page 30: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

transformación de datos son capaces de expresar cualquier objeto porque tienen un

significado más restringido.

El llamado tipo abstracto de dato (tad) es dato, aún cuando sea la asociación de

un tipo de dato con unas rutinas. Los objetos son más; son cosas, que no están

comprometidas a desempeñar la función de dato, ni de nada en particular.

La mayor capacidad para expresar ambigüedad de los objetos tiene varias

consecuencias importantes que también serán estudiadas durante el curso. Por ejemplo,

el enfoque de objetos se acomoda mejor a la diversidad de problemas que aborda el

software. Los objetos son más tolerantes para expresar la idea general de función, como

la función de una casa, que el enfoque estructurado obligado a expresar esa función en

términos de “entrada, proceso y salida”. No obstante, esta mayor libertad de expresión

tampoco es gratis siempre. A menudo, hay que aceptar cualidades “extrañas” como la

capacidad de pintarse, ampliarse, moverse, borrarse, etc. que tienen los círculos

software, para ajustarse al enfoque.

La ambigüedad del enfoque de objetos, también, facilita que un elemento

software, por sí solo, exprese completamente un concepto, por ejemplo círculo.

Mientras que el enfoque estructurado obliga, muchas veces, a disociarlos en funciones y

datos.

La ambigüedad del enfoque de objetos favorece la plasticidad del sistema, como

sucede en la estructura del cuadrado. Por tanto, el enfoque de objetos ayuda el

desarrollo simultáneo de los elementos del sistema y beneficia el mantenimiento, pero

no lo hace de forma automática; hay que conseguirlo con diseño.

La poca capacidad de ambigüedad que tiene el enfoque estructurado, por su

concepción del software, limita las facilidades de desarrollo simultáneo de los

elementos del sistema y las facilidades de mantenimiento. Cuando el enfoque

estructurado intenta obtener estas facilidades introduce ambigüedad en el diseño y,

entonces, se aproxima al enfoque de objetos.

La elevada dosis de ambigüedad potencial de los objetos representa un salto

cualitativo en la evolución del software en su camino hacia la solución de problemas

más complejos. La ambigüedad es un poderoso recurso de simplificación de la

30

Page 31: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

complejidad descriptiva, como sucede en la abstracción que simplifica por ambigüedad,

y también es un recurso de simplificación de la complejidad de incertidumbre, porque

facilita la adopción de variantes. Dicho de otro modo, el enfoque de objetos es un

recurso más eficaz, que sus predecesores para enfrentar problemas complejos.

Figura 1.11 Aumento de la capacidad de ambigüedad en los elementos software

La Figura 1.11 muestra la evolución del software hacia el aumento de la

capacidad de ambigüedad de sus elementos primarios. Por una lado las variables, por

otro el código y juntos, después formando elementos más complejos. Cada paso

adelante ha representado un aumento de la ambigüedad potencial del elemento y,

consecuentemente, del modelo software.

Las clases y demás elementos por encima de los objetos son parte también del

enfoque de objetos y multiplican de manera notable la ambigüedad potencial. Por tanto,

multiplican la eficacia del enfoque de objetos. La presencia de esos elementos y la

ambigüedad asociada ayudan a simplificar los problemas, pero añaden complejidad al

enfoque de objetos. Es una herramienta más eficaz, pero más difícil de manejar. En

ingeniería, casi nada es gratis.

Las clases, clases abstractas e interfaces serán estudiadas en los próximos

capítulos junto con sus beneficios e inconvenientes.

31

ambigüedad en el modelo

variables

tipos abstractos de datos

rutinas

alternativas

recursiónlistasvectoressimples

objetos (cosas)

clases

clases abstractas

interfaces

ambigüedad

(capacidad para expresar alternativas)

Page 32: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

Ninguno es más natural que otro

El enfoque de objetos permite a los objetos expresar un universo más amplio, sin

demasiada distorsión, dada su ambigüedad potencial. Los elementos software no tienen

que ser interpretados en términos de dato y función de transformación de datos. Sin

embargo, a pesar de esta diferencia en capacidad expresiva no se puede decir, en

términos absolutos, que un enfoque es más natural que otro. Quien está acostumbrado al

enfoque estructurado verá la solución en términos de datos y funciones de

transformación de datos, sin darse cuenta que, por ejemplo, ha disociado el concepto de

círculo.

Tanto el enfoque estructurado como el enfoque de objetos exigen expresar

cualquier idea en sus respectivos términos. Datos y funciones, para el estructurado;

objetos y mensajes, para los objetos. Es decir, cualquier concepto debe adoptar una de

esas formas, según sea el enfoque. Los conceptos que no encajen directamente con los

términos del enfoque deberán ser ajustados (distorsionados) para su tratamiento en el

sistema software. Pero los que están acostumbrados a un enfoque no percibirán, en

general, la distorsión.

Gracias a la mayor capacidad expresiva de los objetos se dice a menudo que los

objetos reflejan mejor la realidad. Pero esta idea perjudica, más que beneficia porque

reflejar la realidad:

No es el propósito de los sistemas software, salvo que sean de simulación.

Dificulta los cambios en los sistemas software

¿Qué significa? La realidad varía según el espectador.

Se amplía la idea de variable software, pero…

El enfoque de objetos enriquece el concepto de variable software porque admite

variables software (objetos) con capacidad para recordar particularidades, por ejemplo r,

x0,… y, además, con capacidad para ejecutar operaciones, por ejemplo pintar, leer, …

Mientras que en el enfoque estructurado las variables sólo son elementos pasivos, con

capacidad para recordar, que se dejan transformar por funciones.

Es frecuente confundir la idea de variable software con la idea de variable

matemática. Pero la idea de variable matemática no coincide en general con la idea de

32

Page 33: 01Curso OO Objetos ObjetosYEstructurado

Curso de OO dirigido por Objetos y Estructurado, dos pensamientos distintosla introducción de ambigüedad

variable software, en ninguno de los dos enfoques. Para el enfoque estructurado la

variable software es una posición de memoria, capaz de recordar información. Para el

enfoque de objetos, la variable software es también una posición de memoria capaz de

recordar información, pero en sentido más amplio porque recuerda operaciones y las

condiciones de ejecución. La variable matemática es un símbolo que representa a un

conjunto de valores, sin capacidad para recordar, ni ejecutar nada. Un ejemplo de

diferencia entre variable matemática y variable software se aprecia en el caso de los

círculos, donde las variables software son las constantes matemáticas de los círculos,

mientras que las variables matemáticas pasan inadvertidas en el mecanismo de dibujar

los círculos. La diferencia más marcada es la operación de asignación, frecuente en

software e inexistente en la matemática. Por ejemplo: i i + 1.

El dilema de las bases de datos

La organización diferente del software (estructurado y objetos) provoca otra

diferencia notable. El concepto de base de datos encaja perfectamente dentro del

enfoque estructurado, pero no en el enfoque de objetos porque carece del concepto de

dato. Esta diferencia y la necesidad de trabajar con bases de datos han provocado la

aparición de los conceptos de objeto persistente y de base de datos orientada a objetos,

para manejar el conjunto de objetos persistentes.

33