UNITEC SUR Prof. Ing. José Luis Lozoya Vázquez - Resumen1
  *Inicio
  *Metodología Orientada a Objetos
  => Textos relacionados
  => 1. Antecedentes
  => 2. Intro. al Paradigma O.O.
  => 3. Clases y objetos
  => 4. Proceso de desarrollo del software
  => 5. El lenguaje de modelado unificado
  => 6. Metodologías
  => 7. Análisis
  => 8. Diseño
  => 9. Conceptos avanzados
  => Resumen1
  => Resumen2
  *Tipo de Datos Abstracto*
  *Contacto

METODOLOGÍA ORIENTADA A OBJETOS.

RESUMEN DEL PRIMER PARCIAL


UNIDAD I Antecedentes

1.1 Historia del desarrollo del software.


PRIMERA ERA

Durante los primeros años de la era de la computadora, el software se contemplaba como un añadido. Desde entonces el campo se ha desarrollado tremendamente. La programación de computadoras era un “arte de andar por casa” para el que existían pocos métodos sistemáticos. El desarrollo del software se realizaba virtualmente sin ninguna planificación,

SEGUNDA ERA

La segunda era en la evolución de los sistemas de computadora se extienden desde la mitad de la década de los sesenta hasta finales de los setenta. La multiprogramación y los sistemas multiusuario introdujeron nuevos conceptos de interacción hombre - máquina. Las técnicas interactivas abrieron un nuevo mundo de aplicaciones y nuevos niveles de sofisticación del hardware y del software.

La segunda era se caracterizó también por el establecimiento del software ya se desarrollaba para tener una amplia distribución en un mercado multidisciplinario.


TERCERA ERA

La tercera era en la evolución de los sistemas de computadora comenzó a mediados de los años setenta y continuó más allá de una década. El sistema distribuido, múltiples computadoras, cada una ejecutando funciones concurrentemente y comunicándose con alguna otra, incrementó notablemente la complejidad de los sistemas informáticos.

CUARTA ERA

La cuarta era de la evolución de sistemas informáticos se aleja de los programas de control y de gestion, dirigiéndose al impacto colectivo de las computadoras individuales y del software. Potentes máquinas personales controladas por sistemas operativos sofisticados, en redes globales y locales, acompañadas por aplicaciones de software avanzadas se han convertido en la norma. Las arquitecturas informáticas están cambiando de entornos centralizados de grandes computadoras a entornos descentralizados cliente/servidor.


Es de suma relevancia el mencionar algunas de los lenguajes de programación que fueron utilizados en sus respectivas eras. Esto nos ayudará a comprender mejor el objetivo que se perseguía en cada una de ellas.

ERA

LENGUAJES

CARACTERÍSTICAS

  • Fortran
  • Basic
  • Logo
  • Cobol
  • Fue el primer y principal lenguaje Científico.
  • Diseñado por IBM.
  • Utilizado también para aplicaciones comerciales.
  • Desarrollado como lenguaje de tiempo compartido.
  • Traza elementos gráficos estableciendo la geometría de lápiz.
  • Ampliamente usado en programación en minicomputadores.

  • Pascal
  • Prolog
  • Mumps
  • Lisp
  • Lenguaje Académico.
  • Sus características son copiadas por otros lenguajes.
  • Éxito comercial a través de Borland.
  • Desarrollado en Francia, 1973.
  • Aplicaciones en Inteligencia Artificial (IA).
  • Sistema de Multiprogramación.
  • Incluye su propia base de datos.
  • Utilizado en aplicaciones médicas.
  • Sintaxis muy diferente de los demás lenguajes.
  • Programa aplicaciones en IA.

 

  • C, C++
  • Modula-2
  • dBase
  • Desarrollado en los ochentas.
  • Se utiliza en aplicaciones comerciales.
  • C++, se utiliza para la tecnología orientada a objetos.
  • Versión mejorada de Pascal.
  • Desarrollada en 1979.
  • Lenguaje estándar para aplicaciones comerciales.
  • Ramas colaterales: Clipper, FoxBase.

  • Visual C++
  • Visual Basic
  • JAVA
  • Desarrollado por Microsoft.
  • Principalmente orientado a la tecnología de objetos.
  • Se utiliza para aplicaciones comerciales.
  • Principalmente para aplicaciones comerciales.
  • Versión cotizada, ya que permite interactuar con tablas de manejadores de bases de datos y lenguaje SQL.



Acontinuación se presenta una lista de algunas personas que hicieron contribuciones significativas en la creación y crecimiento de la industria de productos de software.
  • Charles Bachman. Inventó la tecnología del banco de datos en los inicios de los sesentas.
  • John Backus. FORTRAN desarrollado para IBM (1954)
  • Bob Bemer. Uno de los diseñadores de COBOL y el ASCII normal para IBM (años sesenta); inventor de la sucesión del Escape, el mecanismo universal para toda la computadora.
  • Larry Constantine. Inventa los datos que fluyen en los diagramas, presentan primero en papel, los conceptos de un plan estructurado en 1968.
  • Peter Cunningham. Funda una de las primeras empresas de investigación de mercado para enfocar el software y comienza a comercializar los productos del software en 1974.
  • Tom DeMarco. El pionero en utilizar una metodología de caso, el autor, y consultor en los años setenta.
  • Wilfred J. Dixon. Empezó distribuyendo el software estadístico en 1962.
  • Frank Dodge. Co - fundó McCormack & el Regate qué vendió el primer software de   contabilidad en 1969.
  • Larry Ellison. Dejó camino abierto para los DBMS.
  • Dave Ferguson. Logró vender el primer producto de software con éxito contra un programa de IBM.
  • Ken Orr. Crea la metodología de caso desarrollada en los años setenta.

 


1.2 La descomposición funcional vs. La descomposición en objetos.

Varios métodos han sido propuestos para sistematizar el proceso de vida del software.
Y muchas metodologías de desarrollo de software
han sido propuestas, y éstas pueden clasificarse en tres categorías:

Descomposición funcional.

·         Énfasis en datos, más que en funciones.

Descomposición objeto

·         Énfasis en objetos más que en datos.

Clasificación de los métodos.

Descomposición funcional:

·         Diseño Estructural, Refinamiento por Pasos.
Énfasis en datos, más que en funciones:

·         Programación Estructurada, Modelo Entidad-Relación.

Descomposición de Objetos:

·         Análisis Estructural, Análisis de Sistemas Estructurados.

·         Análisis de Sistemas Estructurados y Metodología de Diseño por bloques módulos.



1.3 Ingeniería de software.

La Ingeniería de Software.
Según la definición del IEEE, citada por [Lewis 1994] "software es la suma total de los programas de computadora, procedimientos, reglas, la documentación asociada y los datos que pertenecen a un sistema de cómputo". Según el mismo autor, "un producto de software es un producto diseñado para un usuario".

El proceso de ingeniería de software se define como "un conjunto de etapas parcialmente ordenadas con la intención de logra un objetivo, en este caso, la obtención de un producto de software de calidad" [Jacobson 1998].

  

1.4 Modelado y sus beneficios.

 Principios de Modelado
En cualquier proyecto de ingeniería como la construcción de un gran edificio, un avión, una represa hidroeléctrica, la construcción de un procesador de textos o un software de comunicaciones para Internet, requieren de etapas de modelamiento que permitan experimentar y visualizar el sistema que se construirá. De la experiencia en ingeniería se extractan los siguientes principios de modelado:

a) La forma como vemos el problema tiene una profunda influencia en forma como acometemos el problema y le damos solución al mismo.

b) Para modelar un sistema complejo no es suficiente un único modelo se requieren múltiples modelos donde cada uno representa una vista (aspecto) del sistema; estos modelos se complementan entre si.

c) Cualquier modelo puede ser representado con diferentes grados de precisión.

d) Los mejores Modelos están ligados a la realidad.



UNIDAD II Introducción al paradigma orientado a objetos

2.1 La complejidad del software.

Al observar sistemas complejos sociales como una gran empresa, los naturales como el universo y los sistemas creados por el hombre como el computador, se observa que exhiben una jerarquía de clases (conceptos) y otra de objetos (instancias). En una empresa donde conjuntos de personas forman un departamento y un conjunto de departamentos forman divisiones se describe la forma canónica de un sistema complejo que exhibe dos jerarquías: Una jerarquía de clases y otra jerarquía de objetos, donde cada objeto es una instancia de la una clase. Este es el modelo del cual se apropia el análisis y diseño orientado a objetos para desarrollar sistemas donde hay gran cantidad de software.

Causas de la complejidad del software

  • Facilidad de uso.
  • Exigencia de alto rendimiento y bajo costo.
  • Capacidad de supervivencia.


Requisitos que cambian durante el desarrollo

  • Simplicidad para el usuario.
  • Tamaño (líneas de código).
  • Modularización.
  • Comunicación entre los integrantes del equipo.
  • Director del equipo (persona clave).

Problemas de caracterizar sistemas discretos

 Los sistemas complejos son jerárquicos y cada    nivel de la jerarquía, constituye un nivel de abstracción diferente.

2.2 Abstracción.

La abstracción encarada desde el punto de vista de la programación orientada a objetos expresa las características esenciales de un objeto, las cuales distinguen al objeto de los demás. Además de distinguir entre los objetos provee límites conceptuales. Entonces se puede decir que la encapsulación separa las características esenciales de las no esenciales dentro de un objeto. Si un objeto tiene más características de las necesarias los mismos resultarán difíciles de usar, modificar, construir y comprender.
La misma genera una ilusión de simplicidad dado a que minimiza la cantidad de características que definen a un objeto.

Pensar en términos de objetos es muy parecido a cómo lo haríamos en la vida real. Una analogía sería modelizar un coche en un esquema de POO. Diríamos que el coche es el elemento principal que tiene una serie de características, como podrían ser el color, el modelo o la marca. Además tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o aparcar. En un esquema POO el coche sería el objeto, las propiedades serían las características como el color o el modelo y los métodos serían las funcionalidades asociadas como ponerse en marcha o parar.

2.3 Modularidad.

Es la propiedad de un sistema que ha sido descompuesto en un conjunto de módulos coherentes e independientes.

2.4 Encapsulamiento.

Esta característica es la que denota la capacidad del objeto de responder a peticiones a través de sus métodos sin la necesidad de exponer los medios utilizados para llegar a brindar estos resultados. O sea, el método MostrarSaldo() del objeto “cliente” antes mencionado, siempre nos va a dar el saldo de la cuenta de un cliente, sin necesidad de tener conocimiento de cuáles son los recursos que ejecuta para llegar a brindar este resultado.

2.5 Jerarquía.

Es el orden de las abstracciones organizado por niveles.

2.6 Polimorfismo.

Polimorfismo.
El polimorfismo indica que una variable pasada
o esperada puede adoptar múltiples formas.
Cuando se habla de polimorfismo en
programación orientada a objetos se suelen
entender dos cosas:

EJEMPLO:

  1. class disco{
  2. protected:
  3. int capacidad;
  4. char * fabricante;
  5. int num_serie;
  6. public:
  7. disco (int c, char * f, int n){
  8. capacidad = c; strcpy(fabricante, f);
  9. num_serie=n;}

2.7 Persistencia.

Es la propiedad de un objeto a través de la cual su existencia trasciende el tiempo (es decir, el objeto continua existiendo después de que su creador ha dejado de existir) y/o el espacio (es decir, la localización del objeto se mueve del espacio de dirección en que fue creado).

2.8 Concurrencia.

Es la propiedad que distingue un objeto que está activo de uno que no lo está.


UNIDAD III Clases y objetos

3.1 Atributos y métodos de instancia.

Una instancia de un programa es creada típicamente por el click de usuario en un icono de una interfaz Gráfica para usuarios GUI o por la entrada de un comando en una interfaz de línea de comandos CLI y presionando la tecla ENTER. Instancias de programas pueden ser creadas por otros programas.

 Atributos de instancia:

determina el estado de los objetos
cada objeto reserva memoria para todas las variables de instancia

Declaración:

   [acceso][static][final] tipo nombreAtributo [= valor_inicial];

Atributos

Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.

Las variables de instancia también denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto.
Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.


Los métodos son las operaciones que pueden realizarse sobre el objeto, que normalmente estarán incorporados en forma de programas (código) que el objeto es capaz de ejecutar y que también pone a disposición de sus descendientes a través de la herencia.


La definición de una clase se realiza en la siguiente forma:
[public] class Classname {
// definición de variables y métodos
...
}

donde la palabra public es opcional: si no se pone, la clase tiene la visibilidad por defecto, esto es,
sólo es visible para las demás clases del package. Todos los métodos y variables deben ser definidos
dentro del bloque {...} de la clase.
Un objeto (en inglés, instance) es un ejemplar concreto de una clase. Las clases son como
tipos de variables, mientras que los objetos son como variables concretas de un tipo determinado.
Classname unObjeto;
Classname otroObjeto;


3.3 Relaciones entre clases.

Asociacion

Las asociaciones son conexiones conceptuales entre clases. Por ejemplo la asociación, entre trabajador y empresa.
“Un trabajador labora en una empresa” la asociación conectara con una línea a trabajador y empresa, si vemos los roles de cada uno podemos decir que el trabajador es un empleado y la empresa es la empleadora.

“Labora en” es el nombre de la asociación y la colocamos sobre la linea, mientras que los roles (empleado, empleador) los colocamos bajo la línea a cada lado según corresponda. Así nuestra relación “Un trabajador labora en una empresa” en UML se vería así.

Asociación

3.4 Relaciones entre objetos.

Las relaciones entre objetos son, precisamente, los enlaces que permiten a un objeto relacionarse con aquellos que forman parte de la misma organización.

Las hay de dos tipos fundamentales:

Relaciones jerárquicas. Son esenciales para la existencia misma de la aplicación porque la construyen. Son bidireccionales, es decir, un objeto es padre de otro cuando el primer objeto se encuentra situado inmediatamente encima del segundo en la organización en la que ambos forman parte.

Relaciones semánticas. Se refieren a las relaciones que no tienen nada que ver con la organización de la que forman parte los objetos que las establecen. Sus propiedades y consecuencia solo dependen de los objetos en sí mismos (de su significado) y no de su posición en la organización.

Veamos un ejemplo: estableceremos la relación trabajo entre los objetos NEWTON y OPTICA y la interpretaremos diciendo que significa que Newton trabajó en óptica (véase la fig. 4). La relación es, evidentemente, semántica, pués no establece ninguna connotación jerárquica entre NEWTON y OPTICA y su interpretación depende exclusivamente del significado de ambos objetos.

La existencia de esta relación nos permitirá responder a preguntas como:

¿Quién trabajó en óptica?

¿En qué trabajó Newton?

¿Quien trabajó en Física?

Las dos primeras se deducen inmediatamente de la existencia de la relación trabajo. Para la tercera observamos que si Newton trabajó en óptica automáticamente sabemos que trabajó en Física, por ser óptica una rama de la Física (en nuestro diccionario, el objeto OPTICA es hijo del objeto FISICA). Entonces gracias a la OOP podemos responder a la tercera pregunta sin necesidad de establecer una relación entre NEWTON y FISICA, apoyandonos sólo en la relación definida entre NEWTON y OPTICA y en que OPTICA es hijo de FISICA. De este modo se elimina toda redundancia innecesaria y la cantidad de información que tendremos que definir para todo el diccionario será mínima.



UNIDAD IV
Proceso de desarrollo del software

4.1 Ciclo de vida del desarrollo del software.

El proceso de desarrollo de software requiere por un lado un conjunto de conceptos, una metodología y un lenguaje propio. A este proceso también se le llama el ciclo de vida del software que comprende cuatro grandes fases: concepción, elaboración, construcción y transición. La concepción define le alcance del proyecto y desarrolla un caso de negocio. La elaboración define un plan del proyecto, especifica las características y fundamenta la arquitectura. La construcción crea el producto y la transición transfiere el producto a los usuarios.

Actualmente se encuentra en una etapa de madurez el enfoque Orientado a Objetos (OO) como paradigma del desarrollo de sistemas de información.

Una de las contribuciones más importantes del modelo cascada es para los administradores, posibilitándoles avanzar en el desarrollo, aunque en una escala muy bruta.

4.3 Análisis.

Definición de un Modelo de Ciclo de Vida

Un modelo de ciclo de vida del software:

Describe las fases principales de desarrollo de software.Define las fases primarias esperadas de ser ejecutadas durante esas fases.
Ayuda a administrar el progreso del desarrollo, y
Provee un espacio de trabajo para la definición de un detallado proceso de desarrollo de software.


4.4 Diseño.

Principios básicos de diseño
•El diseñador debe considerar enfoques alternativosjuzgando a cada uno en base a los requisitos del problema, los resultados disponibles y los criterios de calidad interna
•Se deberían poder seguir los pasos de diseño hasta el modelo de análisis
•El diseño no va a reinventar nada que ya esté inventado
•El diseño debería presentar uniformidade integración
•Debe estructurarse para admitir cambios
•El diseño no es escribir código y escribir código no es diseñar
•Se debería valorar la calidad del diseño mientras se crea, no después de terminado
•Diseño de datos:
–Modelo de información a estructuras de datos.
•Diseño arquitectónico:
–Define las relaciones entre los elementos estructurales de nuestro programa.
•Diseño procedimental:
–Se transforman los elementos estructurales de nuestro programa en una descripción procedimental del software.
•Diseño de interfaz:
–Describe cómo se comunica el software consigo mismo y con su entorno.

Directrices para un buen diseño

•El diseño debe implementar todos los requisitos explícitoscontenidos en el modelo de análisis y debe acomodar todos los requisitos implícitosque desee el cliente
•El diseño debe ser una guía que puedan leer y entender los que construyan el código y los que prueban y mantienen el software
•El diseño debería proporcionar una completa idea de lo que es el software, enfocando los dominios de datos, funcional y de comportamiento desde la perspectiva de la implementación.

4.5 Evolución.

Un entorno de desarrollo integrado o IDE (acrónimo en inglés de integrated development environment), es un programa informático compuesto por un conjunto de herramientas de programación.

Un IDE es un entorno de programación que ha sido empaquetado como un programa de aplicación, es decir, consiste en un editor de código, un compilador, un depurador y un constructor de interfaz gráfica (GUI). Los IDEs pueden ser aplicaciones por sí solas o pueden ser parte de aplicaciones existentes. El lenguaje Visual Basic, por ejemplo, puede ser usado dentro de las aplicaciones de Microsoft Office, lo que hace posible escribir sentencias Visual Basic en forma de macros para Microsoft Word.


Ejemplos de IDE:

El eclipse y el EMF plantilla-basaron el sistema para la generación del fuente-código de modelos de UML.

NetBeans : con el paquete de la empresa de NetBeans IDE 5.5

IDEs de Java por Sunmicrosystems.


JCEE
JCSE
JCME
JCLE

 

UNIDAD V El lenguaje de modelado unificado

5.1 Antecedentes.

UML (Unified Modeling Language) es un lenguaje para especificar, visualizar, construir y documentar las diferentes etapas del desarrollo de software, así como para modelado de procesos de negocio u otros sistemas no-software. UML reúne una colección de las mejores prácticas en la ingeniería que han sido utilizadas con éxito para modelar sistemas grandes y complejos, ya que cubre tanto objetos conceptuales como los procesos de negocio y funciones del sistema, como también objetos concretos como clases en un lenguaje de programación, esquemas de base de datos y componentes reusables de software.

La técnica central en el UML es el Modelamiento en Objetos que es un lenguaje que permite la especificación de clases, sus datos o atributos (privados) y métodos (públicos), herencia y otras relaciones entre las clases.

Etapas y actividades en el desarrollo OO basado en UML
En la versión definitiva de la metodología publicada por Booch, Rumbaugh y Jacobson se pueden tener en cuenta las siguientes etapas:
· Análisis de Requerimientos
· Diseño del sistema
· Diseño detallado
· Implementación y pruebas
Cada etapa consta de actividades que le dan cuerpo y los documentos que se esperan al final de cada una de ellas.

Elementos Notacionales de UML
Los elementos notacionales que presenta el UML pretenden ser un lenguaje común para el modelamiento de cualquier sistema y se agrupan en tipos de diagrama:
1. Diagrama de Clases
2. Diagrama de Objetos
3. Diagrama de Casos de Uso
4. Diagrama de Secuencia
5. Diagrama de Colaboración
6. Diagrama de Estados
7. Diagrama de Actividades
8. Diagrama de Componentes
9. Diagrama de Ejecución


5.2 Vista estática.

La vista estática nos permite visualizar el comportamiento externo del programa; de esta forma conseguimos conocer qué es lo que debe hacer el programa independientemente de cómo lo haga y sabremos los elementos que interactúan con el sistema. Los elementos implicados en un diagrama de casos de uso son los casos de uso, las relaciones y los actores. Las relaciones y los casos de uso ya han sido explicados anteriormente y el papel del actor también ha sido comentado pero merece la pena detallarlo más: Un actor es un rol que interactúa con el sistema. Lo definimos como rol porque un actor puede ser tanto un usuario de la aplicación como otro sistema o dispositivos externos.



5.3 Vista dinámica.

5.4 Diagramas  HASTA AQUI PRIMER PARCIAL.

Tipos de Diagramas en UML

Grandes clásicos conocidos por todos, los diagramas de clases, distan mucho de ser los únicos definidos en el lenguaje. De hecho en la versión UML 2 existen trece (13) diagramas concretos y varias categorías de diagramas abstractos, creados como toda clase abstracta, para articular la presentación de los diagramas.

La siguiente figura UML muestra los tipos de diagramas:
Esquema de Diagramas UML

Fig. 1 – Tipos de diagramas en UML2

Análisis del código fuente de un programa

 Clase Ejemplo1

A continuación se muestra el programa principal, contenido en el fichero Ejemplo1.java. En

realidad, este programa principal lo único que hace es utilizar la clase Geometría y sus clases

derivadas. Es pues un programa puramente “usuario”, a pesar de lo cual hay que definirlo dentro de

una clase, como todos los programas en Java.

1. // fichero Ejemplo1.java

2. import java.util.ArrayList;

3. import java.awt.*;

Capítulo 1: Introducción a Java página 5

4. class Ejemplo1 {

5. public static void main(String arg[]) throws InterruptedException

6. {

7. System.out.println("Comienza main()...");

8. Circulo c = new Circulo(2.0, 2.0, 4.0);

9. System.out.println("Radio = " + c.r + " unidades.");

10. System.out.println("Centro = (" + c.x + "," + c.y + ") unidades.");

11. Circulo c1 = new Circulo(1.0, 1.0, 2.0);

12. Circulo c2 = new Circulo(0.0, 0.0, 3.0);

13. c = c1.elMayor(c2);

14. System.out.println("El mayor radio es " + c.r + ".");

15. c = new Circulo(); // c.r = 0.0;

16. c = Circulo.elMayor(c1, c2);

17. System.out.println("El mayor radio es " + c.r + ".");

18. VentanaCerrable ventana =

19. new VentanaCerrable("Ventana abierta al mundo...");

20. ArrayList v = new ArrayList();

21. CirculoGrafico cg1 = new CirculoGrafico(200, 200, 100, Color.red);

22. CirculoGrafico cg2 = new CirculoGrafico(300, 200, 100, Color.blue);

23. RectanguloGrafico rg = new

24. RectanguloGrafico(50, 50, 450, 350, Color.green);

25. v.add(cg1);

26. v.add(cg2);

27. v.add(rg);

28. PanelDibujo mipanel = new PanelDibujo(v);

29. ventana.add(mipanel);

30. ventana.setSize(500, 400);

31. ventana.setVisible(true);

32. System.out.println("Termina main()...");

33. } // fin de main()

34. } // fin de class Ejemplo1

 

 

La sentencia 1 es simplemente un comentario que contiene el nombre del fichero. El

compilador de Java ignora todo lo que va desde los caracteres // hasta el final de la línea.

Las sentencias 2 y 3 “importan” clases de los packages de Java, esto es, hacen posible acceder

a dichas clases utilizando nombres cortos. Por ejemplo, se puede acceder a la clase ArrayList

simplemente con el nombre ArrayList en lugar de con el nombre completo java.util.ArrayList, por

haber introducido la sentencia import de la línea 2. Un package es una agrupación de clases que

tienen una finalidad relacionada. Existe una jerarquía de packages que se refleja en nombres

compuestos, separados por un punto (.). Es habitual nombrar los packages con letras minúsculas

(como java.util o java.awt), mientras que los nombres de las clases suelen empezar siempre por una

letra mayúscula (como ArrayList). El asterisco (*) de la sentencia 3 indica que se importan todas las

clases del package. Hay un package, llamado java.lang, que se importa siempre automáticamente.

Las clases de java.lang se pueden utilizar directamente, sin importar el package.

La sentencia 4 indica que se comienza a definir la clase Ejemplo1. La definición de dicha

clase va entre llaves {}. Como también hay otras construcciones que van entre llaves, es habitual

indentar o sangrar el código, de forma que quede claro donde empieza (línea 4) y donde termina

(línea 34) la definición de la clase. En Java todo son clases: no se puede definir una variable o una

función que no pertenezca a una clase. En este caso, la clase Ejemplo1 tiene como única finalidad

acoger al método main(), que es el programa principal del ejemplo. Las clases utilizadas por main()

son mucho más importantes que la propia clase Ejemplo1. Se puede adelantar ya que una clase es

una agrupación de variables miembro (datos) y funciones miembro (métodos) que operan sobre

dichos datos y permiten comunicarse con otras clases. Las clases son verdaderos tipos de variables

ESIISS: Aprenda Java como si estuviera en Primero página 6

o datos, creados por el usuario. Un objeto (en ocasiones también llamado instancia) es una variable

concreta de una clase, con su propia copia de las variables miembro.

Las líneas 5-33 contienen la definición del programa principal de la aplicación, que en Java

siempre se llama main(). La ejecución siempre comienza por el programa o método main(). La

palabra public indica que esta función puede ser utilizada por cualquier clase; la palabra static

indica que es un método de clase, es decir, un método que puede ser utilizado aunque no se haya

creado ningún objeto de la clase Ejemplo1 (que de hecho, no se han creado); la palabra void indica

que este método no tiene valor de retorno. A continuación del nombre aparecen, entre paréntesis, los

argumentos del método. En el caso de main() el argumento es siempre un vector o array (se sabe

por la presencia de los corchetes []), en este caso llamado arg, de cadenas de caracteres (objetos de

la clase String). Estos argumentos suelen ser parámetros que se pasan al programa en el momento

de comenzar la ejecución (por ejemplo, el nombre del fichero donde están los datos).

El cuerpo (body) del método main(), definido en las líneas 6-33, va también encerrado entre

llaves {...}. A un conjunto de sentencias encerrado entre llaves se le suele llamar bloque. Es

conveniente indentar para saber dónde empieza y dónde terminan los bloques del método main() y

de la clase Ejemplo1. Los bloques nunca pueden estar entrecruzados; un bloque puede contener a

otro, pero nunca se puede cerrar el bloque exterior antes de haber cerrado el interior.

La sentencia 7 (System.out.println("Comienza main()...");) imprime una cadena de

caracteres o String en la salida estándar del sistema, que normalmente será una ventana de MSDOS

o una ventana especial del entorno de programación que se utilice (por ejemplo Visual J++, de

Microsoft). Para ello se utiliza el método println(), que está asociado con una variable static

llamada out, perteneciente a la clase System (en el package por defecto, java.lang). Una variable

miembro static, también llamada variable de clase, es una variable miembro que es única para toda

la clase y que existe aunque no se haya creado ningún objeto de la clase. La variable out es una

variable static de la clase System. La sentencia 7, al igual que las que siguen, termina con el carácter

punto y coma (;).

La sentencia 8 (Circulo c = new Circulo(2.0, 2.0, 4.0);) es muy propia de Java. En ella

se crea un objeto de la clase Circulo, que se define en el Apartado 1.3.4, en la página 11. Esta

sentencia es equivalente a las dos sentencias siguientes:

Circulo c;

c = new Circulo(2.0, 2.0, 4.0);

que quizás son más fáciles de explicar. En primer lugar se crea una referencia llamada c a un objeto

de la clase Circulo. Crear una referencia es como crear un “nombre” válido para referirse a un

objeto de la clase Circulo. A continuación, con el operador new se crea el objeto propiamente

dicho. Puede verse que el nombre de la clase va seguido por tres argumentos entre paréntesis. Estos

argumentos se le pasan al constructor de la clase como datos concretos para crear el objeto (en este

caso los argumentos son las dos coordenadas del centro y el radio).

Interesa ahora insistir un poco más en la diferencia entre clase y objeto. La clase Circulo es lo

genérico: es el patrón o modelo para crear círculos concretos. El objeto c es un círculo concreto, con

su centro y su radio. De la clase Circulo se pueden crear tantos objetos como se desee; la clase dice

que cada objeto necesita tres datos (las dos coordenadas del centro y el radio) que son las variables

miembro de la clase. Cada objeto tiene sus propias copias de las variables miembro, con sus propios

valores, distintos de los demás objetos de la clase.

La sentencia 9 (System.out.println("Radio = " + c.r + " unidades.");) imprime por la

salida estándar una cadena de texto que contiene el valor del radio. Esta cadena de texto se compone

de tres sub-cadenas, unidas mediante el operador de concatenación (+). Obsérvese cómo se accede

Capítulo 1: Introducción a Java página 7

al radio del objeto c: el nombre del objeto seguido del nombre de la variable miembro r, unidos por

el operador punto (c.r). El valor numérico del radio se convierte automáticamente en cadena de

caracteres. La sentencia 10 es similar a la 9, imprimiendo las coordenadas del centro del círculo.

Las sentencias 11 y 12 crean dos nuevos objetos de la clase Circulo, llamados c1 y c2.

La sentencia 13 (c = c1.elMayor(c2);) utiliza el método elMayor() de la clase Circulo. Este

método compara los radios de dos círculos y devuelve como valor de retorno una referencia al

círculo que tenga mayor radio. Esa referencia se almacena en la referencia previamente creada c. Un

punto importante es que todos los métodos de Java (excepto los métodos de clase o static) se

aplican a un objeto de la clase por medio del operador punto (por ejemplo, c1.elMayor()). El otro

objeto (c2) se pasa como argumento entre paréntesis. Obsérvese la forma “asimétrica” en la que se

pasan los dos argumentos al método elMayor(). De ordinario se llama argumento implícito a c1,

mientras que c2 sería el argumento explícito del método.

La sentencia 14 imprime el resultado de la comparación anterior y la sentencia 15 crea un

nuevo objeto de la clase Circulo guardándolo en la referencia c. En este caso no se pasan

argumentos al constructor de la clase. Eso quiere decir que deberá utilizar algunos valores “por

defecto” para el centro y el radio. Esta sentencia anula o borra el resultado de la primera

comparación de radios, de modo que se pueda comprobar el resultado de la segunda comparación.

La sentencia 16 (c = Circulo.elMayor(c1, c2);) vuelve a utilizar un método llamado

elMayor() para comparar dos círculos: ¿Se trata del mismo método de la sentencia 13, utilizado de

otra forma? No. Se trata de un método diferente, aunque tenga el mismo nombre. A las funciones o

métodos que son diferentes porque tienen distinto código, aunque tengan el mismo nombre, se les

llama funciones sobrecargadas (overloaded). Las funciones sobrecargadas se diferencian por el

numero y tipo de sus argumentos. El método de la sentencia 13 tiene un único argumento, mientras

que el de la sentencia 16 tiene dos (en todos los casos objetos de la clase Circulo). En realidad, el

método de la sentencia 16 es un método static (o método de clase), esto es, un método que no

necesita ningún objeto como argumento implícito. Los métodos static suelen ir precedidos por el

nombre de la clase y el operador punto (Java también permite que vayan precedidos por el nombre

de cualquier objeto, pero es considerada una nomenclatura más confusa.). La sentencia 16 es

absolutamente equivalente a la sentencia 13, pero el método static de la sentencia 16 es más

“simétrico”. Las sentencias 17 y 18 no requieren ya comentarios especiales.

Las sentencias 18-31 tienen que ver con la parte gráfica del ejemplo. En las líneas 18-19

(VentanaCerrable ventana = new VentanaCerrable("Ventana abierta al mundo...");) se crea una

ventana para dibujar sobre ella. Una ventana es un objeto de la clase Frame, del package java.awt.

La clase VentanaCerrable, explicada en el Apartado 1.3.9 en la página 17, añade a la clase Frame

la capacidad de responder a los eventos que provocan el cierre de una ventana. La cadena que se le

pasa como argumento es el título que aparecerá en la ventana (ver Figura 1.1). En la sentencia 20

(ArrayList v = new ArrayList();) se crea un objeto de la clase ArrayList (contenida o definida en

el package java.util). La clase ArrayList permite almacenar referencias a objetos de distintas clases.

En este caso se utilizará para almacenar referencias a varias figuras geométricas diferentes.

Las siguientes sentencias 21-27 crean elementos gráficos y los incluyen en la lista v para ser

dibujados más tarde en el objeto de la clase PanelDibujo. Los objetos de la clase Circulo creados

anteriormente no eran objetos aptos para ser dibujados, pues sólo tenían información del centro y el

radio, y no del color de línea. Las clases RectanguloGrafico y CirculoGrafico, definidas en los

Apartados 1.3.6 y 1.3.7, derivan respectivamente de las clases Rectangulo (Apartado 1.3.3) y

Circulo (Apartado 1.3.4), heredando de dichas clases sus variables miembro y métodos, añadiendo

la información y los métodos necesarios para poder dibujarlos en la pantalla. En las sentencias 21-

ESIISS: Aprenda Java como si estuviera en Primero página 8

22 se definen dos objetos de la clase CirculoGrafico; a las coordenadas del centro y al radio se une

el color de la línea. En la sentencia 23-24 se define un objeto de la clase RectanguloGrafico,

especificando asimismo un color, además de las coordenadas del vértice superior izquierdo, y del

vértice inferior derecho. En las sentencias 25-27 los objetos gráficos creados se añaden al objeto v

de la clase ArrayList, utilizando el método add() de la propia clase ArrayList.

En la sentencia 28 (PanelDibujo mipanel = new PanelDibujo(v);) se crea un objeto de la

clase PanelDibujo, definida en el Apartado 1.3.8. Por decirlo de alguna manera, los objetos de

dicha clase son paneles, esto es superficies en las que se puede dibujar. Al constructor de

PanelDibujo se le pasa como argumento el vector v con las referencias a los objetos a dibujar. La

sentencia 29 (ventana.add(mipanel);) añade o incluye el panel (la superficie de dibujo) en la

ventana; la sentencia 30 (ventana.setSize(500, 400);) establece el tamaño de la ventana en pixels;

finalmente, la sentencia 31 (ventana.setVisible(true);) hace visible la ventana creada.

¿Cómo se consigue que se dibuje todo esto? La clave está en la serie de órdenes que se han

ido dando al computador. La clase PanelDibujo deriva de la clase Container a través de Panel, y

redefine el método paint() de Container. En este método, explicado en el Apartado 1.3.8, se realiza

el dibujo de los objetos gráficos creados. El usuario no tiene que preocuparse de llamar al método

paint(), pues se llama de modo automático cada vez que el sistema operativo tiene alguna razón

para ello (por ejemplo cuando se crea la ventana, cuando se mueve, cuando se minimiza o

maximiza, cuando aparece después de haber estado oculta, etc.).




La Figura 1.1 muestra la ventana


resultante de la ejecución del programa main() de la clase Ejemplo1. Para entender más a fondo

este resultado es necesario considerar detenidamente las clases definidas en los apartados que

siguen.

1.3.2 Clase Geometria

En este apartado se describe la clase más importante de esta aplicación. Es la más importante no en

el sentido de lo que hace, sino en el de que las demás clases “derivan” de ella, o por decirlo de otra

forma, se apoyan o cuelgan de ella. La Figura 1.2 muestra la jerarquía de clases utilizada en este

ejemplo. La clase Geometria es la base de la jerarquía. En realidad no es la base, pues en Java la

clase base es siempre la clase Object. Siempre que no se diga explícitamente que una clase deriva de

otra, deriva implícitamente de la clase Object (definida en el package java.lang). De las clases

Figura 1.1. Resultado de la ejecución del Ejemplo1.

Dibujable

RectanguloGrafico

Rectangulo

Dibujable

CirculoGrafico

Circulo

Geometria




Hoy habia 9 visitantes (12 clics a subpáginas) ¡Aqui en esta página!
Este sitio web fue creado de forma gratuita con PaginaWebGratis.es. ¿Quieres también tu sitio web propio?
Registrarse gratis