Para desarrollar aplicaciones en java



Descargar 106,58 Kb.
Fecha de conversión24.03.2017
Tamaño106,58 Kb.

Para desarrollar aplicaciones en java


Desarrollar aplicaciones computacionales utilizando el lenguaje java es modelar y codificar clases que resuelven un problema de la vida real. Por tanto entender el concepto de “clase” es fundamental para ser productivo utilizando a la herramienta java.

Es tentador iniciar el estudio de java estudiando y utilizando sus instrucciones, su sintaxis y sus palabras reservadas propias del lenguaje. La mayoría de los textos que le abordan así lo enfocan; es más, fue de esa manera como muchos desarrolladores de software aprendieron a utilizar este tipo de herramientas para concebir aplicaciones computacionales, sean estas al ambiente local, cliente servidor o aplicaciones orientadas al web. Pero, la experiencia indica, que, además de tentador, es bastante ineficiente y bastante improductivo para enfrentar problemas de la vida real. Por tanto se tiene el criterio que, una vez que el lector haga suyo el concepto de clase, se está en capacidad de iniciar y finalizar aplicaciones computacionales altamente en tiempos relativamente cortos.

Pero se tiene un gran problema: el concepto de clase no es nada intuitivo ni fácil de entender. Es un concepto abstracto, que, por definición apela a la imaginación, a la creatividad y a otro gran tema de estudio que se podría denominar modelaje. (Y cuando se cita la palabra modelaje se debe tener en perspectiva que la expresión “arte” está a la vuelta de la esquina).

A pesar de que el concepto clase es complejo de adoptar y adaptar, y a pesar de la dificultad que implica aprender a trabajar con algo que no se entiende a cabalidad, sí se tiene el convencimiento que, en el muy corto plazo, los réditos son muy, pero muy gratificantes.


El concepto de clase


Como cada autor tiene su propio concepto de clase, en muchos en los cuales se coincide y muy pocos no, se puede decir que, dada cualquier abstracción de cualquier naturaleza, es decir cualquier idea, algoritmo, metodología, entre otros, los cuales dispongan de características similares, se entendería como “clase” a la plantilla, patrón, estructura o modelo que represente esa abstracción.

Una clase, perfectamente, puede ser la expresión matemática utilizada en el cálculo del área de un triángulo, por ejemplo. O la manera intuitiva de calcular áreas bajo un curva imaginando pequeñísimos rectángulos, calcularles su área y luego sumarlos para esperar que sea muy parecida al operador matemático denominado “integral” que, cualquier profesional emplearía. O, el conjunto de propiedades y actividades que implican la idea “persona humana”, “árbol”, “mapa”, “pintor”, “emisión de cheques”, “cajero automático”, y demás.

Similarmente, una clase puede ser desarrollada utilizando otra clase que otra persona acabó y la expuso al conocimiento al público, pero, en aras de resolver un problema en particular, se hace necesario agregarle algún concepto, componente o idea que, la clase primera, es decir, la ancestral, no disponía.

En java es muy común la idea esbozada en el párrafo anterior: dada una clase el analista la “incorpora” para resolver “el” problema que tiene en mente. Inclusive, se puede afirmar que trabajar bajo el contexto de otra clase ya elaborada es la norma del desarrollo de aplicaciones en java. La relación jerárquica de superclase y subclase es crucial entenderla para evitar descubrir el agua tibia cada vez que se aborda algún problema en particular.


¿Una clase que calcula áreas de triángulos?


Teniendo por referencia la posible dificultad de asociar la idea de abstracción de una clase como la idea de “la clase que calcularía las áreas de triángulos”, se debe discriminar las expresiones “las áreas de los triángulos” con la expresión “un área de un triángulo” en particular.

Cuando una clase sigue paso a paso las instrucciones que conducen al cálculo de un triángulo “en abstracto”, es decir, dadas una altura y una base definidas en un espacio determinado, se dice que se hace necesario hacer una instancia de una clase ya elaborada (ya codificada en java) para “estar en capacidad de conocer” el área.

Nótese como paulatinamente lenguajes como java se empiezan a diferenciar de otros lenguajes, como el Pascal, por ejemplo. En java se construyen clases con el fin de implementarlas para la solución de un conjunto de problemas “con características similares”. En Pascal, se construyen archivos “ejecutables” a los cuales se les alimenta parámetros para resolver “problemas similares”.

Instanciando una clase conduce a otro concepto medular en el lenguaje java: al concepto de objeto. La relación entre clase y objeto, y entre objeto y clase, ha abierto todo un nuevo paradigma computacional en el arte del desarrollo de aplicaciones: la programación orientada al objeto, OOP.

Una clase que “calcula áreas de triángulos” es un patrón que implica la implementación del algoritmo propio del área de los triángulos, el producto de la base por la altura y dividiendo el resultado entre dos. Pero ese patrón de cálculo no necesita ser codificado pensando en un triángulo en particular, sino, y esta es la clave, pensando en cualquier triángulo del universo.

La clase que calcula áreas de triángulos no necesita conocer cómo se obtuvo el valor de la base, ni si la altura tiene dimensiones de centímetros o metros, o, si el triangulo representa un terreno de construcción de una casa o, la configuración natural de tres estrellas en el firmamento. Este hecho tan interesante que obliga a los desarrolladores de software a pensar en abstracciones y no en problemas puntuales, ha hecho posible la resolución de planteamientos que, en otros tiempos, requería mucho esfuerzo para la resolución de problemas.


De la clase a las propiedades y a los métodos


La abstracción de clases es la misma idea de la abstracción de sistemas. Por lo tanto, pensar sistémicamente es requisito sine qua non para modelar clases.

Así como los sistemas tienen estados y conductas, las clases tienen propiedades y métodos. Las propiedades son estados de las clases. Una propiedad puede ese el color, la cual, al instanciarlo, genera el color de un determinado objeto, esto es, combina las cantidades de “pigmentos” rojo, azul y verdes. El peso, el valor de las dimensiones, el volumen, el área, el tamaño, entre muchos otros “valores” naturales de un objeto, son ejemplos típicos de las propiedades que los objetos adquieren al ser instanciadas desde una clase.

Por otra parte, los métodos reflejan las conductas de las clases. Conductas en el sentido de “qué hacer”, “cómo actuar”, “qué actividad ejecutar”, “qué evento disparar” cuando alguna instrucción, línea de código o el propio usuario al movimiento de un click del ratón, activa al método en cuestión.

Por tanto es imperativo empezar a diseñar métodos. Y aprendiendo a construir métodos se aprende a ensamblar el código java.


Los métodos


En la Sección anterior se introdujo el verbo “ensamblar”. Y se hizo a propósito en este punto porque, construir clases y aplicaciones con java –como en cualquier otro lenguaje orientado al objeto- es, ni más ni menos, ensamblar continuamente partes ya terminadas de código. A cada una de estas partes de código se denominan métodos.

Métodos son, por tanto, trozos de software que se pueden usar desde cualquier clase. Así como los juegos de piezas estándares y fijas que el jugador junta, arma, ensambla, en función de creatividad, (o desemsambla, desarma y separa) los métodos son líneas de código, por lo general pequeñas cantidades de líneas, que, una vez que se tiene la certeza que no tienen errores y son “multiuso”, el desarrollador de aplicaciones usa y descarta con la misma facilidad de que, con piezas estándares de un juego “de armar”, construye y destruye castillos sofisticados por mero placer.


La primera clase


Supóngase que se tiene necesita de resolver el problema del cálculo de volumen de un cilindro, de radio “r” y de altura “h”. Para ello se desarrolla una clase, denominada “CalculoDelVolumenDeUnCilindroSolido” la cual hace uso de algún método bastante genérico que genera el “CalculoDelAreaDeUnCirculo”, porque, conociendo el área de un círculo, es decir, de la base del cilindro, simplemente se multiplica esta área por la altura del cilindro y se tendría el volumen. Así,

1 public class CalculolDelVolumenDeUnCilindro{

2 public CalculolDelVolumenDeUnCilindro (double RadioDelCilindro, double AlturaDelCilindro;){

3 double AreaDeLaBaseDeUnCilindro;

4 double VolumenDeUnCilindro;

5 AreaDeLaBaseDeUnCilindro = CalculoDelAreaDeUnCirculo(RadioDelCilindro);

6 VolumenDeUnCilindro = AreaDeLaBaseDeUnCilindro * AlturaDelCilindro;

7 System.out.print("Volumen del cilindro: " + VolumenDeUnCilindro);

8 }

9 public double CalculoDelAreaDeUnCirculo (double Radio){



10 double Area;

11 Area = 3.141521 * Radio * Radio;

12 return Area;

13 }


14 }

Por ser esta la primera clase que se presenta muchos elementos pudieran ser desconcertantes pero, una vez comprendidos, tienen su lógica y fundamento.

Lo primero que resalta es la especificación de cualquier clase en la línea 1. Todas las clases en java inician con un “{”y cierran con “}”. Esta clase en particular tiene un método: “CalculoDelVolumenDeUnCilindroSolido”.

La clase tiene un metodo, “CalculoDelAreaDeUnCirculo”, y otra estructura muy parecida al método con un nombre igual al de la clase. Al segundo método se le denomina “constructor”.

El método “CalculoDelAreaDeUnCirculo” inicia con una “{” y termina con otro “}” , líneas 9 y 13. Lo que el método encierra entre los paréntesis redondos, (), se denominan “parámetros” del método. Los métodos pueden tener uno o más parámetros, ó, puede no tener parámetros del todo.

Los parámetros son valores que “se transportan” (que se “comunican”) desde cualquier lugar donde se utiliza el método. Por ejemplo, dado cualquier valor de la variable denominada “radio”, el método “CalculoDelAreaDeUnCirculo” devuelve, a la línea de código que activó el método, es decir, el valor del “Area”, sin interesar para qué se utilizará, posteriormente, el valor del área.

Ahora es importante mirar con detalle las líneas de código.

En primer lugar la forma como se hacen “copias”, -es decir instancias-, de las clases. Por lo general, se tienen el formato:

UnaClase UnaInstancia;

Por ejemplo, dentro del paquete java existen clases primitivas, como la clase “double”, que define al conjunto de números reales desde un ámbito de valores muy grandes, como un poco más adelante se verá.

Las instancias de las clases primitivas, como la clase “double” se formarían así:

double AreaDeLaBaseDeUnCilindro;

double VolumenDeUnCilindro;

En otras palabras, se han generado lo que se podrían denominar “otra instancia” o “variables” cuya vigencia o vida útil estaría desde la línea donde se coloca el “{” hasta la línea donde se cierra la estructura, i.e., “}”.

A pesar que el término variable es muy utilizando en buenos textos de java, no es de nuestro agrado porque tiende a equipar con otros conceptos que no son ciertos para java; por tanto, el término variable se tratará de no utilizarlo; se prefiere el término de instancia de clase.

“Instancia” debe entenderse como sinónimo de “clon”, como “copia al carbón” de algo previamente establecido. De una misma clase perfectamente se pueden hacer muchas instancias para utilizarse dentro de cualquier estructura, esto es, dentro de cualquier aplicación que eventualmente nace de la clase. Dicho lo anterior, las dos líneas del código java antes reproducidas, perfectamente pudo especificarse como:

double AreaDeLaBaseDeUnCilindro, VolumenDeUnCilindro;

con idénticos resultados.

Desde luego que java no solamente es capaz de generar instancias para números reales. También existen clases para números enteros muy grandes, para números reales pequeños, para caracteres alfanuméricos, etc. Una pequeña lista de estas clases primitivas, se comenta un poco adelante.

Parámetros


Lo próximo a comentar es el concepto de parámetros. Parámetros entre métodos, más concretamente, porque existen parámetros “entre clases” y parámetros “entre aplicaciones”.

Los métodos –y los constructores- pueden recibir parámetros. Los métodos –y los constructores- son capaces de devolver resultados, pero, dentro del contexto de los constructores, es mejor concebir a la clase como a la entidad que devuelve resultados (no olvidar que la clase y el constructor siempre tienen el mismo nombre). “Pasar” parámetros entre constructores es sinónimo a “pasar” parámetros entre clases.

Los parámetros, si existieran, se ubican en los “()” de los métodos y de los constructores. Si no existen parámetros, los “()” quedan vacíos.

Cuando un método devuelve un resultado debe especificarse la clase con que se devuelve el valor; ello se conoce con el nombre de “la clase del método”. Nótese que, en alguna parte del método existe la instrucción “return” cuando algún valor (o alguna clase) se regresa.

Pero pudiera darse el caso de un método que no tiene clase, que no devuelve valores para decirlo en sencillo. Cuando un método no se asocia a ninguna clase se dice que la clase del método es “de clase” “void” y, por supuesto, un método de “clase void” no puede tener la instrucción “return”.

Si permanece alguna dificultad en entender “métodos que no devuelven valores”, debe retomarse lo antes comentado en torno a la “conducta” de un sistema. Las conductas no necesariamente generan datos o valores concretos, pueden generar acciones como activar algún otro evento, generar un aviso, poner a trabajar otro método, entre otros.

Los constructores no pueden tener clases asociadas a él ni mucho menos la expresión “return”. Los constructores no están pensados para ser usados por la misma clase: están pensados para que otros constructores de otras clases lo accedan, sin menoscabo que cualquier clase pudiera acceder a cualquier método de alguna clase instanciada. Este punto es crucial en java y vale la pena reflexionar en torno a las diferencias entres método y constructor.

A manera de resumen se puede afirmar que los métodos son funciones definidas -programadas- dentro de las clases los cuales pueden tener o no insumos y pueden regresar o no información a otros métodos. Se reitera que cuando los métodos no tienen insumos los paréntesis redondos de los métodos están vacíos. Cuando un método no regresa valores, se dice que el método es de clase void.


Las estructura de clases y métodos


Por lo pronto, la estructura de una clase es:

public class NombreDeLaClase{

}

y la estructura de un metodo es:



public clase_del_método NombreDelMetodo(ParametrosDeEntrada){

}

Ejemplos de estructuras


La expresión “System.out.print()” y “System.out.println()” son dos llamadas típicas de las clases. La idea es bien intuitiva: dentro de la clase “System” existe otra clase –una subclase por así decirlo- denominada “out” y, dentro de la clase “out” se tienen métodos (que también se pueden concebir como clases), dos de los cuales se denominan “print()” y “println()”.

La resultante de una llamada a cualesquiera estos dos métodos es imprimir en la ventana de comando, o, salida al monitor como se decía en años pasados. Lo que eventualmente se escribe en la ventana es lo que se encierra entre los paréntesis redondos.

La diferencia entre “print” y “println” es que la primera imprime sin crear filas nuevas cada vez que se acceda al método, es decir, sin generar el “carriage-return” (el “enter”) cada vez que se imprime lo solicitado. Por otra parte, cada vez que se llama al método “println” éste siempre inicia en la primera columna de la ventana de salida.

La estructura en la llamada del método “print” es muy frecuente cuando se trabaja con java. Por ejemplo, si se tiene:

java.awt.Button UnBoton;

se está expresando que se desea una copia, una instancia, que se almacenaría en una variable bajo el nombre de “UnBoton”, de la clase “Button”, la cual, a su vez, tiene por superclase a “awt” y ésta, a ”java”.


Clases y archivos físicos


Todas las clases del lenguaje java se almacenan en archivos físicos pero con una gran condición, estos archivos físicos han de tener el mismo nombre –y la misma secuencia de letras mayúsculas y minúsculas- que se le asigna a la clase y, han de tener la extensión .java

Por ejemplo, cuando se tiene una clase denominada “MiClase”, se debe tener un archivo de texto denominado “MiClase.java”, el cual, una vez compilado, generaría el archivo “MiClase.class"


Superclases y subclases


Construída una clase, esta puede generar otras clases. Y pudiera ser que estas segundas clases sirvan para generar otras clases y así sucesivamente. O que de la primera y segunda clase, se conjuguen y formen otra nueva clase.

Java, en realidad es un conjunto de clases a su disposición para que Ud. diseñe y desarrolle sus propias clases de forma tal que el arte de programar en java, y por ende el arte de la programación OOP, es tener habilidad de adaptar clases sin pretender nunca descubrir el agua tibia.

A la clase "ancestral" se le denomina “superclase”. A las clases hijas del una superclase se les denominan “subclases”.

Java tiene infinidad de clases a su disposición contenidas en un paquete antiguamente denominado JDK1, -ahora denominado J2SDK2-, un kit para el desarrollo de aplicaciones en java. Obviamente, este conjunto de clases economizan tiempo de desarrollo porque sencillamente ya están construídas. Todas las clases contenidas en el JDK tienen una clase ancestral denominada Object.

La clase “java.awt.Frame”, contenida en el JDK, en la clase que “le economiza” al desarrollador rescribir el código relacionado a la lógica para producir una ventana del tipo Windows, tan popular entre los usuarios. La clase “java.awt.Button” construye botones, la clase ”java.awt.applet.Applet” construye aplicaciones denominados “applets” muy útiles para generar productos para ser utilizados exclusivamente en la web. La clase “javax.swing.JLabel” y la clase “java.awt.Label” ambas contenidas en el JDK construyen etiquetas con algunas diferencias significativas, y así sucesivamente.

De la clase al objeto


La gran pregunta es cómo obtener el “producto” de una clase, es decir, cómo se ejecuta una clase, cómo se obtiene un objeto. La respuesta ya se ha comentado pero, dada la importancia de la pregunta se enfatizará: los productos de una clase se obtienen instanciando la clase.

Para ejecutar una clase se necesita otra clase que amarre la clase de referencia y la despliegue directamente al monitor o -indirectamente- a cualquier navegador del web. Clases que hacen interface al monitor se les denomina en el argot de java “como clases” “main”; clases que hacen interface -indirecta- a los navegadores, se les denomina “applet”.


Clases primitivas y referenciadas


Pero el comentario anterior lleva a otro punto muy importante. Es fundamental en java hacer la discriminación entre clases primitivas y clases no-primitivas. Se ha visto que, la estructura de instancia de una clase primitiva es:

clase instancia;

Mientras que, para una clase no-primitiva, o clase referenciada, la estructura de instancia a la clase es,

clase instancia = new clase();

Por ejemplo, las instancias siguientes están correctamente estructuradas:

boolean RespuestaDeArranque;

int MiNumeroEntero;

OrdenamientoDeMatriz MiInstancia = new OrdenamientoDeMatriz();

ClaseDelWeb A = new ClaseDelWeb(int TamanoDelMonitor);

Clases referenciales


Por supuesto, las clase que el desarrollador de aplicaciones diseña y la mayoría de las disponibles en las bibliotecas de java, son las clases denominadas no-primitivas. La instancias a estas clases tiene un mismo patrón, a saber:

ClaseNoPrimitiva instancia = new ClaseNoPrimitiva();

Donde los “()” envían al constructor respectivo los parámetros del caso.

Un punto importante en este punto: las clases pueden o no tener constructores. Tres observaciones son de rigor.

En primer lugar, se puede hablar de clases que no contienen constructores, i.e., clases que sólo contienen métodos que pudiesen llamarse desde cualquier punto de cualquier clase. “Bibliotecas” sería un nombre oportuno a este tipo de clases.

En segundo lugar, pueden existir clases con solo un constructor. Este constructor ha de mirarse como “el método” que condude la lógica de la clase. Algo así como el “conductor” de un carro: “el carro” es la clase pero quien decide qué conducta utilizar o que propiedad cambiar, es el constructor de la clase, o, la persona que tiene los controles del carro.

En tercer lugar, pueden existir clases que tengan más de un constructor. A pesar de que todos los constructores se denominan con igual nombre de la clase, cada uno de estos constructores difieren en la cantidad, en la naturaleza de la clase y en el orden de los parámetros. ¿Y para qué sirve esto?, podría preguntarse el lector. Pues sencillamente para implementar una característica muy importante de los objetos denominada el polimorfismo; pero este tema se debe comentar con tiempo en otra oportunidad.

Estructura del main


La idea de la clase que eventualmente amarra a otra clase, el “main” es muy sencilla: esta clase es un medio para ejecutar directamente la clase que se tienen en mente o , la clase para alimentar de valores a las clases –si es que se tuviese el caso de constructores con parámetros- y presentarla al monitor. La estructura típica del “main” se presenta a continuación:

public class EjecutaAlgunaClase{

public static void main( String args[] ){

LaClaseAEjecutar F = new LaClaseAEjecutar();

}

public boolean handleEvent (java.awt.Event e){



if (e.id == java.awt.Event.WINDOW_DESTROY){

System.exit(0);

return true;

}

return false;



}

}

Todos los main tienen que ser públicos, de carácter estático y de clase void, -de “tipo” void, en al argot popular-. Además, la clase main ha de tener un “arreglo” de parámetros de clase String. Nótese la similitud entre esta estructura y la estructura de un método.


Estructura del applet


La estrategia de diseño de la clase para instanciar a un applet sigue a continuación: se busca una clase estándar clase que directamente incrusta la clase tipo applet e inmediatamente la envía a cualquier navegador de la Internet.

Se adjunta la estructura para, posteriormente, comentarla.

public class EjecutaUnApplet extends java.applet.Applet{

public java.awt.Button BotonPrincipal = new java.awt.Button("Inicio del Applet");

public void init(){

setBackground(new java.awt.Color(255,255,255));

add(BotonPrincipal);

}

public boolean action(java.awt.Event e, Object o){



if(e.target == BotonPrincipal){

LaClaseAEjecutar F = new LaClaseAEjecutar();

return true;

}

return false;



}

}

El objetivo de utilizar a la clase “java.awt.applet.Applet” como superclase –haciendo uso de la instrucción “extends” en la primera linea- es únicamente, como medio para introducir la clase que se desea ejecutar, en el web.



La clase “EjecutaUnApplet” únicamente despliega en pantalla un botón. Nótese que el botón es una instancia de la clase “java.awt.Button” la cual, al interpretarse por el compilador java, despliega un botón con un encabezado igual a “Inicio del Applet”. Al dar un click a este botón, se ejecuta la línea crítica de la clase: se hace la instancia de la clase que se desea ejecutar. Y eso es todo.

Se ha reiterado que la clase applet es una forma indirecta de ejecutarla utilizando cualquier navegador del web. Se dice “indirecta” porque los navegadores –por lo pronto- no interpretan directamente a los applets: los navegadores requieren que los applets estén incrustados en archivos planos, con extensión “.html”. Los archivos html sí pueden interpretarse por los motores de los navegadores.



A continuación se presenta un archivo html, típico para servir de interface, de puente, entre el applet y el navegador de Internet.









La base de datos está protegida por derechos de autor ©absta.info 2016
enviar mensaje

    Página principal