El secreto de la creatividad esta en saber como esconder tus fuentes
Einstein

20/5/2004

Programacion, Pffff

Lo "pense" a las 11:55 am

Pues regreso a clases tomando nada mas un curso intensivo de programacion de Java. Le llaman programacion orientada a objetos avanzada pero francamente no le veo lo avanzado. Eso no quiere decir que no le vea lo dificil, la verdad es que si me doy de topes con ese pinche lenguaje porque neta, mis respetos para los cabrones que lo manejan chingon… a diferencia de mi.

Total, me esta costando tanto trabajo que ahora si tengo que leerme minimo 2 libros durante el curso si es que quiero pasar y no nada mas leerlos sino tomar nostas y demas. Aqui dejo algunas de las notas que voy tomando por si a alguien le sirven.

Recomiendo la lectura solo para personas que quieran aprender algo sobre el tema y que tengan una base sobre informatica o para algun incauto que tenga un ligero interes en que hace mi cabeza hervir.

Todo es una clase, dentro de la clase estan los objetos. Los objetos no son mas que data types con otros nombres.En el programa los objetos se encuentran mandando mensajes entre ellos y es lo que hace al programa funcionar. Lo que define al objeto es QUE tipo de mensajes puede interpretar y cuales no. Todo lo que se hace en Java es crear clases, objetos dentro de esas clases y los mensajes para ellos.

Java, entre sus curiosidades, cuenta con un ‘recolector de basura’ el cual se encarga de limpiar la memoria, eliminando algunos de los peores problemas presentados en C++; los cuales radican en el scope de las variables asi como el sobre uso de la memoria.

Java utiliza varios tipos de memoria:

Registers: Es la mas rapida, se encuentra dentro del procesador pero es muy limitada. Por su tamaño los programadores no tienen acceso a este tipo de memoria, de hecho no hay prueba evidente dentro de un programa de que esta memoria siquiera exista.

Stack: Esta memoria radica en el RAM pero se encuentra apoyada directamente por el procesador por medio de ‘Stack Pointers’. Si se quiere generar mas memoria el pointer baja y si se quiere recuperar memoria el pointer sube. La limitantes que el compilador debe saber perfectamente como se utilizara ya que el codigo que maneja este tipo de memoria se genera a la hora de compilacion lo cual compromete la felixibilidad de los programas. En el stack solo hay referencias, los objetos en si no residen aqui.

Heap: Esta es la memoria de proposito general. Al contrario del stack, el compilador no necesita saber como se utilizara esta memoria dentro del programa. Para crear un objeto aqui se utiliza la palabra ‘new’ y la informacion se almacenara dentro del Heap a la hora de ejecutar el codigo. El precio es la velocidad de esta memoria.

Static Storage: Este tipo de memoria es estatica aunque tambien se encuentra en el RAM. Este tipo de memoria se utiliza para informacion que estara disponible durante todo el programa. Se utiliza la palabra static para definir que ese objeto debe ser almacenado de esta manera aunque el objeto en si nunca se almacena dentro de esta memoria.

Constant Storage: Aqui se almacenan todas las constantes que resulta ser la informacion que no cambiara durante todo el programa. Esta memoria puede ser del tipo ROM para algunos sistemas integrados.

Non-RAM storage: Este tipo de memoria se utiliza para informacion totalmente independiente del programa, es decir, que la informacion puede sobrevivir aun cuando el programa no esta corriendo, fuera del control del programa. Los dos objetos principales de esto son los ’streamed objects’, en el cual los objetos se convierten en ’streams’ (corrientes) de bytes que generalmente son enviados a otra maquina y los objetos persistentes en los cuales los objetos son almacenados en disco para que mantengan su estado aun cuando el programa ha terminado. El truco de esta clase de almacenaje radica en convertir los objetos en algo que exista en otro medio pero que pueda ser ‘revivido’ en un objeto basado en RAM cuando sea necesario.

Existen dos tipos de elementos dentro de las clases; los fields (data members) y los methods (member functions).

FIELD= es un objeto de cualquier tipo que se puede comunicar a traves de su referencia. Tambien puede ser un primitive type (boolean, integer, character, etc) que no son una referencia. Si es una referencia a un objeto esta se febe de inicializar para que conecte con un objeto real (utilizando new) en un method especial que ha llamado a un constructor. Si es un primitive entonces se puede inicializar directo al punto de la definicion de la class.

Cada clase aparta el espacio necesitado para sus propios fields y estos no son compartidos entre objetos. Un ejemplo de una clase con algunos fields:

class DataOnly {
int i;
float f;
boolean b;
}

Esta clase no hace nada pero es posible crear un objeto de ella.

DataOnly d= new DataOnly();

Se pueden asignar valores a los fields pero para ello necesitamos saber primero como referninos a un miembro de un objeto. Esto se logra declarando el nombre del objeto referencia, seguido por un punto y seguido por el nombre del miembro dentro del objeto:

ReferenciaDelObjeto.miembro

En nuestro ejemplo quedaria:

d.i=47;

Esto declara que el field i (int i) dentro de DataOnly(objeto de referencia d) tiene un valor de 47.

Es posible que nuestro objeto contenga a su vez otros objetos que contienen informacion que deseamos modificar, en cuyo caso seguiremos interconectando con puntos.

Methods

En Java se habla de los Methods como una manera de realizar algo. Se puede pensar en terminos de funciones de C++. Los Methods definen que clase de mensajes el objeto puede recibir.

La manera basica para definir un metodo es:

returnType methodName( /* Argument list */ ) {
/* Method body */
}

Return type es el tipo del valor que saldra del metodo despues de ser llamado. La lista de argumentos indica los tipos y nombres de la informacion que se desean pasar dentro del metodo.

Jerarquia

Todos los objetos en Java tienen una jerarquia. La jerarquia permite heredar caracteristicas cuyo flujo siempre es de arriba hacia abajo. De esta manera si tenemos las clases:

Animal

Canino

Felino

Ave

Gato

Pato

Perro

Jaguar

Paloma

Podemos encontrarle un orden logico de relacion entre ellas que iria mas o menos asi:

Animal
——
|
——————-
| | |
—– —– ——
Canino Ave Felino
—– —– ——
| | |
Perro | |
| —— ——
| Gato Jaguar
—– —–
Pato Paloma

Podemos decir ahora que:

Mientras que un perro es un canino y ultimadamente un animal, tiene caracteristicas comunes con todos los animales pero no comparte caracteristicas mas especificas con otras especies como los felinos. Mas explicitamente: Un felino posee garras, bigotes que le permiten medir profundidad, etc y otro monton de caracteristicas exclusivas de la especie que no comparte con otras clases dentro del mundo animal.

Uff… Dificil de explicar pero facil de comprender creo yo.

Quizas esto parezca demasiado sencillo e irrelevante pero es aqui donde el verdadero poder de Java (y mas generalmente la programacion orientada a objetos) reside. Porque? Sencillamente por la capacidad de reutilizacion de codigo. Teniendo programada la estructura para crear objetos de esta manera no necesitamos definir las caracteristicas generales de una nueva clase. Por ejemplo, si deseamos añadir otro elemento en nuestra clase de felinos no necesitamos definir todas sus caracteristicas desde 0 (bigotes, garras, etc), solo tenemos que definir las especificas que diferencian a nuestra nueva clase de los demas dentro de la misma categoria.

Un ejemplo mas practico (orientado hacia la programacion de un sistema) seria:

Necesitamos crear un sistema para una tienda que vende electronicos. En tal circunstancia necesitamos pensar primero en la clase mas general que encierra a todo lo que queremos vender en nuestra tienda. La solucion logica es productos ya que no importa de que clase sea ni que caracteristicas especificas tenga, son productos los que vendera nuestra tienda y no servicios.

Entonces tenemos nuestra super Clase Productos:

Productos
———
|

Ahora si podemos entrar en algo mas especifico, digamos camaras y televisores (que siguen siendo productos siendo esta la unica caracteristica que comparten):

Productos
———
|
———— ————
Camaras Televisores

Dentro de Camaras y televisores podemos encontrar mas divisiones que las diferenciaran unas de otras sin dejar de ser productos y en cada caso sin dejar de ser camaras o televisores:

Productos
———
|
———— ————
Camaras Televisores
| |
———- ————
| | | |
——- ——- ——- ——-
Analogas Digitales Plasma CRT

Este diagrama explica lo siguiente:

Dentro de nuestra Clase productos tenemos todos los objetos que estan relacionados de alguna manera, en este caso porque son los que nuestro negocio ofrece y todos cuentan con un numero de inventario, precio, costo, etc.

Tenemos dos Divisiones basicas Camaras y Televisores que a su vez se subdividen en Analogas, Digitales, Plasma y CRT. Todas las camaras y todos los Televisores siguen teniendo un numero de inventario, un precio, un costo, etc pero a su vez tienen caracteristicas particulares; en el caso de las camaras las analogas (sin dejar de ser camaras) se diferencian por su formato mientras que en el caso de los Televisores se dividen por la tecnologia que utilizan: CRT o Plasma.

A lo que voy es que cada subclase hereda las caracteristicas de la anterior Y añade unas cuantas mas haciendose cada vez mas especificas y mas manejables.

Con todo esto me viene algo a la mente, si seguimos dividiendo a las clases por sus caracteristicas invariablemente nos vamos a encontrar en que vuelven a tener puntos en comun. Casos extremos de objetos fisicos nos llevan a que todos estan formados por atomos, en casos informaticos (no tangibles) todos estan formados por patrones de bits… tengo que preguntarle esto al profesor.

*-*-*-*-*-*-*-*-*-*-*-*

Esas son mis primeras notas sobre el tema. De aqui al miercoles 26 de mayo tengo que trabajar sobre un programa que haga lo siguiente:

Tenga 3 figuras (circulos llamados balls). Cada una de esas figuras se selecciona con un boton distinto y tiene un comportamiento distinto, controlado por un scrollbar. Una debe de moverse sobre el eje de las x (movimiento horizontal), la segunda debe de moverse sobre el eje de las y (movimiento vertical) y la tercera debe de ser capaz de cambiar su tamaño (scale).

Pues bien, aun no he analizado el problema muy bien que digamos pero deacuerdo a lo que he entendido (no se si este en lo correcto) lo primero que hay que hacer es crear las clases de cada objeto, definir sus caracteristicas, capacidades y a que clase (mas general) pertenece. Para esto estare utilizando una libreria que viene integrada con el compilador BlueJ; tal libreria es llamada (ingeniosamente) aLibrary (unaLibreria). ALibrary contiene diferentes subclases pero en este momento solo utilizaremos AOval (para crear los objetos circulares), AScrollbar (Para crear el scrollbar) y A3ButtonWindow (para los botones).

Sabiendo que voy a utilizar es hora de pensar exactamente que clases voy a utilizar para este programa.

Director: Va a ser el intermediario y mandamas de todas las acciones, desde aqui voy a definir como va a reaccionar cada objeto dependiendo del input del usuario.

RedBall: Objeto de la bola roja

GreenBall: Objeto de la bola verde

BlueBall: Objeto de la bola azul

Scrollbar: Objeto de la scrollbar

Y hasta aqui me quedo por hoy porque ya me canse…

He dicho.

Weymaster

| |

Comments are closed.

| |