% Activate the following line by filling in the right side. If for example the name of the root file is Main.tex, write
% "...root = Main.tex" if the chapter file is in the same directory, and "...root = ../Main.tex" if the chapter is in a subdirectory.
 
%!TEX root =  ../notas_java.tex

\chapter[Introducción]{Introducción}

Java es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems a principio de los años 90's.

En Diciembre de 1950 Patrick Naughton, ingeniero de Sun Microsystems, reclutó a varios colegas entre ellos James Gosling y Mike Sheridan para trabajar sobre un nuevo proyecto conocido como El proyecto verde. Con la ayuda de otros ingenieros, empezaron a trabajar en una pequeña oficina en Sand Hill Road en Menlo Park, California. Y así interrumpió todas las comunicaciones regulares con Sun y trabajó sin descanso durante 18 meses.

Intentaban desarrollar una nueva tecnología para programar la siguiente generación de dispositivos inteligentes, en los que Sun veía un campo nuevo a explorar. Crear un lenguaje de programación fácil de aprender y de usar. En un principio se consideraba C++ como lenguaje a utilizar, pero tanto Gosling como Bill Joy lo encontraron inadecuado. Gosling intentó primero extender y modificar C++ resultando el lenguaje C++ ++ - (++ - porque se añadían y eliminaban características a C++), pero lo abandonó para crear un nuevo lenguaje desde cero al que llamo Oak (roble en inglés, según la versión mas aceptada, por el roble que veía a través de la ventana de su despacho).

El resultado fue un lenguaje que tenía similitudes con C, C++ y Objetive C y que no estaba ligado a un tipo de CPU concreta. Mas tarde, se cambiaría el nombre de Oak a Java, por cuestiones de propiedad intelectual, al existir ya un lenguaje con el nombre de Oak. Se supone que le pusieron ese nombre mientras tomaban café (Java es nombre de un tipo de café, originario de Asia), aunque otros afirman que el nombre deriva de las siglas de James Gosling, Arthur Van Hoff, y Andy Bechtolsheim. 
	
\section{Propiedades deseables: Reusabilidad y extensibilidad, entre otras}

\textbf{Reusabilidad.} Cuando hemos diseñado adecuadamente las clases, se pueden usar en distintas partes del programa y en numerosos proyectos.

\textbf{Mantenibilidad.} Debido a las sencillez para abstraer el problema, los programas orientados a objetos son más sencillos de leer y comprender, pues nos permiten ocultar detalles de implementación dejando visibles sólo aquellos detalles más relevantes.

\textbf{Modificabilidad.} La facilidad de añadir, suprimir o modificar nuevos objetos nos permite hacer modificaciones de una forma muy sencilla.

\textbf{Fiabilidad.} Al dividir el problema en partes más pequeñas podemos probarlas de manera independiente y aislar mucho más fácilmente los posibles errores que puedan surgir.


\section{Programación orientada a objetos}

La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa los objetos en sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento. Su uso se popularizó a principios de la década de los años 1990. En la actualidad, existe una gran variedad de lenguajes de programación que soportan la orientación a objetos.

Un paradigma de programación es una propuesta tecnológica que es adoptada por una comunidad de programadores cuyo núcleo central es incuestionable en cuanto a que únicamente trata de resolver uno o varios problemas claramente delimitados. Es un estilo de programación empleado. La resolución de estos problemas debe suponer consecuentemente un avance significativo en al menos un parámetro que afecte a la ingeniería de software. Tiene una estrecha relación con la formalización de determinados lenguajes en su momento de definición. Un paradigma de programación está delimitado en el tiempo en cuanto a aceptación y uso ya que nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial o totalmente.

Un objeto es una unidad dentro de un programa de computadora que consta de un estado y de un comportamiento, que a su vez constan respectivamente de datos almacenados y de tareas realizables durante el tiempo de ejecución. 

\section{Ingeniería de Software. Ventajas de la Programación Orientada a Objetos}

Las ventajas más importantes de la programación orientada a objetos: son Reusabilidad, Mantenibilidad, Modificabilidad y Fiabilidad.
 
La programación orientada a objetos presenta también algunas desventajas como pueden ser:

    Cambio en la forma de pensar de la programación tradicional a la orientada a objetos.
    
    La ejecución de programas orientados a objetos es más lenta.
    
    La necesidad de utilizar bibliotecas de clases obliga a su aprendizaje y entrenamiento.


\section{El lenguaje de programación Java}

Las características principales que nos ofrece Java son:

\textbf{1.- Lenguaje  Simple:}

Se lo conoce como lenguaje simple porque viene de la misma estructura de c y c++; ya que c++ fue un referente para la creación de java por eso utiliza determinadas características de c++ y se han eliminado otras.

\textbf{2.- Orientado a Objeto:}

Toda la programación en java en su mayoría está orientada a objeto, ya que al estar agrupados en estructuras en estructuras encapsuladas es más fácil su manipulación.

\textbf{3.- Distribuido:}

Permite abrir sockets, establecer y aceptar conexiones con los servidores o clientes remotos; facilita la creación de aplicaciones distribuidas ya que proporciona una colección de clases para aplicaciones en red.

\textbf{4.- Robusto:}

Es altamente fiable en comparación con c,  se han eliminado muchas características con la aritmética de punteros, proporciona numerosas comprobaciones en compilación y en tiempo de ejecución.

\textbf{5.- Seguro:}

La seguridad es una característica muy importante en java ya que se han implementado barreras des eguridad en el lenguaje y en el sistema de ejecución de tiempo real.

\textbf{6.- Indiferente a la arquitectura:}

Java es compatible con los más variados entornos de red, cualquiera sean estos desde Windows 95, Unix aWindows Nt  y Mac, para poder trabajar con diferentes sistemas operativos.

Java es muy versátil ya que utiliza byte-codes que es un formato intermedio que sirve para transportar el código eficientemente o de diferentes  plataformas (Hardware - Software).

\textbf{7.- Portable:}

Por ser indiferente a la arquitectura sobre la cual está trabajando, esto hace que su portabilidad sea muy eficiente, sus programas son iguales en cualquiera de las plataformas, yaque java especifica tamaños básicos, esto se conoce como la máquina virtual de java.

\textbf{8.- Interpretado y compilado a la vez:}

Java puede ser compilado e interpretado en tiempo real,  ya que  cuando se construye el código fuente este se transforma en una especie de código de máquina.

 
\textbf{9.- Multihebra o Multihilos:}

Java tiene una facilidad de cumplir varias funciones al mismo tiempo, gracias a su función  de multi-hilos ya que por cada hilo que el programa tenga se ejecutaran en tiempo real muchas funciones al mismo tiempo.

\textbf{10.- Dinámico:}

El lenguaje java es muy dinámico en la fase de enlazado, sus clases solamente actuaran en medida en que  sean requeridas o necesitadas con esto permitirá que los enlaces se puedan incluir incluso desde fuentes muy variadas o desde la red.

\textbf{11.- Produce Applets:}

En java se pueden crear aplicaciones independientes y applets.

Independientes porque se pueden comportar como cualquier programa escrito en cualquier lenguaje.

Por otra parte los applets considerados pequeños programas, tienen la capacidad de ejecutar funciones muy complejas.

\textbf{12.- Alto rendimiento}

Java es considerado de alto rendimiento por ser tan  veloz en el momento de correr los programas y por ahorrase muchas líneas de código.

\section{Ciclo de desarrollo de programas en Java}

\textbf{Planificación}

La importante tarea a la hora de crear un producto de software es obtener los requisitos o el análisis de los requisitos. Los clientes suelen tener una idea más bien abstracta del resultado final, pero no sobre las funciones que debería cumplir el software.

Una vez que se hayan recopilado los requisitos del cliente, se debe realizar un análisis del ámbito del desarrollo. Este documento se conoce como especificación funcional.

\textbf{Implementación, pruebas y documentación}

La implementación es parte del proceso en el que los ingenieros de software programan el código para el proyecto.

Las pruebas de software son parte esencial del proceso de desarrollo del software. Esta parte del proceso tiene la función de detectar los errores de software lo antes posible.

La documentación del diseño interno del software con el objetivo de facilitar su mejora y su mantenimiento se realiza a lo largo del proyecto. Esto puede incluir la documentación de un API, tanto interior como exterior.


\textbf{Despliegue y mantenimiento}

El despliegue comienza cuando el código ha sido suficientemente probado, ha sido aprobado para su liberación y ha sido distribuido en el entorno de producción.

Entrenamiento y soporte para el software es de suma importancia y algo que muchos desarrolladores de software descuidan. Los usuarios, por naturaleza, se oponen al cambio porque conlleva una cierta inseguridad, es por ello que es fundamental instruir de forma adecuada a los futuros usuarios del software.

El mantenimiento y mejora del software de un software con problemas recientemente desplegado puede requerir más tiempo que el desarrollo inicial del software. Es posible que haya que incorporar código que no se ajusta al diseño original con el objetivo de solucionar un problema o ampliar la funcionalidad para un cliente. Si los costes de mantenimiento son muy elevados puede que sea oportuno rediseñar el sistema para poder contener los costes de mantenimiento.
