jueves, 13 de marzo de 2008

IPF1501: Unidad I - Clase Nº 1



¿Qué es Java?
No es solo un lenguaje de programación, si no que una “PLATAFORMA” para el desarrollo de aplicaciones.
Es completamente orientado a objetos (OO). Usa una sintaxis conocida, tomando sus estructuras sintácticas del lenguaje C++, además, omite algunos conceptos complejos de programación como el manejo de memoria a bajo nivel (Punteros), eliminando de raíz la fuente de muchos problemas en las aplicaciones, problemas casi siempre de un muy alto costo de corrección debido a su complejidad.
La plataforma Java se compone de los siguientes elementos:
  • Un lenguaje de programación orientado a objetos (POO). Su sintaxis es similar a la de C++.
  • Un ambiente de desarrollo capaz de transformar un programa en lenguaje Java en un programa en código Java denominado Java Byte Code. El Byte Code no corresponde al lenguaje de una máquina en particular, sino que a un código intermedio independiente de la plataforma en la que se ejecutará la aplicación (JDK, refiérase Arquitectura Java).
  • Un ambiente de ejecución, al que se le denomina Maquina Virtual de Java o Java Virtual Machine (JVM). En esencia la aplicación corre sobre la JVM y es esta es la que se preocupa que conversar con el SO correspondiente. Es la encargada de implementar las bibliotecas estándares o librerías (JRE, refiérase Arquitectura Java).
La plataforma de Java otorga un ambiente de desarrollo multiplataforma, gracias a la JVM, en el que las aplicaciones se escriben y prueban en una única máquina, para luego migrarlas o transportarlas, sin necesidad de modificaciones, entre distintos SO (Write once, run anywhere).

La simplicidad de Java
Java es un lenguaje moderno completamente OO, lo que permite a los programadores hacer un uso en forma natural de las nuevas técnicas de análisis y diseño de aplicaciones. Utilizando la experiencia aprendida de sus predecesores (C y C++) Java ha eliminado las complejidades que constituyen un riesgo para el desarrollo de aplicaciones.
  • Java no posee aritmética de punteros, práctica que constituye el origen de muchos errores de programación, además de ser muy difíciles de detectar y corregir.
  • Java posee un recolector de basura o Garbage Collector (GC), perteneciente a la JVM, que tiene la responsabilidad de liberar la memoria reservada por nuestras aplicaciones que ya no se esté utilizando.
  • Java puede ser utilizado tanto en celulares, electrodomésticos como en Internet (Web).
  • Permite la realización de programas más grandes y complejos, con equipos de trabajo más pequeños y en menos tiempo (No muy cercano a la realidad :().

Tipos de Java

  • J2SE/JSE – Java StandardEdition, orientado al desarrollo de aplicaciones de escritorio (similares a VB) y, lo más importante, se utiliza en la creación de librería para ser utilizadas en los distintos tipos de Java.
  • J2EE/JEE – Java Enterprise Edition, como su nombre lo dice está orientado al desarrollo de sistemas empresariales, consta de una serie de normas que determinan patrones y comportamientos, orientado fuertemente a aplicaciones Web. Es en este tipo donde aparecen elementos como JSP, Servlet, Applet, EJB, entre otros.
  • J2ME/JME – Java Micro Edition, orientado al desarrollo de aplicaciones en dispositivos móviles como celulares, GPS, PALM, PocketPC, etc.

Historia
Línea de tiempo
(Fuente: PC Magazine, vol. 17, No. 7, 7 Abril de 1998).

Enero 1991
Java nace como Oak, con el objetivo de permitir el desarrollo de aplicaciones para electrodomésticos. Uno de los personajes más relevantes del “Green Team” es James Gosling.

Marzo 1993
SUN enfoca Oak hacia un proyecto de televisión interactiva de la Time Warner. Silicon Graphics se gana la propuesta.

Agosto 1994
Se desecha el proyecto, y se pierde la propuesta.

Julio 1994
Sun orienta el potencial de Oak hacia Internet, donde se requiere correr aplicaciones en estaciones en las que no se tiene el control sobre su configuración, apuntando la tecnología hacia su actual funcionalidad.

Mayo 1995
Java es oficialmente presentado en la Sun World 1995. Netscape es la primera empresa en adherirse al ambiente Java. Sun libera una versión alfa de su navegador de Internet llamado Hot Java.

Diciembre 1995
Symantec libera el primer ambiente de desarrollo Java para Windows 95 y Windows NT, llamado Symantec Café, el que tiene un éxito inmediato.

Enero 1996
Sun forma JavaSoft, para el desarrollo de productos basados en Java y para trabajar con otros desarrolladores.

Enero 1996
Sun libera el ambiente de desarrollo Java 1.0 (JDK 1.0). Incluye el Java Applet View, el compilador de Java y la primera JVM (JRE).

Febrero 1997
Sun libera JDK 1.1, que incluye la especificación para Java Beans.

Abril 1997
Sun anuncia Personal Java orientado a desarrollar aplicaciones en dispositivos del hogar y oficina.

¡JAVA HA VUELTO A SU ORIGEN!

Arquitectura
La arquitectura de Java consta de dos grandes piezas conocidas bajo las siglas JDK (Java Development Enviroment) y JRE (Java Runtime Enviroment), quienes tienen distintas responsabilidades a la hora de compilar y ejecutar un programa Java.

JDK
Es el encargado de proveer las herramientas necesarias para llevar a cabo la COMPILACIÓN (Archivo.java) del código fuente Java y transformarlo en Byte Code (Archivo.class).
Algunos incluyen otras piezas tales como editores de texto sensible y herramientas de debug (Depuración, búsqueda de errores), estos ambientes reciben el nombre de IDE (Integrated Development Enviroment), en este curso utilizaremos BlueJ.

JRE
Es el ambiente que provee las herramientas necesarias para llevar a cabo la EJECUCIÓN de un Byte Code. Es donde se encuentra la JVM, además de un módulo conocido como Cargador de Clases y un Intérprete de Java.


Programación Orientada a Objetos
La Programación Orientada
a Objetos (POO u OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas computacionales. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo, y encapsulamiento. Su uso se popularizó a principios de la década de 1990. Actualmente son muchos los lenguajes de programación que soportan la orientación a objetos entre ellos Java.


Conceptos
Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:

Objeto: Entidad provista de un conjunto de propiedades o atributos y de comportamiento o funcionalidad conocidos como métodos. Corresponden a los objetos reales del mundo que nos rodea, o a objetos internos del sistema o programa. Corresponde a una instancia de una clase.

Clase: Definiciones de las propiedades y comportamientos de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.

Propiedad o atributo: Contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método.

Método: Algoritmo asociado a un objeto (que se define en las clases), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

Evento: Un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera.

Mensaje: Una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

Estado interno: Es una propiedad invisible de los objetos, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos).

Características
Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes:

Abstracción: Es el proceso de generalización o agrupamiento de objetos, es decir, es el proceso en el cual se intenta mirar el modelo de objetos desde un nivel más alto buscando un objeto que contenga de forma generalizada a otros.
Por ejemplo, imaginemos que estamos en casa sentados viendo TV de pronto nuestra atención se centra en nuestros perros (para este caso de nombre Pillin y Camila), vamos a aplicar el concepto de abstracción e intentemos llevar a Pillin y Camila a un diagrama OO.

Pillin
y Camila son objetos (tienen características distintas, como color, tamaño, etc.) si quisiéramos representar a Pillin y Camila en un nivel más abstracto deberíamos decir que son de la clase Perro, ahora si queremos subir un nivel de abstracción más podríamos decir que la clase Perro y la clase Gato (que es una abstracción de las mascotas de mi vecino llamados Luna y Estrella) corresponden a la clase Mamífero y si quisiéramos generalizar aún más subiendo otro nivel de abstracción podríamos decir que la clase Mamífero extiende (extends) de la clase Animal.

Herencia: Como en la vida real, la herencia es el legado o cualidad que nos dejan nuestros antecesores o personas mayores (en la mayoría de los casos), en Java sufre una leve modificación y se dice que es el mecanismo en el cual “un Padre hereda (extends) cualidades a un Hijo y esas cualidades son nada más que atributos o métodos, en otras palabras código Java, por esta razón la herencia se utiliza para ordenar nuestro esquema de clases y para la reutilización de código.

Por ejemplo recordemos el esquema anterior basándonos en la herencia y se podría traducir de la siguiente manera:

La clase Perro extiende de la clase Mamífero, quien a su vez extiende de la clase Animal.

Eso quiere decir que todas los atributos y métodos que tiene implementada la clase Animal se encuentran, también, en la clase Mamífero y que a su vez todas las propiedades y métodos de la clase Mamífero se encuentran en la clase Perro.

¿La clase Perro posee atributos y métodos de la clase Animal?
R: Si, al hacer herencia se heredan todos los atributos y métodos inclusive los ya heredados anteriormente.

La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes.

Encapsulamiento: Es el término utilizado en la POO que describe la acción en la cual se definen métodos y propiedades (como definición, no sus valores) especificas de una clase, que las caracteriza en el mundo real. Está íntimamente relacionada con el Principio de ocultación de información, definiendo que partes estarán ocultas y cuales visibles.

Por ejemplo, tenemos la clase Ampolleta y vamos a aplicar la encapsulación para poder definir su estructura de clase (definir atributos y propiedades, y sus respectivas visibilidades):

Atributos o valores IMPORTANTES de una Ampolleta

  • Estado (si esta encendida o apagada) (Privado)

Métodos IMPORTANTES de una Ampolleta

  • Encender (Público)
  • Apagar (Público)
  • Energizar la ampolleta (Privado)
  • Desenergizar la ampolleta (Privado)

En relación a la visibilidad de los atributos, recordemos que los atributos son variables que contienen datos o valores y en Java SIEMPRE los datos son privados. A menos que explícitamente te definan lo contrario, el manejo de los valores de los atributos de Java SIEMPRE debe ser a través de métodos de la clase y nunca directamente utilizando los atributos.
Ahora, en los métodos encontramos algunos públicos y otros privados y esto depende del aislamiento que se quiera tener en los sistemas, solo los métodos públicos podrán ser
accesados desde otros objetos, mientras que los métodos privados solo se podrán invocar desde la misma clase.
En este caso se declararon dos métodos públicos que corresponde al conocimiento natural de las acciones que realiza una ampolleta Encender y Apagar estos pueden ser invocados desde otros objetos de nuestra aplicación, quienes a su vez (y de forma interna, en la misma clase) invocan a los métodos privados Energizar y Desenergizar.

Polimorfismo: Se dice que dos objetos son polimórficos cuando poseen una interfaz común (generalmente una clase abstracta) pero que al momento de heredar y sobrescribir los métodos tienen un comportamiento distinto.
Este término es el más complicado de entender y generalmente se le da menos importancia, pero es uno de los más poderosos ya que permite tener una alta cohesión y un bajo acoplamiento de los modelos de clases.

Por ejemplo, tenemos una clase abstracta llama Figura que tiene un método implementado llamado Dibujar Contorno, de esta clase extienden dos llamadas Triangulo y Cuadrado en ambas se sobrescribe el método de la clase padre y se implementa el necesario para cumplir con el objetivo: Dibujar la figura correspondiente. A simple vista nos damos cuenta que ambas clases son polifórmicas ya que ambas heredan de la clase Figura, ambas sobrescribieron el método Dibujar Contorno y al llamar al mismo método pero en clases distintas producen resultado completamente distintos (en este caso un triángulo y un cuadrado respectivamente).

Cohesión: Que todas las clases tengan un fin en común y lógico, por ejemplo en una clase Auto se debería implementar atributos y métodos que me permitan acelerar, frenar, doblar (Izq. y Der.) y NO que se preocupe de los datos pertenecientes al seguro. Un buen diseño siempre busca mantener una ALTA COHERSIÓN.

Acoplamiento: Es la interdependencia que existe entre clases, esto ocurre normalmente cuando una clase necesita saber demasiados detalles internos de otra clase para su buen funcionamiento, es decir rompe con el esquema del encapsulamiento y produce que la mantención del sistema sea tediosa y complicada (no es el principio de Java). En un buen diseño mientras más BAJO ACOPLAMIENTO mejor.

Principio de ocultación: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que específica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.


martes, 11 de marzo de 2008

Introducción a la Programación, DuocUC.

Profesor de "Introducción a la programación", carrera "Analista Programador Computacional".
DuocUC, Sede Alonso de Ovalle.

Esta vía será usada para compartir archivos, noticias e información referentes al curso.

Descripción curso:
Nombre: Introducción a la programación.
Sigla: IPF1501.

Temario del curso:
Unidad I) Fundamentos lenguaje programación Java.
Unidad II) Clases y Objetos.
Unidad III) Bibliotecas y documentación.

Calificaciones:
3 pruebas (1 por unidad).
2 trabajos individuales (Unidades II y III).
* cada nota equivale a un 20% de la nota presentación exámen.

Programas útiles para el ramo:
BlueJ 2.0: Entorno de desarrollo (IDE).

Para Windows
Para MacOS X
Otros SO

JDK 5.0: Kit desarrollo Java.
java.sun.com

Bibliografía:
Piensa en Java 3º Edición, Bruce Eckel.

¿Quieres saber cuanto gana un Informático con conocimientos de Java, en el mundo?

Ni te lo imaginabas?... Ya sabes asi que a estudiar!!! :)