31 agosto 2008

Arreglando cosas en Java con arreglos

Hace mucho hablé de arreglos y puse un ejemplo hecho en Visual Basic 6.0 (otro ejemplo lo puedes encontrar aquí). También mostré la manera de ordenar datos usando arreglos con el algoritmo Burbuja (los ejemplos los hice en Visual Basic 6, Visual Basic 2005 y C), sin embargo nunca lo hice en Java, así que voy a aprovechar para mostrar como funcionan los arreglos en este lenguaje.

A modo de repaso rápido, un arreglo es una estructura de datos que se componen de datos del mismo tipo. Se hace referencia a ella por medio de un nombre y el número del elemento deseado. Funciona como los asientos numerados de un autobús: el camión tiene un nombre (bueno, origen-destino) y cada asiento tiene un número. De esta manera puedes encontrar a una persona sabiendo el nombre del camión y su número de asiento.

Dejando la explicación breve a un lado, vamos viendo como se hace esto en Java. En Java los arreglos son objetos, así que tienen algunas cosas interesantes que se pueden hacer con ellos (por ejemplo, tienen una propiedad llamada length que devuelve el número de elementos que contiene el arreglo). Como objetos, para declararlos lo hago con la instrucción new como se ve aquí (declaro un arreglo llamado c de tipo entero que tiene 12 elementos):

int c[] = new int[12];

También puedo declarar arreglos poniendo corchetes cuadrados después del tipo de dato. Aquí lo hago y de una vez estoy declarando dos arreglos en la misma línea:

String[] semana = new String[7], meses = new String[12]
;

Ahora sí, voy a escribir un programa en Java que haga algo con arreglos. Este es el código de un programa que inicializa un arreglo con los resultados de la tabla de multiplicar del 6 (a lo mejor te preguntarás porque la tabla del 6... yo también me hice la misma pregunta y no supe responder :) ):


Al correrlo se ve esto:


Si quiero, puedo inicializar un arreglo en cuanto lo declaro y sirve que no tengo que escribir la instrucción new. Modifiqué el código anterior para incluir un arreglo que muestre los días de la semana:


Y este es el resultado:


Hasta aquí llego hoy. Con esto creo que queda claro la manera de declarar y usar arreglos. Luego explicaré unos ejemplos donde se usen los arreglos de forma chuviduvis. ¡Hasta la próxima!

30 agosto 2008

Constructores en Java: ¡adaptados para todo!

Hace unos cuantos posts, hablé de algunas características de la programación orientada a objetos que lo hacen único, particularmente del polimorfismo (bueno, ese es el aspecto del que quiero hablar hoy).

Como dije en aquél post, el polimorfismo le permite a una comportarse de diferentes maneras según el contexto en el que se encuentra. Vamos a hablar de un ejemplo de la vida real: yo. Aunque soy el mismo en muchos lugares, me comporto de manera diferentes cuando estoy en misa, que cuando estoy con mi esposa, que cuando estoy dando clases o que cuando hablo con algún empresario. De la misma manera, puedo hacer una sobrecarga de operadores (cosa del que hablaré en otra ocasión) que significa que un operador (por ejemplo el +) funcione diferente si se le aplica a cadenas o a números u otra cosa, sobrecargar funciones. El día de hoy, vamos a sobrecargar (u overload en inglés) un constructor (si tienes dudas sobre constructores, revisa este post que publiqué que habla de ellos).

Voy a comenzar creando una clase que se encargue de hacer operaciones entre 2 números enteros. Que contenga dos datos de tipo entero (en este caso se van a llamar x y y) y varios constructores: uno que funciones cuando no se inicialice ningún valor, otro cuando se le dan valores para x y y, otro cuando solo se inicialice x.

Aunque el propósito es mostrar la manera en que se pueden sobrecargar el constructor (palabra dominguera para decir que puedo tener una función que se comporte de manera diferente según el contexto en que se use), le voy a agregar otros métodos para que sirva para algo: uno que sume los numeritos, otro que los reste, otro que multiplique y otro que divida.

El código de la clase es esta (estoy usando un programa llamado Editra, que estuve probando aunque ahora puedo decir que prefiero el Notepad++). Incluí comentarios para que se entendiera mejor:


Aquí puedes ver mi ventana cuando compilé y corrí el programa:


En este caso, estoy haciendo varias versiones del constructor, pero lo mismo podría hacer para cualquier función. Por ejemplo, voy a alterar el código para agregarle otra función suma que sume x y y con otro valor proporcionado por el usuario. El código se ve así (ahora sí con el Notepad++):


Aquí puedes ver mi ventana cuando compilé y corrí el programa:



Ahora sí, los dejo. ¡Hasta la próxima!

19 agosto 2008

Java: compilando sin problemas en Windows

Al estar trabajando con Java en mi post anterior sobre Java tuve que hacer un pequeño "truco" para facilitarme la vida. Lo que pasa es que el compilador javac, la máquina virtual java y algunos otros programas que necesitas para trabajar están en una carpeta (en mi caso, en C:\j2sdk1.4.2_13\bin). Una solución sencilla sería copiar tus archivos java a esta carpeta y desde allí compilarlos y ejecutarlos (como hice en el post pasado), pero es más fácil hacer un cambio pequeño a Windows para que funcione en cualquier carpeta.

¿Cómo se hace esto? ¡Fácil! Ve al Panel de Control, abre Sistema y de allí da clic sobre la pestaña Opciones Avanzadas. Haz clic sobre el botón Variables de entorno. Aparece la siguiente ventana:


De la lista de variables del sistema, selecciona Path y haz clic sobre el botón Modificar y al final de esta línea, agrega un punto y coma y escribe la ruta donde están los archivos (en mi caso, agregué ;C:\j2sdk1.4.2_13\bin). Ahora da clic en Aceptar hasta que salgas de la ventana del Sistema (son 3 botones Aceptar).

En Windows más viejos (como el 98 o el ME), hay que editar el archivo AUTOEXEC.BAT que generalmente está en C:\ y hacer lo mismo en la línea que dice PATH=.

Les paso al costo este tip esperando que les ayude un poco en sus aventuras programáticas (o como se llame)
en Java. ¡Hasta la próxima!

17 agosto 2008

Un Office en línea: Google Docs


Google Docs es una herramienta fantástica. En un procesador de texto, hoja de cálculo y programa de presentaciones gratuitas y en línea de Google. A lo mejor piensas que el Microsoft Office o el OpenOffice sea todo lo que necesitas pero tiene algunos inconvenientes. En primer lugar, no es gratuito. Pero lo más importante es que no tiene herramientas de colaboración, en línea en tiempo real, es decir, no puede ser editado al mismo tiempo por muchas personas.

Con estas herramientas se pueden crear documentos, subir un archivo de Word, Excel, PowerPoint, PDF u algunos otros y también se pueden descargar los documentos en diversos formatos. Hasta 5 personas pueden estar modificando el mismo documento al mismo tiempo (miles pueden modificarlo, pero solo 5 en un momento dado) y guarda revisiones para saber quién escribió o borró qué.

Encontré un excelente tutorial de Google Docs que puedes accesar desde aquí. Es una herramienta que estoy seguro que será de mucha utilidad. Seguimos en contacto...

16 agosto 2008

Java: ejecutando programa con más de una clase

Ayer les escribí el código de dos clases, Ejemplo y Ejemplo2 (el artículo fue este), y ahora los escribí en la compu para ejecutarlo. Quiero compartir contigo mi experiencia desde la linea de comando.

El proceso consiste en usar el programa javac para compilar el archivo con extensión java (el del código fuente). Esto me genera un archivo con la extensión class (el famoso P-Code del que hablamos aquí). Luego usas el programa java (que arranca la máquina virtual) para ejecutar el archivo class. No hay problema si tu programa consiste en una sola clase: solo tienes que escribir java nombre-archivo.class y asunto arreglado.

Sin embargo el código de ayer usaba dos clases lo cual genera dos archivos .class. Hmm... si le doy java Ejemplo, me marca error porque no tiene la función main() y si escribo java Ejemplo2, me dice que no tiene la clase Ejemplo. ¡Ah que lata! Y todo por querer usar la línea de comando... pero como decidí no renunciar e irme a un ambiente gráfico (todavía), me puse a averiguar que onda y encontré la solución.

En primer lugar tengo que arrejuntar todos los archivos .class en un solo archivo JAR (Java ARchives, o archivos Java). Esto se hace con el programita jar que viene en la misma carpeta que el java y javac. La sintaxis completa la puedes ver si escribes jar en la línea de comando y eso hace innecesario que lo escriba aquí. Yo escribí la siguiente instrucción:

jar cf EjemploClases.jar Ejemplo.class Ejemplo2.class

Lo cual significa que haga un nuevo archivo llamado EjemploClases.jar que va a contener el contenido de Ejemplo.class y Ejemplo2.class. Para ver el contenido del archivo , escribo la siguiente instrucción:

jar tf EjemploClases.jar

Esta es el texto que me aparece cuando ejecuto esta extensión:


Si te fijas, aparece Ejemplo.class y Ejemplo2.class tal y como nos lo esperábamos pero, ¿qué onda con el META-INF y el MANIFEST.MF? es un archivo que le permite al archivo JAR agregar funcionalidad que incluye firmas electrónicas, control de versiones y otras tantas cosas. Solamente puede haber un archivo manifest en un archivo y contiene información acerca de los archivos que están empaquetados en el archivo JAR. Al crear un archivo JAR, se crea un archivo de manifest de manera automática. Tengo que modificar este manifest default para que corra mi programa, específicamente decirle cuál de las clases va a ser el que se ejecuta (el que tiene el main()). Para hacer esto, primero se tiene que hacer un archivo de texto que contenga la información que quiero agregar al manifest y luego uso la herramienta jar con la opción m para agregarlo. Hice un archivo en el bloc de notas, llamado Manifest.txt, que contenía lo siguiente:

Main-class: Ejemplo2

Toma en cuenta que el último renglón tiene que terminar con un enter, si no, no jala. Luego escribo el comando:

jar cfm EjemploClases.jar Manifest.txt Ejemplo.class Ejemplo2.class

Ahora al ejecutar el archivo rar, se ejecuta la función main de la clase Ejemplo2. Esta es la instrucción:

java -jar EjemploClases.jar

¡Y listo! Todo funciona de maravilla. Bueno, la verdad es que hice tanto argüende (nota cultural totalmente fuera del tema: argüende se deriva del verbo argüir del latín ʽarguereʼ que significa alegar o dar argumentos a favor o en contra) para que apareciera un pinchurriento -14 en la pantalla, pero lo importante es que esta es la manera de empaquetar clases para su ejecución. Los archivos JAR también son usados para desplegar aplicaciones (proceso conocido como depoyment) con el Java Web Start (para aplicaciones correr como aplicaciones de forma local en las computadoras de los clientes) o el Java Plug-in (para aplicaciones que se ejecuten en un navegador).

Seguimos en contacto...

15 agosto 2008

Clases en Java

Hace días hablé de lo que son las clases y ejemplifiqué su uso con C++ (Paradigmas de Programación y muchos objetos en C++), sin embargo las cosas son un poquitito diferentes para Java y eso quiero exponer en este mensaje.

Antes de hablar de sintaxis, solo quiero "traducir" los términos Java. Un objeto es una instancia de una clase. Donde escribo tipo, me refiero a un tipo de dato como int, double, String, etc. Las funciones o subrutinas se conocen como métodos. En esta sintaxis pongo algunos comentarios (los que empiezan con //) con puntos suspensivos para indicar que allí puede o debe ir más código. Aclarado esto, la sintaxis de una clase en Java sería algo así:


Veamos un ejemplo:


En este caso, estoy declarando dos variables (instancias) de tipo entero (int). También estoy definiendo una función (método) llamado suma que devuelve un número de tipo int (el resultado de la operación a+b) por medio de la instrucción return.

Ok. Así defino la clase pero, ¿cómo #%¡* lo uso? Fácil. Este ejemplo crea un objeto llamado X de tipo Ejemplo (el de la clase que acabamos de crear):

Ejemplo X;
X = new Ejemplo();


La primera línea le dice a Java que va a haber un objeto de tipo Ejemplo que se llama X. Las segunda línea hace la operación de apartar memoria para el objeto e inicializarlo. Podría resumir las dos instrucciones en una sola que haga lo mismo, como se ve aquí:

Ejemplo X = new Ejemplo();

Para poder acceder a un miembro de una clase, se usa el operador . (punto): objeto.instancia, como ejemplifico aquí:

X.a=3; // Asigna 3 a la variable 'a' que está en el objeto X

Constructor

No me refiero al personaje Bob que tiene este oficio, sino a una método de una clase en Java que se encarga de inicializar a un objeto en cuando es creada (con la instrucción new). Estos métodos no devuelven valores (por eso son de tipo void aunque no se escriba) y tiene que tener el mismo nombre de la clase. Aquí voy a escribir una versión de la clase Ejemplo con un constructor:


Si la clase no tiene un constructor definido, Java crea un constructor por default que inicializa todas las variables de instancia en cero.

La siguiente clase va a crear un objeto de tipo Ejemplo, le pasa los valores -78 y 64. Esto significa que a recibirá el valor -78 y b tendrá 88.


El programa desplegará en la pantalla el valor -14. Pero antes de terminar con esta explicación de clases, quiero analizar un poco esta última clase. Algo que es obvio es que en la clase Ejemplo2 se está declarando un método main que no devuelve valores (por eso es de tipo void). Sin embargo, ¿para qué sirve el public y el static? El public indica que todo el mundo puede acceder a él y cuando se declara como static a un miembro de la clase, puede ser accesado antes de que cualquier objeto de su clase y sin hacer referencia a ningún objeto (su uso más común es para declarar el método main, aunque también puedes crear un bloque de código que sea static para que se ejecute una sola vez cuando se carga la clase por primera vez a la memoria). El String args[] es el argumento que recibe la función main() desde la línea de comando.

Aquí dejo otro ejemplo de una clase, una versión un poquito diferente al choteado programa Hola mundo que aparece en todos los libros de programación. Aproveché para usar objetos de la clase String. La ventana que ves es la de Notepad++.


Un libro que es buena de referencia, pero pésima para aprender, que me sirvió para este mensaje es Java Programmer's Reference de Herbert Schildt y Joe O'Neil (abajo pongo la liga a Amazon por si te interesa conseguirlo).



Espero que todo esto te haya servido. Si tienes cualquier duda o comentario, deja un comentario (valga la redundancia, jeje).

13 agosto 2008

Java: ¿Qué software necesito para arrancar?

Trabajar con Java es gratis, bueno casi gratis. Puedes encontrar herramientas por la red que te permitan desarrollar aplicaciones. En este mensaje pretendo hablar un poco de las herramientas indispensables (ofrecidas por Sun) y algunas utilerías útiles (ante tanta utilería que no sirve para absolutamente nada, como el EggOn, vale la pena mencionar que estas sí son útiles).

En primer lugar, necesitas los programas para desarrollar aplicaciones que puedes encontrar aquí. Como vas a encontrarte aquí muchas descargas, voy a explicar de qué tratan.

Hay tres variedades de la plataforma Java: la edición estándar (o Java SE) que está diseñada para el uso en computadoras personales, la edición para empresas (o Java EE) que está basada en Java SE y es una plataforma para aplicaciones Internet que ejecutan desde un servidor y la edición micro (Java ME) que está diseñado para programar celulares, PDAs, etc.

Hasta aquí todo es alegría y felicidad, pero todavía falta algo. Para desarrollar aplicaciones, es necesario el JDK (acrónimo de Java Developer Kit), que está bajo la sección de descargas de Java SE, parte del Java SE que contiene todas las herramientas básicas para compilar un programa escrito en Java (por ejemplo el archivo javac que compila tu código fuente, entre mil otros). Hay que tener cuidado porque si el JRE (Java Runtime Environment) solo tiene el software necesario para ejecutar aplicaciones Java (o sea, la máquina virtual y otros chunches).

Eso es lo básico. Sin embargo también necesitas algún programa para escribir tu código. Puedes usar el bloc de notas común y corriente que viene con Windows o usar el Notepad++ que pone colores alrededor de las palabras clave y algunas otras cosas que te facilitan el trabajo. Ahorita estoy a punto de probar Editra, que se supone ser una utilería similar al Notepad++ con más funciones y sepa que cosas más. Si me llega a gustar más que el Notepad++ les escribo un comentario.

Si quieres hacer aplicaciones en un entorno gráfico y dejar la línea de comando a un lado, como lo harías en Visual Basic, Delphi, RealBasic, etc., necesitas el NetBeans. Éste es un ambiente de desarrollo para Java SE, EE y ME y lo puedes bajar aquí. Yo voy a comenzar trabajando en modo texto para agarrar la onda del Java y luego voy a usar el NetBeans para hacer cosas interesantes, así que no te pierdas mis próximos posts al blog.

Antes de terminar, solo quiero resumir en lo único que es muy reelevante: baja todo lo que necesitas para el desarrollo aquí. El J2SE y NetBeans vienen junto con pegado y tiene todo lo necesario.

Ahora sí, aquí le voy a parar por hoy. Me voy a poner a programar en estos días y luego les informo cómo me ha ido. Falta hablar de sintáxis, clases, objetos y mil otras cosas más pero, como dijo Jack el destripador, vámonos por partes. ¡Hasta la próxima!

Look@LAN: Un vistazo por tu red

Me topé con este programa que se ve muy interesante: Look@LAN que probablemente sea una utilería básica para los administradores de red. Este programita te permite monitorear tu red de área local (LAN) para ver información sobre el porcentaje de máquinas en línea, sistemas operativos instalados en ellos, que registre cambios en la red (y opcionalmente mandarte un emilio para notificarte), limitar los rangos de escaneo de acuerdo a la dirección IP, adaptador de red o tipo de puertos. También incluye un visualizador de pings, para rastrear rutas (traceroute) y un visualizador que te permite ver la red en forma de árbol.

Abajo les incluyo algunas imágenes para que te des cuenta de algunas de las tantas cosas que puede hacer. La página desde donde puedes aprender más y descargar el programa es http://www.lookatlan.com. Seguimos en contacto. ¡Hasta la próxima!

10 agosto 2008

Un editor a todo dar: Notepad++

En mi post anterior les comentaba que me estoy aventurando en Java. Como soy fan del software gratuito, anduve buscando algo que sustituyera el bloc de notas para escribir código javadiense. Encontré este editor de código muy padre y que ocupa poco espacio. Te ayuda a escribir HTML, C++, Java, SQL y un montón de otros lenguajes, coloreando el texto de diferentes colores para ayudarte a detectar errores o simplemente hacerte la vida más fácil al estar editando tu código.

El programita se llama Notepad++ y su página es esta. Ojalá te sea útil...

08 agosto 2008

Java: la mera mata de la programada

Voy a comenzar a aventurarme en los reinos oscuros de la programación orientado a objetos con Java, así que en mi blog comenzarán a aparecer algunos mensajes sobre el tema.

Antes que nada, voy a platicar un poco sobre la tecnología de Java, cosa que es muy interesante. Para entender su funcionamiento, hay que hablar un poco sobre los lenguajes de programación existentes. Todos los lenguajes de programación usan el código fuente en un lenguaje determinado siguiendo cierta sintáxis (reglas impuestas por C, C++, Visual Basic, COBOL, FORTRAN, Ensamblador u otro). Este es un buen avance, sin embargo a la computadora como tal no le sirve de nada porque sólo entiende ceros y unos, puro binario, y, aunque es posible codificar en puro binario, es cosa de locos. Entonces para que todo funcione, es necesario traducir este código a unos y ceros.

Para hacer esto, básicamente hay dos tipos de lenguajes: los interpretados y los compilados. Los interpretados, usados por lenguajes como GW-BASIC, Logo, JavaScript, Lisp, VBScript, etc., necesitan de un programa traductor entre el código fuente y la computadora. Lo que hace es leer la primera línea del código, lo traduce para que lo entienda la computadora, lo envía a la computadora, recibe la respuesta de la computadora, lo traduce para que lo entienda el programa y da el resultado al programa. Luego lee la siguiente línea del código fuente y vuelve a hacer el mismo proceso y así sucesivamente hasta terminar todas las instrucciones del programa. Esto es como si me quisiera comunicar con una persona que sólo habla kuskoy y yo no tengo ni la más remota idea de cómo se habla. Lo mejor sería conseguirme un intérprete que sepa kuskoy y así yo le digo algo en español, él le dice lo mismo al cuate con el que pretendo comunicarme, éste le contesta al intérprete y éste último me dice la respuesta en español. Luego yo le digo otra cosa y así nos la llevamos durante toda la conversación. Es obvio que no puedo hacer nada si el intérprete no va conmigo. Lo mismo sucede con el programa hecho en un lenguaje interpretado: si no estoy corriendo el software intérprete, no funciona mi programa. Hice el siguiente dibujito para resumir lo que acabo de escribir:


Otra manera de hacer que el programa fuente pueda ser ejecutado por la computadora es por medio de un compilador (o sea, los lenguajes compilados). Algunos ejemplos de este tipo de lenguajes son el C, C++, Pascal o Fortran. El compilador es un programita que traduce el código fuente de golpe y porrazo a binario, por lo que ya no necesitas el compilador para ejecutar tu magna aplicación que sorprenderá al mundo entero. Es como si, en lugar de un intérprete para comunicarme con el que habla kuskoy, a alguien que traduce todo un documento al kuskoy para que lo pueda leer el extranjero. Una vez traducido el documento, no requiero los servicios del traductor para seguirme comunicando.

Una nota técnica sobre lo que dije del compilador: el compilador realmente no lo convierte a binario sino que convierte el código fuente a un código objeto, algo intermedio entre el código fuente y binario. Al tener el código objeto, se usa un programa llamado linker que sirve para convertir el código objeto al código binario de la computadora en cuestión. Ten cuidado aquí porque el código binario de cada tipo de sistema operativo es diferente, o sea que no es lo mismo un ejecutable para una PC corriendo Windows Vistagüácala!) que para una Mac usando MacOS X o para una computadora ejecutando Ubuntu (una distribución de Linux). Lo chido es que tienes un sólo codigo fuente que puedes compilar con diferentes compiladores para su uso en diferentes sistemas, por decir un programa en C++ puedes compilarlo con Visual C++ o Borland C++ para obtener una aplicación que funcione bajo Windows o compilarlo con el compilador C++ 9.1 para MacOS para que funcione en esa plataforma o con el GCC para que funcione bajo Linux. Aquí dejo un diagrama para ejemplificar el proceso de compilar un programa:


¿Y cuál es la diferencia entre ambos mundos? Los lenguajes compilados son mucho más rápidos que ñps interpretados, pero solo funcionan bajo un sistema operativo. La mayor parte de los lenguajes hechos para desarrollar aplicaciones "serias" son de este tipo. Sin embargo, teniendo el intérprete, un programa hecho en un lenguaje interpretado funciona en cualquier máquina, en cualquier sistema operativo (por ejemplo, el ActionScript que viene con el Flash funciona en todas las computadoras que tienen instalado el Flash Player).

Java une lo mejor de dos mundos. El código fuente que escribes en Java es compilado a un lenguaje ejecutable, llamado P-Code, que se ejecuta en una máquina virtual, o sea, una computadora "de mentiritas", totalmente funcional pero físicamente inexistente. A la hora de correr el programa, se necesita una máquina virtual de Java instalado para el sistema operativo en cuestión para que sirva de intérprete entre la aplicación Java y la computadora y ¡listo! el programa ejecutable se ejecuta (valga la redundancia). Aquí les dejo un último diagrama de cómo funciona todo este relajo de Java:


¿Qué ventajas trae esto, probablemente te preguntarás? Fácil. Con el famoso código P, se puede llevar esa aplicación a cualquier máquina y funciona, sea una PC, Mac, Servidor, Palm, teléfono celular, refrigerador, cafetera inteligente, máquina expendedora de refrescos o casi cualquier cosa que tenga un procesador. Sun, la compañía detrás de Java, tiene máquinas virutales para casi todas las plataformas que son gratuitas. Como verás, la desventaja de este lenguaje compilado-interpretado es la velocidad, pero la gran ventaja es que tu programa ejecutable puede correr en cualquier lado. Por ejemplo, hace tiempo Sun hizo una suite de aplicaciones gratuita llamada StarOffice (ahora la versión gratuita se llama OpenOffice porque el StarOffice ya se cobra) que funciona sobre Java (querían demostrar que Java era lo suficientemente potente como para realizar casi cualquier aplicación para computadoras). Funciona muy bien y todo es alegría y felicidad pero si lo comparas con Microsoft Office en una PC vas a ver que el OpenOffice es más lento, pero necesitas una copia de MS Office diferente si lo quieres ejecutar en la Mac (versión que difiere de la versión para PC) y es inexistente en Linux. OpenOffice funciona bajo cualquier plataforma.
Referencias:

Aquí te dejo algunas referencias padres que te pueden ayudar. Hay dos libros que hasta ahorita me han gustado y son útiles:

Introduction to Java and Software Design de Nell Dale, Chip Weems y Mark Headington de Jones and Bartlett Publishers

Java: How to program de los Deitel (padre e hijo)

El mejor material que he visto hasta ahorita en línea es The Java Tutorials. Vale la pena que le eches un vistazo.

Aquí les pongo ligas a estos libros por si les interesa. Si tienes dudas, sugerencias, propuestas o lo que sea, deja un comentario. ¡Hasta la próxima!

05 agosto 2008

Paradigmas de Programación y muchos objetos en C++

En este mensaje, voy a comenzar a hablar un poco acerca de la programación orientada a objetos y voy a ejemplificar lo que voy describiendo con el lenguaje C++.  Espero que encuentren esto de utilidad y si hay alguna duda, queja sugerencia o lo que sea, déjenme un comentario e intentaré responer en cuanto pueda.
Paradigmas de programación
Antes que nada, vamos familiarizándonos con diferentes paradigmas de programación (palabra dominguera para decir que son diferentes maneras de representar y manipular datos).

Existen varios paradigmas y todos tienen una manera diferente de resolver problemas.  Aquí pongo unos cuantos con un resumen de su filosofía:
  • El paradigma imperativo es considerado el más común y está representado, por ejemplo, por el C o por BASIC.  Aquí los programas se ejecutan de manera lineal, una instrucción a la vez, línea por línea, siempre en el mismo orden.
  • El paradigma funcional está representado por la familia de lenguajes LISP.  Aquí todos los programas son un montón de funciones anidadas.
  • El paradigma lógico, un ejemplo es PROLOG.
  • El paradigma orientado a objetos. Un lenguaje completamente orientado a objetos es Smalltalk.  Aquí todo el programa de compone de objetos, los cuales contienen procedimientos y datos.
También hay algunos lenguajes que mezclan paradigmas.  Por ejemplo, C++, Java y Visual Basic combinan el paradigma imperativo y el orientado a objetos.

Vista Preeliminar de OOP
Ya que hemos hablado tantito acerca de los diferentes paradigmas de programación, es hora de ver que onda con la Programación Orientada a Objetos (abreviado como POO [por sus siglas en español] o OOP [por sus siglas en inglés: Object Oriented Programming]) enfocada a C++.

¿Y qué "¡#¿$!? es un objeto?
De una manera chipocluda, podemos decir que un objeto es un principio de alto nivel, un concepto que nos permite organizar software.  Precisamente de aquí sacamos la palabrita de "programación orientada a objetos".

De una manera más real, podemos decir que un objeto es una región de almacenamiento dentro de un programa ejecutable que obedece un conjunto de reglas definidas por el usuario, o sea que es una estructura que guarda datos y contiene funciones para manipular esos datos.  Tomemos como ejemplo un arreglo.  En teoría, el programador tuvo que pensar en qué características serían necesarias en ese objeto arreglo; y a cada arreglo declarado en un programa ejecutable se le llama objeto.  También se conoce a un objeto en memoria como una "instancia".

Esto sonó muy bonito, pero son un par de conceptos que en la práctica no nos sirven de nada.  Hasta ahora he descrito a los objetos como regiones de memoria.  Es claro que conozcamos objetos (un vaso, una ventana, un carro, etc.), pero todavía no se entiende muy bien que característica de un lenguaje de programación nos permite especificar y crear objetos.  Para esto hacemos una "clase", que en la mayoría de lenguajes de programación OO incluyendo al C++, es un tipo de dato definido por el usuario para crear objetos.  Clases son como los planos de una casa: especifican exactamente como debe de construirse el objeto y como se va a comportar.

¿Y cómo uso las clases?
La definición de una clase especifica los datos y funciones miembros de esa clase.  Por ejemplo, consideremos una clase llamado VerArch que tiene un dato miembro llamado fin.  Si tenemos un objeto VerArch llamado oVA, podemos accesar al dato miembro fin usando la notación normal de C++:

if (oVA.fin == NULL)
   ...

Ya estuvo bueno de datos pero, ¿y si necesito funciones?  Supongamos que la clase VerArch usada anteriormente tiene una función llamada AddLine() (luego llego a la parte de como declarar/hacer la función miembro).  Para el objeto VerArch llamado oVA podemos llamar a la función AddLine() así:

oVA.AddLine();

oVA es el nombre del objeto, el punto significa "miembro de", AddLine es el nombre de la función miembro y los paréntesis son indicadores estándares de C++ y Java.

Lo mejorcito de los objetos...

Los 3 conceptos más importantes en programación OO son la abstracción (también conocido como encapsulamiento), la herencia y el polimorfismo.  Yo casi diría que en estos 3 conceptos radica la ventaja de los lenguajes OO.  Luego vemos de que trata cada uno, pero antes un poco de rollo...

En la programación OO (desde ahora la voy a abreviar como OOP), diseñamos software usando partes componentes, a los que llamamos "objetos".  Los objetos se conforman de datos miembro y un conjunto de rutinas para manipular los datos, a los que llamamos funciones miembro.  Pero el tener a las funciones "pegadas" a los datos es solo una ventaja.  Como diría Raúl Velasco, aún hay más...

Por ejemplo, los objetos físicos (como tu teclado o un carro) tienen una interfase externa que esconden su complejidad interna (por ejemplo: no tienes que saber exactamente como funciona un motor de combustión interna para poder manejar un carro).  El esconder información se llama abstracción o encapsulación.  Esto facilita las cosas: imagínate que un arquitecto tenga que dibujar como va a funcionar el sistema de agua caliente a una casa.  Le sería complicado.  Mejor solo dibuja en los planos lo que es necesario para poner el boiler, tubería, etc. sin preocuparse como funciona.  Sabe que funciona y con eso basta.

Otro aspecto de objetos físicos que se extienden a la OOP es la forma en que algunos objetos pueden ser adaptados para crear nuevos objetos.  En OOP a esto lo llaman herencia y decimos que un objeto se deriva de otro.  Volvamos a nuestro arquitecto frustrado: puede modificar los planos de una casa para incluir una cochera para 2 autos y un desayunador.  Estas cosas que se agregan requieren un ajuste a los planos de piso y de ventanas, pero el diseño básico de la casa queda igual.

Y una tercera característica de objetos físicos que agarramos es que diferentes objetos muchas veces operan en la misma manera.  En OOP eso se llama polimorfismo.  Piensa en vehículos con motores de combustión interna, desde el volcho (Volkswagen Sedan) hasta tráileres grandes.  Todos se operan con un pedal para la gasolina, otro para el freno y un volante.  En este rango de vehículos se usan mecanismos muy diferentes para algunas cosas como son frenos o cambios de velocidades.  Pero en todos los casos el pedal del freno es una interfase uniforme para el mecanismo interno.

Usando Clases
Después de esto, como diría el dermatólogo, vámonos directo al grano.  Vamos a usar las clases y crear objetos.

La sintaxis básica de una clase en C++ sería así (sé que hay muchos otros tiliches que se le pueden poner, pero eso lo hablaremos más adelante):

class Nombre_Clase
{
   public:
      // declaración de los miembros públicos
   private:
      // declaración de los miembros privados
}

Al ver esto, probablemente tu primera pregunta es ¿qué es un miembro público?  Y el segundo probablemente sería ¿y qué es un miembro privado?  La onda está así, en la sección public se define las partes (funciones y variables) de la clase que son accesibles a todos y se declaran las funciones miembro que pertenecen a esta clase.  En la sección private se especifican los datos miembros de la clase.  Los usuarios no tienen acceso a esta parte.

Hagan de cuenta que las clases son como el edificio del restaurante con dos puertas.  Todo el mundo puede entrar por la puerta principal (sección public) y solo los empleados pueden entrar por una puerta pequeña que está en la parte posterior del edificio.  Esta sería una puerta que solo pueden acceder los empleados (miembros) del restaurante.

Este sería un ejemplo de una clase que guarda datos acerca de un video:

// video.h
class Video
{
   public:
      Video();
      void establecer(char *,char *,int);
      char* obtener_nombre();
      char* obtener_productor();
      int obtener_cantidad();
   private:
      char nombre[40]
      char productor[40];
      int cantidad;
}

Esta clase se llama Video (class Video) y tiene 3 datos privados (lo que está después de la línea private): nombre, productor y cantidad.  No conforme con esto, también contiene 5 funciones públicas (todo lo que viene después de public: y antes de private:), es decir, Video, establecer, obtener_nombre, obtener_productor y obtener_cantidad.

Referencias
Bibliografía (libros que tienen material interesante)
  • Desarrollo de proyectos con programación orientada a objetos con C++, de Jo Ann Smith, Editorial Thompson, ISBN: 970-686-091-6
  • Borland C++ Techniques & Utilities, de Kaare Christian, Editorial ZD Press, ISBN: 1-56276-054-8
Webografía (es medio contradictorio decir “bibliografía en la web”)
Si te interesan estos libros, aquí hay unas ligas donde los puedes conseguir:


¡Hasta la próxima!

02 agosto 2008

El cotorreo virtual: Digsby

El chat se ha vuelto indispensable en nuestros días. Ya sea para perder el tiempo con amigos, dar asesorías a mis alumnos, contactar a proveedores, comunicarse de forma barata con familiares que viven en lugares lejanos, tener una reunión virtual con amigos de diferentes ciudades, y otras chorrocientas mil otras cosas más, es un software imprescindible para todo cybernauta.

Un problema con el Chat es que cada compañía tiene el propio (por ejemplo, Microsoft tiene el MSN Messenger para los usuarios de Hotmail, Yahoo! tiene el Yahoo! Messenger para usuarios de Yahoo!, Google tiene el Google Talk para su gente, etc.). Sé que últimamente muchos programas de estos pueden comunicarse con gente que esté usando otro software de chat, sigue siendo todo un relajo.

El otro día me topé con un programita que ayuda en todo esto: Digsby. Este es un programa que te permite chatear con todos tus cuates, independientemente si usan AOL, MSN, Yahoo!, GTalk o lo que sea. Tengo ya como 3 o 4 días con él y ya no quiero regresar a los programas que usaba antes.

Antes usaba principalmente el MSN Messenger y chateaba desde mi cuenta de GMail, pero el problema es que a veces se me olvidaba y cerraba mi correo, lo cual daba al traste con lo que estaba diciendo. Además soy enemigo de instalar un montón de programas que no uso (luego se llena mi disco duro y Windows se hace bolas).

Con Digsby dí de alta mis cuentas de correo y las de mensajería instantánea y ¡listo! Comencé a chatear con mis cuates que tenían en la lista de MSN Messenger, y al mismo tiempo se veían los que tenía en GMail. Otra cosa que a mí me gusta mucho es que no me abre una ventanita diferente para cada plática sino que la ventana de conversaciones tiene pestañas. Además, en la barra de tareas me aparecen mini iconos de mis correos (GMail, Yahoo y Hotmail) que me dice el número de correos que no he leído en cada cuenta y al darle click sobre el icono, me abre mi correo para leerlos. Lo único que extraño del MSN Messenger es la incorporación de emoticones. No me he puesto a picarle, pero todavía no le hallo para incorporar emoticones usados por otros.

En resumidas cuentas, este es el programa ideal para el que gusta de buenas cyberpláticas en el chat. Visita www.digsby.com para mayores detalles y bara descargarlo. ¡Hasta la próxima!
Related Posts Plugin for WordPress, Blogger...