| [Las cosas que no interesan] |
jueves dic 06, 2007
Peopleware
Posted at 09:13PM dic 06, 2007 by Carlos Alexander Zuluaga in General | Comentarios[1]
miércoles oct 03, 2007
Las Cosas por Leer Durante mi entrada a este mundo de la ingeniería de
software me he encontrado con cosas increíbles: la forma como se puede concebir
un proyecto a un alto nivel, las técnicas para estimar su duración, el cálculo
de puntos de función, las metodologías iterativas y la convivencia con el
cambio, la asignación de recursos, el modelado del negocio, el análisis, el
diseño, las pruebas todas las disciplinas de RUP, etc. Hace 6 meses ni me
imaginaba todas las herramientas que existen para administrar un proyecto de
desarrollo de software, no es que esté administrando un proyecto ahora, pero si
que he tenido que preocuparme por estos aspectos. Pero son tantos, tan diversos, hay tantas formas de ver un
proyecto que resulta abrumadora la cantidad de materias en las que me encuentro
ignorante; puedo mirar el proyecto desde el punto de vista de su desarrollo, es
decir, las etapas que comprenden el modelado del negocio, la definición de
requerimientos, el análisis y diseño, la implementación, las pruebas y el
despliegue. Esta es la primera “vista” a la que me acerqué, es la que más
conozco o al menos la que se me antoja menos ajena, de todas formas en la
universidad se aborda cada uno de estos temas, no con gran profundidad, pero se
hace y ya tenía idea de que se trata cada uno. Aún así me he llevado muchas
sorpresas: la relevancia que tienen los casos de uso, como a través de ellos se
puede conocer el tamaño de un sistema y como a través de ellos se puede hacer
un seguimiento a todo el proceso de desarrollo; también he descubierto muchas
cosas sobre el diseño, que se trata como todo de un proceso iterativo, que de
un diagrama de clases se hace un esbozo inicial y a través de otros diagramas
(especialmente el de secuencia) se pude probar ese diseño inicial para entrar
en una etapa cíclica de refinamiento. Me he enterado de otras disciplinas sobre
las que no tenía mucho conocimiento: las técnicas para modelar el negocio y la
preparación de casos de prueba, no solo las he conocido, sino que he aprendido
a reconocer su valor en el proceso. El hecho de que el material seleccionado haya salido en su gran parte de lo recomendado por RUP, no quiere decir que no se pueda abortar de forma independiente a metodología. Aquí va pues, la tarea que tengo para los próximos tres meses:
Artículos 1. A Software Development Process for Small Projects (http://www.geocities. com/marioztobon/articles/s5096.pdf). 2. When Telepathy Won't Do: Requirements Engineering Key Practices. 3. Listening to the Customer’s Voice. 4. Estimación ISO 9000 (http://www.geocities. com/marioztobon/formatos/Estimacion_ISO_9000.doc). 5. Stop Promising Miracles. 6. Know Your Enemy: Software Risk Management. 7. Running Projects. 8. Configuration Management (http://www.geocities. com/marioztobon/articles/Configuration_Management_Notes.pdf). 9. Improving Quality through Software Inspections. 9. What Is Software Testing? And Why Is It so Hard? (http://www.geocities. com/marioztobon/articles/s1070.pdf). 10. Vee Chart (http://www.geocities. com/marioztobon/articles/Extracto_V_V.pdf). 11. Core Measures (http://www.geocities. com/marioztobon/articles/metricas.pdf). 12. Implementing Software Engineering in a Small Software Group. 13. Looking Back, Looking Ahead. 14. The New Methodology. 15. Continuous Integration. 16. Building a Fort: Lessons in Software Estimation. 17. Function Point Training Manual. 18. Structuring Use Cases with Goals. Libros 1. Software Project Management in Practice. 2. Getting Things Done. 3. Desarrollo y Gestión de Proyectos Informáticos. 4. Peopleware: Productive Projects and Teams. 5. The Unified Modeling Language User Guide. 6. The Mythical Man-Month. 7. Object-Oriented Analysis and Design with Applications. 8. Head First Design Patterns. 9. The Rational Unified Process: An Introduction. 10. The Rational Unified Process Made Easy. 11. Patterns for Effective Use Cases. 12. Writing Effective Use Cases. 13. Software Requirements. 14. Head First Object-Oriented Analysis and Design. Otros 1. Memorias de la Informática en Colombia. 2. Ingeniería de Software. 3. La Inteligencia Emocional. 4. The Art of Software Testing. 5. La esperanza no es un método. Vaya, después de hacer esta lista veo tres cosas:
Posted at 01:13AM oct 03, 2007 by Carlos Alexander Zuluaga in General | Comentarios[5]
domingo sep 30, 2007
La Brecha Ha existido desde siempre una línea que nos
separa los ingenieros de nuestros usuarios, una línea construida sobre la
diferencia en lenguajes y en la forma de pensar; en el caso del desarrollo de
software, nos separa a quienes diseñamos y construimos las aplicaciones de
aquellos usuarios que las van a usar o que de una u otra forma se van a ver
beneficiados por ellas. Que exista esta diferencia está bien, la
hay en todas las ciencias, artes, deportes, etc. El mundo funciona por que a
todos nos gustan cosas diferentes, hay quienes diseñan casas, hay quienes las
construyen, otros se especializaron en hacer cemento y los otros en
transportarlo, esto no es un problema en sí, es una condición. Sin embargo para
que este mismo mundo funcione, debe haber comunicación entre las diferentes
especializaciones: quien diseña la casa le debe explicar al que la va a
construir para que éste pueda hablar con los que hacen el cemento y hacer el
pedido exacto, pero eso no implica que quien hace el cemento, deba ser un
experto en el diseño y/o construcción de casas. Lo que me inquieta y me trae a este punto
es que en los ingenieros que tenemos que ver con la informática hemos hecho
todo lo posible por aumentar la brecha. Hemos vivido desde hace años con la
ilusión de ser y hacer como hackers, de usar un lenguaje ininteligible para los
“demás idiotas”; soñamos con cuartos oscuros, llenos de módems, computadores
portátiles y un montón de geeks hablando de los temas que “realmente importan”
(stuff that matters) y absolutamente aislados de ese mundo donde está el
monstruo a vencer, ese monstruo que nos hace la vida más difícil con sus
preguntas tontas, con su manejo torpe del teclado, con su odiosa indiferencia
cuando le hablamos de Linux, ese monstruo que llamamos “usuario final”. Los ingenieros (al menos los informáticos)
somos unos pedantes, somos capaces de presumir con un pregrado y 10 años de
experiencia aún sin conocer un pito sobre UML y programación orientada a
objetos, nos encanta sentirnos diferentes con nuestro idioma lleno de
tecnicismos, nos encanta hablar rápido para hacer que las cosas parezcan más
complejas de lo que son, nos encanta el estrés para demostrar cuan importante
es lo que hacemos, nos encanta odiar a nuestros gerentes por que no saben nada
de programación. Nos encanta despreciar a nuestros usuarios por que no saben lo
que se puede hacer con la tecnología, usamos sobrenombres tan divertidos como
“el idiota aquel” para referirnos a ellos, creamos caricaturas y usamos nuestro
gran ícono universal para representarlos: el pobre tipo o tipa dándole golpes a
un teclado a ver si su aplicación funciona. Y lo peor de todo es que nos
sentimos orgullosos de ser así, nos mantenemos aislados de lo no técnico, de lo
administrativo, del negocio que estamos modelando. Pero no, el usuario no es tan torpe, el
gerente no es tan inepto y nuestro mundo no es tan complejo. Es cierto, somos
una ciencia nueva, con mucha incertidumbre, con muchas cosas por descubrir e
inventar. Estamos en una situación que nos exige humildad, nos exige mirar con
cara de niño curioso hacia otras ciencias, nos exige respetar al usuario que es
quien más sabe sobre lo que hacemos, por que es él quien lo usa. Debemos
acercarnos a él, preguntarle como se siente lo que hicimos, que hay de bueno,
que hay de malo; por que el mundo no se divide entre lo que funciona y lo que
no. Hay demasiados factores subjetivos que son clave en el éxito de una
aplicación, al usuario no solo debería importarle si funciona o no, el usuario
es humano y como tal hay cosas que le gustan por que sí o por que no Sabemos que no se puede garantizar que una
nueva aplicación sea 100% libre de errores, los bugs son el pan de cada día y
de hecho la ingeniería de software existe para darle mantenimiento a las
aplicaciones con errores. Cuando no podemos dar esta garantía, deberíamos por
lo menos procurar una experiencia agradable en el uso de nuestros productos,
por que no es justo que aparte de soportar una aplicación con errores, el
usuario deba usarla y sentirla como el ingeniero lo ordena, no es justo que se
sienta idiota por que las operaciones son como las pensó el ingeniero y no como
él cree que deberían ser. Claro, eso tampoco debe llevarnos a implementar
cuanta cosa se le ocurra a la gente, pero si debería llevarnos a un
acercamiento que facilite el trabajo en equipo, dejar de ver a nuestros usuario
únicamente como el receptor de lo que hacemos, debemos convertirlo en una ficha
clave en lo que hacemos. Debemos hacer que aprenda UML (que para eso se
diseñó), que comprenda como se hace una aplicación, debemos escucharlo, quizá
la diferencia entre un botón azul o amarillo sea la clave para la aceptación de
una nueva aplicación, en fin, debemos darle al usuario la importancia que se
merece, seguramente haciéndolo vamos a encontrar muchas de las respuestas que
necesitamos para que los proyectos de desarrollo de software fracasen menos,
para tener más claridad en el camino a seguir. Al fin y al cabo, ¿Qué es lo que
hace que MAC OS sea tan exitoso?, ¿Por qué sus usuarios lo sienten como una
religión?, ¿Por qué aunque Linux sea ahora tan fácil como Windows, los usuarios
prefieren este último aunque tengan que pagar mucho más? Posted at 11:37PM sep 30, 2007 by Carlos Alexander Zuluaga in General | Comentarios[12]
sábado sep 15, 2007
El Software La
Ingeniería de Software siendo una de las áreas que se desprende de las
ciencias de la computación, cuenta con un alto nivel de incertidumbre
en cuanto a sus metodologías, procesos, disciplinas, etc. Uno de los
problemas con los que siempre hemos tenido que lidiar quienes estamos
involucrados en el desarrollo de software es tratar de hacerlo un
negocio rentable y predecible, por que sabemos que aproximadamente el
70% de este tipo de proyectos fracasan en cuanto a sus costos y
tiempos. Esta aterradora cifra nos plantea inmediatamente la pregunta:
¿por qué si es un negocio que genera tantas pérdidas, tiene tantas
empresas que siguen empecinadas en invertir en él? Posted at 09:34PM sep 15, 2007 by Carlos Alexander Zuluaga in General | Comentarios[2]
miércoles sep 05, 2007
El Arte Por estos días con todo eso de el cambio y de la ingeniería de software estoy estudiando "Object Oriented Análisis and Design with Applications" de Grady Booch y compañía. Estoy empezando y es casi un viaje cósmico, Booch es de los que sabe lo que dice en cuando al diseño y construcción de software. Pero lo que más me ha gustado es esta joya, no la traduzco por que sería vulgar:
Posted at 10:31AM sep 05, 2007 by Carlos Alexander Zuluaga in General | Comentarios[0]
lunes ago 20, 2007
El Cambio El último año de mi vida ha tenido cambios brutales, la palabra es muy aparatosa, pero es cierto. La cosa empezó hace un poco más cuando empecé a programar en Cobol para la empresa en que trabajaba. El paso de Java a Cobol no fue muy bien visto, para muchos era un retroceso, significaba devolverse como 15 ó 20 años en tecnología y dejar de pensar en clases, paquetes, objetos, Web, etc, etc. La verdad es que me estaba hartando de Java, no de la tecnología, sino de lo que había en torno a ella. No parecíamos programadores de un lenguaje, eramos más bien un montón de fanáticos religiosos donde lo mejor de Java es que era Java. Sin muchos argumentos, sin preguntarnos mucho de nada, leyendo siempre javaHispano, TheServerSide, java.net y todas las páginas en las que solo se habla de Java, aprendiendo a defendernos de "Los Otros", los programadores de .NET, pero defendiéndonos sin conocer esa plataforma, defendiéndonos con lo que nos daban las noticias de javaHispano y los objetivos "BenchMarks" de TheServerSide. Era claro para mí que necesitaba un cambio. Programar en Cobol fue una experiencia bastante loca, dejar de pensar en términos de clases, ver algoritmos con 20 ó 30 mil líneas y empezar a entender las bases de datos jerárquicas era como cambiar de mundo, cambiar de trabajo, eso sí, el negocio era similar, por que fue bien divertido ver como soluciones que en el mundo de los objetos y las arquitecturas multicapas llevaban varias semanas de implementación, en Cobol tomaban apenas unas horas. Claro, lo contrario era mucho más común. Los meses que duré como programador Cobol fueron rejuvenecedores, me mostraron un mundo que no conocía y sobre todo entendí por que muchas de las cosas son como son ahora, jeje, por ejemplo el impacto que tiene sobre la legibilidad de un programa el poder declarar variables en cualquier punto o el tener que declararlas todas al principio, es mucho más de lo que uno se imagina o por lo menos fue muchísimo más del que yo me imaginaba. Durante mi "estadía" en Cobol descubrí algunas cosas que hacían falta en el proceso que seguíamos. Una de esas cosas que hacían falta era un IDE que permitiera agilizar el trabajo y detectar algunos problemas que el compilador no detectaba, aunque busqué bastante, no encontré mucho, de hecho nada. Aprovechando que tenía la energía suficiente para trabajar 14 horas al día me puse en la tarea de desarrollarlo. No fue algo maravilloso, pero si que resolvió numerosos problemas, de paso conocí el entorno de NetBeans 5 para aplicaciones Swing y ya entrado en gastos, usé parte del tiempo para estudiar y certificarme como programador Java. No tengo idea como hice para que el tiempo fuera suficiente en ese entonces, solo se que cuando más tareas tenía por hacer, mucho mejor era usando los recursos con que contaba (tiempo, espacio y hasta dinero). Después a causa de algunos movimientos clave en la empresa pasé al área de investigación y desarrollo, donde apenas duré unos días por que llegó una nueva propuesta de trabajo que tomé, claro, después de meditarlo mucho. Entré al mundo SAP en un proyecto que se trataba de instalar y personalizar el portal integrándolo con el CRM y la tienda en línea. Algo bien interesante y diferente con respecto a lo que había hecho hasta el momento. Aprendí bastante sobre sistemas integrados, su filosofía, sobre CRMs, tiendas en línea, ABAP y todo lo que pude en los 4 meses que estuve en el proyecto. Ahora estoy en una nueva ciudad, lejos de mi mundo conocido y entendiendo todas las cosas de las que nunca quise entender por que siempre creí que "lo mio" era ser muy técnico, usar un lenguaje ininteligible para los gerentes, estar encerrado en un garaje con un pc y unos manuales de referencia tipo biblia, tomando café y trabajando hasta la madrugada. Pero no, para eso es la vida, para demostrarle a uno que casi todo lo que creía era mierda, que antes de los 60 no hay criterio para tomar decisiones y que definitivamente la casualidad es la que me guía. No nací para nada, hago lo que haya por hacer y casi todo me gusta. Hago lo que hago por pura casualidad, soy ingeniero de sistemas por que para ser electrónico hubiera tenido que viajar mucho y a mis papás en mis 17, les parecía exagerado eso sabiendo que habían tantas otras cosas por estudiar. Hoy estoy aprendiendo sobre todo lo que tiene que ver con ingeniería de software, todas las etapas de un proyecto, donde la programación y el desarrollo solo ocupan a lo sumo una tercera parte del ciclo. Ahora lo mío es entender como gestionar un proyecto, ahora lo mío es leer "The Mythical Man-Month" y entender como funcionan los equipos de trabajo, como disminuir el riesgo en un proyecto de desarrollo. Ahora lo mío es sentarme con un usuario y entender como siente, que quiere, ponerme de acuerdo con él y asegurarme de que los dos pensemos lo mismo cuando planteamos una solución. Ahora estoy en un mundo donde la cosa es más un arte que una ciencia exacta, donde no hay soluciones exactas, donde no hay bueno y malo sino lo uno y lo otro. Ahora estoy entendiendo por que UML sí es importante y sobre todo por que los casos de uso en verdad fueron una revolución en su momento, entendiendo que no se trata de los pinches gráficos, que no se trata de hacer bien el muñeco y que los círculos cumplan con un montón de reglas estrictas, donde no importa si tengo que comunicar dos muñecos para entender mejor el funcionamiento del sistema. Donde ahora UML y Java en verdad son herramientas, ya no defiendo las cosas religiosamente, ya no puedo hacerlo. Eso si me ha gustado de el cambio, que me ha restregado lo equivocado que me mantengo y como es que el mundo no funciona dentro de una cuadrícula. Posted at 07:49PM ago 20, 2007 by Carlos Alexander Zuluaga in General | Comentarios[1]
lunes jun 25, 2007
SCJP for JSE5 - 9 SOBREESCRITURA Y SOBRECARGA La sobreescritura de métodos consiste en la habilidad de definir cierto tipo de comportamiento que es específico para una subclase. Por ejemplo: class Humano{ class Pepe extends Humano{ En la implementación anterior la clase Humano define un grupo de métodos que aplicará a todas sus subclases. Pepe por ejemplo, hereda todos los métodos heredables de Humano, pero por alguna razón, define un comportamiento específico para caminar. Quizá por que Pepe sea cojo, tenga un pie más largo que otro o por que camina muy rápido, en fin, de esto se trata la sobreescritura de métodos: las subclases pueden aprovechar todos los métodos que heredan de sus padres y además personalizar el comportamiento que no se acomode a sus necesidades. No se debe confundir la sobreescritura de métodos con la implementación. Cuando se heredan métodos abstractos de una clase (abstracta por supuesto), estos se implementan no se sobreescriben. Las reglas para sobreescribir métodos son: - La lista de argumentos debe ser exactamente igual a la del método sobreescrito. Si esta regla no se cumple, probablemente se obtiene un método sobrecargado. - El tipo de retorno debe ser el mismo o un subtipo del tipo de retorno declarado en el método sobreescrito en la superclase. Lo de subtipo es nuevo en JSE5, se le llama "Covariant Returns" y se verá más adelante. - El nivel de acceso no puede ser más restrictivo que el del método sobreescrito. - Los métodos marcados como private, final o static no pueden ser sobreescritos. - El método que sobreescribe no puede lanzar 'Checked Exceptions' nuevas o de nivel superior a las declaradas en el método sobreescrito. - El método que sobreescribe no tiene que declarar excepciones que no vaya a lanzar, no importa las que hayan declaradas en el método original. OJO: Si un método no puede ser heredado tampoco puede ser sobreescrito. Sobreescribir un método no quiere decir que el método de la clase de nivel superior ya nunca más puede ser invocado con una instancia de la subclase; la palabra reservada super hace referencia a la instancia de la superclase (sí, al crear la instancia de una subclase, también se crea una de la superclase) y con esta palabra podemos invocar los métodos que han sido sobreescritos en la subclase. Por ejemplo: class Humano{ class Pepe extends Humano{ El uso de la palabra super para invocar métodos sobreescritos, está restringido para los métodos de instancia que sean accesibles por la subclase (los no private). 2. Sobrecarga de métodos - La sobrecarga de métodos permite reutilizar el mismo nombre de un método en una clase pero con una lista de argumentos diferente y se puede cambiar el tipo de retorno. Los métodos se pueden sobrecargar en la misma clase o una subclase puede sobrecargar uno o varios métodos de la clase padre. Un ejemplo: class Humano{ public void caminar(Recorrido rr){ class Pepe{ Note que en el ejemplo anterior el método caminar() de la clase Pepe no sobreescribe ninguno de Humano sino que lo sobrecarga. Así una instancia de la clase Humano tiene acceso a dos formas del método caminar: una que recibe el número de kilómetros y otra que recibe el recorrido a hacer; mientras una instancia de la clase Pepe tiene acceso a tres formas del método caminar: dos heredadas de Humano y otra sobrecargada en Pepe que recibe una dirección. Las reglas para sobrecargar métodos son: - Los métodos sobrecargados tienen que cambiar la lista de argumentos. - Un método sobrecargado puede cambiar el tipo de retorno. - Un método sobrecargado puede cambiar el modificador de acceso. - Un método sobrecargado puede declarar excepciones nuevas o de nivel superior. Dado el método public Integer calcularPrecioProducto(int valorCompra, double ganancia) throws Exception, algunas versiones sobrecargadas de este método pueden ser: protected Double calcularPrecioProducto(int valorCompra, double ganancia) - La decisión de la versión del método que se va a invocar está basada en la lista de argumentos y se hace en tiempo de compilación. Por ejemplo al compilar y ejecutar la clase EjemploSobrecarga: class Humano{} La salida será: "Procesando un Humano...". Aunque la instancia que se pasa como parámetro al método 'hacerAlgo()' es de la clase Pepe, el compilador solo sabe que la variable es una referencia a la clase Humano y por tanto decide invocar la versión que recibe tiene esta clase como argumento. La salida sería diferente si la variable se creará así: 'Pepe pepe = new Pepe();', en este caso el compilador reconoce una referencia a Pepe e invoca el método correspondiente. Algo que nunca me ha quedado muy claro es que sucede cuando se pasa null como argumento, no se cuál es el criterio para elegir el método. En el ejemplo anterior que sucedería con la línea: 'new EjemploSobrecarga().hacerAlgo(null);' El Final Es muy importante reconocer si un método se está sobreescribiendo, sobrecargando o ambos. Hay que reconocer cuando hay errores de compilación o cuando una mala sobreescritura termina en una sobrecarga; esto se debe complementar muy bien con los conceptos de polimorfismo para que dado cualquier código, con la complejidad que sea, podamos predecir la salida. En SProgramando he publicado un listado de preguntas sobre el tema. Posted at 02:09PM jun 25, 2007 by Carlos Alexander Zuluaga in Java | Comentarios[7]
miércoles jun 20, 2007
Los Recursos A través de un sitio que hace referencia a este weblog, encontré una buena página con recursos para la certificación. Se trata del Grupo de Usuarios Java del Uruguay que tiene una sección dedicada a la SCJP en donde tienen algunos artículos publicados y otra sección aún más interesante con preguntas y su solución bien explicada. A mi modo de ver una de las mejores formas de estudiar es ver preguntas y entender bien su solución por que aunque en el examen no importa si se responde por suerte o conocimiento, para efectos educativos (y de la vida en general ;-) es mejor entender como funcionan las cosas por dentro y aprender más que casos concretos, reglas generales. Claro, otra recomendación es hacerlo una vez se acabe de leer la sección correspondiente en el libro guía. Estos son los enlaces: - Grupo de Usuarios Java del Uruguay: http://juguy.org/ Más material para el repositorio!. Posted at 03:25PM jun 20, 2007 by Carlos Alexander Zuluaga in Java |
miércoles jun 06, 2007
SCJP for JSE5 - 8 1. ENCAPSULACIÓN.
Ejemplo de una clase bien encapsulada: class Algo{ 2. HERENCIA, IS-A (ES-UN) Y HAS-A (TIENE-UN). Dado el código: class A{ Las clases B y C heredan de A. B lo hace directamente y C lo hace a través de B; esto quiere decir que tanto B como C pueden ser tratadas como cualquiera de sus padres, esto es, B puede ser tratada como A y, C puede ser A o B. El siguiente código por ejemplo, es válido y la salida será 4 veces la frase "A está haciendo alguna cosa". public static void main(String[] args) { Lo mismo ocurre con los parámetros: public static void unParametroGeneral(A parametro){ El problema al tratar las clases como su padre, es que solo se puede acceder a los métodos y atributos de instancia declarados por el mismo padre; para acceder a los métodos y atributos específicos de cada clase, se debe usar una variable de su tipo. IS-A y HAS-A
La relación HAS-A es mucho más simple y se refiere únicamente al uso que una clase hace de otra. Se dice que A HAS-A (TIENE-UN) B si A tiene un atributo de tipo B. Por ejemplo: class A{} En este caso la clase B HAS-A A. Todo esto se entiende mejor con un ejemplo. class Animal{ En este caso, las instancias de la clase Perro pueden ser tratadas como Animal o Perro y las de Labrador como Animal, Perro y Labrador. Pero claro, si por ejemplo se quiere acceder al método 'hacerCosasDivertidasDeLabrador()' de la clase Labrador debe hacerse a través de una variable de tipo Labrador. public static void main(String[] args) { Con el tipo Animal se pueden referenciar las instancias de las tres clases, por que Animal, Perro y Labrador cumplen el test 'IS-A Animal'. Pero los métodos que se acceden corresponden a cada una de las instancias que realmente se crearon. Al ejecutar la clase la salida es: Comiendo como Animal Las líneas 'an.comer();' y 'pe.comer()' invocan ambos el mismo método implementado en la clase Animal, por que la clase Perro no tiene ninguno declarado, esto es, lo hace a través de herencia. La línea 'la.comer();' aunque tenga una referencia a través de la clase Animal, invoca el método implementado en la clase Perro por que es la instancia a la que realmente apunta. Si introdujéramos la siguiente línea 'la.hacerCosasDivertidasDeLabrador()', tendríamos un error de compilación por que aunque la instancia en verdad sea de Labrador, la referencia a través Animal no tiene ni idea sobre la existencia del método. Un buen truco para descifrar este tipo de errores es que los llamados a los métodos se definen en tiempo de compilación, es decir, si el compilador no encuentra una relación directa entre la variable usada (herencia, implementación de una interface) y el método a llamar, lo único que puede hacer es mostrar un error. Pero esto que es clave, lo intentaré explicar mejor en otra entrada. Finalmente, para invocar correctamente el método 'hacerCosasDivertidasDeLabrador()', debemos crear una instancia de la clase Labrador y apuntar a ella (aunque a mucha gente no le gusta usar la palabra apuntador en Java) con una variable de ese mismo tipo, todo este enredo textual en dos líneas de código: Labrador labra = new Labrador(); Algo muy importante saber y que debe ser entendido y practicado muy bien es que lo único que se selecciona dinámicamente basado en el objeto actual (en vez de la referencia) son los métodos de instancia. No sucede ni con los métodos estáticos ni con los atributos. El Final. Posted at 12:19AM jun 06, 2007 by Carlos Alexander Zuluaga in Java | Comentarios[1]
martes jun 05, 2007
Y yo que creía que no se podía NOMBRES DE VARIABLES Alguna vez me pregunté si una variable podía tener el mismo nombre de una clase del paquete java.lang o en general, ¿una variable puede tener el mismo nombre de una clase que se esté importando?. A ver: package whatyoubelievedyoucouldnot; Si se compila y ejecuta la clase anterior la salida será: Tamanio: 9 Pues resulta que sí, si se puede usar el nombre de cualquier clase como variable. ¿Pero qué pasa si necesito usar la clase java.lang.Integer?, pues eso, hay que cualificarla completamente: System.out.println(java.lang.Integer.toHexString(0xCAFE)); Aunque el código es como para moler a golpes quien lo haga, según las reglas no hay razón por la que no se puedan usar estos nombres ya que no son palabras reservadas y tienen nombres válidos. Eso sí, según las buenas prácticas los nombres de variables y atributos deben empezar con letras minusculas, pero esto no es ningún impedimento para que una clase compile. NOMBRES DE CLASES package whatyoubelievedyoucouldnot; También asesinaría a quien cometa este tipo de aberración, pero es válida. La salida al ejecutar este programa es "Soy un hilo farsante", por qué el método toString() que se ejecuta es el de la clase 'whatyoubelievedyoucouldnot.Thread'. ¿Qué tal si queremos un hilo de los 'verdaderos'? package whatyoubelievedyoucouldnot; Igual, se cualifica la clase completamente para diferenciarla de la actual. Hemos visto verdaderas obras del desastre y la confusión, supongo que si todo el código que hiciéramos fuera así, nadie se atrevería a ser programador. Aunque se ven tantas cosas... Bien, y ¿qué pasa si hago una clase llamada Thread dentro de un paquete java.lang?, pues ese asunto ya toca con classloaders, el orden en que se cargan las clases, etc. algo para probar en casa y con lo que no me quiero meter. Posted at 02:28PM jun 05, 2007 by Carlos Alexander Zuluaga in Java | Comentarios[2]
lunes may 28, 2007
SCJP for JSE5 - 7 1. Variables locales y modificadores de acceso 2. Otras consideraciones para el modificador final - Las clases final no pueden ser heredadas. - synchronized: este modificador solo aplica para los métodos. Un método sincronizado solo puede ser ejecutado por un hilo a la vez, esto se verá más adelante cuando se trate el tema de concurrencia. - native: este modificador solo aplica para los métodos. Un método nativo es implementando normalmente en otro lenguaje para cada plataforma y en la clase solo se declara (como un método abstracto). - strictfp: aplica para clases y métodos. Una clase o método marcada como strictfp se adhiere al estándar IEEE 754, no es necesario profundizar más (solo si se tiene curiosidad). - transient: solo aplica para atributos de instancia. Los atributos marcados como transient son ignorados cuando se serializa una clase (tema tratado más adelante). - volatile: solo aplica para atributos de instancia. Es un modificador utilizado cuando se trabaja con hilos, e indica a la máquina virtual que siempre acceda a una copia de la variable. Esto es complejo y se tratará junto con todo el tema de concurrencia. 4. Combinaciones entre modificadores
Por ejemplo el modificador synchronized no se puede usar con abstract. Los modificadores (que no son de acceso) que se pueden usar con atributos de instancia son: final, transient y volatile. Esta es la tabla para combinarlos:
5. Métodos con argumentos variables void hacerCosas(int otroArgumento, String... valores){} 6. Declaración de constructores public class Perro(){ 7. Declaración de variables De Referencia. Se declaran igual que las primitivas pero estas apuntan hacia objetos. 8. Variables de instancia 9. Variables locales void hacerAlgoBienBacano(){ 10. Declaración de arreglos 11. Variables y métodos static 12. Declaración de enums enum Animales{PERRO, GATO, MARRANITO, POLLITO}; Con esta simple declaración la variable miMascota solo podrá tener valores que estén declarados detro del enum Animales. Los enums se comportan de forma muy similar a las clases, es decir, solo pueden usar los modificadores de acceso por defecto (cuando no se digita nada) y public, cuando son públicos el nombre del enum debe ser el mismo del archivo que lo contiene. También pueden declararse dentro de clases (como las clases internas) e interactuar con los modificadores public, private, protected, static y strictfp. No pueden llevar los modificadores transient, volatile, synchronized ni abstract. Los enums pueden tener constructores, variables de instancia, métodos y 'constant specific class body' (no me atrevo a traducirlo!). Todo se entiende mejor con un ejemplo. enum TipoPollo { public String getPresa(){ Dada la anterior lista enumerada, podemos invocarla desde otra clase y ejecutar el siguiente método main(): public static void main(String[] args) { Ahora supongamos que el pollo frito viene en alas, el resto en muslos; se podría hacer empezar a preguntar por el tipo de presa (if (this.equals(FRITO)) return "ALA"; else return "MUSLO";)) o sobreescribir el método getPresa() del valor FRITO: enum TipoPollo { Así, al ejecutar el método main(): public static void main(String[] args) { La salida sería: El pollo está FRITO Algunas conclusiones: El Final Si hay errores en este texto, los anteriores o las preguntas, por favor escribirlo en los comentarios. Un saludo. Posted at 11:00PM may 28, 2007 by Carlos Alexander Zuluaga in Java | Comentarios[4]
domingo may 27, 2007
SCJP for JSE5 - 6 Acabo de crear una página donde reúno todos los recursos que voy encontrando con material para la certificación. La página completa: http://sprogramando.wikidot.com/scjp-for-jse5. Las preguntas: http://sprogramando.wikidot.com/preguntas-scjp-for-jse5-preguntas. Pues nada, esperemos a ver como funciona esto. Posted at 11:26PM may 27, 2007 by Carlos Alexander Zuluaga in Java |
sábado may 26, 2007
SCJP for JSE5 - 5 1. DECLARACIÓN DE MÉTODOS Y ATRIBUTOS (MIEMBROS) package uno; package dos; En este caso no importan los modificadores de acceso de los miembros de la clase Servidor, por tener esta el tipo de acceso por defecto (default), la clase Cliente nunca podrá acceder a sus atributos o métodos, a menos claro, que se modifiquen para pertenecer al mismo paquete. Una clase solo puede invocar los métodos o ver los valores de los atributos de otra, cuando ésta última es pública o se encuentran en el mismo paquete, ahí si empiezan a aplicar los modificadores de acceso de los miembros. Miembros public package utilidades; package operaciones; Miembros private package utilidades; |