AUTORES JUAN CARLOS GUEVARA BOLAOS Y LUIS FELIPE WANUMEN SILVA GRUPO DE INVESTIGACION METIS LINEA DE INGENIERIA DE SOFTWARE
ENFOQUE PRCTICO DE MODELAMIENTO BASADO EN UML CON JAVA EN DONDE SE INCLUYEN ALGUNOS PATRONES DE DISENO.
UNIVERSIDAD DISTRITAL FRANCISCO JOSE DE CALDAS FACULTAD TECNOLGICA SISTEMATIZACIN DE DATOS BOGOT D.C. 2008
TABLA DE CONTENIDO
TABLA DE CONTENIDO.....................................................................................................2 1. EL CRONOGRAMA EN RUP...........................................................................................7 2.1. LAS FASES Y LOS FLUJOS DE RUP......................................................................8 2.2. FASE DE INICIACION EN RUP.............................................................................11 2.3. FASE DE ELABORACION EN RUP.......................................................................13 2.4. FASE DE CONSTRUCCION EN RUP....................................................................15 2.5. FLUJO DE TRANSICION EN RUP.........................................................................16 2. CONSIDERACIONES AL REALIZAR SU PROYECTO DE GRADO.........................27 2.1. CONSIDERACIONES SOBRE LAS PALABRAS QUE DEBE INCLUIR EL DOCUMENTO DE GRADO O PROYECTO DE SOFTWARE.....................................27 2.2. SOBRE LA INTRODUCCION DE LA TESIS.........................................................28 2.2. SOBRE EL TITULO DE LA TESIS.........................................................................29 2.3. PLANTEAR OBJETIVOS GENERALES Y ESPECIFICOS...................................29 2.4. OTRAS COSAS SOBRE LOS OBJETIVOS ESPECIFICOS..................................31 2.5. CUIDADOS AL PLANTEAR EL ALCANCE DEL PROYECTO..........................32 2.6. COSAS HA TENER EN CUENTA EN EL PLANTEAMIENTO DEL PROBLEMA ...........................................................................................................................................33 EJEMPLO DESGLOSADO DE DESCRIPCION DEL PROBLEMA............................36 2.7. COSAS SOBRE LAS DELIMITACIONES..............................................................38 2.8. SOBRE EL ALCANCE Y LAS DELIMITACIONES..............................................38 2.9. COSAS SOBRE EL RIESGO....................................................................................38 2.10. COSAS HA TENER EN CUENTA SOBRE EL MARCO HISTORICO...............39 2.11. COSAS SOBRE EL MARCO CONCEPTUAL......................................................39 2.12. COSAS SOBRE EL MARCO REFERENCIAL.....................................................39 2.13. COSAS SOBRE LOS COSTOS DEL PROYECTO...............................................39 2.14. COSAS SOBRE LA FACTIBILIDAD OPERATIVA DEL PROYECTO.............40 2.15. COSAS SOBRE LA METODOLOGIA..................................................................40 2.16. COSAS HA TENER EN CUENTA EN EL MODELAMIENTO...........................40 2.17. TALLER PROPUESTO PARA MEJORAR LA FASE DE PLANEACION DEL PROYECTO......................................................................................................................41 2.18. TALLER PROPUESTO PARA PENSAR EN OBJETOS......................................44 3. GENERALIDADES DE UML.........................................................................................45 3.1. DIAGRAMAS DE CASOS DE USO........................................................................45 3.2. DIAGRAMAS DE ACTIVIDADES.........................................................................45 3.3. DIAGRAMAS DE CLASES.....................................................................................45 3.4. DIAGRAMAS DE INTERACCION.........................................................................45 3.5. DIAGRAMAS DE ESTADO....................................................................................46 3.6. DIAGRAMAS DE COMPONENTES.......................................................................46 3.7. DIAGRAMAS DE DESPLIEGUE............................................................................46 4. MODELANDO CON UML..............................................................................................46
4.1. MODELAMIENTO DEL DOMINIO DEL PROBLEMA........................................47 4.2. MODELAMIENTO DE LA SOLUCION DEL PROBLEMA..................................47 4.3. MODELAMIENTO DE LA CODIFICACION DEL PROBLEMA.........................47 5. MODELOS UML EN LOS FLUJOS DE TRABAJO RUP.............................................48 5.1. DIAGRAMAS USADOS EN EL FLUJO DE MODELADO DEL NEGOCIO.......49 5.2. DIAGRAMAS USADOS EN EL FLUJO DE TRABAJO REQUERIMIENTOS....50 5.3. DIAGRAMAS USADOS EN EL FLUJO DE TRABAJO ANALISIS Y DISENO. 50 5.4. DIAGRAMAS USADOS EN EL FLUJO DE TRABAJO IMPLEMENTACION...52 5.5. DIAGRAMAS USADOS EN EL FLUJO DE TRABAJO DESPLIEGUE...............53 5.6. DIAGRAMAS USADOS EN EL FLUJO DE TRABAJO PRUEBAS.....................54 6. EL LENGUAJE OCL.......................................................................................................57 6.1. OCL Y MOF..............................................................................................................57 6.2. UML Y OCL..............................................................................................................57 6.3. EVOLUCION DE OCL.............................................................................................58 6.4. COSAS QUE SE PUEDEN HACER CON OCL......................................................58 6.5. OCL Y LOS REQUISITOS.......................................................................................58 6.6. CONCLUSIONES SOBRE OCL..............................................................................59 6.7. BIBLIOGRAFIA SOBRE OCL.................................................................................59 7. SOBRE LOS CASOS DE USO EN UML 2.0..................................................................61 7.1. IDENTIFICAR ACTORES Y CASOS DE USO......................................................61 7.2. TIPOS DE RELACIONES ENTRE LOS CASOS DE USO.....................................63 7.3. IDENTIFICAR RELACIONES TIPO <<EXTENDS>>...........................................64 7.4. ERRORES COMUNES CON RELACIONES TIPO <<EXTENDS>>....................68 7.5. RELACIONES DE GENERALIZACION SIN ESTEREOTIPO..............................70 7.6. IDENTIFICAR RELACIONES TIPO <<USES>> O <<INCLUDE>>....................75 7.7. EJEMPLO DE RELACION TIPO <<USES>> O <<INCLUDE>>.........................77 7.8. CASO ESPECIAL DE RELACION TIPO <<USES>> O <<INCLUDE>>............78 7.9. DOCUMENTACION DE CASOS DE USO.............................................................79 8. MODELAMIENTO UML Y SU IMPLEMENTACIN EN JAVA................................86 8.1. DEFINICIN DE RELACIONES.............................................................................86 8.2. GENERALIZACIN VS HERENCIA....................................................................87 8.3. EL ACCESO PRIVADO...........................................................................................88 8.4. EL ACCESO PROTECTED......................................................................................90 8.5. ACCESO A LOS ATRIBUTOS: PRIVATE, PROTECTED O PUBLIC.................91 8.6. ASOCIACIONES......................................................................................................92 8.7. LAS AGREGACIONES............................................................................................93 8.8. RELACIONES DE DEPENDENCIA........................................................................96 8.9. HERENCIA MLTIPLE EN JAVA.........................................................................97 9. ESTEREOTIPOS DE LAS CLASES EN UML 2.0.........................................................98 9.1. LAS CLASES CON ESTEREOTIPO VIEW............................................................98 9.2. LAS CLASES CON ESTEREOTIPO TABLE..........................................................98 9.3. LAS CLASES CON ESTEREOTIPO SERVICE......................................................99 9.4. LAS CLASES CON ESTEREOTIPO RESOURCE..................................................99 9.5. OTROS ESTEREOTIPOS DE CLASES.................................................................100 10. P.O.O. EN JAVA Y CLASES ABSTRACTAS...........................................................104 10.1. LAS CLASES ABSTRACTAS.............................................................................104 10.2. CASO 1: SOBRE LAS CLASES ABSTRACTAS...............................................105
10.3. CASO 2: SOBRE LAS CLASES ABSTRACTAS................................................105 10.4. CASO 3: SOBRE LAS CLASES ABSTRACTAS................................................106 10.5. CASO 4: SOBRE LAS CLASES ABSTRACTAS................................................107 10.6. CASO 5: SOBRE LAS CLASES ABSTRACTAS................................................108 10.7. CASO 6: SOBRE LAS CLASES ABSTRACTAS................................................109 10.8. CASO 7: SOBRE LAS CLASES ABSTRACTAS................................................111 10.9. CASO 8: SOBRE LAS CLASES ABSTRACTAS................................................112 11. P.O.O. EN JAVA Y LAS INTERFACES.....................................................................113 11.1. LAS INTERFACES DEBEN INICIALIZAR SUS ATRIBUTOS........................114 11.2. EN LAS INTERFACES NO ES OBLIGATORIO MODIFICADORES DE ATRIBUTOS..................................................................................................................115 11.3. EL MODIFICADOR DE ATRIBUTO POR DEFECTO ES PUBLIC EN LAS INTEFACES...................................................................................................................115 11.4. EL MODIFICADOR DE ATRIBUTO PROTECTED NO ESTA PERMITIDO EN LAS INTERFACES........................................................................................................115 11.5. EL MODIFICADOR DE ATRIBUTO PRIVATE NO ESTA PERMITIDO EN LAS INTERFACES........................................................................................................116 11.6. UNA INTERFAZ NO PUEDE SER INSTANCIADA DIRECTAMENTE.........116 11.7. UNA CLASE NO INTERFAZ PUEDE IMPLEMENTAR UNA CLASE INTERFAZ.....................................................................................................................117 11.8. UNA CLASE INTERFAZ NO PUEDE IMPLEMENTAR UNA CLASE INTERFAZ.....................................................................................................................118 11.9. UNA CLASE INTERFAZ PUEDE EXTENDER DE UNA CLASE INTERFAZ .........................................................................................................................................120 11.10. UNA CLASE NO INTERFAZ PUEDE IMPLEMENTAR VARIAS CLASES TIPO INTERFAZ............................................................................................................121 11.11. UNA CLASE INTERFAZ PUEDE EXTENDER DE VARIAS CLASES TIPO INTERFAZ.....................................................................................................................122 11.12. UNA CLASE NO INTERFAZ NO PUEDE EXTENDER DE UNA CLASE TIPO INTERFAZ.....................................................................................................................123 11.13. NO SE PUDE MODIFICAR VARIABLE DE UNA CLASE TIPO INTERFAZ .........................................................................................................................................125 11.14. CLASE QUE IMPLEMENTE CLASE TIPO INTERFAZ DEBE DEFINIR SUS MTODOS.....................................................................................................................127 12. TODO A CERCA DE CLASES...................................................................................129 12.1. TIPOS DE CLASES..............................................................................................130 12.2. VARIABLES Y METODOS DE INSTANCIA....................................................130 12.3. AMBITO DE UNA VARIABLE...........................................................................131 12.4. METODOS Y CONSTRUCTORES......................................................................131 12.5. FINALIZADORES................................................................................................132 12.6. ALCANCE DE OBJETOS Y RECICLADO DE MEMORIA..............................132 13. EJERCICIO DEL PIRATA RESULADO DE LA PRIMERA ITERACION CON RUP .............................................................................................................................................134 13.1. PLANTEAMIENTO DEL ENUNCIADO............................................................134 13.2. ESTABLECIMIENTO DE FRASES IMPORTANTES........................................134 13.3. ESTABLECIMIENDO DE CLASES....................................................................135 13.4. PROGRAMA EN JAVA........................................................................................136
13.5. EJECUCIN DEL PROGRAMA:........................................................................141 14. EJERCICIO DEL AVION............................................................................................144 14.1. DIAGRAMA DE CLASE......................................................................................144 14.2. EXPLICACIN DE LA IMPLEMENTACIN...................................................145 14.3. EJECUCIN DEL PROGRAMA..........................................................................155 15. LA CLONACION DE OBJETOS................................................................................157 15.1. COPIA DE OBJETOS LIMITADA.......................................................................157 15.2. COPIAR OBJETOS CON INTERFAZ CLONEABLE........................................166 15.3. LA INTERFAZ CLONEABLE ABARCA SUBOBJETOS..................................169 16. CLASES TIPO OBSERVER Y OBSERVABLE.........................................................174 16.1. ESTRUCTURA DE LAS CLASES OBSERVABLES.........................................174 16.2. ESTRUCTURA DE LAS CLASES OBSERVER.................................................175 16.3. CREACION DE OBJETOS DE TIPO OBSERVER Y OBSERVABLE..............175 16.4. VINCULACION DEL OBJETO OBSERVABLE AL OBJETO OBSERVER....176 16.5. UN EJEMPLO COMPLETO CON OBSERVER Y OBSERVABLE..................176 16.6. PREGUNTAS SOBRE OBSERVER Y OBSERVABLE.....................................179 17. COMO DELEGAR CLASES.......................................................................................181 17.1. PLANTEAMIENTO TEORICO DE LA DELEGACION....................................181 17.2. EJERCICIO PRCTICO SOBRE DELEGACION..............................................184 17.3. PREGUNTAS SOBRE DELEGACION................................................................186 18. SERIALIZACION DE OBJETOS................................................................................187 18.1. SERIALIZAR UN OBJETO COMPLETAMENTE.............................................187 18.2. SERIALIZAR UN OBJETO COMPLETAMENTE EN JAVA............................189 18.3. ATRIBUTOS TRANSIENTES EN LA SERIALIZACION................................194 18.4. LA SERIALIZACION Y EL DIAGRAMA DE ESTADOS................................198 18.4. TALLER PROPUESTO SOBRE SERIALIZACION...........................................201 19. EJERCICIOS QUE TIENEN DIAGRAMAS DE SECUENCIA.................................206 19.1. MODELAMIENTO DE DETENCION SINCRONICA DE MULTIPLES HILOS CON UN EJEMPLO.......................................................................................................206 19.2. IMPLEMENTACION DE DETENCION SINCRONICA DE MULTIPLES HILOS CON UN EJEMPLO.......................................................................................................218 20. INTRODUCCION A LOS PATRONES DE SOFTWARE.........................................224 20.1. PATRONES CON FUNCIONALIDAD DE CREACIN....................................224 20.2. PATRONES CON FUNCIONALIDAD ESTRUCTURAL..................................224 20.3. PATRONES CON FUNCIONALIDAD DE COMPORTAMIENTO..................224 21. EXPLICACION DETALLADA DE LOS PATRONES..............................................224 21.1. EJEMPLO PRCTICO DE APLICACIN DE FACTORY................................224 21.2. EJEMPLO MAS ELABORADO USANDO FACTORY......................................228 22. PATRON DE CREACION SINGLETON....................................................................231 22.1. PARTE TEORICA DEL PATRON SINGLETON................................................231 22.2. PARTE PRACTICA DEL PATRON SINGLETON.............................................232 22.3. OBSERVACIONES AL EJERCICIO DE SINGLETON......................................233 23. SOBRE LA CALIDAD DEL SOFTWARE.................................................................235 23.1. MODELOS DE CALIDAD...................................................................................235 22.2. MODELO SPICE...................................................................................................238 23.3. NORMA ISO 9000-2000.......................................................................................239 23.4. NORMA ISO 90003..............................................................................................239
23.5. NORMA ISO/IEC TR 15504.................................................................................239 23.6. ESTANDAR ISO 9126..........................................................................................240 23.7. MODELOS CMMI................................................................................................241 23.8. TALLER PROPUESTO DE CALIDAD...............................................................243 24. LOS SISTEMAS DE CONTROL DE VERSIONES...................................................244 24.1. LOS CVS Y EL PROCESO DE DESARROLLO UNIFICADO..........................244 24.2. LA GESTION DE CONFIGURACIONES Y LOS CVS......................................245 24.2. CONTENIDO DE LA UNIDAD...........................................................................245 24.3. CONCRETANDO LO QUE ES UN CVS.............................................................246 24.4. TIPOS DE SISTEMAS DE CONTROL DE VERSIONES..................................246 24.5. LOS CVS Y LA INGENIERA DE SOFTWARE................................................247 24.6. SISTEMAS PARA GESTIONAR LOS CVS........................................................248 24.7. OTROS SISTEMAS QUE APOYAN A LOS CVS..............................................249 24.8. CARACTERISTICAS QUE DEBE TENER UN BUEN CONTROL DE VERSIONES...................................................................................................................249 24.9. EL FUTURO DE LOS CVS..................................................................................251 24.10. CONCLUSIONES SOBRE LOS CVS................................................................251 24.11. BIBLIOGRAFIA DE LA UNIDAD....................................................................252 24.12. INFOGRAFIA DE LA UNIDAD........................................................................253 25. BIBLIOGRAFIA...........................................................................................................256 25.1. BIBLIOGRAFIA SOBRE PROCESOS DE DESARROLLO Y RUP..................256 25.2. BIBLIOGRAFIA SOBRE MODELAMIENTO CON UML.................................256 25.3. BIBLIOGRAFIA SOBRE IMPLEMENTACIONES CON UML.........................257
1. EL CRONOGRAMA EN RUP
Una de las preocupaciones de los estudiantes de Ciencias Tecnolgicas e Ingenieras relacionadas con la Informtica es el hecho de hacer buenos cronogramas en sus proyectos de desarrollos informticos. Estos cronogramas deben ser acordes con las metodologas. En esta seccin se muestra a continuacin el diagrama que aparece en todos los documentos que hablan de RUP y con base en el se planteara como deducir un posible cronograma que tenga algo de coherencia con dicho diagrama. Para comenzar veamos primero el diagrama que aparece siempre y en todo documento de RUP:
D Diagrama tomado de unas diapositivas elaboradas por Maria Fernanda Diaz y Margarita Cardozo Galvis.
Diagrama tomado del libro El lenguaje Unificado de Modelado. Addison Wesley Iberoamericana, Madrid, 1999. ISBN: 84-7829-028-1. Pag 29. Con lo cual podemos ver que a pesar de lo diferentes que parecen los dos anteriores diagramas, en realidad muestran lo mismo. Y muestran que en RUP existen dos tipos de flujos, tal como se muestra a continuacin: FLUJOS DE RUP
Los flujos de trabajo de proceso son los flujos que se documentan y se acostumbran a presentar con diversos diagramas para documentar un sistema y en muchas Universidades colombianas se acostumbra a entregar solamente esta parte documentada como constancia del proceso de Ingeniera de Software aplicado al desarrollo del proyecto. Podramos pensar en la siguiente analoga: Las labores de un docente universitario son: 1. Dictar clases 2. Participar en proyectos institucionales 3. Investigar 4. Preparar clase 5. Atender estudiantes 6. Orientar pasantias y tesis 7. Participar en comits institucionales 8. Apoyar actividades de extensin de la universidad 9. Sacar tiempo para escribir sus materiales de clase. 10. Sacar tiempo para comer y alimentarse bien. 11. Sacarle tiempo a la familia y al descanso. 12. Analizar sus experiencias docentes vividas para mejorar en algunos aspectos. Claro, al amigo lector / estudiante, se estar preguntando: Cmo es que sacarle tiempo para comer y alimentarse bien es una de las labores de un docente?: La respuesta es sencilla y se puede responder con otra pregunta: Qu pasa si el docente no se alimenta, podr continuar con su labor como docente durante mucho tiempo, no se ver afectado su desarrollo profesional?. La respuesta es: Se requiere que el docente ejecute estas tareas para tener un buen desempeo laboral. Pues bien, en este caso esta tarea es una labor que no es tan necesario documentar, pero que si es necesario ejecutar para que se puedan dar las otras labores. Tenemos pues una subclasificacin de actividades de soporte, tal como muestra el siguiente diagrama: FLUJOS DE RUP
Pues bien, segn lo explicado anteriormente, los flujos de soporte deben ejecutarse, para que se puedan ejecutar los flujos de proceso. La pregunta que viene es: Se pueden ejecutar mal los flujos de soporte?. Se puede un docente alimentar mal?. La respuesta es: Lo puede hacer, pero esto poco a poco deteriorara el rendimiento del profesional como docente. En pocas palabras, estamos diciendo que un flujo de soporte ayuda para que los flujos de proceso se realicen bien o mal, dependiendo la forma como se realicen los flujos de soporte Para explicar otro concepto importante, seguiremos con nuestra analoga: Es posible que un docente dicte sus clases sin elaborar sus propios materiales de clase?. La respuesta es: Si, no es necesario que se hagan materiales de clase, se pueden usar las guias elaboradas por otros autores. Viene entonces la otra pregunta: Si se llegase a realizar algn material de clase por parte del docente, este material servira como documentacin del proceso de enseanza?. La respuesta es Si. Otra pregunta es: El realizar manuales de clase por parte del docente no mejorara el dominio que tiene el docente sobre la materia y no mejorara el proceso enseanza-aprendizaje?. La respuesta es Claro que si porque mejorara la calidad del proceso. Entonces tenemos que los flujos de soporte son muy tiles para medir la calidad de los flujos de proceso. En pocas palabras los flujos de modelado del negocio, requisitos, anlisis, diseo, implementacin, pruebas y despliegue son de buena calidad cuando se les realiza una buena gestin de configuracin, gestin de proyecto y se tienen en cuenta metodolgicamente las variables de ambiente que intervienen en la elaboracin del sistema. El resumen de lo dicho anteriormente se puede esquematizar mediante el siguiente diagrama:
FLUJOS DE RUP
Los flujos de trabajo en RUP segn lo dicho hasta el momento estn clasificados en flujos de proceso y en flujos de soporte, en cada flujo de estos se encuentran ms subflujos que se resumen en la siguiente tabla: FLUJOS DE PROCESO Modelado del negocio Requisitos Anlisis y Diseo Implementacin Pruebas Despliegue FLUJOS DE SOPORTE Gestin del cambio y configuraciones Gestin del proyecto Entorno
De otra parte es interesante observar que las fases de RUP son las mostradas en el siguiente diagrama:
Iniciacin
pero destinando pocos recursos de tiempo, presupuestales y dems para este tipo de flujos en dicha fase, con lo cual elaboramos la siguiente tabla:
PORCENTAJE 9,00%
REQUERIMIENTOS
5,00%
AMBIENTE
2,00%
En donde queda claro que los flujos de anlisis y diseo e implementacin tienen una importancia pequea cuando se realizan dentro de la fase de iniciacin. En el ejemplo de la tabla anterior a estos flujos se les da una importancia de 1% a cada uno, e incluso se puede notar que a los flujos de test y despliegue se les da ninguna importancia. Para la elaboracin de la anterior grafica nos basamos en la observacin detallada de la parte que se seala con un cuadro grueso de color rojo en el siguiente dibujo:
REQUERIMIENTOS
4,00%
ANALISIS Y DISEO
5,00%
2,00% 2,00%
AMBIENTE
1,00%
En donde se puede verificar que los flujos de pruebas y de despliegue son los que menos importancia tienen en esta fase y por eso se les da una importancia de 1%, debido a que en la grafica anterior aparece muy delgada la linea, pero de todas formas aparece. De otra parte es importante ver que el flujo de diseo es el mas importante en la fase de elaboracin, razn por la cual se le da una importancia de 5, en tanto que a los flujos de requerimientos y modelado del negocio se le da una importancia de 4. Obviamente estos valores son una cuestin subjetiva, producto de observar el grafico y calcular al ojo un valor de importancia para cada flujo basado en el rea que se le alcanza a ver a cada flujo en cada fase (La cual en el grafico se ve como una montaa).
Podriamos pensar que un buen cronograma para la fase construccion acorde con el anterior diagrama es el siguiente:
ADMINISTRACION
3,00%
AMBIENTE
1,00%
En donde los valores de importancia son tomados en forma arbitraria, pero basndonos en las reas de las montaas del diagrama RUP en la fase de construccin.
TEST PRUEBAS
3,00%
DESPLIEGUE
11,00%
CONFIGURACION Y MANTENIMIENTO
5,00%
ADMINISTRACION
1,00%
La cual esta basada en la fase de transicin que esta sealada en el siguiente grafico de RUP, mediante un cuadro grueso de color rojo:
Y ahora bien, con todo lo expuesto hasta el momento creo que ha llegado el momento de comenzar a definir actividades para cada uno de los flujos expuestos en las anteriores tablas, de tal forma que el numero y el tipo de actividades asociadas a cada fase sean medianamente proporcionales a la importancia que hemos dado en las anteriores tablas. Para esto tenemos que comenzar por averiguar y hacer listados preliminares de las posibles actividades que pueden ir en cada flujo de trabajo y despus de realizar todo este trabajo, se puede decir que para nuestro cronograma propuesto tenemos que las actividades con los flujos correspondientes para cada una de las fases y colocndoles la duracin en das para cada flujo son las que se muestran a continuacin:
FASE .
NEGOCIOS Y MODELAMIENTO
ADMINISTRACION AMBIENTE
PORCENTAJE ACTIVIDAD Modelo de Dominio Establecimiento de viabilidad del sistema Establecimiento de factibilidad Tcnica del sistema Establecimiento de factibilidad Operativa del Sistema Establecimiento de factibilidad Legal del Sistema 9,00% Modelo de procesos Definicin de actores Lista preliminar de casos de uso Documentacin de las excepciones de los casos de uso Documentacin de descripcin de casos de uso Depuracin de los casos de uso 5,00% Modelo de casos de Uso 1,00% Lista preliminar de clases 1,00% Definicin de las caractersticas de la herramienta 0,00% 0,00% Creacin de casos de uso de prueba 2,00% Montaje de un servidor de pruebas Administracin del personal Administracin de recursos 2,00% Administracin de recursos de computo 2,00% Adquisicin del espacio de trabajo
DIAS
27
15 3 3 0 0 6
6 6
FASE .
FLUJOS DE TRABAJO
NEGOCIOS Y MODELAMIENTO
REQUERIMIENTOS
FASE DE ELABORACION 22% ANALISIS Y DISEO IMPLEMENTACION TEST PRUEBAS DESPLIEGUE CONFIGURACION Y MANTENIMIENTO ADMINISTRACION AMBIENTE
PORCENTAJE ACTIVIDAD Depuracin del Modelo De Dominio Depuracin del modelo de procesos 4,00% Diagnostico de viabilidad del sistema Depuracin de actividades de los actores Depuracin de requerimientos funcionales Depuracin de requerimientos no funcionales Documentacin de casos de uso Depuracin de la lista de casos de uso 4,00% Depuracin del diagrama final de casos de uso Elaboracin del Diagrama de secuencia Elaboracin del Diagrama de colaboracin Elaboracin del diagrama de estados Elaboracin de diagrama de actividad 5,00% Diagrama de actividades 2,00% Elaboracin del diagrama de componentes inicial Creacin de clases de prueba 1,00% Pruebas basadas en objetos 1,00% Elaboracin del diagrama de despliegue inicial Creacin de casos de uso de prueba 2,00% Montaje de un servidor de pruebas Administracin del personal Administracin de recursos 2,00% Administracin de recursos de computo 1,00% Adquisicin del espacio de trabajo
DIAS
12
12
15 6 3 3 6
6 3
FASE .
ANALISIS Y DISEO
PORCENTAJE ACTIVIDAD 2,00% Correccin de polticas con respecto a la misin y visin 2,00% Depuracin de casos de uso extendido Elaboracin de diagramas de clase final Elaboracin de diagramas de actividad finales Elaboracin de diagramas de secuencia finales Elaboracin de diagramas de colaboracin finales 4,00% Elaboracin de diagramas de estado finales 10,00% Elaboracin de diagrama de componentes final 2,00% Pruebas basadas en escenarios 1,00% Elaboracin de diagrama de despliegue final Establecimiento de un modelo de pruebas Montaje de un servidor de pruebas Montaje de un servidor de control de escenarios Montaje de un servidor de control de versiones de software Pruebas del servidor CVS Montaje de un servidor de subversiones 5,00% Montaje de un servidor de pruebas Administracin del personal Administracin de recursos 3,00% Administracin de recursos de computo 1,00% Mejoras locativas a la estructura fsica de trabajo
DIAS 6 6
12 30 6 3
15
9 3
FASE .
IMPLEMENTACION
TEST PRUEBAS
DESPLIEGUE
CONFIGURACION Y MANTENIMIENTO
ADMINISTRACION
PORCENTAJE ACTIVIDAD 0,00% 1,00% Depuracin de casos de uso extendido Depuracin del modelo de anlisis y colocacin de etiquetas 1,00% OCL Creacin de mdulos de interfaz de usuario Creacin de mdulos de lgica del negocio 4,00% Creacin de mdulos de acceso a datos Pruebas basadas en escenarios Pruebas unitarias de clase Pruebas de acoplamiento Pruebas de cohesin 3,00% Pruebas de concurrencia Empaquetamiento de componentes de lgica de aplicacin Empaquetamiento de componentes de acceso a datos 11,00% Empaquetamiento de componentes de interfaz grafica Distribucin de paquetes en los distintos nodos Establecimiento de un modelo de pruebas Montaje de un servidor de pruebas Montaje de un servidor de control de escenarios Montaje de un servidor de control de versiones de software Pruebas del servidor CVS 5,00% Montaje de un servidor de subversiones Montaje de un servidor de pruebas Administracin del personal Administracin de recursos 1,00% Administracin de recursos de computo
DIAS 0 3 3
12
33
15
Observe amigo lector / estudiante que hay flujos que son transversales a todas las fases y tienen mas o menos la misma duracin en todas las fases y lo mas interesante del asunto es que dichos flujos son precisamente los flujos de soporte que estbamos mencionando al comienzo de esta seccin. PREGUNTAS QUE VERIFICAN LO APRENDIDO 1. Cual de las siguientes afirmaciones son FALSAS (Si es que hay varias falsas): a. El cronograma es independiente de la metodologa usada. b. El cronograma en RUP, esta compuesto por los flujos de iniciacin, elaboracin, construccin y transicin. c. En la fase de elaboracin el flujo de implementacin es el ms importante. d. En la fase de elaboracin el flujo de anlisis y diseo es el ms importante. e. No todas las afirmaciones anteriores son falsas f. todas las afirmaciones de la a) a la e) son falsas g. todas las afirmaciones de la a) a la e) son verdaderas. 2. Cual de las siguientes afirmaciones son FALSAS (Si es que hay varias falsas): a. La gestin del proyecto es un flujo de proceso que se debe tener en cuenta nicamente durante las fases de inicio y elaboracin b. Una primera clasificacin de los flujos en RUP es: Flujos de proceso y flujos de soporte. c. La forma en que se realicen los flujos de soporte es decisoria a la hora de observar la calidad con la que se presentan los flujos de proceso. 3. Cual de las siguientes afirmaciones son FALSAS (Si es que hay varias falsas): a. Los dos flujos de anlisis y diseo mostrados en el diagrama de RUP clsico son dos flujos que hacen parte de los flujos de proceso y que se toman separadamente en dicho diagrama con el animo de resaltar que una cosa es el anlisis y otra el diseo. 4. Para el caso de las afirmaciones que son falsas en el anterior cuestionario amigo lector / estudiante escriba la razn por la que son falsas mediante la elaboracin de una afirmacin que sea verdadera y que controvierta la afirmacin falsa. A parte de la construccin de esta afirmacin se debe hacer una composicin de una justificacin que respalde dicha afirmacin. (Este punto vale lo mismo que todos los anteriores puntos reunidos, es decir este punto es medio parcial si lo contesta bien y si no lo contesta bien es medio parcial que haz perdido. Tambin es el nico punto que se califica por respuesta completa y conjunta bien contestada junto con la justificacin y la afirmacin que el lector / estudiante componga). Recordad que una pregunta o se responde bien o se responde mal, porque decir que una pregunta tiene dos falsas, cuando en realidad tiene tres falsas es no acertar con la respuesta. De otra parte decir que algo es falso cuando lo es, pero dar una justificacin errnea bien sea falsa o cierta de la afirmacin es no acertar con la respuesta a la pregunta. RESPUESTAS A PREGUNTAS DE LA SECCION
1. Las afirmaciones A, B, C, F y G son falsas 2. La afirmacin A es falsa 3. La afirmacin A es falsa 4. La justificacin de las afirmaciones falsas son: Afirmacin 1A El cronograma es independiente de la metodologa usada Respuesta: El cronograma es DEPENDIENTE de la metodologa usada Justificacin: Es falsa porque de acuerdo a la metodologa se plantea el cronograma, por ejemplo si la metodologa es una metodologa basada en las pruebas como en el caso de la metodologa XP, se tienen que hacer en todo momento pruebas de todo y para el caso de RUP, una metodologa que le da gran importancia a los requerimientos, vemos pues que aun cuando el proyecto a avanzado se deja la posibilidad que se sigan haciendo revisiones y ajustes a los requerimientos con el animo de lograr en la mejor medida que al sistema se le puedan corregir errores antes de tener el producto final. De otra parte las metodologas lineales deben reflejar esta linealidad en los cronogramas, en tanto que las metodologas iterativas como RUP, deben reflejar esta iteratividad en el cronograma. Afirmacin 1B El cronograma en RUP, esta compuesto por los flujos de iniciacin, elaboracin, construccin y transicin. Respuesta: El cronograma en RUP, NO esta compuesto por los flujos de iniciacin, elaboracin, construccin y transicin. Justificacin: Iniciacin, elaboracin, construccin y transicin son fases y no flujos en RUP. Afirmacin 1C En la fase de elaboracin el flujo de implementacin es el ms importante. Respuesta: En la fase de elaboracin el flujo de implementacin NO es el ms importante. Justificacin: En la fase de elaboracin el flujo de anlisis y diseo es el ms importante. Afirmacin 1F Todas las afirmaciones de la a) a la e) son falsas. Respuesta: Las afirmaciones A, B, C, F y G son falsas. Justificacin: En la fase de elaboracin el flujo de anlisis y diseo es el ms importante y esta afirmacin esta en el numeral D, con lo cual todas las afirmaciones de la a) a la e) no son falsas.
Afirmacin 2A: La gestin del proyecto es un flujo de proceso que se debe tener en cuenta nicamente durante las fases de inicio y elaboracin Respuesta: La gestin del proyecto es un flujo de SOPORTE que no solamente se debe tener en cuenta en las fases de inicio y elaboracin Justificacin: La gestin del proyecto no es un flujo de proceso, sino un flujo de soporte. El flujo de gestin del proyecto hace parte de una de las mejores practicas en forma implcita (en forma implcita, ya que las mejores practicas son: Administracin de requerimientos, desarrollo iterativo, modelamiento visual, verificacin de la calidad, arquitecturas con componentes y control de cambios) y algunas de estas mejores 6 practicas estn presentes en la gestin de un proyecto. Afirmacin 3A: Los dos flujos de anlisis y diseo mostrados en el diagrama de RUP clsico son dos flujos que hacen parte de los flujos de proceso y que se toman separadamente en dicho diagrama con el animo de resaltar que una cosa es el anlisis y otra el diseo Respuesta: Los dos flujos de anlisis y diseo mostrados en el diagrama de RUP clsico son UN solo flujo que hace parte de los flujos de proceso y que se toman conjuntamente para efectos del diagrama de resumen de la metodologa RUP Justificacin: El flujo se llama: Flujo de anlisis y diseo y es que sean dos flujos por separado. Esta afirmacin se puede corroborar observando detenidamente los diagramas que simplifican la explicacin de la metodologa RUP.
Palabra o frase que hay que sacar de una Para mi tesis Razn por la que se debe sacar Recuerde que el pensamiento individual o personal (experimental) no tiene validez La siguiente frase queda un poco mejor en Podemos encontrar que.. la tesis Palabra o frase que hay que sacar de una Lo dijo fulanito o sutangano tesis Razn por la que se debe sacar El hecho que lo halla dicho alguien muy importante no quiere decir que sea la verdad, cuantas veces al mejor panadero se le quema el pan. La siguiente frase queda un poco mejor en Los siguientes autores coinciden en la tesis afirmar que
FORMA DE
OBJETIVO Construir el sistema Aunque es posible medir el operativo mas pequeo. tamao del software por ejemplo usando las mtricas de cantidad de funciones, cantidad de lneas de cdigo, es bastante ambicioso este objetivo por cuanto es posible que salga en unos anos otras tecnologas que permitan construir sistemas operativos mas pequeos y en este momento se tendran problemas con el cumplimiento del objetivo. Construir el mejor sistema Es posible construir este operativo en cuento a objetivo y cumplirlo aunque seguridad de ingreso. con mucho esfuerzo, pero se corren muchos riesgos al plantear este objetivo y la razn es que la seguridad es un tema bastante espinoso que hasta el momento ninguna casa de software puede decir que no ha tenido problemas de seguridad, y si hasta el momento todos los fabricantes de software han tenido problemas con seguridad no es recomendable ser tan osado y atreverse a realizar afirmaciones como esta. Construir un sistema bonito No existen mtricas para medir lo bonito de un sistema.
COLOCAR EL OBJETIVO Construir un sistema operativo que respecto a los actuales este entre los 10 sistemas operativos mas pequeos del mundo.
Construir un sistema que permita la autenticacin basado en el estndar X para encriptacin de datos y usando el algoritmo Y como algoritmo de encriptacin de datos al momento de enviar datos hacia el servidor.
Construir un sistema No existen mtricas de agradable agradabilidad. Construir un sistema gil. Lo gil no solamente depende del programador o desarrollador del sistema, sino de la congestin de la red entre otros factores,
Construir un procesador de textos con una apariencia similar a la del procesador de textos Start Office. <<Este un objetivo mejorado, pero le falta mejorar mas>> Seria bueno suprimir este objetivo Construir un sistema que en condiciones normales de red permita realizar consultas a datos en menos de un minuto si la base de datos no ha
Desarrollar un sistema de registro de notas que permita agilizar los procesos de preinscripcin automtica de notas.
Desarrollar un sistema de consulta bibliotecaria Software educativo que permita mejorar el nivel de aprendizaje en java de los estudiantes y les permita aprobar los parciales propuestos por los profesores de sistematizacin de datos.
razn por la cual no es bueno colocar este objetivo que no solamente depende de los desarrolladores del sistema. El objetivo propuesto faltara todava depurarlo, pero tan solo se coloca para dar una idea de cmo enfocar el objetivo Es posible que el sistema permita agilizar los procesos de preinscripcin de notas, pero de ser esto lo que se quiere se debe tener en cuenta que el proceso como tal depende de otros factores y no del software en su totalidad. Esta bien, pero le falta mas cosas como en donde y que tipo de sistema va a ser. El software educativo es tan solo una herramienta que si es usada bien ayuda a mejorar los procesos de aprendizaje, pero en ningn caso reemplaza al docente.
alcanzado los 20000000 registros y la red tiene una velocidad promedio de 200 kb por segundo y no se presentan sistemas que interfieran con los puertos y servicios que usa el sistema en cada una de las maquinas. Colocar en alguna parte del documento algo que aclare que en condiciones normales de uso se cumplira, pero que el proceso se puede agilizar si existe la disposicin y las condiciones para que esto se de. Sistema intranet de consulta bibliotecaria en la Facultad Tecnolgica de la Universidad Distrital Desarrollar un material educativo computarizado que sirva de apoyo al proceso de enseanza de los principios de programacin orientada a objetos con Java.
ALGUNOS OBJETIVOS ESPECIFICOS SERAN Realizar un subsistema que permita la importacin y exportacin de documentos con el S.O. (Archivo) Desarrollar un subsistema que permita la manipulacin de texto al interior del documento presentando formas de tipo de letras y de fuentes diversas. = (Edicin) Desarrollar un subsistema que permita la visualizacin del documento en varias vistas incluyendo presentaciones personales y de impresin. RAZON DE LOS OBJETIVOS ESPECIFICOS Si usted observa las opciones principales que aparecen en la mayora de los editores de texto encuentra estas opciones. Osea que una forma de vislumbrar el asunto es observando aplicaciones que hagan cosas que usted esta haciendo en su proyecto de desarrollo de software, aunque no sean completamente iguales le darn una nocin de las opciones principales de men y de algunos de los objetivos del proyecto. Recuerde que hay algo de relacin con los subsistemas del proyecto, las opciones principales del men principal y los objetivos especficos, no se esta diciendo que las tres sean iguales, simplemente que hay algo de relacin. EJEMPLOS DE OBJETIVOS MAL REDACTADOS Disenar y desarrollar una base de datos. RAZON POR LA QUE ESTA MAL Las bases de datos son difciles de desarrollar porque ya estn desarrolladas a menos que uno la vaya a mejorar. CORRECTO. Disenar e implementar. EJEMPLOS DE OBJETIVOS MAL REDACTADOS Entender las necesidades de la organizacion RAZON POR LA QUE ESTA MAL Las necesidades son muy grandes y todas no se pueden abarcar. CORRECTO. Concretarlo mas.
Colombia.
la capacidad de otros mecanismo de clave y desarrolladores, cosa que nombre de usuario. nunca se puede hacer. El sistema usara cookies o sesiones para restringir el acceso a ciertos mdulos web.
Se sugiere que en los formatos de anteproyectos de grado no se quite esta parte de las limitaciones y alcance, por cuanto estos son importantes en la definicin del anteproyecto de grado.
EN
EL
No siempre lo que se ve como problema es un problema. Por ejemplo decir que: El problema es que mi pap lleva su contabilidad en un cuaderno, parece ser un problema, pero si vemos que los ingresos de mi padre no son muchos y como si fuera poco nadie le exige contabilidad y sus gastos ya no son artos por cuanto esta pensionado y sus hijos ya son independientes y como si fuera poco no tiene negocios, ni quiere tenerlos, diramos que lo que parecera ser un problema ya no lo es. Hay veces que los problemas no se dicen completos y esto hace que el problema no quede bien especificado. Por ejemplo el siguiente problema: El problema es que yo amo a Natalia Paris, puede ser entendido por algunos, pero otros no lo podrn comprender, pero si coloco el objetivo completo: El problema es que yo amo a Natalia Paris y ella no me ama, entonces vemos que el problema es bien claro. Y finalmente podemos decir que en el planteamiento del problema tenemos que las personas tienden a ver las soluciones a estos problemas de acuerdo a su rea de estudio y sus conocimientos y para comprender esto veamos la siguiente tabla: PROBLEMA PROFESION DEL QUE DIO LA SOLUCION. El seor Mario Silva Colocarle unas gafas. Oftalmlogo no ve bien por un ojo. SOLUCION LA SOLUCION NO SIEMPRE ES LA MEJOR Es posible que al colocarle gafas vea, pero la solucin ptima podra ser operarlo de la miopa, pero esta solucin no fue vista por cuanto el rea de conocimiento del que dio la solucin era un oftalmlogo que no sabia hacer operaciones de ojos.
Mi Padre tiene Desarrollar un Ingeniero problemas con su sistema contable para Sistemas contabilidad. las necesidades de mi Padre.
de A mi Padre no le gusta estar pegado a un computador y a duras penas usa Word cuando le toca y como si fuera poco sus contabilidades son pequeas y pueden caber perfectamente en una hoja de cuaderno. Y la razn del problema contable de mi Padre es que se le perdan las facturas, con lo cual la mejor solucin no era construir un sistema contable sino darle algunas nociones de archivstica y comprarle el legajador para que guarde sus facturas de las mesadas de su pensin. Es mas, usar el computador para sumar uno mas uno es mucha tecnologa, es como usar una escopeta para matar a una mosca.
Segn lo mostrado en el cuadro anterior queda el interrogante siguiente: Cmo hago para saber si algo es un problema que se puede solucionar con software?. Una de las formas para saber esto es haciendo uso de las cualidades de la informacin entre las que podemos encontrar: Veracidad Identidad Integridad Capacidad Seguridad Fiabilidad Confidencialidad Autenticacin No denegacin No repudiacin Accesibilidad
Si estas se llegan a ver afectadas muy seguramente es porque hay un problema de informacin y si el problema es de informacin muy posiblemente se puede atacar con la creacin de un sistema informtico. Si ninguna de estas caractersticas se ven afectadas es porque no es un problema que pueda ser solucionado por profesionales de la informacin, sino por otro tipo de profesionales, puede ser por mdicos, veamos un ejemplo de esto. PROBLEMA MAL SOLUCION PLANTEADO El problema es que Desarrollar un uso Excel para sistema informtico almacenar la en Access. informacin de 65536888888 clientes. CUALIDAD AFECTADA El problema no debe ser planteado como que se usa Excel, sino que en Excel la informacin para esta cantidad de registros no se guarda en forma segura, es mas ni siquiera se guarda. PLANTEAMIENTO MEJORADO PERO EN PROCESO El problema es que el sistema actual no permite almacenar en forma SEGURA la informacin de 65536888888 clientes.
Tambin hay que tener en cuenta hasta que punto el problema que al parecer es informtico no lo es, debido a factores no informatizables que afectan el problema. Por ejemplo. EJEMPLO DE PROBLEMA MAL PLANTEADO PLANTEMIENTO DEL PROBLEMA El problema es que la informacin se almacena no es veraz e integra. RAZON POR LA QUE EL PROBLEMA ESTA MAL PLANTEADO La razn es que la persona que lo almacena tiene problemas de digitacin por cuanto sus ojos y sus dedos presentan problemas. Vemos que el problema que parecera ser solucionable por medios informticos no puede ser solucionado debido a que las causales no son por mal funcionamiento del sistema en este aspecto. UN PLANTEAMIENTO NUEVO DEL PROBLEMA No es un problema para solucionar un profesional de la informtica. OTRO EJEMPLO DE PROBLEMA MAL PLANTEADO PLANTEMIENTO DEL PROBLEMA El problema es que la empresa no cuenta con un sistema de enseanza de las tablas de multiplicar. RAZON POR LA QUE EL PROBLEMA ESTA MAL PLANTEADO El planteamiento del problema debe dejar entrever que existen varias soluciones, y si segn el problema planteado la nica solucin es construir un sistema de enseanza de las tablas de multiplicar. Recordemos que en los problemas se tienen alternativas de solucin y la
forma como se defini el problema no da para construir alternativas de solucin. UN PLANTEAMIENTO NUEVO DEL PROBLEMA Los estudiantes solo tienen acceso a libros que muestran las tablas de multiplicar, pero por sus bajos recursos no cuentan con otros modelos pedaggicos que le permitan apropiarse del conocimiento de las tablas de multiplicar teniendo en cuenta que el modelo de libros solo es acorde con estudiantes que tienen psquicamente asociado un modelo repetitivo de aprendizaje, dejando por fuera a los que por su naturaleza tengan asociados otros modelos pedaggicos como el constructivista, el jerrquico, en didctico y el metdico. OTRO EJEMPLO DE PROBLEMA MAL PLANTEADO PLANTEMIENTO DEL PROBLEMA El problema es que la empresa usa Word para almacenar los datos RAZON POR LA QUE EL PROBLEMA ESTA MAL PLANTEADO Si el anterior problema es un problema tambin lo ser el siguiente: El problema es que la empresa usa Satara suit 4.5 para almacenar los datos. Pero, con seguridad este nuevo problema no es comprendido debido a que la herramienta Word es mas conocida por una mayora, mientras que Satara suit 4.5 no, con lo cual se tiene que si alguien desconoce Word no comprender el problema. Bueno, esto es una exageracin, pero muestra que el problema debe incluir la cantidad menor de tecnicismos posibles, obviamente hay momentos en los que es imposible quitarlos. UN PLANTEAMIENTO NUEVO DEL PROBLEMA El problema es que la empresa usa un procesador de textos que no tiene la capacidad para soportar el volumen de datos exigidos por la empresa. NOTA Se recomienda que en ningn formato de anteproyecto de grado se quite el planteamiento del problema. Se recomienda que en ningn formato de anteproyecto de grado se quiten las alternativas de solucin a los problemas.
Formulacion se puede hacer mediante una pregunta, lo dicen muchos textos de metodologa de la investigacin. Como hacer para que los que ejerzan las profesiones en las areas de salud tengan la formacin para hacerlo? Segn el formato de la Universidad. Por que debera resolverse? Porque si personas no calificadas ejercen cargos en reas de la salud, se pueden presentar altos riesgos para la atencin a los usuarios del sector de la salud.
-Que soluciones existen actualmente y por qu debera buscarse nuevas soluciones.
Una solucin es una ley que sali para controlar y vigilar el ejercicio ilegal de las profesiones y ocupaciones en el rea de la salud.. La situacin actual Actualmente el manejo de la informacin para la expedicin de la tarjeta, consiste en diligenciar los documentos necesarios de una manera personalizada, generando retardos en la verificacin de los documentos ya que solo se realizara la comprobacin de los mismos cuando la entidad considere que hay suficientes solicitudes para empezar. Las races del problema Muchas personas no se capacitan para ejercer puestos en el rea de la salud y sin embargo ejercen usando ttulos falsos Situacin deseada Solamente los profesionales que tengan los requisitos establecidos por la ley pueden ejercer ocupaciones en el area de la salud. Comparacin entre lo actual y lo deseado. Se conocen resultados de aplicacin de estas soluciones en otras partes. En el mundo existen aplicaciones basadas en XML para intercambiar informacin entre sectores de la salud. Un estndar a nivel mundial para la realizacin de sistemas en el area de la salud es el HL7, el cual se encuentra en www.hl7.org. Por que profundizar en el tema Porque el desarrollo de sistemas de este permitiran contar con mejores beneficios en la formacin y atencin dentro de la disponibilidad dentro de la disponibilidad del sistema educativo y de servicios, con los menores riesgos para los usuarios de los servicios de salud.
SI EL PROYECTO ES Desarrollar un sistema para la enseanza de las tablas de multiplicar en grados tercero y cuarto de primaria de la Escuela la Alquera. UN RIESGO SERIA Cambien los equipos de la sala de sistemas y como REDP dona computadores y la Escuela no tiene suficientes recursos para adquirir licencias, adquieran equipos con S.O. Linux. Y Frente a este riesgo hay que establecer por lo menos dos planes: PLAN A Desarrollar un sistema que tambin se pueda ejecutar en Linux. PLAN B Desarrollar el software web en un servidor externo para que pueda ser accedido usando el navegador de internet de Linux.
Llene la siguiente tabla: Acciones que debe desempear el sistema, pero que no estn en el titulo, ni en el objetivo general, ni especifico.
Empresa, sustantivo, persona, cargo, departamento o similar con el que se encuentra asociada la accin de la anterior columna.
proyecto
Llene la siguiente tabla: Acciones que debe desempear el sistema, y que se encuentran en el objetivo general del proyecto.
Acciones que debe desempear el sistema, y que se encuentran en los objetivos especficos del proyecto.
Llene la siguiente tabla: Lista de acciones que son desempeadas por personas de carne y hueso, y que tambin debe desempear el sistema.
Lista de acciones que son desempeadas por personas de carne y hueso pero que no son desempeadas por el sistema o software que usted a va realizar.
Lista de acciones que son desempeadas por el sistema, pero que no son desempeadas por el sistema.
Lista de acciones
Espero que esta vez, si entreguen el trabajo, no como la vez pasada que no lo entregaron, sino tan solo unos pocos, porque de no entregarlo, la nota de talleres le queda en CERO.
3. GENERALIDADES DE UML
UML es un lenguaje que tiene elementos, relaciones y diagramas, tal como se especifica en la siguiente tabla Elementos VISION GENERAL DE UML Elementos estructurales Elementos de comportamiento Elementos de agrupacin Elementos de anotacin Diagrama de casos de uso Diagrama de clases Diagrama de objetos Diagrama de secuencia Diagrama de colaboracin Diagrama de estado Diagrama de actividad Diagrama de componentes Diagrama de despliegue
Relaciones Diagramas
Diagramas de secuencia y Diagramas de colaboracin. Tambin se denominan diagramas isomorfos debido a que a partir de un diagrama se puede obtener el otro, es decir que a partir del diagrama de secuencia se puede obtener el diagrama de colaboracin y viceversa, a partir del diagrama de colaboracin se puede obtener el diagrama de secuencia.
Y cada modelamiento debe verse desde varios puntos de vista. A continuacin veremos que algunos de estos modelamientos son mas cercanos a la codificacin y otros son menos cercanos a la codificacin (Cuando se habla de codificacin, se hace referencia en este material a cdigo fuente). Podemos decir que se despus de modelar el dominio del problema, se esta en disposicin de modelar la solucin del problema y transitivamente despus de modelar la solucin del problema se esta en disposicin de modelar la codificacin del problema.
MODELAMIENTO DE LA FORMA DE MODELARLO CODIFICACION DEL PROBLEMA MODELAMIENTO PARTE ESTATICA Diagrama de Clases Diagrama de componentes Diagrama de despliegue MODELAMIENTO PARTE DINAMICA Diagrama de objetos Diagrama de secuencia Diagrama de colaboracin Diagrama de actividad
A continuacin vamos a bosquejar los diagramas que se pueden asociar con cada uno de dichos flujos de RUP.
Diagrama de objetos Diagrama de secuencia Diagrama de colaboracin Diagrama de estado Diagrama de actividad Diagrama de componentes Diagrama de despliegue En alto porcentaje
Diagrama de objetos Diagrama de secuencia Diagrama de colaboracin Diagrama de estado Diagrama de actividad Diagrama de componentes Diagrama de despliegue En alto porcentaje En un bajo porcentaje En un bajo porcentaje En bajo porcentaje
Anlisis y Diseo
Implementa cin
Despliegu e
Pruebas
Diagrama de clases
Diagrama de objetos
Diagrama de secuencia Diagrama de colaboraci n Diagrama de estado Diagrama de actividad Diagrama de En alto porcentaj e
En bajo porcentaj e
En alto porcentaje, incluyendo funcionalidad es que no estaban en la fase de modelado del negocio. En alto porcentaje, sobre todo en el flujo de diseo, mas que en el de anlisis. En alto porcentaje En alto porcentaje
Diagrama de clases
Diagrama de objetos
En bajo porcentaj e
de colaboraci n Diagrama de estado Diagrama de actividad Diagrama de component es Diagrama de despliegue En alto porcentaj e En un bajo porcentaj e En un bajo porcentaj e
porcentaje
porcentaje
Diagrama de clases
Diagrama de objetos
Diagrama de secuencia Diagrama de colaboraci n Diagrama de estado Diagrama de actividad Diagrama de component es Diagrama de despliegue En alto porcentaj e
En bajo porcentaj e
modelado del negocio. En alto porcentaje, sobre todo en el flujo de diseo, mas que en el de anlisis. En alto porcentaje En alto porcentaje
Diagrama
de casos de uso
porcentaj e
porcentaj ee incluyen do casos de uso extendid os En alto porcentaje, incluyendo funcionalidad es que no estaban en la fase de modelado del negocio. En alto porcentaje, sobre todo en el flujo de diseo, mas que en el de anlisis. En alto En alto porcentaje porcentaje En alto porcentaje En bajo porcentaje
porcenta je
Diagrama de clases
En alto porcenta je
Diagrama de objetos
En alto porcenta je
Diagrama de secuencia Diagrama de colaboraci n Diagrama de estado Diagrama de actividad Diagrama de component es Diagrama de En alto porcentaj e
En bajo porcentaj e
despliegue
je
6. EL LENGUAJE OCL
La presente seccin pretende mostrar una breve introduccin a lo que es lenguaje OCL pero desde el enfoque de compararlo con otras cuestiones de UML. Comienza el trabajo explicando la diferencia entre OCL y MOF, despus entre OCL y UML. Ms adelante se escriben las cosas ms importantes de la evolucin de OCL y de las cosas que se pueden hacer con OCL. Continuando se muestra la simbiosis existente entre OCL y los requisitos. Al finalizar se muestran en forma de conclusiones ventajas y desventajas de UML. El lenguaje OCL ha sido desarrollado a la par que el lenguaje de modelado UML, y por ello, podemos decir que es difcil que hablemos de OCL sin hablar de UML. [1]
Es importante notar que UML usa OCL, pero UML en ningn momento depende de OCL. Sin embargo los cambios y las mejoras hechas a OCL no tienen porque cambiar la estructura de UML y en forma recproca los cambios hechos a UML en ningn momento tienen porque afectar al lenguaje OCL y es sta situacin la que habla de la independencia entre UML y OCL. [3] Algunos autores hablan de lo anteriormente mencionado diciendo que la especificacin OCL no puede alterar la especificacin del modelo grfico[1] [3] Lo que hace UML, no lo hace OCL y lo que no hace OCL no lo puede hacer UML, lo que muestra una relacin de complementariedad entre OCL y UML.
que capture los requisitos, pues las cuestiones puntuales de los requisitos por lo general se especifican con OCL. No olvidar que de todas formas OCL puede estar presente en casi cualquier diagrama de UML, con lo cual se puede decir que ayuda a ir enriqueciendo la semntica y el significado de cada uno de los mismos.
Envio de quejas a la empresa Captura de quejas del cliente Solicitud de envio de queja a Empresa Almacenamiento de quejas de clientes Seguimiento de queja expuesta por el Cliente Evaluacion de quejas no atendidas Evaluacion de quejas atendidas
Es importante notar que estas funcionalidades a veces ocurren con una secuencialidad, razn por la cual es necesario conocer previamente a esta fase los procesos de la organizacin para poder establecer esta secuencialidad y conocer el dominio de aplicacin del sistema con respecto a la empresa en la que va a funcionar el mismo. En otras palabras podramos decir que estas funcionalidades tienen mas o menos las siguientes relaciones en un flujo de procesos de la empresa:
Es importante notar que el anterior diagrama nunca se coloca en UML, pero si se observa desde el punto de vista de procesos de la empresa, se tiene un diagrama de procesos de la empresa. Bueno, continuando con nuestro proceso de establecer actores en este punto es importante notar que lo mas importante en el diagrama de casos de uso inicialmente es establecer bien las funcionalidades del sistema que posteriormente se convertirn en los casos de uso del sistema, y posterior a ello se observan entes autnomos que realicen dichas funcionalidades y estos sern candidatos a ser actores. En pocas palabras estamos diciendo que se comienza con las funcionalidades. De todas formas, hay ocasiones en las que como no es tan fcil identificar las funcionalidades del sistema se establece una serie de personas y entes autnomos que estn directamente relacionados con el sistema y se observan las funcionalidades que realizan estos entes con el animo de establecer los casos de uso que faltan.
Suponiendo que los casos de uso expuestos en el anterior diagrama ya estn completos procedemos a separarlos y a ha colocar con la figura de un ser humano el ente que posiblemente ejerce dicha funcionalidad en el sistema que estamos desarrollando. Veamos:
funcionario
Relaciones Extends Relaciones Include y Relaciones de generalizacin. En las siguientes secciones se explicaran cada una de estas tres.
Cliente
Y supongamos que al analizar el caso de uso envi de quejas a la empresa, vemos que hay dos tipos de quejas que el cliente puede enviar a la empresa que son: Quejas sobre maltrato fsico Quejas sobre maltrato psicolgico. Y tambin digamos que despus de analizar la situacin, vemos que es necesario hacer la anterior divisin, debido a que los maltratos fsicos son atendidos finalmente por un medico, en tanto que los maltratos psicolgicos son atendidos por un psiquiatra. De otra forma, vemos que tanto los maltratos fsicos como los maltratos psicolgicos tienen unas mismas caractersticas, pero que hacen estas que su atencin sea distinta la una de la otra, pero lo nico cierto es que ambas son quejas de maltrato Con todo lo dicho hasta el momento tenemos pues el siguiente diagrama de casos de uso:
<<<<extends>>>>
Observe amigo lector / estudiante que el caso de uso envio de quejas a la empresa no esta directamente relacionado con el actor Cliente. Tambien observe que en trminos lgicos una queja de maltrato fsico es un tipo de queja sobre maltrato y para que esto quede bien claro en el diagrama es necesario colocar la palabra maltrato como se muestra en el siguiente diagrama:
<<<<extends>>>>
Con el anterior diagrama es bueno observar dos cosas: Los casos de uso que extienden del caso de uso base no se colocan directamente relacionados con el actor del sistema. Cuando se dice que un cliente enva quejas de maltrato, se esta diciendo que eventualmente el puede o esta en capacidad de enviar quejas sobre maltrato fsico y de enviar quejas sobre maltrato psicolgico, en pocas palabras se dice que si un actor de hace cargo del caso de uso base, tambin se debe hacer cargo de todas sus extensiones. Una conclusin de las dos anteriores es que si un actor se hace cargo de un caso de uso base, tan solo el se har cargo de todas sus casos de uso que son extensiones del mismo. Segn algunos autores es bueno colocar los verbos de los casos de uso en algn formato, por ejemplo el ms acogido es colocarlos en trminos de verbos en infinitivo, con lo cual nuestro diagrama de casos de uso mejorado seria:
<<<<extends>>>>
<<<<extends>>>>
La razn por la cual esta mal elaborado el anterior diagrama de casos de uso es porque no podemos relacionar los casos de uso que extienden de otro caso de uso directamente con el actor. Veamos ahora el error existente en el siguiente diagrama de casos de uso:
Funcionario
<<<<extends>>>> Enviar quejas de maltrato fisico <<<<extends>>>> Envio de quejas de maltrato Cliente
El error es que si un actor se hace cargo de un caso de uso base, tambin el se hace cargo de todas las extensiones de dicho caso de uso. En el caso concreto del anterior diagrama vemos que el actor Funcionario se hace cargo de un caso de uso extendido de uno base que esta a cargo del actor Cliente. Es posible que el diagramador quiera hacer el anterior diagrama de casos de uso y se encontrara con que no es posible llevar este diagrama de casos de uso a cdigo. Una opcin para solucionar este problema es crear un caso de uso separado para las quejas de maltrato fsico de los funcionarios. Una posible solucin al anterior problema es la siguiente:
<<<<extends>>>>
<<<<extends>>>> Envio de quejas de maltrato a clientes Envia quejas de maltrato psicologico a clientes <<<<extends>>>> Envio de quejas de maltrato a funcionarios Cliente
Funcionario
En donde queda claro que se han discriminado los maltratos a funcionarios y los maltratos a clientes. La pregunta que surge entonces es: Cmo optimizar este modelamiento cuando la misma accin sea realizada por varios actores?. Obviamente el modelamiento anterior es bueno cuando no se tengan muchos actores relacionados con envi de quejas sobre maltratos. En trminos de cdigo fuente estaramos diciendo que estaramos escribiendo y duplicando tanto cdigo que el modelamiento no tendra razn de ser si este tipo de situaciones a nivel de implementacin se presentan. Una respuesta posible a la anterior pregunta es que de pronto estemos modelando a un nivel de detalle tan grande que posiblemente ya lo que se este modelando no sean actores y casos de uso, sino mtodos de una clase.
<<<<extends>>>>
Cliente enviar quejas de maltrato a <<<<extends>>>> clientes enviar quejas de maltrato psicologico a clientes
<<<<extends>>>> enviar quejas de maltrato fisico a funcionarios enviar quejas de maltrato a funcionarios <<<<extends>>>> enviar quejas de maltrato psicologico a funcionarios Funcionario
Auditor
En donde no es posible agrupar las quejas de maltrato psicolgico y las quejas de maltrato fsico si se sigue usando la palabra <<extends>>. Una solucin es hace relaciones de extensin poco controladas. A fin de comprender como se podra solucionar el agrupamiento en el anterior diagrama de casos de uso, mostramos a continuacin una posible solucin:
Cliente enviar quejas de maltrato psicologico a clientes enviar quejas de maltrato fisico a funcionarios
enviar quejas de maltrato psicologico a auditores enviar quejas de maltrato fisico a auditores
Funcionario
Auditor
Observe amigo lector / estudiante que ahora si es posible que casos de uso extendido estn directamente asociados con distintos actores y todo debido a que son relaciones de generalizacin sin estereotipo. Antes de concluir con la explicacin sobre relaciones de generalizacin sin estereotipo decimos algunas afirmaciones sobre este tipo de relaciones:
1. En una relacin de generalizacin sin estereotipo puede anadir o no acciones con respecto al caso de uso base. 2. Un caso de uso extendido por medio de una relacin de generalizacin sin estereotipo es una variante del caso de uso base. 3. En las relaciones de generalizacin sin estereotipo el caso de uso que extiende puede incluir parte o la totalidad del comportamiento del caso de uso base.
No son validos, al igual que tampoco son validos diagramas como el siguiente:
Caso de USO B
<<<<include>>>> Caso de USO A <<<<include>>>> validar usuario ACTOR Diagrama VALIDO Caso de USO B
Y no esta dems recordar que diagramas de casos de uso como los siguientes:
<<<<extends>>>>
Caso de USO A
Caso de USO B
Son validos. Para resumir estamos diciendo que relaciones entre casos de uso tipo <<include>> son relaciones de dependencia y por tanto la flecha de generalizacin no aplica cuando se encuentre presente este termino en el diagrama de casos de uso.
<<<<include>>>> Consultar Cliente <<<<include>>>> validar usuario funcionario Diagrama VALIDO Matricular Cliente
En el que se esta diciendo que para que se pueda consultar un cliente se debe validar el usuario, y tambin se esta diciendo que para matricular un cliente se debe validar el usuario. Recordemos pues que el siguiente diagrama de casos de uso no es valido:
<<<<include>>>> funcionario
Matricular Cliente
ACTOR
En el anterior diagrama estamos diciendo que el caso de uso B es un caso de uso abstracto porque no es invocado directamente por un actor. En el siguiente diagrama de casos de uso:
ACTOR A
ACTOR B
Tenemos que el caso uso B, es un caso de uso no abstracto o mejor dicho lo que algunos autores llaman caso de uso concreto.
Numero del caso de uso <<Numero >> Cabecera del caso de uso
<<Nombre del Caso de Uso.>> Ejemplo: Ingresar estudiante <<Id del <<Nombre del requisito funcional>> requisito funcional>> Ejemplo: Requisito numero 44 del documento de requisitos funcionales establecidos en la entrevista 2 hecha al asistente de decanatura de la Facultad Tecnolgica de la Universidad Distrital <<Versin>> <<Numero de versin y fecha>> Ejemplo: Version 1.3 del 14 de abril de 2008 <<Autores>> <<Autor>> Ejemplo: Luis Felipe Wanumen Silva y Juan Carlos Guevara Bolaos Tipo de Caso Abstracto No Abstracto X de USO Fuentes <<Fuente de la versin actual>> Ejemplo: Documento almacenado en http://www.udistrital.edu.co/facultados.tecnologica/document o1.doc Estado del DEFINITIVO documento Evento de <<Nombre del evento de activacin>> Activacin Ejemplo: Cuando un estudiante hace su peticin de ingreso y se comunica con un usuario que esta activo en el sistema y que tiene las facultades para hacer su ingreso, obviamente con la autorizacin de la Decanatura y de la Universidad para realizar el proceso de matricula para dicho estudiante.
<<Objetivo <<Nombre del objetivo general>> general del caso de Ejemplo: uso>> Registrar un estudiante mediante el proceso de matricula para que sea parte activa del sistema y pueda gozar de todos los privilegios acadmicos con que cuenta un estudiante de la Universidad Distrital. <<Objetivos <<Nombre del objetivo especifico>> especficos> > Ejemplo: Matricular a un estudiante a la Universidad Distrital y concretamente a la Facultad Tecnolgica en el proyecto Curricular de Sistematizacin de Datos. Modalidad <<Numero modal en el que los actores o entidades son del caso de afectadas>> Uso Ejemplo: El caso de uso no afecta sino nicamente a un estudiante y para ver afectados a varios estudiantes recin matriculados es necesario realizar el proceso n veces, donde n es el numero de estudiantes a los que se les va a realizar el proceso de matricula. El sistema permite a <<lista de actores>> en <<instante en el que se puede realizar el caso de uso>> <<funcionalidad del caso de uso>>. Ejemplo: El sistema permite a los administradores, profesores y estudiantes con permisos de decanatura, hacer la matricula de estudiantes ingresando los datos personales, econmicos, sociales y acadmicos de los nuevos y futuros estudiantes de la Universidad. <<Listado de actores>> Ejemplo: Administrador, profesor, estudiante Objetivo <<Objetivo en infinitivo>><<elementos que se ven afectados por el verbo incluyendo actores o estados del sistema>>
Descripcin:
Actores
Ejemplo: Registrar en la base de datos un estudiante Precondicio <<Estado(s) de actores y/o entidades preliminares para que se pueda ejecutar nes el caso de uso en cuestin>> Ejemplo: El estudiante no debe estar registrado. Pos <<Estado posterior en el que debe estar un actor o una entidad, despus de condiciones ejecutado el caso de uso>> Ejemplo: Conocer todos los datos del estudiante <<Recuerde que el flujo de eventos debe tener coherencia con el futuro diagrama de secuencia y diagrama de colaboracin y que no debe incluir casos no perfectos o excepcionales>> Paso Accin Responsabl e <<Identifica <<accin a realizar o situacin que produce una <<Actor>>. cin del alternativa, mostrando las alternativas para este Especifican paso>> ultimo caso>> do si es una accin o una respuesta de algn agente del sistema. Ejemplo: Ejemplo: Ejemplo: Si << situacin que produce una alternativa>>, el sistema deber <<accin a realizar>> 1 Digitar todos los datos del estudiante Actividades del Actor Ejemplo: Ejemplo: Ejemplo: 2 Validar formulario 2a. Si se valido correctamente el formulario, el sistema debe mostrar un mensaje de satisfaccin al cliente. 2a. Si se valido correctamente el formulario, el sistema debe enviar los datos al servidor usando el mtodo de autenticacin POST. - --------Invocada por el actor e implementa da por el sistema
Ejemplo: 2
Ejemplo:
Flujos alternos
Situaciones Anormales
Respuesta del Sistema ---------------------------------------------------------------------------------N --------------------------------------1 --------------------------2 ----------------------------------------------------------N --------------------------<<Recuerde que en esta parte de la documentacin se pretende modelar el caso de uso y sus situaciones excepcionales que deben estar completamente acordes con los diagramas de flujo futuros con los que se relaciona este caso de uso y que sern elaborados en el flujo de anlisis y diseo. Tambin es bueno recordar que un caso de uso como mnimo debe tener una situacin excepcional, porque si no tiene casos excepcionales, quiere decir que es demasiado atmico o que le falta modelamiento>>. Tambien recuerde que en muchos lenguajes de programacin las excepciones se codifican con bloques try-catch-finally, es decir que no solamente es necesario colocar la excepcin y el manejo que se le va a dar, sino que en muchos casos es necesario colocar acciones que en forma indiferente de la presentacin de la excepcin siempre se van a efectuar, este es el caso de las instrucciones que van en los bloques finally. Tambmin es bueno tener en cuenta que las excepciones son lanzadas y capturadas por otros actores, entidades o sistemas con el animo de lograr un tratamiento adecuado de las excepciones <<en el caso en el que>><<actor o entidad involucrada>><<estado del actor o entidad>><<predicado acorde con la frase>>, el sistema deber <<accin o acciones a realizar>><<casos de uso y /o acciones correctivas>>. (Esto para cada una de las opciones anormales y / o combinacin de estas). Tener en cuenta que a veces ciertas situaciones excepcionales son excepcionales si estn acompaadas de unos ciertos factores. FINALIZADOR: <<Accion que siempre se va a realizar en forma independiente que se presente o no la excepcion>>. ACTORES ENTIDADES O SISTEMAS QUE RECIBEN LA EXCEPCION. <<Actor, entidad o sistema que es capaz de atrapar la excepcion>> Ejemplo:
1. En el caso en el que un estudiante ya est registrado en la base de datos, pero halla sido ingresado el mismo da de la actualizacin de datos, el sistema deber informarle al usuario que ya existe uno y darle la posibilidad para que cree uno nuevo con los datos ingresados actualmente, pero con distinto identificador NIP (numero de identificacin personal) o tambin le da la opcin para que guarde en un archivo los datos, pero que de ninguna manera los ingrese al sistema con este cdigo. FINALIZADOR: A pesar que el estudiante este o no registrado en la base de datos, de todas formas, siempre se emite un mensaje al final, en el que se muestra al usuario los resultados del ingreso o no ingreso del estudiante al sistema por medio de alertas. ACTORES ENTIDADES O SISTEMAS QUE RECIBEN LA EXCEPCION. Si el estudiante ya esta registrado, se notifica al actor AUDITOR para que el conozca por lo menos el cdigo de los estudiantes a los cuales se les ha hecho intentos varios de ingresarlos en forma duplicada con el animo que este tenga conocimiento de mencionados estudiantes. 2. En el caso en el que un estudiante ya est registrado en la base de datos, pero NO halla sido ingresado el mismo da de la actualizacin de datos, el sistema deber informarle al usuario que ya existe uno y darle la posibilidad para que cree uno nuevo con los datos ingresados actualmente, pero con distinto identificador NIP (numero de identificacin personal) o tambin le da la opcin para que guarde en un archivo los datos, pero que de ninguna manera los ingrese al sistema con este cdigo. FINALIZADOR: A pesar que el estudiante este o no registrado en la base de datos, de todas formas, siempre se emite un mensaje al final, en el que se muestra al usuario los resultados del ingreso o no ingreso del estudiante al sistema por medio de alertas. ACTORES ENTIDADES O SISTEMAS QUE RECIBEN LA EXCEPCION. Se notifica al sistema, se crea un archivo de log o si ya existe se le anade una lnea con la explicacin del error presentado y se le da la posibilidad al usuario que guarde o que no guarde los datos digitados hasta el momento para un posterior ingreso. Esto se hace por medio de una carpeta llamada la carpeta de No Enviados.
Cambios de <<Recuerde que toda accin es accin si cambia el estado de alguna entidad
estado
o de algn actor>>(Las cosas se hacen para transformar el estado de algo o de alguien y si no lo logra no es una accin que tenga una funcionalidad interesante, es decir que de no cambiarse el estado de algo, se podra decir que este caso de uso no es un caso de uso) Ejemplo: El estado del estudiante se cambia de inactivo en el sistema a activo en el sistema. Paso Cota de tiempo Ejemplo: 1 2 Ejemplo: N segundos N segundos
Rendimient o
Frecuencia esperada
Importancia <<sin importancia o importancia vital>>. (Recuerde o excluyente) Urgencia <<Puede esperar, hay presin, inmediatamente>>
entonces definir un tipo de relaciones especficas para modelar esta forma de percibir al carro con respecto a otros trminos reales o abstractos inventados por el hombre. Existen a su vez varios tipos de relaciones entre los objetos, las cuales se irn describiendo con mayor detalle en las siguientes secciones, pero por el momento nos limitaremos a decir que las ms importantes son: TIPOS DE RELACIONES
Relaciones de DEPENDENCIA
Relaciones de GENERALIZACIN
Relaciones de ASOCIACIN
La implementacin de dicho diagrama de clase se hace en dos archivos, los cuales se muestran a continuacin:
// Archivo: MATERIA.java public class MATERIA { protected Integer COD_MAT; private String NOM_MAT; MATERIA() { } }
y el archivo:
// Archivo: ASIGNATURA.java public class ASIGNATURA extends MATERIA { private Integer COD_ASIG; private String NOM_ASIG; ASIGNATURA() { }
Observemos que esto es en esencia una herencia simple, debido a que existe una clase base denominada MATERIA y una clase que hereda de sta, la cual se llama ASIGNATURA. En realidad los trminos generalizacin, nos indican que una clase es la base para las dems y el trmino herencia, nos indica que una clase hereda caractersticas de otra, la cual es una clase generalizacin con respecto a la mencionada. En vista de ste tipo de discusiones, podemos ver que en realidad estamos hablando de lo mismo, lo que sucede es que para referirnos a la clase de la que se hereda usamos el trmino generalizacin y para referirnos a la que utiliza dicha clase para heredar, utilizamos el trmino herencia.
protected Integer COD_MAT; MATERIA() { COD_MAT = new Integer(5); } private Integer getCOD_MAT(){ return COD_MAT; } // Por defecto la funcion es publica Integer getCODIGO(){ Integer aux = getCOD_MAT(); return aux; }
Observemos que podemos llamar a la funcin getCOD_MAT() desde una funcin que haga parte de la clase y no ocurre ningn error: Pues bien, si intentramos acceder a la funcin getCOD_MAT() desde una instancia de la clase MATERIA, tal como se muestra a continuacin:
MATERIA obj_materia = new MATERIA(); Integer cod_materia = obj_materia.getCOD_MAT();
Tendramos un error al compilar el programa y este error sera: getCOD_MAT() has private access in MATERIA Integer cod_materia = obj_materia.getCOD_MAT(); 1 error Como se imaginar el amigo lector / estudiante, si no es posible acceder a una funcin como la anterior desde una instancia de la clase, mucho menos ser posible acceder a la funcin desde una clase heredada. Para mostrar este concepto, a continuacin se muestra una clase que hereda de la clase MATERIA, y que se denomina ASIGNATURA, la cual tiene una instruccin que intenta acceder a la funcin getCOD_MAT() y obviamente no puede. Veamos:
// Archivo: ASIGNATURA.java public class ASIGNATURA extends MATERIA { private Integer COD_ASIG; private String NOM_ASIG; ASIGNATURA() { Intege codigo_mat = getCOD_MAT(); }
getCOD_MAT() has private access in MATERIA Intege codigo_mat = getCOD_MAT(); 1 errors Yo s que puede sonar bastante canzn y molesto decir que las instancias de la clase heredada tampoco podrn acceder a la funcin getCOD_MAT(), pero por experiencia docente se que es necesario hacer todo este tipo de aclaraciones con el nimo no de repetir cosas, sino de lograr la mayor comprensin de los conceptos. Veamos las siguientes instrucciones:
ASIGNATURA ojb_asignatura = new ASIGNATURA(); Integer cod_asignatura = ojb_asignatura.getCOD_MAT();
De las cuales solamente nos resta decir que generan un error similar al siguiente: getCOD_MAT() has private access in MATERIA Integer cod_asignatura = ojb_asignatura.getCOD_MAT(); 1 errors
Observemos que esta clase tiene una funcin denominada setCODIGO(), la cual modifica el tipo de objeto de dato llamado COD_MAT. Pues bien, es posible crear una instancia de esta clase y por medio de la misma modificar nuevamente la variable de objeto de dato, tal como se muestra a continuacin:
MATERIA obj_materia = new MATERIA(); obj_materia.COD_MAT = new Integer(35);
Ahora vamos pues a crear una clase heredada de la clase anterior, denominada ASIGNATURA, la cual se muestra a continuacin:
// Archivo: ASIGNATURA.java public class ASIGNATURA extends MATERIA { private Integer COD_ASIG; private String NOM_ASIG; ASIGNATURA() { // Integer codigo_mat = getCOD_MAT(); COD_MAT = new Integer(10); } }
Como podemos observar, esta clase tambin puede modificar el objeto de datos COD_MAT en forma directa, sin mayores problemas. Podemos entonces ver que es factible modificar la misma variable desde una instancia de la clase ASIGNATURA, tal como se muestra a continuacin:
ASIGNATURA obj_asignatura = new ASIGNATURA(); obj_asignatura.COD_MAT = new Integer(30);
subclase en el mismo paquete otras clases en el mismo paquete subclases en otros paquetes otras clases en otros paquetes
N N N N
S S X N
S S S S
S S N N
En este cuadro la S, significa: Puede acceder N: No puede acceder. X: puede acceder al atributo en objetos que pertenezcan a la subclase, pero no en los que pertenecen a la clase madre. Es un caso especial
8.6. ASOCIACIONES
Las asociaciones son uno de los temas ms tratados en bases de datos y la verdad es que es necesario tratar este tema con mucho cuidado y detenimiento, puesto que de nada sirve crear y estructurar bien las clases, si la asociaciones entre las mismas no se hacen de la mejor forma. En el siguiente ejercicio, se muestra la asociacin entre una ASIGNATURA y un ESTUDIANTE:
+tomada_por ASIGNATURA COD_ASIGN : Integer NOM_ASIGN : String 0..6 INSCRIPCION +inscribe 0..35 ESTUDIANTE COD_ESTU : Integer NOM_ESTU : String
En el anterior diagrama de clases, se est intentando decir: Un estudiante puede inscribir o no una materia Un estudiante puede inscribir como mximo seis materias Una asignatura puede estar asociada con un cero o hasta 35 estudiantes El nombre de la asociacin entre el objeto ASIGNATURA y el objeto ESTUDIANTE es INSCRIPCIN, debido bsicamente a que una asignatura es inscrita por un ESTUDIANTE y un estudiante inscribe una ASIGNATURA.
Es importante reconocer que a simple vista las asociaciones permiten la comunicacin y el paso de informacin entre un objeto y otro, pero no por ello se debe estar de acuerdo con las personas que argumentan que las asociaciones violan el principio de encapsulacin de informacin propio de la programacin orientada a objetos. Esto lo digo porque es probable que una asociacin tenga atributos inherentes a sta que no se puedan adjudicar directamente a cualquiera de las clases involucradas.
// Archivo: ESTUDIANTE.java public class ESTUDIANTE { private Integer COD_ESTU; private String NOM_ESTU; public ASIGNATURA tomada_por[]; ESTUDIANTE() { }
MUESTRA +en 1..1 via2 +envia1 COMPUTADOR C OD_COMP : Integer NOM_C OMP : String +envia3 TECLADO COD_TECL : Integer NOM_TECL : String MANIPULA
PROCESA
+manipula
La implementacin del anterior diagrama se muestra a continuacin en donde se especifica el contenido y el nombre de cada archivo de java que es necesario crear para implementar el anterior diagrama:
// Archivo: COMPUTADOR.java public class COMPUTADOR { private Integer COD_COMP; private String NOM_COMP; public MONITOR muestra; public TECLADO manipula; public CPU procesa; public IMPRESORA imprime[]; COMPUTADOR() { }
Un COMPUTADOR est relacionado con cero a un monitor por medio del rol muestra. Un COMPUTADOR est relacionado con cero o una CPU por medio del rol procesa
Un COMPUTADOR est relacionado con cero o un TECLADO por medio del rol manipula. Un COMPUTADOR est relacionado con cero o varias EMPRESORAS
// Archivo: CPU.java public class CPU { private Integer COD_CPU; private String NOM_CPU; public COMPUTADOR envia2; CPU() { }
Una CPU, est relacionada con uno y con slo un COMPUTADOR por medio del rol envia2
// Archivo: IMPRESORA.java public class IMPRESORA { private Integer CO_IMPR; private String NOM_IMP; public COMPUTADOR envia4; IMPRESORA() { }
Una IMPRESORA, est relacionada con cero o un COMPUTADOR por medio del rol envia4
// Archivo: MONITOR.java public class MONITOR { private Integer COD_MON; private String NOM_MON; public COMPUTADOR envia1; MONITOR() { }
Un MONITOR est relacionado con cero o un COMPUTADOR, por medio del rol envia1
// Archivo: TECLADO.java public class TECLADO { private Integer COD_TECL; private String NOM_TECL; public COMPUTADOR envia3;
TECLADO() { } }
Un TECLADO est relacionado con cero o un COMPUTADOR por medio del rol envia3
0..n
CALIFICACION
1..1
// Archivo: NOTA.java public class NOTA { private Integer COD_NOTA; private Integer VALOR_NOTA; private String DESCRIPCION; public ESTUDIANTE inscribe[]; NOTA() {
Observemos que los valores que determinan la cardinalidad se pueden especificar ms adelante a medida que se vayan creando los diversos objetos. A las dependencias en muchas ocasiones se les conoce como relaciones de uso y esto se debe a que son utilizadas comnmente para especificar que una clase utiliza a otra para realizar determinadas operaciones y obviamente la clase que usa a la otra es una clase que depende de la inicial. En trminos grficos, la situacin se puede comprender de la siguiente manera:
COORDINACIN
COORDINADOR
Dependencia Un cambio en el coordinador afecta a la coordinacin, es decir la coordinacin depende del coordinador. (Bueno, en la vida real, la coordinacin depende tambin de muchos otros elementos y de muchas clases como se dira en programacin orientada a objetos). La situacin anterior, indicara por tanto, alguna de las siguientes situaciones: o Existe una funcin en la clase COORDINACIN que utiliza un objeto de tipo COORDINADOR para realizar alguna operacin. o Existe una funcin que recibe un parmetro por valor en la clase COORDINACIN, que es una instanciacin de la clase COORDINADOR.
ConsultaEstudiantesEx celentes
Son clases consulta. Es decir que se estn relacionadas con consultas a bases de datos que se hacen en el sistema. La anterior tabla tambin se pude modelar como se muestra a continuacin:
<<<<View>>>> ConsultaEstudiantes Excelentes
Estudiante
Son clases tabla. Es decir que estas clases tienen su equivalente en una base de datos y son clases que manipulan la informacin de una tabla de una base de datos. Tambin se puede dibujar la anterior clase de la siguiente forma:
<<<<Table>>>> Estudiante
Estudiante
Se usa cuando se quiere modelar una clase que globalice un servicio. Esto puede ser til tanto en la parte del modelo del dominio como en cualquier diagrama de clases de anlisis o de diseo. De forma anloga a las anteriores clases, es posible diagramar la clase con la convencin que siempre usamos para las clases que es un cuadro dividido en tres secciones, pero adicionndole la etiqueta <<service>>.
<<<<Service>>>> Estudiante
Estudiante
<<<<Resource>>>> Estudiante
Estudiante
<<<<Location>>>> Edificio
Edificio
Interface
<<<<entity>>>> Edificio
entidad.
Edificio
<<<<Domain>>>> Mundo
Mundo
<<<<control>>>> Mundo
Domain. Generalme nte son clases que aparecen en el dominio del problema. Control
Mundo
Mundo
Mundo
Evento de negocio.
Mundo
Entidad e negocio.
Mundo
Actor de negocio
Mundo
Boundary
Actor. Esta clase es mas comnmen te modelada con la figura similar a la humana
Las clases tipo abstract, son clases que describen como se tienen que declarar los mtodos, sin tener que implementarlos. Es ms, si los mtodos son declarados abstract en una clase abstract, es porque no pueden ser implementados en la misma clase, sino en una clase que herede de la misma. Otra cuestin bien importante a tener en cuenta es el hecho que una clase que herede de una clase tipo abstract, est obligada a implementar todos los mtodos que la clase antecesora en cuestin tenga definidos como de tipo abstract. Para lograr que el amigo lector / estudiante comprenda estos conceptos a continuacin se muestra un ejercicio que muestra dos archivos en cada uno de los cuales hay una clase. Estos archivos describen en forma sencilla la forma de crear una clase abstracta y la forma de utilizarla. Veamos:
// Archivo: uml1.java package uml2; import java.awt.*; import java.awt.event.*; public abstract class uml1 { public abstract void printf(); }
// Archivo: MyApp.java package uml2; import java.awt.*; import java.awt.event.*; public class MyApp extends uml1{ public void printf(){ System.out.println("probando"); } }
Observe el amigo lector que la implementacin del mtodo printf() es obligatoria en la clase MyApp
El error dependiendo el compilador java es algo similar al siguiente: MyApp.padre is abstract; cannot be instantiated padre obj_padre = new padre(); 1 error Exit code: 1 There were errors
Las clases abstractas no pueden ser instanciadas directamente, pues fueron creadas para que otras hereden de ellas y stas ltimas si pueden ser instanciadas.
} public class hijo extends padre{ } hijo obj_hijo = new hijo(); } // Cierra public class MyApp
Una clase no abstracta que herede de una clase abstracta puede ser instanciada directamente
El programa anterior es totalmente vlido debido a que la clase bisabuelo es una clase abstracta, pero su funcin estatura() no lo es, lo que quiere decir que una clase que herede de la clase bisuabuelo, no est obligada a implementar el mtodo estatura(). De otra
parte la clase abuelo hereda de bisabuelo y no por ello est obligada a ser una clase abstracta. En ltimas vemos que el rbol de herencia puede seguirse prolongando hasta que no aparezca el identificador final (el cual se explicar ms adelante.). Por ltimo vemos que las nicas clases que se estn instanciando directamente son las clases abuelo e hijo, quienes no son abstractas y por lo tanto es perfectamente vlido instanciarlas.
Una clase abstracta puede heredar de una abstracta o de una no abstracta. Una clase no abstracta puede heredar de una clase abstracta o de una no abstracta.
El programa anterior genera un error, debido a que no es posible hacer una clase que herede de dos clases abstractas. El error que genera al anterior programa al compilarlo es similar al siguiente: '{' expected public class hijo extends padre extends madre{
Aunque muchos compiladores no colocan explcito el error de intentar heredar simultneamente de dos clases mediante la palabra reservada extends, es importante tener en cuenta que no es posible heredar de dos clases abstractas al mismo tiempo debido a que por este mecanismo no se permite la herencia mltiple.
Como podemos observar en este programa, se crea una clase abstracta llamada padre, la cual define un mtodo que devuelve un valor entero y dicho mtodo se llama estatura(), el error surge porque se estn abriendo y cerrando corchetes despus del mtodo lo cual estara indicando que se va a implementar dicho mtodo y recordemos que los mtodos abstractos de una clase abstracta no se pueden implementar en dicha clase, sino en las clases que hereden de la misma. Algunas personas piensan que el error surge porque se estn colocando instrucciones dentro del mtodo. Pues para las personas que piensan esto, veamos el siguiente programa:
import java.applet.*; public class MyApp extends Applet { public abstract class padre{ public abstract int estatura(){ } } } // Cierra public class MyApp
Vemos entonces que este programa tambin genera errores, y eso que no hay nada de instrucciones en medio de los corchetes. La razn es muy sencilla a pesar de no tener instrucciones en dicho mtodo el solo hecho de colocar corchetes le est indicando a java que es posible colocar instrucciones y esto provoca un error.
En los dos programas anteriores mostrados se presenta pues el mismo error, el cual es algo similar al siguiente: abstract methods cannot have a body public abstract int estatura(){
Las clases abstractas no pueden contener instrucciones y es ms, ni siquiera deben tener corchetes de apertura y cierre, sino nicamente la sola definicin (no declaracin) del mtodo seguido por un punto y coma.
Para corregir el problema presentado en los dos anteriores programas se muestra un programa que declara el mtodo abstracto en una clase abstracta pero que no da pie para su definicin y mucho menos su implementacin. Veamos:
import java.applet.*; public class MyApp extends Applet { public abstract class padre{ public abstract int estatura(); } } // Cierra public class MyApp
El anterior programa define una clase abstracta denominada padre, la cual tiene un mtodo abstracto llamado estatura(). El problema con este programa radica no en la clase padre, sino en la clase hijo, la cual hereda de la clase padre, pero no implementa el mtodo abstracto estatura() proveniente de su clase ancestra.
Por todo lo anterior a continuacin se muestra el error generado por java al compilar el anterior programa: MyApp.hijo should be declared abstract; it does not define estatura() in MyApp.padre public class hijo extends padre{
Si una clase no abstracta hereda de una clase abstracta y dicha ancestra declara mtodos abstractos, es obligacin de la clase no abstracta definir los mtodos abstractos de sus clases antecesoras.
Para corregir el problema del programa anterior, a continuacin se muestra la nueva definicin de la clase hijo para lograr que el programa no tenga errores. Veamos:
import java.applet.*; public class MyApp extends Applet { public abstract class padre{ public abstract int estatura(); } public class hijo extends padre{ public int estatura(){ return 165; // cm } } // Cierra public class MyApp
Es bueno que el amigo lector y/o estudiante tenga en cuenta que al definir el mtodo abstracto en la clase que hereda de la clase abstracta se omite la palabra abstract en el mtodo y el resto se deja igual. Tambin es bueno que se tenga en cuenta que el abrir y cerrar corchetes en el mtodo estatura() de la clase hijo es supremamente importante. Algunos estudiantes han preguntado si es obligatorio que se coloquen instrucciones en el mtodo estatura() del programa anterior. La respuesta es que no. Y para comprobarlo, puede compilar el siguiente programa que no genera ningn error y que sintcticamente es correcto. Veamos:
import java.applet.*; public class MyApp extends Applet { public abstract class padre{ public abstract void saludo(); } public class hijo extends padre{
Pero bueno, obviamente para lograr que esto funcionase, hubo necesidad de cambiar la declaracin del mtodo saludo() de la clase padre, con el nimo de lograr que dicho mtodo no devolviera un valor entero, porque el hacerlo obligara a que al momento de definir el mtodo saludo() en la clase hija fuera necesaria la instruccin return y de lo que se trataba era de mostrar que era posible definir mtodos en la clase hijo que no tuvieran instrucciones algunas en medio de los corchetes de apertura y cierre de la funcin saludo().
En el anterior programa no se presenta error alguno, debido a que las clases abstractas pueden declarar mtodos, y no estn obligadas a declarar mtodos abstractos de sus clases abstractas ancestras. Por ejemplo para este caso, la clase hijo declara un mtodo abstracto llamado saludo1() y no est obligada a declarar el mtodo abstracto saludo(), por ser sta clase hija una clase tambin abstracta. De otra parte la clase llamada nieto como no es clase abstracta, est obligada a definir (no declarar) el mtodo abstracto saludo1() de la clase hijo y adems est obligada a definir el mtodo abstracto saludo() de la clase padre, por ser una clase que implcitamente hereda de esta tambin.
Recordemos que si C hereda de B y B hereda de A, implcitamente C hereda de A. Esto se podra pensar como una ley de transitividad en la herencia, pero bueno, no es el tema hablar en trminos matemticos de estos aspectos. Por lo pronto basta con que se entienda que para nuestro ejercicio, la clase nieto hereda implcitamente de padre.
Las clases abstractas que hereden de otras clases abstractas pueden o no declarar mtodos que tengan el mismo nombre y parmetros de sus clases abstractas antecesoras
Este programa genera un error similar al siguiente: missing method body, or declare abstract public int estatura(); La razn es que la clase abstracta padre posee un mtodo llamado estatura(), el cual no es abstracto y por tanto no solamente debe declararse, sino definirse.
Los mtodos que no sean abstractos y que se encuentren en clases abstractas deben definirse y no solamente declararse.
Para corregir el problema del programa anterior, se podra definir el mtodo estatura() tal como se muestra en el siguiente programa:
import java.applet.*; public class MyApp extends Applet { public abstract class padre{ public int estatura(){ return 165; }; } } // Cierra public class MyApp
Una clase tipo abstract describe como se tienen que declarar los mtodos, sin tener que implementarlos, pero tengamos en cuenta que la clase que va a implementar estos mtodos es una clase que hereda de la clase abstract. En cambio cuando se declara una clase como de tipo interface y es utilizada por otra por medio de la instruccin implements, estamos dijramos copiando los mtodos de la clase interfaz a la clase que la implementa. Con ello, estamos pues evitando el problema de tener que heredar y esto obviamente ser muy til cuando veamos la necesidad de heredar de varias clases, no haremos esto, sino simplemente crearemos varias clases tipo interfaz y otras clases sern las que implementan la funcionalidad de las anteriores y as evitaremos el gran problema que describamos en apartados anteriores: El problema que java no permite la herencia mltiple. Bien, y ahora con el nimo de lograr que el amigo lector / estudiante adquiera la destreza para crear este tipo de clases, a continuacin se muestra un ejercicio que tiene dos archivos cada uno con una clase, en donde habr una clase que es de tipo interface y otra que la implementa. Veamos:
// Archivo: MyApp.java package uml2; import java.awt.*; import java.awt.event.*; class MyApp implements uml1{ public void printf(){ System.out.println("probando"); } }
// Archivo: uml1.java package uml2; import java.awt.*; import java.awt.event.*; public interface uml1 { public void printf(); }
Debido a que inicializa el valor de las variables posicin_x y posicin_y con los valores 2 y 0 respectivamente Pero con el nimo de lograr la mayor comprensin de este tema, por parte del estudiante a continuacin se muestra un ejemplo que genera un error. Veamos:
// ESTA CLASE GENERA UN ERROR public interface transporte{ public int posicion_x; public int posicion_y; } // Cierra interface transporte
La razn por la que genera un error es debido bsicamente a que en una interfaz se necesita que se le asigne un valor a cada una de las variables que se declaren en dicha clase.
public interface transporte{ public int posicion_x=2; // genera error por tener el // modificador protected protected int posicion_y=0; } // Cierra interface transporte
para corregir el problema necesitaramos cambiarle el modificador private por el modificador public o de otra manera tambin podramos quitarle el modificador debido a que como se mencionaba anteriormente el modificador por defecto para los atributos de una interfaces es pblico, con lo cual el quitarle el atributo bastara para solucionar el problema de compilacin.
/* Autor: Tipo:
Clase: Descripcin:
public class MyApp extends Frame { public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; } // Cierra interface transporte public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); // Aqui el compilador genera error porque // NO PUEDE INSTANCIAR LA INTERFACE // transporte transporte zorra = new transporte(); } }
Luis Felipe Wanumen Silva Orientacin a objetos Interface Manipulacin de clases tipo interface 9 de Mayo de 2005
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; } // Cierra interface transporte // Esta clase se crea correctamente public class vaca implements transporte{ } // Cierra class vaca public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); // YA NO HAY ERROR AL CREAR EL OBJETO vaca pintada = new vaca(); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); }
o desarrollar en las clases que implementen dicha clase. De otra parte una clase interfaz, no desarrolla mtodos, con lo cual no es posible que una clase interfaz implemente otra clase interfaz debido a que de una la responsabilidad de implementar los mtodos le queda restringida por el simple hecho de ser la clase tambin una clase interfaz. A continuacin se muestra un ejemplo en el que se un error debido a que se infringe con sta norma de programacin en java. Veamos:
/* Autor: Tipo: Clase: Descripcin: Luis Felipe Wanumen Silva Orientacin a objetos Interface Manipulacin de clases tipo interface 9 de Mayo de 2005
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; } // Cierra interface transporte // ESTA CLASE NO SE PUEDE CREAR // debido a que una interfaz no puede // implementar otra interfaz public interface vaca implements transporte{ } // Cierra class vaca public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); }
En caso de ser necesario que una clase interface adquiera la funcionalidad especificada en otra clase tipo interfaz, se puede observar el siguiente tem que muestra como se solucionara ste problema.
Luis Felipe Wanumen Silva Orientacin a objetos Interface Manipulacin de clases tipo interface 9 de Mayo de 2005
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; } // Cierra interface transporte // Esta clase se puede crear puesto que // UNA INTERFAZ PUEDE EXTENDER DE OTRA // interfaz public interface vaca extends transporte{ } // Cierra class vaca public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show();
Cuando se dice que una clase extiende, quiere decir que la clase hija adquiere la funcionalidad de la clase padre y en este caso la clase padre es una clase tipo interface, con lo cual la clase hija al extender dicha funcionalidad lo puede hacer debido a que ella misma tambin es una clase interface.
11.10. UNA CLASE NO INTERFAZ PUEDE IMPLEMENTAR VARIAS CLASES TIPO INTERFAZ
En ocasiones se hace necesario que una clase implemente la funcionalidad especificada en ms de una clase y esto es perfectamente vlido en java, con lo cual se puede dar un simulacro de herencia mltiple a nivel de interfaz. A continuacin se muestra un ejemplo en el que se tiene una clase denominada vaca que implementa de dos clases tipo interface denominadas transporte y animal. Veamos el ejercicio:
Luis Felipe Wanumen Silva Orientacin a objetos Interface Manipulacin de clases tipo interface 9 de Mayo de 2005
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; } // Cierra interface transporte // Esta clase no genera un error public interface animal{ public String tipo="mamifero"; } // Cierra interface animal public class vaca implements transporte, animal{ } // Cierra class vaca public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose();
System.exit(0);
}); // NO HAY PROBLEMA CREANDO OBJETO PINTADA vaca pintada = new vaca();
public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); } }
Es importante notar que en el ejercicio anterior se cre un objeto denominado pintada que es un objeto de tipo vaca, la cual a su vez es una clase que implementa de las interfaces transporte y animal. Recordemos que se pueden crear objetos directamente de clases que no sean interface, pero indirectamente el objeto vaca tiene pues la funcionalidad de las interfaces. Esto es lo que se conoce como herencia mltiple en java, pero si el amigo lector / estudiante observa con cuidado podr descubrir que no existe como tal la verdadera herencia mltiple, debido a que no se pueden heredar implementaciones de mtodos de varias clases y esto en vez de ser una limitacin del lenguaje java a veces se convierte en un gran beneficio a la hora de programar, aunque cuando se comienza con el mundo de la programacin pareciera ser una desventaja.
11.11. UNA CLASE INTERFAZ PUEDE EXTENDER DE VARIAS CLASES TIPO INTERFAZ
Aunque suene un poco raro, es importante no dejarse confundir con sta parte del manual, debido bsicamente a que se podra pensar que dado que en java no se permite la herencia mltiple pura en su concepcin ms amplia, y dicha herencia se realiza mediante la palabra reservada extends, podramos deducir que la extensin de varias clases, si no se permite en otros contextos, no se debera permitir en ste. La verdad es que este es un caso muy especial y tiene que ver con el simple hecho que el compilador verifica si las clases que extienden de una clase tipo interface son clases tipo interface lo permite, y en caso contrario no lo permite. El significado de extender de varias clases tipo interfaz, no quiere decir que se est heredando, sino que se hace un compromiso de implementar los mtodos declarados en las clases interfaces de las que se extiende. Veamos un ejemplo en el que se muestra una clase tipo interface denominada vaca que extiende de dos clases tipo interface denominadas transporte y animal:
/* Autor: Tipo: Luis Felipe Wanumen Silva Orientacin a objetos
Clase: Descripcin:
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; } // Cierra interface transporte // Esta clase no genera un error public interface animal{ public String tipo="mamifero"; } // Cierra interface animal // ESTA CLASE NO GENERA UN ERROR public interface vaca extends transporte, animal{ } // Cierra class vaca public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); } }
11.12. UNA CLASE NO INTERFAZ NO PUEDE EXTENDER DE UNA CLASE TIPO INTERFAZ
En este punto se hace hincapi en el anlisis que hace el compilador de java al verificar que se puede extender de una clase tipo interface o de varias clases tipo inteface siempre y cuando la clase que extienda la funcionalidad de stas sea una clase tipo no interface, de lo contrario no. La razn es bien sencilla y radica en el hecho principal de saber que para poder extender es porque se tiene la garanta que tendr un comportamiento similar a la
clase padre y este comportamiento similar a la clase padre, no se puede asegurar cuando la clase que la extiende no es una clase tipo interface, por cuanto puede tener comportamientos que no corresponden con una clase tipo interface y esto daara o deteriorara el concepto de la extensin de clases. El ejemplo siguiente muestra un programa que genera un error, debido a que se viola el concepto anteriormente explicado:
/* Autor: Tipo: Clase: Descripcin: Luis Felipe Wanumen Silva Orientacin a objetos Interface Manipulacin de clases tipo interface 9 de Mayo de 2005
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; } // Cierra interface transporte // ESTA CLASE GENERA UN ERROR // POR CUANTO UNA CLASE NO INTERFACE // NO PUEDE EXTENDER NI DE UNA, NI // MUCHO MENOS DE VARIAS CLASES TIPO // INTERFACE public class vaca extends transporte{ } // Cierra class vaca public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); }
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; } // Cierra interface transporte // Esta clase no genera un error public class animal implements transporte{ public String tipo="mamifero"; } // Cierra interface animal public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); // El objeto se crea correctamente animal vaca = new animal(); // No se puede asignar valor a variable // de tipo final vaca.posicion_x = 3;
public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); } }
En el anterior ejemplo, vemos que la variable posicin_x es una variable que pertenece a la interfaz transporte y por lo tanto es como si se hubiese declarado de tipo final, con lo cual cualquier intento por modificar su valor generara un error por parte del compilador, incluso si el valor que se le quisiese asignar fuere el mismo valor que tuviese en la declaracin de la clase. El siguiente ejemplo tambin presenta problemas y no se puede compilar:
/* Autor: Tipo: Clase: Descripcin: Luis Felipe Wanumen Silva Orientacin a objetos Interface Manipulacin de clases tipo interface 9 de Mayo de 2005
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; public void moverse(); } // Cierra interface transporte // Esta clase no genera un error public class animal implements transporte{ public String tipo="mamifero"; public void moverse(){ // Esta asignacin genera error debido a que // variable final no puede ser modificada posicion_x = posicion_x + 1; } // Cierra void moverse } // Cierra interface animal public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } public static void main(String args[]) { System.out.println("Starting App");
} }
Cabe anotar que verdaderamente la variable dentro de una clase interface es una variable tipo final por lo que no podr ser modificada ni siquiera por algn mtodo de las clases que implementen dicha interface. Se podra pensar que las variables de las clases tipo interface se comportan como constantes
11.14. CLASE QUE IMPLEMENTE CLASE TIPO INTERFAZ DEBE DEFINIR SUS MTODOS
Es importante notar que toda clase no interface que implemente otra clase tipo interface debe implementar todos sus mtodos. Por ejemplo el siguiente programa genera un error:
/* Autor: Tipo: Clase: Descripcin: Luis Felipe Wanumen Silva Orientacin a objetos Interface Manipulacin de clases tipo interface 9 de Mayo de 2005
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; public void moverse(); } // Cierra interface transporte // Esta clase no genera un error public class animal implements transporte{ public String tipo="mamifero"; // SE REQUIERE QUE AQUI SE HUBIESE // IMPLEMENTADO EL MTODO moverse() } // Cierra interface animal public MyApp() {
this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); }
Lo interesante del asunto es que con slo indicar que se est implementando el mtodo del programa anterior, ya el compilador no genera error, as en verdad no se est implementando dicho mtodo. Veamos pues sta correccin en el programa mejorado con respecto al mencionado:
/* Autor: Tipo: Clase: Descripcin: Luis Felipe Wanumen Silva Orientacin a objetos Interface Manipulacin de clases tipo interface 9 de Mayo de 2005
public class MyApp extends Frame { // Esta clase no genera un error public interface transporte{ public int posicion_x=2; public int posicion_y=0; public void moverse(); } // Cierra interface transporte // Esta clase no genera un error public class animal implements transporte{ public String tipo="mamifero"; // El compilador no genera error // porque cree que se est implementando // el mtodo cuando en verdad no se // est implementando public void moverse(){ } // Cierra void moverse } // Cierra interface animal
public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); }
La clase MiClase contiene una variable (i) y dos mtodos, MiClase que es el constructor de la clase y Suma_a_i( int j ).
La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new no consume memoria, simplemente es una declaracin de tipo. Despus de ser instanciado un nuevo objeto mc, el valor de i en el objeto mc ser igual a 10. Se puede referenciar la variable (de instancia) i con el nombre del objeto:
mc.i++; // incrementa la instancia de i de mc Al tener mc todas las variables y mtodos de MiClase, se puede mc.Suma_a_i( 10 );
usar la primera sintaxis para llamar al mtodo Suma_a_i() utilizando el nuevo nombre de clase mc: y ahora la variable mc.i vale 21.
12.5. FINALIZADORES
Java no utiliza destructores (al contrario que C++) ya que tiene una forma de recoger automticamente todos los objetos que se salen del alcance. No obstante proporciona un mtodo que, cuando se especifique en el cdigo de la clase, el reciclador de memoria (garbage collector) llamar:
// Cierra el canal cuando este objeto es reciclado protected void finalize() { close(); }
Ms adelante veremos en detalle la clase String, pero una breve descripcin de lo que hace esto es; crear un objeto String y rellenarlo con los caracteres "abc" y crear otro (nuevo) String y colocarle los caracteres "def". En esencia se crean dos objetos:
Objeto String "abc" Objeto String "def"
Al final de la tercera sentencia, el primer objeto creado de nombre s que contiene "abc" se ha salido de alcance. No hay forma de acceder a l. Ahora se tiene un nuevo objeto llamado s y contiene "def". Es marcado y eliminado en la siguiente iteracin del thread reciclador de memoria.
MyApp grilla : GridLayout = new borde : BorderLayout = new paneles : panel[][] = new gp : Graphics = new actual_x : int = null actual_y : int = null superior : Panel = new arriba : Panel = new inferior : Panel = new ta : TextArea = new t1 : TextField = new IngSistemas : pirata = new Rampa : rampa = new Mar : mar = new salvado : boolean = false Barco : barco = new Muelle : muelle = new paint(Graphics) : void init() : void keyDown(Event, int) : boolean muelle peso_actual : int = 70 peso_cadena : String = "" informar_peso: void()
rampa pos_x : int = 0 pos_y : int = 0 mensaje : String = "El Muelle Habla" validar_salida(int, int) : void informar_caer_al_mar: void()
import java.awt.*; import java.awt.event.*; import java.applet.*; public class MyApp extends Applet { GridLayout grilla = new GridLayout(15,5,1,1); BorderLayout borde = new BorderLayout(4,4); Panel paneles[][] = new Panel[5][15]; Graphics gp[][] = new Graphics[5][15]; int actual_x, actual_y; Panel superior = new Panel(); Panel arriba = new Panel(); Panel inferior = new Panel(); TextArea ta = new TextArea(5,30); TextField t1 = new TextField("EL PIRATA PESA"); pirata IngSistemas = new pirata(); rampa Rampa = new rampa(); mar Mar = new mar(); boolean salvado = false; barco Barco = new barco(); muelle Muelle = new muelle(); public void paint(Graphics g) { for(int x = 0; x<5; x++){ for(int y = 0; y<15; y++){ gp[x][y] = paneles[x][y].getGraphics(); if(x == actual_x && y == actual_y){ paneles[x][y].setBackground(Color.red); } else{ paneles[x][y].setBackground(Color.white); } // Cierra else } // cierra for interno
public class mar{ public void ahogar(pirata hombre){ String cadena = ta.getText().trim(); cadena = cadena + "\n EL MAR HABLA: \n"; cadena = cadena + "ESTOY AHOGANDO AL MUERTO"; ta.setText(cadena); IngSistemas.dejarse_ahogar(); } } // Cierra class mar public void init(){ actual_x = 2; actual_y = 0; setLayout(borde); superior.setLayout(new BorderLayout(4,5)); superior.add("Center", arriba); add("Center", superior); add("South", inferior); inferior.add(ta); inferior.add(t1); arriba.setLayout(grilla); setBackground(Color.black); for(int x = 0; x<5; x++){ for(int y = 0; y<15; y++){ paneles[x][y] = new Panel(); } } for(int y = 0; y<15; y++){ for(int x = 0; x<5; x++){ arriba.add(paneles[x][y]); } } Muelle.soportar_peso(IngSistemas.peso); Muelle.informar_peso(); } // Cierra funcion init() public class barco{
String mensaje = ""; public void salvar_pirata(){ salvado = true; mensaje = ta.getText().trim(); mensaje = mensaje + "\n EL BARCO HABLA \n"; mensaje = mensaje + "SALVADO EL PIRATA"; ta.setText(mensaje); } } // Cierra class barco public class muelle{ int peso_actual = 70; String peso_cadena = ""; public void soportar_peso(int valor){ peso_actual = valor; } // Cierra void soportar_peso public void informar_peso(){ peso_cadena = t1.getText().trim(); peso_cadena = peso_cadena + " "; peso_cadena = peso_cadena + peso_actual; peso_cadena = peso_cadena + "KILOS "; t1.setText(peso_cadena); }// int informar_peso } // Cierra class muelle public class rampa{ int pos_x=0; int pos_y=0; String mensaje = "EL MUELLE HABLA; \n"; public void validar_salida(int x, int y){ pos_x = x; pos_y = y; if(pos_y<0){ mensaje = mensaje + "Fuera del rango y"; ta.setText(mensaje); tirar_al_mar(); } if(pos_x<0){
mensaje = mensaje + "Fuera del rango x"; ta.setText(mensaje); tirar_al_mar(); } if(pos_x>=5){ mensaje = mensaje + "Fuera del rango x"; ta.setText(mensaje); tirar_al_mar(); } if(pos_y>=15){ mensaje = mensaje + "NO LO DEJE CAER"; ta.setText(mensaje); Barco.salvar_pirata(); } } // Cierra void validar_salida() public void tirar_al_mar(){ Mar.ahogar(IngSistemas); } // Cierra void tirar_al_mar() } // Cierra class rampa public class pirata{ int pos_x; int pos_y; int peso = 75; // Kilos boolean estado_vida = true; public void moverse(int i, int j){ if(estado_vida){ pos_x = i; pos_y = j; Rampa.validar_salida(pos_x, pos_y); } // Cierra if } // Cierra moverse public void dejarse_ahogar(){ estado_vida = false; } //Cierra void dejarse_ahogar } // Cierra clase pirata
public boolean keyDown(Event evt, int key){ if(IngSistemas.estado_vida && salvado==false){ switch(key){ case Event.RIGHT: actual_x++; IngSistemas.moverse(actual_x, actual_y); repaint(); break; case Event.LEFT: actual_x--; IngSistemas.moverse(actual_x, actual_y); repaint(); break; case Event.UP: actual_y--; IngSistemas.moverse(actual_x, actual_y); repaint(); break; case Event.DOWN: actual_y++; IngSistemas.moverse(actual_x, actual_y); repaint(); break; } return true; } // Cierra if externo return false; } // Cierra boolean } // Cierra clase MyApp
Ahora bien, el usuario, puede desplazarse mediante las teclas de direccin del teclado y de esta manera podr mover el pirata. (que en este caso es la posicin roja). Si el usuario no lo deja desbordarse por alguna posicin de la derecha o de la izquierda y llega a la posicin de debajo de la figura, se obtiene un resultado similar al siguiente:
Pero si el usuario lo deja desbordarse por la derecha o por la izquierda, aparecer una pantalla similar a la siguiente:
Con lo cual se indica que efectivamente se ha caido el pirata al mar y por supuesto se ha ahogado.
avion h : Graphics = null x : int = 150 y : int = 400 cuerpo : rectangulo = new cola : rectangulo = new ala_superior : triangulo = new ala_inferior : triangulo = new punta : triangulo = new matriz : int[][] = new int[17][4] colita : int[][] = null cuerpito : int[][] = null puntica : int[][] = null alita_arriba : int[][] = null alita_abajo : int[][] = new trompita : int[][] = new alejarse() : void ascender() devolver_grafica() : int[][] moverse() avion()
rectangulo h : Graphics = null posx : int = null posy : int = null ancho : int = null alto : int = null rectangulillo : int[][] = new rectangulo() devolver_grafica: int[][]() posicion_derecha: int() posicion_superior: int() posicion_inferior: int() posicionar(rectangulo) : void actualizar_rectangulo(int int int int) : void alargar: void() adelgazar: void() triangulo posx : int = null posy : int = null posx1 : int = null posy1 : int = null posx2 : int = null posy2 : int = null pos : int[][] = new alto : int = null devolver_grafica: int[][]() ajustarse(String) : void ajustarse(String, rectangulo) : void triangulo()
canvitas gra : Graphics = null pintar : int = 0 puntos : int = null apariciones : int = 100 referencia_avion : avion = null pintar(avion) : void paint(Graphics) : void 1..1
1..1
avion.java
import java.awt.*; import java.awt.event.*; import java.applet.*; public class avion{ Graphics h; int x = 150; int y = 400;
rectangulo cuerpo = new rectangulo(); rectangulo cola = new rectangulo(); triangulo ala_superior = new triangulo(); triangulo ala_inferior = new triangulo(); triangulo punta = new triangulo(); int matriz[][] = new int[17][4]; int colita[][]; int cuerpito[][]; int puntica[][]; int alita_arriba[][]; int alita_abajo[][] = new int[3][4]; int trompta[][] = new int[3][4]; public avion(){ // Por medio de punta se establece // el tamao del avion punta.alto = 40; }// Cierra public avion public void alejarse(){ if(punta.alto>10){ punta.alto = punta.alto - 1; }// Cierra ir } // Cierra void alejarse public void ascender(){ if(y>20){ y = y - 5; }// Cierra ir } // Cierra void alejarse public int[][] devolver_grafica(){ // punta.alto = 20; punta.posx = x; punta.posy = y; punta.ajustarse("punta"); cuerpo.alto = punta.alto;
cuerpo.ancho = cuerpo.alto*6; cuerpo.posx = punta.posx1-cuerpo.ancho; cuerpo.posy = punta.posy - (int)punta.alto/2; cola.posicionar(cuerpo); ala_superior.ajustarse("ala_superior", cuerpo); ala_inferior.ajustarse("ala_inferior", cuerpo); colita = cola.devolver_grafica(); puntica = punta.devolver_grafica(); cuerpito = cuerpo.devolver_grafica(); alita_arriba = ala_superior.devolver_grafica(); alita_abajo = ala_inferior.devolver_grafica(); for(int i = 0; i<4; i++){ for(int j = 0; j<4; j++){ matriz[i][j] = colita[i][j]; } // Cierra for interno for(int k = 0; k<4; k++){ matriz[i+4][k] = cuerpito[i][k]; } // Cierra for interno for(int m = 0; m<3; m++){ matriz[m+8][i] = puntica[m][i]; } // Cierra for interno for(int n = 0; n<3; n++){ matriz[n+11][i] = alita_arriba[n][i]; } // Cierra for interno for(int p = 0; p<3; p++){ matriz[p+14][i] = alita_abajo[p][i]; } // Cierra for interno } // Cierra for externo return matriz; } // Cierra devolver_grafica public void moverse(){ x = x+8; }// Cierra void moverse } // Cierra class avion
canvitas.java import java.awt.*; import java.awt.event.*; import java.applet.*; public class canvitas extends Canvas{ Graphics gra; int pintar = 0; int puntos[][]; int apariciones = 100; avion referencia_avion; public void pintar(avion obj_volador){ puntos = obj_volador.devolver_grafica(); referencia_avion = obj_volador; repaint(); } // Cierra pintar public void paint(Graphics g){ this.gra = g; g.setColor(Color.blue); while(apariciones>0){ referencia_avion.moverse(); referencia_avion.alejarse(); referencia_avion.ascender(); puntos = referencia_avion.devolver_grafica(); g.setColor(Color.blue); for(int i = 0; i<17; i++){ g.drawLine(puntos[i][0], puntos[i][1], puntos[i][2], puntos[i][3]); } try{ Thread.sleep(40); } catch(InterruptedException e){ } // Cierra catch g.setColor(Color.yellow); for(int i = 0; i<17; i++){ g.drawLine(puntos[i][0], puntos[i][1], puntos[i][2], puntos[i][3]); } setBackground(Color.yellow); g.drawString("ESTO ES EL CANVAS", 200,300);
apariciones--; } // Cierra while } // Cierra public void paint } // Cierra class canvitas
MyApp.java import java.awt.*; import java.awt.event.*; public class MyApp extends Frame { canvitas tablero = new canvitas(); avion avioncito = new avion(); int apariciones = 500; public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); add(tablero); tablero.pintar(avioncito); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(960,600); f.show(); } }
rectangulo.java
import java.awt.*; import java.applet.*; public class rectangulo{ Graphics h; int posx, posy, ancho, alto; int rectangulillo[][] = new int[4][4]; public rectangulo(){ } // Cierra public rectangulo public int[][] devolver_grafica(){ rectangulillo[0][0] = posx; rectangulillo[0][1] = posy; rectangulillo[0][2] = posx+ancho; rectangulillo[0][3] = posy; rectangulillo[1][0] rectangulillo[1][1] rectangulillo[1][2] rectangulillo[1][3] rectangulillo[2][0] rectangulillo[2][1] rectangulillo[2][2] rectangulillo[2][3] = = = = = = = = posx; posy; posx; posy+alto; posx+ancho; posy; posx+ancho; posy+alto;
rectangulillo[3][0] = posx; rectangulillo[3][1] = posy+alto; rectangulillo[3][2] = posx+ancho; rectangulillo[3][3] = posy+alto; return rectangulillo; } // Cierra int[][] devolver_grafica public int posicion_derecha(){ return posx+ ancho; } // Cierra int posicion_derecha public int posicion_superior(){ return posy;
} // Cierra int posicion_superior public int posicion_inferior(){ return posy+alto; } // Cierra int posicion_inferior public void posicionar(rectangulo rect){ ancho = (int)rect.ancho/5; alto = rect.alto*3; posx = rect.posx -ancho; posy = rect.posy - (rect.alto); } // Cierra mover_derecha public void actualizar_rectangulo(int x, int y, int ancho, int alto){ posx = x; posy = y; this.ancho = ancho; this.alto = alto; } // Cierra public rectangulo public void alargar(int valor){ ancho = ancho + valor; } // Cierra alargar public void adelgazar(int valor){ alto = alto - valor; } // Cierra adelgargar } // Cierra class rectangulo
triangulo.java
import java.applet.*; public class triangulo{ int posx; int posy; int posx1; int posy1; int posx2; int posy2; int pos[][] = new int[3][4]; int alto; public int[][] devolver_grafica(){ pos[0][0] = posx; pos[0][1] = posy; pos[0][2] = posx1; pos[0][3] = posy1; pos[1][0] pos[1][1] pos[1][2] pos[1][3] pos[2][0] pos[2][1] pos[2][2] pos[2][3] = = = = = = = = posx; posy; posx2; posy2; posx1; posy1; posx2; posy2;
public void ajustarse(String tipo){ if(tipo.equals("punta")){ posx1 = posx - (int)alto; posy1 = posy - (int)alto/2; posx2 = posx - (int)alto; posy2 = posy + (int)alto/2;
System.out.println("posx = "+ posx ); System.out.println("posy = "+ posy ); System.out.println("posx1 = "+ posx1 ); System.out.println("posy1 = "+ posy1 ); System.out.println("posx2 = "+ posx2 ); System.out.println("posy2 = "+ posy2 ); } }// Cierra if tipo == "punta" public void ajustarse(String tipo, rectangulo body){ if(tipo.equals("ala_superior")){ posy = body.posy - body.alto*2; posx = body.posx + (int )body.ancho/3; posx1 = body.posx + (int)body.ancho/3 + (int)body.ancho/6; posy1 = body.posy; posx2 = body.posx + (int)body.ancho/3 + (int)body.ancho/3; posy2 = body.posy; }// Cierra if tipo == "ala_superior" if(tipo.equals("ala_inferior")){ posy = body.posy + body.alto + body.alto*2; posx = body.posx + (int )body.ancho/3; posx1 = body.posx + (int)body.ancho/3 + (int)body.ancho/6; posy1 = body.posy + body.alto; posx2 = body.posx + (int)body.ancho/3 + (int)body.ancho/3; posy2 = body.posy + body.alto; System.out.println("ESTOY EN EL FI"); System.out.println("posx = "+ posx); System.out.println("posy = "+ posy); System.out.println("posx1 = "+ posx1); System.out.println("posy1 = "+ posy1); System.out.println("posx2 = "+ posx2); System.out.println("posy2 = "+ posy2); }// Cierra if tipo == "ala_superior" } // Cierra void ajustarse public triangulo(){
// Cierra triangulo
Y a medida que pasa el tiempo se va elevando el avin, tal como se muestra en la siguiente
grfica: Finalmente el avin llega a un punto en el que alcanza la altura mxima y contina volando.
} // Cierra setParametro1 public void printPar4(){ System.out.println("Parametro 4 = "+parametro4); } // Cierra setParametro1 public void printEstado(){ if(estado){ System.out.println("Estado = true"); } else{ System.out.println("Estado = false"); } } public void cambiarEstado(){ if(estado){ estado = false; } else{ estado = true; } } public void printParametros(String objetin){ System.out.println("Parametros de "+objetin); printPar1(); printPar2(); printPar3(); printPar4(); printEstado(); } // Cierra void printParametros() public void modificarParametros(){ parametro1 = 10; parametro2 = 20; parametro3 = 30; parametro4 = 40; cambiarEstado(); } // Cierra void modificarParametros() public Object copiar(){ // Original objOriginal = new Original(); Original objOriginal = this; System.out.println("Copiando objeto"); Original retornar = new Original(); retornar.parametro1 = objOriginal.parametro1; retornar.parametro2 = objOriginal.parametro2; retornar.parametro3 = objOriginal.parametro3; retornar.parametro4 = objOriginal.parametro4; retornar.estado = objOriginal.estado; return retornar; } // Cierra void copiar() } // Cierra class Original
En la cual encontramos que se tienen cinco atributos a saber: Parametro1, Parametro2, Parametro3, Parametro4 y estado, los cuales tienen inicialmente los siguientes valores: parmetro parametro1 parametro2 parametro3 parametro4 estado Valor 1 2 3 4 true
Decimos que queremos modificar los atributos de dicho objeto y esto se hace ejecutando del cdigo anterior las siguientes instrucciones: Es decir ejecutando las instrucciones
parametro1 parametro2 parametro3 parametro4 = = = = 10; 20; 30; 40;
Obviamente estas instrucciones cambian el estado del objeto ObjOriginal definido en el mtodo ejecutarCopia():
public void ejecutarCopia(){ Original origen = new Original(); origen.printParametros("Original "); origen.modificarParametros(); origen.printParametros("Original "); Original destino; destino = (Original)origen.copiar(); destino.printParametros("Destino "); } // Cierra void ejecutarCopia()
Y este es precisamente el mtodo que tiene toda la lgica del programa que queremos explicar. El programa crea el objeto llamado origen:
Despus de lo cual imprime los datos de dicho objeto, con lo cual se produce por la vista consola una salida que muestra los datos contenidos en la siguiente tabla: parmetro parametro1 parametro2 parametro3 parametro4 estado Valor 1 2 3 4 true
Despus modifica los parmetros del mencionado objeto, con lo cual modifica el estado del objeto cuando ejecuta la instruccin:
origen.modificarParametros();
La cual modifica los parmetros expuestos en la anterior tabla y luego se vuelven a imprimir los parmetros del mismo objeto para tener la certeza que realmente se han cambiado los parmetros del objeto tal como venan desde la creacin del objeto. Esto se logra con las instrucciones:
public void modificarParametros(){ parametro1 = 10; parametro2 = 20; parametro3 = 30; parametro4 = 40; cambiarEstado(); } // Cierra void modificarParametros()
Y para tener la certeza que efectivamente se han cambiado los parmetros del objeto, se imprimen nuevamente los parmetros del objeto origen:
public void ejecutarCopia(){ Original origen = new Original(); origen.printParametros("Original "); origen.modificarParametros(); origen.printParametros("Original "); Original destino; destino = (Original)origen.copiar(); destino.printParametros("Destino "); } // Cierra void ejecutarCopia()
Con lo cual se producen unos resultados por consola similar a los mostrados en la siguiente tabla: parmetro Valor
10 20 30 40 false
Y finalmente se saca una copia al objeto origen, invocando el mtodo copiar() del mencionado objeto.
public void ejecutarCopia(){ Original origen = new Original(); origen.printParametros("Original "); origen.modificarParametros(); origen.printParametros("Original "); Original destino; destino = (Original)origen.copiar(); destino.printParametros("Destino "); } // Cierra void ejecutarCopia()
El procedimiento de copia crea un objeto nuevo llamado destino con los atributos que aparecen en la declaracin de la clase del objeto, es decir con los datos: parmetro parametro1 parametro2 parametro3 parametro4 estado Valor 1 2 3 4 true
Pero para simular que la copia es del objeto llamado original es cierta, se copian uno a uno los valores de los atributos del objeto original al objeto destino. Lo cual se encuentra en el mtodo copiar:
public Object copiar(){ // Original objOriginal = new Original(); Original objOriginal = this; System.out.println("Copiando objeto"); Original retornar = new Original(); retornar.parametro1 = objOriginal.parametro1; retornar.parametro2 = objOriginal.parametro2; retornar.parametro3 = objOriginal.parametro3; retornar.parametro4 = objOriginal.parametro4; retornar.estado = objOriginal.estado; return retornar; } // Cierra void copiar()
Claro, la pregunta que viene es: Qu pasa si el numero de atributos es mas grande?. La respuesta podra ser aumentar el numero de instrucciones en nuestro programa que ejecute estas instrucciones, pero la verdad hay otras soluciones mejores como la de crear un vector
con los valores iniciales, para que al modificarlos, ser simple cosa de hacer un ciclo for. Obviamente esta solucin es bastante limitada debido a que si el tipo de atributos del objeto son variados, la cuestin es un poco mas compleja, pero si el objeto a su vez esta conformado por objetos internos que tienen un estado particular, la cuestin de sacarle copia a un objeto ser cosa bastante complicada. Y para finalizar la explicacin es bueno tener en cuenta que el programa completo al que estamos haciendo referencia en esta seccin es el siguiente:
/****************************************************************** Nombre : CopiaObjetos.java Descripcion : El siguiente programa muestra como se : pueden sacar copias de objetos en forma : manual y artesanal Tipo: : No Maneja apuntadores, maneja referencias : Es de tipo AUTONOMO : El programa no usa la interfaz CLONABLE : para sacar copias de objetos Autor : Luis Felipe Wanumen luchofelipe2000@yahoo.com Revision : No hay revisiones por el momento. Agradecimientos : No hay D.Historico : 03/08/2007 ******************************************************************/ import java.awt.*; import java.awt.event.*; public class CopiaObjetos extends Frame { public class Original{ int parametro1 = 1; int parametro2 = 2; int parametro3 = 3; int parametro4 = 4; boolean estado = true; public void printPar1(){ System.out.println("Parametro 1 = "+parametro1); } // Cierra setParametro1 public void printPar2(){ System.out.println("Parametro 2 = "+parametro2); } // Cierra setParametro1 public void printPar3(){ System.out.println("Parametro 3 = "+parametro3); } // Cierra setParametro1 public void printPar4(){ System.out.println("Parametro 4 = "+parametro4); } // Cierra setParametro1 public void printEstado(){ if(estado){
public void printParametros(String objetin){ System.out.println("Parametros de "+objetin); printPar1(); printPar2(); printPar3(); printPar4(); printEstado(); } // Cierra void printParametros() public void modificarParametros(){ parametro1 = 10; parametro2 = 20; parametro3 = 30; parametro4 = 40; cambiarEstado(); } // Cierra void modificarParametros() public Object copiar(){ // Original objOriginal = new Original(); Original objOriginal = this; System.out.println("Copiando objeto"); Original retornar = new Original(); retornar.parametro1 = objOriginal.parametro1; retornar.parametro2 = objOriginal.parametro2; retornar.parametro3 = objOriginal.parametro3; retornar.parametro4 = objOriginal.parametro4; retornar.estado = objOriginal.estado; return retornar; } // Cierra void copiar() } // Cierra class Original public void ejecutarCopia(){ Original origen = new Original(); origen.printParametros("Original "); origen.modificarParametros(); origen.printParametros("Original "); Original destino; destino = (Original)origen.copiar(); destino.printParametros("Destino "); } // Cierra void ejecutarCopia() public CopiaObjetos()
this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } // Cierra CopiaObjetos() public static void main(String args[]) { System.out.println("Starting App"); CopiaObjetos f = new CopiaObjetos(); f.setSize(100,100); f.setVisible(true); f.ejecutarCopia(); } // Cierra void main
Y para lograr la mayor comprensin de este tema, a continuacin se muestran los resultados obtenidos de la ejecucin del programa anterior: Starting App Parametros de Original Parametro 1 = 1 Parametro 2 = 2 Parametro 3 = 3 Parametro 4 = 4 Estado = true Parametros de Original Parametro 1 = 10 Parametro 2 = 20 Parametro 3 = 30 Parametro 4 = 40 Estado = false Copiando objeto Parametros de Destino Parametro 1 = 10 Parametro 2 = 20 Parametro 3 = 30 Parametro 4 = 40 Estado = false En el cual queda claro que los datos del objeto original eran inicialmente los siguientes: OBJETO ORIGINAL PARMETRO VALOR parametro1 1 parametro2 2
3 4 true
Se modificaron artesanalmente los datos del objeto en cuestin y se obtuvieron los siguientes datos: OBJETO ORIGINAL PARMETRO VALOR parametro1 10 parametro2 20 parametro3 30 parametro4 40 Estado false Y despus de ello se saco una copia del objeto ORIGINAL en el objeto DESTINO, con lo cual al imprimir los datos del nuevo objeto creado se obtuvieron los siguientes resultados: OBJETO DESTINO PARMETRO VALOR parametro1 10 parametro2 20 parametro3 30 parametro4 40 Estado false
En el caso del presente ejercicio, era factible sacarle una copia al objeto debido a que los elementos que contenan se les poda sacar copia, pero el problema es cuando los atributos que tiene un objeto no son tan sencillos como del ejercicio en cuestin.
System.out.println("Parametro 4 = "+parametro4); } // Cierra setParametro1 public void printEstado(){ if(estado){ System.out.println("Estado = true"); } else{ System.out.println("Estado = false"); } } public void cambiarEstado(){ if(estado){ estado = false; } else{ estado = true; } } public void printParametros(String objetin){ System.out.println("Parametros de "+objetin); printPar1(); printPar2(); printPar3(); printPar4(); printEstado(); } // Cierra void printParametros() public void modificarParametros(){ parametro1 = 10; parametro2 = 20; parametro3 = 30; parametro4 = 40; cambiarEstado(); } // Cierra void modificarParametros() public Object copiar(){ // Original objOriginal = new Original(); Original objOriginal = this; System.out.println("Copiando objeto"); Object retornar; try{ Object objeto = (Original)objOriginal.clone(); retornar = objeto; return retornar; } catch(Exception e){ return null; } } // Cierra void copiar() public Object Clone(){ try{ return super.clone(); }
catch(CloneNotSupportedException e){ return null; } } // Cierra public Object Clone } // Cierra class Original public void ejecutarClonacion(){ Original origen = new Original(); origen.printParametros("Original "); origen.modificarParametros(); origen.printParametros("Original "); Original destino; destino = (Original)origen.copiar(); destino.printParametros("Destino "); } public Cloncito() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } // Cierra Cloncito() public static void main(String args[]) { System.out.println("Starting App"); Cloncito f = new Cloncito(); f.setSize(100,100); f.setVisible(true); f.ejecutarClonacion(); } // Cierra void main }
Observe amigo lector / estudiante que en el ejemplo anterior no hay necesidad de sacarle copia a cada uno de los atributos que componen el objeto original, debido a que la interfaz Cloneable se encarga de hacer esta labor. Es interesante observar que el tipo de elementos que componen al objeto que se le va a sacar un clon, no hay que programarlo y esto se vuelve una labor transparente al programador. A manera de aclarar la ejecucin del programa anterior, a continuacin se muestran los resultados generados por el mencionado: Starting App Parametros de Original Parametro 1 = 1 Parametro 2 = 2 Parametro 3 = 3 Parametro 4 = 4 Estado = true Parametros de Original
Parametro 1 = 10 Parametro 2 = 20 Parametro 3 = 30 Parametro 4 = 40 Estado = false Copiando objeto Parametros de Destino Parametro 1 = 10 Parametro 2 = 20 Parametro 3 = 30 Parametro 4 = 40 Estado = false Exit code: 0
public class Interna{ int p1 = 11; int p2 = 22; int p3 = 33; } // Cierra class Interna Interna objInterno = new Interna(); boolean estado = true; public void printPar1(){ System.out.println("Parametro 1 = "+parametro1); } // Cierra setParametro1 public void printPar2(){ System.out.println("Parametro 2 = "+parametro2); } // Cierra setParametro1 public void printPar3(){ System.out.println("Parametro 3 = "+parametro3); } // Cierra setParametro1 public void printPar4(){ System.out.println("Parametro 4 = "+parametro4); } // Cierra setParametro1 public void printEstado(){ if(estado){ System.out.println("Estado = true"); } else{ System.out.println("Estado = false"); } } // Cierra public void printEstado() public void cambiarEstado(){ objInterno.p1 = 111; objInterno.p2 = 222; objInterno.p3 = 333; if(estado){ estado = false; } else{ estado = true; } } // Cierra cambiarEstado() public void printParametros(String objetin){ System.out.println("Parametros de "+objetin); printPar1(); printPar2(); printPar3(); printPar4(); printEstado(); System.out.println("ATRIBUTOS DEL OBJETO INTERNO");
System.out.println("p1 = "+objInterno.p1); System.out.println("p2 = "+objInterno.p2); System.out.println("p3 = "+objInterno.p3); } // Cierra void printParametros() public void modificarParametros(){ parametro1 = 10; parametro2 = 20; parametro3 = 30; parametro4 = 40; cambiarEstado(); } // Cierra void modificarParametros() public Object copiar(){ // Original objOriginal = new Original(); Original objOriginal = this; System.out.println("Copiando objeto"); Object retornar; try{ Object objeto = (Original)objOriginal.clone(); retornar = objeto; return retornar; } catch(Exception e){ return null; } } // Cierra void copiar() public Object Clone(){ try{ return super.clone(); } catch(CloneNotSupportedException e){ return null; } } // Cierra public Object Clone } // Cierra class Original public void ejecutarClonacion(){ Original origen = new Original(); origen.printParametros("Original "); origen.modificarParametros(); origen.printParametros("Original "); Original destino; destino = (Original)origen.copiar(); destino.printParametros("Destino "); } public Cloncito1() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } });
} // Cierra Cloncito() public static void main(String args[]) { System.out.println("Starting App"); Cloncito1 f = new Cloncito1(); f.setSize(100,100); f.setVisible(true); f.ejecutarClonacion(); } // Cierra void main }
El cual produce el siguiente resultado: Starting App Parametros de Original Parametro 1 = 1 Parametro 2 = 2 Parametro 3 = 3 Parametro 4 = 4 Estado = true ATRIBUTOS DEL OBJETO INTERNO p1 = 11 p2 = 22 p3 = 33 Parametros de Original Parametro 1 = 10 Parametro 2 = 20 Parametro 3 = 30 Parametro 4 = 40 Estado = false ATRIBUTOS DEL OBJETO INTERNO p1 = 111 p2 = 222 p3 = 333 Copiando objeto Parametros de Destino Parametro 1 = 10 Parametro 2 = 20 Parametro 3 = 30 Parametro 4 = 40 Estado = false ATRIBUTOS DEL OBJETO INTERNO p1 = 111 p2 = 222 p3 = 333 Exit code: 0
Con lo cual vemos que los valores del subojeto eran inicialmente: p1 = 11 p2 = 22 p3 = 33 y fueron modificados intencionalmente por los siguientes en su objeto ORIGEN: p1 = 111 p2 = 222 p3 = 333 pero lo interesante del asunto es que el objeto DESTINO, cuando se imprimen los valores de los subobjetos, tambin tiene en cuenta el subobjeto. Con todo esto se puede concluir que la clonacin, tiene grandes ventajas cuando de sacarle copia a objetos complejos se trate. De tarea se deja al amigo / lector estudiante para compruebe por su propia cuenta que la clonacin cobija a cualquier atributo de objeto incluido en la clase a ser clonable.
panel1.add(ta); luisfelipe = new Persona(); chismoso = new ObservadorPersona(luisfelipe); luisfelipe.addObserver( chismoso ); b1.addActionListener(evento); } public static void main(String args[]) { System.out.println("Starting App"); Observacion f = new Observacion (); f.setSize(200,200); f.setVisible(true); evento.setVentana(f ); chismoso.setVentana(f); }
public void update(Observable observable, Object objeto){ if(observable == personaObservable){ this.refVentana.ta.setText("Edad vista por el observador: "+personaObservable.getEdad()); } } public void setVentana(Observacion refVentana){ this.refVentana = refVentana; } } // Cierra class ObservadorPersona
Cuando se hace click sobre el botn con la etiqueta crecer se producen inicialmente los siguientes resultados:
En la cual queda bien claro que el valor antes de ser modificado y visto por el evento es el valor 0, pero el valor visto por el observador es 1, debido a que este observador es notificado del cambio justamente despus de modificado el valor de la variable edad en la clase Persona.
1. Es posible crear eventos en Java, sin usar las clases que tiene dicho lenguaje para tal fin, simplemente haciendo uso de las clases tipo OBSERVER y OBSERVABLE? 2. Segn lo visto en la seccin sobre OBSERVER y OBSERVABLE es posible que un objeto tipo OBSERVABLE este asociado con varios OBSERVER? 3. Es posible crear un solo objeto OBSERVER que observe a varios objetos OBSERVABLES, pero que dependiendo del objeto que halla sido modificado en su estado se comporte? Si responde afirmativamente a la afirmacin: Cmo hara un programa que implemente dicha funcionalidad? 4. Suponga un programa que tiene una clase que accede a un archivo plano y que dicha clase es usada por varios clientes del aplicativo. Se quiere tener acceso solamente al archivo por parte de un solo usuario y hasta que dicho usuario no halla desocupado y liberado los recursos relacionados con el acceso a dicho archivo no se puede permitir que otro usuario acceda a dicho archivo. Tambin se quiere que la adjudicacin sobre el uso del archivo se entregue por orden de entrada de los diversos usuarios al sistema. Explique mediante un grafico como implementara una solucin de este tipo usando clases tipo OBSERVER y clases tipo OBSERVABLE. 5. Qu otras aplicaciones le ha encontrado a las clases OBSERVER y OBSERVABLE vistas en la unidad?
Y para lograr que se presente la condicin de inicio que al momento de creacin de un MAMIFERO, este se comporte como si fuese un PERRO, tendramos que hacer un constructor en la clase MAMIFERO que defina una referencia a un objeto de tipo ANIMAL y se lo asigne a un objeto tipo PERRO. En trminos de UML, vamos a colocar el constructor
y diremos que el cdigo colocado en mtodo constructor de la clase MAMIFERO ser el siguiente:
public Mamifero() { super(); i=new Perro(); }
Recordemos que la relacin en UML que se coloca es la relacin de realizacin que se simboliza con una flecha punteada y terminada en un triangulo sin rellenar que significa que la clase MAMIFERO implementa la funcionalidad especificada en la clase ANIMAL. Tambien es bueno mencionar que la clase MAMIFERO debe estar asociada con una relacin de dependencia a la clase PERRO. Esto se coloca en UML, mediante el siguiente diagrama:
ANIMAL expresarse() caminar()
Recordemos que la relacin es dependencia debido a que la lnea es punteada y la flecha es abierta. No es complicado pensar que la reacion sea de dependencia puesto que el objeto tipo PERRO debe poderse crear antes que se cree el objeto tipo MAMIFERO debido a que esta creacin se especifica en el constructor de la clase MAMIFERO y como es bien sabido, si no se puede ejecutar el constructor, no se puede crear el objeto. De otra parte lo que se pretende hacer es tener un objeto que sea de un tipo por ejemplo en este caso que sea de tipo MAMIFERO y concretamente que se comporte como si fuera un PERRO, pero que en tiempo de ejecucin y en forma dinmica se pueda cambiar su tipo y pueda llegar a ser incluso de tipo HUMANO, lo cual obliga obviamente a que tanto la clase PERRO como la clase ANIMAL deben compartir una cierta funcionalidad y en este caso la funcionalidad compartida se especifica mediante la implementacin de la clase ANIMAL por parte de ambas clases. En pocas palabras tenemos a nivel de UML, la siguiente situacin:
ANIMAL expresarse() caminar()
Ahora bien, queremos que cuando se cambie el tipo de objeto en tiempo de ejecucin este cambio sea lo mas transparente para el sistema. En pocas palabras queremos que el objeto de tipo MAMIFERO pueda invocar un mtodo que lo convierta a un objeto tipo HUMANO y tambin que le permita en un momento dado convertirse nuevamente en un objeto tipo PERRO. Para lograr esta funcionalidad tendramos que definir dos mtodos adicionales en la clase MAMIFERO que permitan hacer estas alteraciones en tiempo de ejecucin y esta situacin a nivel de UML se muestra a continuacin:
MAMIFERO PERRO expresarse() caminar() Mamifero() toPerro() toHombre() expresarse() caminar() HUMANO expresarse() caminar()
En donde los mtodos toPerro y toHombre hagan uso de una variable tipo interfaz por ejemplo llamada i que pueda ser reasignada en tiempo de ejecucin para el caso del mtodo toPerro tal como se muestra a continuacin:
void toPerro() { i = new Perro(); }
Archivo Hombre.java
public class Hombre implements Animal { public void expresarse() { System.out.println("Hombre expresarse hablando"); } public void caminar() { System.out.println("Hombre caminando en DOS PIES"); } }
Archivo Main.java
public class Main { public static void main(String[] args) { Mamifero c = new Mamifero(); c.expresarse(); c.caminar(); c.toHombre(); c.expresarse(); c.caminar(); } }
Archivo Mamifero.java
public class Mamifero implements Animal { Animal i ; public Mamifero() { super(); i=new Perro(); } public void expresarse() { i.expresarse(); } public void caminar() { i.caminar(); } // Con estos metodos se puede hacer casting // entre objetos tipo Perro y Hombre void toPerro() { i = new Perro(); } void toHombre() { i = new Hombre(); } }
Archivo Perro.java El cual al ser ejecutado arroja unos resultados similares a los siguientes: Perro expresandose ladrando Perro caminando en DOS PATAS Hombre expresarse hablando Hombre caminando en DOS PIES En donde se puede apreciar que al ejecutar las lneas siguientes:
Mamifero c = new Mamifero(); c.expresarse(); c.caminar(); c.toHombre(); c.expresarse(); c.caminar();
Inicialmente se estaba expresando el PERRO: Perro expresandose ladrando Perro caminando en DOS PATAS y despus de convertirse a HOMBRE invocando el mtodo toHombre(), en verdad estaba actuando un hombre debido a que se obtuvieron las dos ultimas lneas: Hombre expresarse hablando Hombre caminando en DOS PIES
Int numeroAmigos=0
Ahora, imaginmonos que han transcurrido 2 anos y el objeto tiene 3 amigos, tendramos entonces la siguiente situacin: Int edad = 0;
String nombre = Hugo;
Int edad = 2;
String nombre = Hugo;
Int numeroAmigos=0
Int numeroAmigos=0
Tiempo 0 NO ALMACENADO
Tiempo 2 NO ALMACENADO
Pensemos que queremos almacenar el estado del objeto en el tiempo 2. Grficamente tendramos la siguiente situacin: Int edad = 0;
String nombre = Hugo;
Int edad = 2;
String nombre = Hugo;
Int numeroAmigos=0
Int numeroAmigos=3
Tiempo 0 NO ALMACENADO
Tiempo 2 ALMACENADO
Pensemos que transcurridos 5 anos, el objeto tiene 6 amigos, situacin que puede verse grficamente como se muestra a continuacin:
Int edad = 0;
String nombre = Hugo;
Int edad = 2;
String nombre = Hugo;
Int edad = 5;
String nombre = Hugo;
Int numeroAmigos=0
Int numeroAmigos=3
Int numeroAmigos=6
Tiempo 0 NO ALMACENADO
Tiempo 2 ALMACENADO
Tiempo 5 NO ALMACENADO
Realicemos ahora una recuperacin del objeto, basado en el objeto que se almaceno. Debera imprimirse pues, el objeto almacenado en el tiempo 2, tal como se muestra a continuacin:
edad = 0; nombre = Hugo; numeroAmigos=0 edad = 2; nombre = Hugo; numeroAmigos=3 edad = 5; nombre = Hugo; numeroAmigos=6 edad = 2; nombre = Hugo; numeroAmigos=3
Tiempo 0 NO ALMACENADO
Tiempo 2 ALMACENADO
Tiempo 5 NO ALMACENAO
En este caso obtenemos una socializacin completa, debido a que todos los elementos contenidos en el objeto fueron almacenados durante el proceso de socializacin y obviamente en el proceso de recuperacin del objeto tambin llamado deserializacin se volvieron a obtener los valores previamente almacenados.
<<Serializable>> ClaseSerializable int edad String nombre int numeroAmigos crecer(int valor) imprimirDatosClase() conseguirAmigos(int numero)
Ahora tan solo resta mostrar el programa que crea un objeto de la clase ClaseSerializable lo usa: Archivo MyApp1.java
import java.io.*; import java.awt.*; import java.awt.event.*; public class MyApp1 { ClaseSerializable objeto1 = null; public MyApp1() { objeto1 = new ClaseSerializable("Hugo"); System.out.println("Datos iniciales del objeto"); objeto1.imprimirDatosClase(); try{ // Creamos los flujos para leer y escribir en archivo.txt
FileOutputStream flujoSalida = new FileOutputStream("archivo.txt"); FileInputStream flujoEntrada = new FileInputStream("archivo.txt"); ObjectOutputStream escritor = new ObjectOutputStream(flujoSalida); ObjectInputStream lector = new ObjectInputStream(flujoEntrada);
// Transcurridos dos anos el objeto ha crecido y ha conocido // tres amigos // Lo hacemos crecer y lo imprimimos
System.out.println("Transcurridos dos anos el objeto ha crecido");
objeto1.imprimirDatosClase(); // Escribimos el objeto en archivo.txt System.out.println("Escribimos el objeto en archivo.txt"); escritor.writeObject(objeto1); // Transcurridos 5 anos el objeto ha crecido // Lo hacemos crecer 5 anos y lo imprimimos. // Tambien haremos que tenga 6 amigos System.out.println("Transcurridos 5 anos el objeto ha crecido"); System.out.println("y ha conocido 6 amigos"); objeto1.crecer(5); objeto1.conseguirAmigos(6); objeto1.imprimirDatosClase(); // Recuperamos el objeto System.out.println("Recuperamos el objeto"); objeto1 = (ClaseSerializable)lector.readObject(); // Imprimimos objeto recuperado System.out.println("Imprimimos objeto recuperado"); objeto1.imprimirDatosClase(); } catch(Exception e){ System.out.println("Errores en algo"); } } public static void main(String args[]) { MyApp1 f = new MyApp1(); } }
En el anterior programa podemos ver primero se crea un objeto en tiempo 0, despus en el tiempo 2 se alteran sus valores y se almacena, en el tiempo 5 se alteran sus valores, pero no se almacena y finalmente en el siguiente tiempo se recupera, con lo cual se deberan ver los valores del objeto que fue guardado en el tiempo 2.
edad = 0; nombre = Hugo; numeroAmigos=0 edad = 2; nombre = Hugo; numeroAmigos=3 edad = 5; nombre = Hugo; numeroAmigos=6 edad = 2; nombre = Hugo; numeroAmigos=3
Tiempo 0 NO ALMACENADO
Tiempo 2 ALMACENADO
Tiempo 5 NO ALMACENAO
Finalmente para probar que la lgica funciona para el programa que estamos mostrando, simplemente vamos a decir que los resultados arrojados por el programa anterior son los siguientes: Datos iniciales del objeto edad = 0 nombre = Hugo numeroAmigos = 0 Transcurridos dos anos el objeto ha crecido y ha conocido 3 amigos edad = 2 nombre = Hugo numeroAmigos = 3 Escribimos el objeto en archivo.txt Transcurridos 5 anos el objeto ha crecido y ha conocido 6 amigos edad = 5 nombre = Hugo numeroAmigos = 6 Recuperamos el objeto Imprimimos objeto recuperado edad = 2 nombre = Hugo numeroAmigos = 3 Exit code: 0 No Errors
En donde se observa que los datos iniciales del objeto eran: Datos iniciales del objeto edad = 0 nombre = Hugo numeroAmigos = 0 Fruto de crear el objeto tan solo con el valor de Hugo en el atributo nombre y de ejecutar las sentencias siguientes:
objeto1 = new ClaseSerializable("Hugo"); System.out.println("Datos iniciales del objeto"); objeto1.imprimirDatosClase();
lo cual produce el resultado: Transcurridos dos anos el objeto ha crecido y ha conocido 3 amigos edad = 2 nombre = Hugo numeroAmigos = 3 Procedemos pues a guardar los datos del objeto usando la instruccin:
// Escribimos el objeto en archivo.txt System.out.println("Escribimos el objeto en archivo.txt"); escritor.writeObject(objeto1);
Con lo cual los siguientes datos son guardados edad = 2 nombre = Hugo numeroAmigos = 3 DATOS ALMACENADOS USANDO SERIALIZACION
Transcurridos 5 anos el objeto ha crecido y ha conocido 6 amigos, lo cual se hace con las instrucciones:
// Transcurridos 5 anos el objeto ha crecido // Lo hacemos crecer 5 anos y lo imprimimos. // Tambien haremos que tenga 6 amigos System.out.println("Transcurridos 5 anos el objeto ha crecido"); System.out.println("y ha conocido 6 amigos"); objeto1.crecer(5); objeto1.conseguirAmigos(6); objeto1.imprimirDatosClase();
Despues restauramos los datos del objeto serializado y lo imprimimos usando las instrucciones:
// Recuperamos el objeto System.out.println("Recuperamos el objeto"); objeto1 = (ClaseSerializable)lector.readObject(); // Imprimimos objeto recuperado System.out.println("Imprimimos objeto recuperado"); objeto1.imprimirDatosClase();
Las cuales producen el resultado siguiente: edad = 2 nombre = Hugo numeroAmigos = 3 DATOS RECUPARADOS DE LA SERIALIZACION
<<Serializable>> ClaseSerializable int edad String nombre int numeroAmigos crecer(int valor) imprimirDatosClase() conseguirAmigos(int numero)
Y se declarar de tipo transient, con lo cual nuestro diagrama de clases toma la siguiente forma:
InterfazSeriali zable
<<Serializable>> ClaseSerializable int edad String nombre transient int numeroAmigos crecer(int valor) imprimirDatosClase() conseguirAmigos(int numero)
Ahora supongamos que estamos usando la misma clase interfaz de la seccin anterior, es decir que estamos usando el archivo mostrado a continuacin:
Archivo InterfazSerializable.java
import java.io.*; public interface InterfazSerializable extends Serializable{ }
Si ejecutamos un programa que haga uso de un objeto que sea del tipo ClaseSerializable y que puede ser un programa como el mostrado en las siguientes lneas: Archivo MyApp1.java
import java.io.*; import java.awt.*; import java.awt.event.*; public class MyApp1 { ClaseSerializable objeto1 = null; public MyApp1() { objeto1 = new ClaseSerializable("Hugo"); System.out.println("Datos iniciales del objeto"); objeto1.imprimirDatosClase(); try{ // Creamos los flujos para leer y escribir en archivo.txt
FileOutputStream flujoSalida = new FileOutputStream("archivo.txt"); FileInputStream flujoEntrada = new FileInputStream("archivo.txt"); ObjectOutputStream escritor = new ObjectOutputStream(flujoSalida); ObjectInputStream lector = new ObjectInputStream(flujoEntrada);
// Transcurridos dos anos el objeto ha crecido y ha conocido // tres amigos // Lo hacemos crecer y lo imprimimos
System.out.println("Transcurridos dos anos el objeto ha crecido");
System.out.println("y ha conocido 3 amigos"); objeto1.crecer(2); objeto1.conseguirAmigos(3); objeto1.imprimirDatosClase(); // Escribimos el objeto en archivo.txt System.out.println("Escribimos el objeto en archivo.txt"); escritor.writeObject(objeto1); // Transcurridos 5 anos el objeto ha crecido // Lo hacemos crecer 5 anos y lo imprimimos. // Tambien haremos que tenga 6 amigos System.out.println("Transcurridos 5 anos el objeto ha crecido"); System.out.println("y ha conocido 6 amigos"); objeto1.crecer(5); objeto1.conseguirAmigos(6); objeto1.imprimirDatosClase();
// Recuperamos el objeto System.out.println("Recuperamos el objeto"); objeto1 = (ClaseSerializable)lector.readObject(); // Imprimimos objeto recuperado System.out.println("Imprimimos objeto recuperado"); objeto1.imprimirDatosClase(); } catch(Exception e){ System.out.println("Errores en algo"); } } public static void main(String args[]) { MyApp1 f = new MyApp1(); } }
Podemos encontrar que los resultados obtenidos fueron los siguientes: Datos iniciales del objeto edad = 0 nombre = Hugo numeroAmigos = 0 Transcurridos dos anos el objeto ha crecido y ha conocido 3 amigos edad = 2 nombre = Hugo numeroAmigos = 3 Escribimos el objeto en archivo.txt Transcurridos 5 anos el objeto ha crecido y ha conocido 6 amigos edad = 5 nombre = Hugo numeroAmigos = 6 Recuperamos el objeto Imprimimos objeto recuperado edad = 2 nombre = Hugo numeroAmigos = 0 Exit code: 0 No Errors
En donde es claro que a pesar que el objeto objeto1 se guardo cuando tena los siguientes valores: edad = 2 nombre = Hugo numeroAmigos = 3 Tambin es cierto que al deserializarse se obtienen los siguientes datos: edad = 2 nombre = Hugo numeroAmigos = 0 Lo que indica que el atributo numeroAmigos no fue almacenado en el momento de la serializacin
Pero tambin es posible que cuando el objeto objeto1 cambie sus valores a los siguientes: edad = 2 nombre = Hugo numeroAmigos = 3
En donde el paso de un estado a otro depende no del numero de amigos que tenga el objeto, sino de la edad del objeto. Tambien podramos pensar en modelar la situacin que el objeto objeto1 tenga los siguientes datos: edad = 5 nombre = Hugo numeroAmigos = 6 Mediante el empleo de la siguiente notacin:
NINO
Con lo cual la alteracin de estos atributos del objeto objeto1 hechas hasta el momento podran modelarse de la siguiente manera:
PRENATAL BEBE
NINO
Y nos restara modelar la situacin en la que se puede pasar al estado anterior, o sea del estado de NINO al estado de BEBE usando la descerializacion y modelndolo tal como se muestra a continuacin:
PRENATAL
BEBE
NINO
Finalmente si el estado inicial es ser PRENATAL y el mximo estado es ser NINO teniendo en cuenta que utpicamente solamente se pueda morir cuando se sea NINO, podramos modelar esta situacin tal como se muestra a continuacin:
PRENATAL
BEBE
NINO
Obviamente el anterior diagrama no es acorde con la realidad debido a que un PRENATAL se puede morir, al igual que un BEBE o un NINO. Con lo cual en la vida real tenemos una situacin como la siguiente:
PRENATAL BEBE
NINO
Aunque para el caso del programa que ya hicimos y que mostramos anteriormente tan solo podemos finalizar si somos NINO.
Archivo ClaseSerializable.java
public class ClaseSerializable implements InterfazSerializable{ public int edad; public String nombre; public transient int numeroAmigos; public ClaseSerializable(String nombrecin){ this.nombre = nombrecin; edad = 0;
numeroAmigos = 0;
public void crecer(int valor){ edad = valor; } public void imprimirDatosClase(){ System.out.println("edad = "+edad); System.out.println("nombre = "+nombre); System.out.println("numeroAmigos = "+numeroAmigos); } public void conseguirAmigos(int numero){ this.numeroAmigos = numero; } }
= = = =
// Imprimimos los datos iniciales de los objetos System.out.println("Datos iniciales de objetos"); objeto1.imprimirDatosClase(); objeto2.imprimirDatosClase(); objeto3.imprimirDatosClase(); objeto4.imprimirDatosClase(); try{ // Creamos los flujos para leer y escribir en archivo.txt
FileOutputStream flujoSalida = new FileOutputStream("archivo.txt"); FileInputStream flujoEntrada = new FileInputStream("archivo.txt"); ObjectOutputStream escritor = new ObjectOutputStream(flujoSalida); ObjectInputStream lector = new ObjectInputStream(flujoEntrada);
// Escribimos los objetos en archivo.txt System.out.println("Escribimos los objetos en archivo.txt"); escritor.writeObject(objeto1); escritor.writeObject(objeto2); escritor.writeObject(objeto3); escritor.writeObject(objeto4); // Transcurridos dos anos los objetos han crecido
System.out.println("Transcurridos dos anos los objetos han crecido");
objeto1.crecer(2); objeto2.crecer(2); objeto3.crecer(2); objeto4.crecer(2); // Imprimimos los nuevos datos de los objetos System.out.println("Imprimimos los nuevos datos de los objetos"); objeto1.imprimirDatosClase(); objeto2.imprimirDatosClase(); objeto3.imprimirDatosClase(); objeto4.imprimirDatosClase();
System.out.println("Y uno de ellos el mas piloso ha conseguido 3 amigos");
// Imprimimos nuevamente datos de los objetos System.out.println("Imprimimos nuevamente datos de los objetos"); objeto1.imprimirDatosClase(); objeto2.imprimirDatosClase(); objeto3.imprimirDatosClase(); objeto4.imprimirDatosClase(); // Volvemos a serializar los objetos System.out.println("Volvemos a serializar los objetos"); escritor.writeObject(objeto1); escritor.writeObject(objeto2); escritor.writeObject(objeto3); escritor.writeObject(objeto4); // Recuperamos los objetos una vez System.out.println("Recuperamos los objetos una vez"); objeto1 = (ClaseSerializable)lector.readObject(); objeto2 = (ClaseSerializable)lector.readObject(); objeto3 = (ClaseSerializable)lector.readObject(); objeto4 = (ClaseSerializable)lector.readObject(); // Falta Imprimir objetos recuperados una vez System.out.println("Falta Imprimir objetos recuperados una vez"); objeto1.imprimirDatosClase(); objeto2.imprimirDatosClase(); objeto3.imprimirDatosClase(); objeto4.imprimirDatosClase(); // Recuperamos los objetos por segunda vez System.out.println("Recuperamos los objetos por segunda vez"); objeto1 = (ClaseSerializable)lector.readObject(); objeto2 = (ClaseSerializable)lector.readObject();
objeto3 = (ClaseSerializable)lector.readObject(); objeto4 = (ClaseSerializable)lector.readObject(); // Falta Imprimir objetos recuperados segunda vez
System.out.println("Falta Imprimir objetos recuperados segunda vez");
objeto1.imprimirDatosClase(); objeto2.imprimirDatosClase(); objeto3.imprimirDatosClase(); objeto4.imprimirDatosClase(); // Recuperamos el objeto 3 System.out.println("Recuperamos el objeto 3"); objeto1 = (ClaseSerializable)lector.readObject(); objeto2 = (ClaseSerializable)lector.readObject(); objeto3 = (ClaseSerializable)lector.readObject(); objeto4 = (ClaseSerializable)lector.readObject(); // Falta Imprimir objeto3 recuperado System.out.println("Falta Imprimir objeto3 recuperado"); objeto3.imprimirDatosClase();
Los cuales producen el resultado siguiente: Datos iniciales de objetos edad = 0 nombre = Hugo numeroAmigos = 0 edad = 0 nombre = Paco numeroAmigos = 0 edad = 0 nombre = Luis numeroAmigos = 0 edad = 0 nombre = Mickey numeroAmigos = 0 Escribimos los objetos en archivo.txt Transcurridos dos anos los objetos han crecido
Imprimimos los nuevos datos de los objetos edad = 2 nombre = Hugo numeroAmigos = 0 edad = 2 nombre = Paco numeroAmigos = 0 edad = 2 nombre = Luis numeroAmigos = 0 edad = 2 nombre = Mickey numeroAmigos = 0 Y uno de ellos el mas piloso ha conseguido 3 amigos Imprimimos nuevamente datos de los objetos edad = 2 nombre = Hugo numeroAmigos = 0 edad = 2 nombre = Paco numeroAmigos = 0 edad = 2 nombre = Luis numeroAmigos = 3 edad = 2 nombre = Mickey numeroAmigos = 0 Volvemos a serializar los objetos Recuperamos los objetos una vez Falta Imprimir objetos recuperados una vez edad = 0 nombre = Hugo numeroAmigos = 0 edad = 0 nombre = Paco numeroAmigos = 0 edad = 0 nombre = Luis numeroAmigos = 0 edad = 0 nombre = Mickey numeroAmigos = 0 Recuperamos los objetos por segunda vez Falta Imprimir objetos recuperados segunda vez edad = 0 nombre = Hugo numeroAmigos = 0
edad = 0 nombre = Paco numeroAmigos = 0 edad = 0 nombre = Luis numeroAmigos = 0 edad = 0 nombre = Mickey numeroAmigos = 0 Recuperamos el objeto 3 Errores en algo Exit code: 0 No Errors Y el amigo lector / estudiante debe dar una explicacin racional y cierta sobre la razn por la cual se producen los resultados anteriores.
<<include>>
Burro
Zoologico
<<include>>
<<include>>
Perro
Domador
Ahora supongamos que el Zoolgico ha comprado dos burros llamados higor y corcelin, como tambin ha comprado dos perros llamados doki y cuchufleto. Con lo cual nuestro diagrama de clases, podra eventualmente tener algunos objetos tal como se muestra a continuacin:
<<include>> Burro Burro: higor
Zoologico
Domador
Perro: cuchufleto
Perro
Perro: cuchufleto
No solamente se usa para denotar que una clase dependa de otra, sino que tambin se usa para denotar relaciones de instanciacin entre clases y los objetos que implementan estas clases. En otras palabras vemos que esto es una relacin de instanciacin. Siguiendo con nuestro ejemplo supongamos que el Zoolgico contrata a un domador llamado pepito para que haga el trabajo de adiestrar a estos animalitos, con lo cual nuestro diagrama tomara la siguiente forma:
<<include>> Burro Burro: higor
Zoologico
<<include>>
Perro
Perro: doki
Domador
Domador: pepito
Perro: cuchufleto
En trminos de cdigo, las relaciones anteriores se crean cuando se crean los objetos, tal como lo muestra el siguiente cdigo fuente:
Burro higor = new Burro("higor"); Burro corcelin = new Burro("corcelin"); Perro doki = new Perro("doki"); Perro cuchufleto = new Perro("cuchufleto"); Domador pepito = new Domador();
Dado que los animales burros y los perros se comportan abstractamente de acuerdo al concepto de animal, es bueno crear una interfaz que obligue a los animales a implementar su mtodo dialogar (). Con la creacin de esta interfaz, tenemos que nuestro nuevo diagrama de clases toma la forma:
Animal dialogar() <<include>> Burro Burro: higor
Zoologico
<<include>>
Perro
Perro: doki
Domador
Domador: pepito
Perro: cuchufleto
Con lo cual queda bien claro que los burros y los perros implementan los contratos especificados en la interfaz Animal. A nivel de cdigo podramos crear la interfaz como se muestra a continuacin:
public interface Animal { public void dialogar(); } // Cierra interface Animal
Con lo cual el diagrama que estamos haciendo tomara una forma similar a la siguiente:
<<include>> Zoologico <<include>> <<include>> Animal dialogar() Domador Perro: doki Burro dialogar() String getNombre() Burro: corcelin Burro: higor
De otra parte el zoolgico tiene dos grandes actividades que son las actividades previas a la funcin y las actividades que realiza cuando la funcin esta presentndose. Por esta razn es necesario agregar a la clase zoolgico dos mtodos que son:
Zoologico realizarActividadesPrevias() mostrarFuncion()
Las actividades previas tienen que ver con adiestrar los animales por parte del Domador, en este caso por parte de pepito, con lo cual a nivel de cdigo tendramos un cdigo similar al siguiente:
public void realizarActividadesPrevias(){ pepito.adiestrar(higor); pepito.adiestrar(corcelin); pepito.adiestrar(doki); pepito.adiestrar(cuchufleto); } // Cierra void realizarActividadesPrevias()
En este caso el mtodo adiestrar() del domador es un mtodo que se encuentra dos veces implementado debido a que permite recibir dos tipos de objetos y de acuerdo a cada uno de ellos sigue el proceso de adiestramiento, puesto que no es lo mismo adiestrar un perro que un burro. De otra parte tenemos que el domador es el nico que conoce cuantos animales tiene a su cargo, con lo cual el tendr un vector que permita almacenar los burros y los perros y la implementacin de sus mtodos adiestrar(), seria similar a la siguiente:
public void adiestrar(Burro animalin){ ThreadBurros hiloBurros = new ThreadBurros(animalin, grupoBurros,animalin.getNombre()); vectorBurros.add(hiloBurros); } // Cierra void adiestrar(Burro) public void adiestrar(Perro animalin){ ThreadPerros hiloPerros = new ThreadPerros(animalin, grupoPerros,animalin.getNombre()); vectorPerros.add(hiloPerros); } // Cierra void adiestrar(Perro)
Observemos este proceso de sincronizacin. Vemos que cuando se adiestran a los animales se tienen grupos para cada animal. Veamos la implementacin pues de cada uno de estos ThreadGroup:
ThreadBurros.java public class ThreadBurros extends Thread{ Burro objetoBurro1; public ThreadBurros(Burro objetoBurro, ThreadGroup grupo, String cadena){ super(grupo, cadena); objetoBurro1 = objetoBurro; } // Cierra constructor ThreadBurros public void run(){ while(true){ try{ this.objetoBurro1.dialogar(); Thread.sleep(1000); } // Cierra try catch(Exception e){ System.out.println("Errores rebusnando"); break; // objetoBurro1.estadoRebusnado(false); } // Cierra catch(); } // Cierra while(true) } // Cierra public void run() } // Cierra public class ThreadBurros En donde simplemente se esta diciendo que un burro cuando comienza a dialogar(), lo hace cada Segundo y si en algun momento algun proceso extrano o ajeno no permite la ejecucion, automaticamente se sale del ciclo para que nunca vuelva ejecutarse el hilo. La implementacin para el ThreadPerros es similar a la anterior y se muestra a continuacin: public class ThreadPerros extends Thread{ Perro objetoPerro1; public ThreadPerros(Perro objetoPerro, ThreadGroup grupo, String cadena){ super(grupo, cadena); objetoPerro1 = objetoPerro; } // Cierra constructor ThreadPerros public void run(){ while(true){ try{ this.objetoPerro1.dialogar(); Thread.sleep(1000); } // Cierra try catch(Exception e){ System.out.println("Errores ladrando");
break; } // Cierra catch(); } // Cierra while(true) } // Cierra public void run() } // Cierra public class ThreadPerros Con todo lo dicho hasta el momento, tenemos que nuestro diagrama tiene una forma similar a la siguiente:
<<include>> Zoologico realizarActividadesPrevias() mostrarFuncion() <<include>> <<include>> Animal dialogar() Domador ThreadPerros ThreadBurros Burro: higor
Burro: corcelin
Perro: cuchufleto
Cuando se pongan a hablar los perros, se obtienen los hilos asociados a cada animal y se comienza la ejecucin del hilo, tal como lo muestran las funciones: ponerHablarBurros() ponerHablarPerros() Las cuales se detallan una a una mas adelante. La funcin ponerHablarBurro, por ejemplo contiene el siguiente cdigo: public void ponerHablarBurros(){ int cantidad = vectorBurros.size(); System.out.println("Cantidad burros = "+cantidad); int contador = 0; while(contador<cantidad){ ThreadBurros grupoBurrosHilos = (ThreadBurros)vectorBurros.elementAt(contador);
try{ grupoBurrosHilos.start(); } catch(Exception e){ System.out.println("Burros no pueden rebusnar"); }// Cierra catch contador++; } // Cierra while } // Cierra void ponerHablarBurros() Es tan complicado hacer este mtodo, que es bueno disear un diagrama que permita modelar la complejidad de dicho mtodo. Para lograr esto, a continuacin se muestra el diagrama de actividad que modela y explica el funcionamiento de dicho mtodo:
v ectorBurros : Vector
grupoBurros : ThreadBurros
<<<<size>>>> obtenerTamano
<<<<println>>>> ImprimirTamano <<<<Max 2>>>> While( contador<2 ) <<<<elementAt>>>> ...>> obtenerElemento <<<<Casting>>>> Conversion
While
Exception?
NO_Exception( e )
SI_Exception( e )
<<<<println>>>> imprimirError
Obviamente el diagrama de actividad para el mtodo ponerHablarPerros, es similar al anterior, pero antes de mostrarlo primero veamos el cdigo fuente de dicho mtodo: public void ponerHablarPerros(){ int cantidad = vectorPerros.size(); System.out.println("Cantidad perros = "+cantidad); int contador = 0; while(contador<cantidad){ ThreadPerros grupoPerrosHilos = (ThreadPerros)vectorPerros.elementAt(contador); try{ grupoPerrosHilos.start(); } catch(Exception e){ System.out.println("Perros no pueden ladrar"); }// Cierra catch contador++; } // Cierra while } // Cierra void ponerHablarPerros()
v ectorPerros : Vector
grupoPerros : ThreadPerros
<<<<size>>>> obtenerTamano
<<<<println>>>> ImprimirTamano <<<<Max 2>>>> While( contador<2 ) <<<<elementAt>>>> ...>> obtenerElemento <<<<Casting>>>> Conversion
While
Exception?
NO_Exception( e )
SI_Exception( e )
<<<<println>>>> imprimirError
La detencin de los procesos simultneos se hace mediante los siguientes mtodos: public void callarBurros(){ try{ System.out.println("Estoy intentando interrumpir"); grupoBurros.interrupt(); System.out.println("PUDE interrumpir a burros"); } catch(Exception e){ System.out.println("No pude callar a Burros"); } // Cierra catch } // Cierra void callarBurros El cual detiene la ejecucin del mtodo dialogar, asociado a cada Burro, Y para el caso de detener los hilos asociados a los Perros, tenemos el siguiente cdigo: public void callarPerros(){ try{ System.out.println("Estoy intentando interrumpir"); grupoPerros.interrupt(); System.out.println("PUDE interrumpir a perros"); } catch(Exception e){ System.out.println("No pude callar a Perros"); } // Cierra catch } // Cierra callarPeros() Observe finalmente que la invocacin del mtodo interrupt() se encarga de detener los hilos asociados a este ThreadGroup. En conclusin todos los hilos que se encuentran en este grupo de hilos, son automticamente detenidos con la invocacin de este mtodo.
boolean estadoRebusno = true; public void dialogar(){ System.out.println("Rebusno bastante"); } // Cierra void dialogar() public Burro(String nombre){ nombrecin = nombre; } // Cierra public Burro() public String getNombre(){ return nombrecin; } } // Cierra class Burro Archivo Domador.java import java.util.*; public class Domador { ThreadGroup grupoPerros = new ThreadGroup("perrillos"); ThreadGroup grupoBurros = new ThreadGroup("burrillos"); Vector vectorBurros = new Vector(); Vector vectorPerros = new Vector(); public void callarAnimales(){ callarBurros(); callarPerros(); } // Cierra void callarAnimales() public void adiestrar(Burro animalin){
ThreadBurros hiloBurros = new ThreadBurros(animalin, grupoBurros,animalin.getNombre());
vectorPerros.add(hiloPerros); } // Cierra void adiestrar(Perro) public void ponerHablarBurros(){ int cantidad = vectorBurros.size(); System.out.println("Cantidad burros = "+cantidad); int contador = 0; while(contador<cantidad){
ThreadBurros grupoBurrosHilos = (ThreadBurros)vectorBurros.elementAt(contador);
try{
// Thread.sleep(500); grupoBurrosHilos.start(); } catch(Exception e){ System.out.println("Burros no pueden rebusnar"); }// Cierra catch contador++; } // Cierra while } // Cierra void ponerHablarBurros() public void ponerHablarPerros(){ int cantidad = vectorPerros.size(); System.out.println("Cantidad perros = "+cantidad); int contador = 0; while(contador<cantidad){ ThreadPerros grupoPerrosHilos = (ThreadPerros)vectorPerros.elementAt(contador); try{ // Thread.sleep(500); grupoPerrosHilos.start(); } catch(Exception e){ System.out.println("Perros no pueden ladrar"); }// Cierra catch contador++; } // Cierra while } // Cierra void ponerHablarPerros() public void callarBurros(){ try{ System.out.println("Estoy intentando interrumpir"); grupoBurros.interrupt(); System.out.println("PUDE interrumpir a burros"); } catch(Exception e){ System.out.println("No pude callar a Burros"); } // Cierra catch } // Cierra void callarBurros public void callarPerros(){ try{ System.out.println("Estoy intentando interrumpir"); grupoPerros.interrupt(); System.out.println("PUDE interrumpir a perros"); }
catch(Exception e){ System.out.println("No pude callar a Perros"); } // Cierra catch } // Cierra callarPeros()
} // Cierra class Domador Archivo Perro.java public class Perro implements Animal{ String nombrecin =""; boolean estadoLadro = true; public void dialogar(){ System.out.println("ladro bastante"); } // Cierra void dialogar() public Perro(String nombre){ nombrecin = nombre; } // Cierra public Perro() public String getNombre(){ return nombrecin; } } // Cierra class Perro Archivo ThreadBurros.java public class ThreadBurros extends Thread{ Burro objetoBurro1; public ThreadBurros(Burro objetoBurro, ThreadGroup grupo, String cadena){ super(grupo, cadena); objetoBurro1 = objetoBurro; } // Cierra constructor ThreadBurros public void run(){ while(true){ try{ this.objetoBurro1.dialogar(); Thread.sleep(1000); } // Cierra try catch(Exception e){ System.out.println("Errores rebusnando"); break; // objetoBurro1.estadoRebusnado(false); } // Cierra catch();
} // Cierra while(true) } // Cierra public void run() } // Cierra public class ThreadBurros Archivo ThreadPerros.java public class ThreadPerros extends Thread{ Perro objetoPerro1; public ThreadPerros(Perro objetoPerro, ThreadGroup grupo, String cadena){ super(grupo, cadena); objetoPerro1 = objetoPerro; } // Cierra constructor ThreadPerros public void run(){ while(true){ try{ this.objetoPerro1.dialogar(); Thread.sleep(1000); } // Cierra try catch(Exception e){ System.out.println("Errores ladrando"); break; } // Cierra catch(); } // Cierra while(true) } // Cierra public void run() } // Cierra public class ThreadPerros Archivo Zoologico.java public class Zoologico { Burro higor = new Burro("higor"); Burro corcelin = new Burro("corcelin"); Perro doki = new Perro("doki"); Perro cuchufleto = new Perro("cuchufleto"); Domador pepito = new Domador(); public void realizarActividadesPrevias(){ pepito.adiestrar(higor); pepito.adiestrar(corcelin); pepito.adiestrar(doki); pepito.adiestrar(cuchufleto); } // Cierra void realizarActividadesPrevias() public void mostrarFuncion(){
pepito.ponerHablarBurros(); pepito.ponerHablarPerros(); try{ Thread.sleep(7000); pepito.callarAnimales(); } catch(Exception e){ System.out.println("Errores callando burros o perros"); } } // Cierra mostrarFuncion() public static void main(String[] args) { Zoologico programa = new Zoologico(); programa.realizarActividadesPrevias(); programa.mostrarFuncion(); } // Cierra statico void main() } // Cierra class Zoologico
pueda invocar un mtodo de la misma con el nimo que sta sea capaz de entregar un objeto especfico hijo(i) que no siempre ser el mismo, pero que lo nico cierto es que siempre va a ser un objeto de una clase que a su vez hereda de la gran clase padre. En el caso particular que nos proponemos realizar tenemos la siguiente situacin: Se requiere hacer una clase que sea capaz de premiar a una carrera de la Universidad, dndole un cupo adicional a un estudiante para que ingrese a un proyecto curricular especfico. El proyecto curricular especfico que gana la premiacin se elige a la zar. Lo importante es que el programa sea capaz de crear verdaderamente el estudiante y que no sea fijo que se cree dicho estudiante. El programa propuesto anteriormente se puede resolver
Est_musica Est_preescolar Premiacion dev_Nuevo_Cupo : Estudiante
Estudiante
Est_sis_datos
Est_ing_civil
Est_electronica
Est_literatura
Ahora bien, para lograr una mayor comprensin del patrn, a continuacin se muestra el programa completo que implementa mencionado patrn y que trabaja las clases mostradas en el diagrama anterior:
import java.awt.*; import java.awt.event.*; public class MyApp extends Frame { public class Estudiante{ protected int cod_carrera; public int dev_Cod_carrera(){ return cod_carrera; } } public class Est_sist_datos extends Estudiante{ public Est_sist_datos(){ cod_carrera=1; System.out.println("Se ha creado un estudiante"); System.out.println("tipo Est_sist_datos");
public class Est_ing_civil extends Estudiante{ public Est_ing_civil(){ cod_carrera=2; System.out.println("Se ha creado un estudiante"); System.out.println("tipo Est_ing_civil"); } } public class Est_electronica extends Estudiante{ public Est_electronica(){ cod_carrera=3; System.out.println("Se ha creado un estudiante"); System.out.println("tipo Est_electronica"); } } public class Est_literatura extends Estudiante{ public Est_literatura(){ cod_carrera=4; System.out.println("Se ha creado un estudiante"); System.out.println("tipo Est_literatura"); } } public class Est_musica extends Estudiante{ public Est_musica(){ cod_carrera=5; System.out.println("Se ha creado un estudiante"); System.out.println("tipo Est_musica"); } } public class Est_preescolar extends Estudiante{ public Est_preescolar(){ cod_carrera=6; System.out.println("Se ha creado un estudiante"); System.out.println("tipo Est_preescolar"); } } public class Premiacion{ int sorteo; public Premiacion(){ sorteo = (int)(Math.random()*6); } public Estudiante dev_NuevoCupo(){ switch(sorteo){ case 0: return new Est_sist_datos(); case 1: return new Est_ing_civil(); case 2: return new Est_electronica();
case 3: return new Est_literatura(); case 4: return new Est_musica(); default : return new Est_preescolar(); } } // Cierra public Estudiante dev_NuevoCupo() } public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); Premiacion premiacion1 = new Premiacion(); Estudiante estudiante1 = premiacion1.dev_NuevoCupo(); int carrera = estudiante1.dev_Cod_carrera(); System.out.println("Se ha creado un nuevo"); System.out.println("cupo para un estudiante que"); System.out.println("pertenece a la carrera con"); System.out.println("codigo = "+carrera); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); } }
Los resultados del anterior programa son similares a los siguientes: Se ha creado un estudiante tipo Est_ing_civil Se ha creado un nuevo cupo para un estudiante que pertenece a la carrera con codigo = 2 Lo cual comprueba que verdaderamente se crea el cupo para un estudiante de ingeniera civil. Obviamente la ejecucin del anterior programa generara resultados diferentes cada vez que se ejecute, por ejemplo cuando el autor ejecut por segunda vez el anterior programa, se tuvieron los resultados siguientes: Se ha creado un estudiante tipo Est_electronica Se ha creado un nuevo
cupo para un estudiante que pertenece a la carrera con codigo = 3 Normalmente las clases que heredan las clases Factory heredan un comportamiento comn de una clase abstracta, pero implementan a su manera los mtodos abstractos.
public class MyApp extends Frame { public abstract class Parcial{ public String TipoParcial; public abstract String entregarTipoParcial(); } // Cierra class Parcial public class ParcialBueno extends Parcial{ public String entregarTipoParcial(){ return TipoParcial; } public ParcialBueno(){ TipoParcial = "BUENO"; } } // Cierra class ParcialBueno public class ParcialMalo extends Parcial{ public String entregarTipoParcial(){ return TipoParcial; } public ParcialMalo(){ TipoParcial = "MALO"; } } // Cierra class ParcialMalo public class ParcialExcelente extends Parcial{ public String entregarTipoParcial(){ return TipoParcial; } public ParcialExcelente(){ TipoParcial = "EXCELENTE"; } } // Cierra class ParcialExcelente public abstract class Estudiante{ int TipoExamen; public void presentarEvaluacion(){ TipoExamen = (int)(Math.random()*6); } public Parcial entregarEvaluacion(){ switch(TipoExamen){ case 2: return new ParcialExcelente(); case 1: return new ParcialBueno(); default: return new ParcialMalo(); } // Cierra switch } // Cierra entregarEvaluacion() } // Cieraa class Estudiante public class EstudianteExcelente extends Estudiante{ } public class EstudianteBueno extends Estudiante{
} public class EstudianteMalo extends Estudiante{ } public class Universidad{ Vector Matriculados = new Vector(); public void matricularEstudiantes(){ for(int i=0;i<10;i++){ int TipoEst = (int)(Math.random()*4); switch(TipoEst){ case 2 : Matriculados.addElement(new EstudianteExcelente()); case 1 : Matriculados.addElement(new EstudianteBueno()); default : Matriculados.addElement(new EstudianteMalo()); } } // Cierra for } // Cierra void matricular public void imprimirEstudiantesMatriculados(){ System.out.println(Matriculados.toString()); } public void entregarMencion(){ for(int i=0;i<10;i++){ Estudiante estu = (Estudiante)Matriculados.elementAt(i); if(estu instanceof EstudianteExcelente){ System.out.println("entrega mencion a estudiante"); } // Cierra if } // Cierra for } // Cierra void entregarMencion } // Cierra class Universidad public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); Universidad UDistrital = new Universidad(); UDistrital.matricularEstudiantes(); UDistrital.imprimirEstudiantesMatriculados(); UDistrital.entregarMencion(); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show();
Obsrvese que en la medida de lo posible es mejor procurar que la clase Estudiante sea una clase abstracta, que describa en lo posible en forma general las funcionalidades, pero que se implementen de diferente manera en las clases que hereden de dicha clase.
En el ejercicio que nos proponemos desarrollar en la siguiente seccin queremos usar la anterior clase desde un programa llamado MyApp y esto en trminos de UML seria como se muestra a continuacin:
Con lo anterior estamos diciendo con el rombo en la flecha que se trata de una agregacin y esto quiere decir que el programa MyApp puede existir si existen o no existen objetos tipo Impresora. Se le coloca una relacin unidireccional debido a que no es posible que una impresora contenga objetos de tipo MyApp. Y para especificar que tenemos o que estamos usando el patrn singleton, a continuacin le colocamos una multiplicidad a la relacin de asociacin tal como se muestra a continuacin:
catch(Exception e){ } } // Cierra MyApp public static void main(String args[]) { MyApp f = new MyApp(); }
Archivo Impresora.java
public class Impresora{ static String trabajo = null; public Impresora(String traba){ } public static Impresora getInstance(String trabajo1){ if(trabajo == null){ trabajo = trabajo1; return new Impresora(trabajo1); } else{ return null; } } // Cierra getInstance } // Cierra class PrimerAmor
En otras palabras estamos diciendo que aunque a nivel de programacin se pueden crear los objetos con instrucciones como la siguiente:
Impresora impresora1 = new Impresora("Trabajin1");
Si usted quiere trabajar con el patrn singleton debe usar tan solo el mtodo getInstance() para la creacin de objetos porque si no se corre el riesgo que se este intentando crear un objeto que no sea el primero y el constructor no realizara este tipo de comprobaciones.
Otra de las cosas a tener en cuenta con el uso del patrn singleton es que la asignacin de un valor para la variable esttica usada como punto de referencia para controlar si ya se han creado instancias puede hacerse no necesariamente desde el mtodo getInstance(), es decir que para el ejercicio que venimos realizando podemos hacer la asignacin desde el mismo constructor de la clase, tal como se muestra a continuacin:
CMM
CMMI
procesos relacionados con el desarrollo del software Se deben usar como referencia para definir procesos en una organizacin y para autoevaluaci n Evolucin de CMM con el objetivo de facilitar la integracin de varios modelos de forma simultnea. Incorpora un rea de proceso dedicada a Medicin y Anlisispa ra dar soporte al resto de reas de proceso. El estado de madurez se divide en 6 niveles (incompleto, ejecutado, gestionado, definido, cuantitativa mente
anlisis de la medicin Establecer los objetivos de la medicin. Especificar medidas. Especificar procedimie ntos de recogida y almacenam iento. Especificar procedimie ntos de anlisis. Proporcionarlos resultados de la medicin. Recoger los datos de la medicin. Analizar los datos de la medicin Almacenar los datos y resultados Comunicar los resultados
gestionado y optimizado). PSP Enfocado en individuos Enfocados a la ingeniera de productos de software Nos dice el cmo debemos hacer las cosas Se usa como gua para ejecutar proyectos Se basa en la mejora de los procesos, pero centrndose en el ingeniero de software. Proyectos cortos y de poca calidad. TSP Enfocados en equipos Diseado con el objetivo de Se trata de un proceso software diseado para mejorar las actividades y la productivid ad de los ingenieros. La calidad depende del trabajo de los ingenieros de software. Mejora la planeacin del trabajo. Mejora tcnicas de desarrollo.
(incluye psp) Enfocados a la ingenieria del software Proporciona los fundamento s necesarios para construir y guiar a un grupo de ingenieros software, que primero deben saber controlar su trabajo, y despus saber trabajar en equipo.
facilitar alcanzar el nivel 5 CMM. Contribuye a la administrac in eficiente de proyectos. Enfocados en reducir riesgos e incertidum bre en un proyecto de software.
TICKLT
ISO-9001 ISO-90003
Desventajas
No es especfica para la industria de software. No es fcil de entender. No est definida como un conjunto de procesos.
No es fcil de aplicar.
Especfico para el desarrollo y mantenimiento de software. Fcil de entender (24 procesos, 16 pginas). Definido como un conjunto de procesos. Orientado a mejorar los procesos para contribuir a los objetivos del negocio.
Desventajas
No es prctico ni fcil de aplicar. Tiene solamente lineamientos para un mecanismo de evaluacin. Todava no es norma internacional.
Proporciona un marco de trabajo para la evaluacin del proceso y establece los requisitos mnimos para realizar una evaluacin que asegure la repetibilidad y consistencia de las valoraciones obtenidas El objetivo de la evaluacin del proceso es conocer la capacidad de los procesos de una organizacin. Como resultado de una exitosa implementacin de la evaluacin de los procesos se determina la informacin que caracteriza los procesos evaluados y el punto hasta el cual los procesos realizan su propsito
Y aunque los anteriores atributos no se pueden medir directamente son una base para realizar medidas indirectas.
Gestin de la configuracin Anlisis y resolucin de decisiones Gestin integral de proyecto Gestin integral de proveedores Gestin de equipos Medicin y anlisis Entorno organizativo para integracin Innovacin y desarrollo Definicin de procesos Procesos orientados a la organizacin
Soporte Soporte Gestin de proyectos Gestin de proyectos Gestin de proyectos Soporte Soporte Gestin de procesos Gestin de procesos Gestin de procesos
2 3 3 3 3 2 3 5 3 3 4 3 3 2 2 2 4 3 2 3 2 3
Rendimiento de los procesos de la org. Gestin de procesos Formacin Integracin de producto Monitorizacin y control de proyecto Planificacin de proyecto Gestin calidad procesos y productos Gestin cuantitativa de proyectos Desarrollo de requisitos Gestin de requisitos Gestin de riesgos Gestin y acuerdo con proveedores Solucin tcnica Gestin de procesos Ingeniera Gestin de proyectos Gestin de proyectos Soporte Gestin de proyectos Ingeniera Ingeniera Gestin de proyectos Gestin de proyectos Ingeniera
Validacin Verificacin
Ingeniera Ingeniera
3 3
Dentro del marco terico plasmado anteriormente vemos que la gestin de configuraciones cobra una especial importancia en el desarrollo de sistemas y obviamente como casi todas las cosas han sido plasmadas primero en forma terica por expertos del rea y luego algunas personas han tratado de dar soluciones reales en el rea. Pues bien, la gestin de configuraciones es un rea tratada durante aos por la Ingeniera de Software, pero en los ltimos aos se ha incrementado su inters tanto que surgieron teoras al respecto. La cuestin es que dentro de la gestin de configuraciones un punto bien importante a tratar es
la gestin de versiones cosa que hasta hace unos aos se trataba solamente en forma terica, pero afortunadamente en estos ltimos cinco aos se ha visto favorecida debido al surgimiento de sistemas que permiten a los desarrolladores de sistemas gestionar las versiones e incluso ir ms all y gestionar las subversiones. Obviamente los sistemas actuales que permiten la gestin de configuraciones son sistemas que tienen algunas limitaciones, pero que as mismo tambin brindan algunas facilidades y ste es precisamente el objetivo de este artculo, poder dar una idea mundial del estado en el que se encuentran dichos sistemas y poder hacer algunas predicciones de los posibles caminos que pueden tomar estos sistemas basndonos en las cuestiones que les hace falta mejorar a los sistemas actuales. Tambin se pretenden sacar algunas conclusiones sobre lo que son y lo que no son los sistemas de gestin de configuraciones. Se han realizado algunos trabajos sobre el tema, pero han sido desarrollados en su mayora por personas que estn inclinadas tecnolgicamente a utilizar una u otra tecnologa, por ejemplo Microsoft ha publicado algunos trabajos para hablar sobre la gestin de configuraciones y especficamente sobre la gestin del control de versiones en proyectos de desarrollo de sistemas, pero inmediatamente despus comienza hablando sobre las herramientas que ofrece para apoyar dicha gestin, esto obviamente se hace debido a que estn inclinados por la utilizacin de dichas herramientas. En otros casos algunos fervientes amantes del software amparado por GNU muestran a los sistemas CVS de cdigo abierto como los mejores, pero la verdad es bueno tener el objetivismos para hacer anlisis medios en los que no se subestime una u otra tecnologa. En este sentido el presente artculo espera ser de valiosa ayuda para todo aquel que quiera comprender el estado actual de los sistemas de control de versiones.
Indagar sobre los tipos de sistemas de control de versiones Analizar el papel que cumplen los CVS dentro de la Ingeniera de Software Indagar sobre los desarrollos ms importantes actualmente hechos por empresas desarrolladores de sistemas para ayudar a implementar CVS Observar las caractersticas que deben tener los buenos CVS y hacer algunas precisiones sobre el futuro que tienen estos sistemas en el desarrollo de sistemas a largo y mediano plazo. Precisas algunas conclusiones que no se encuentren en textos algunos, sino que sean el resultado de analizar lo que son los CVS y de su estado actual.
No solamente un CSV es esto, sino que tiene otras cosas como poder sacar instantneas de cualquier momento de la historia a parte de manejar unas tecnologas complejas que son descritas con ms detalle en [Ref 1]
usuarios con respecto al servidor de versiones. Es as como encontramos usuarios administradores, usuarios annimos e invitados[Ref 2,II] Existen variedad de formas para implementar sistemas de control de versiones [Ref 3] [Ref 4] [Ref 5], entre los que tenemos: Sistema de control de versiones clsico Modelo optimista de control de modificaciones concurrentes Clientes disponibles para muchas plataformas Modelo cliente-servidor (no desde el principio) Gestin conjunta de grupos de ficheros Sistemas complementarios pueden soportar acceso va web
II
En esta referencia encuentra tambin como configurar estos permisos para los diversos usuarios del servidor de control de versiones. III Sobre este proceso podemos encontrar bastante informacin en el libro [Ref Biblio 2] denominado The Unified Software Development Process
y en cada una de estas fases se tienen unos flujos de trabajo del proceso que son: Modelado del negocio Requisitos anlisis y diseo implementacin Pruebas Despliegue Flujos de trabajo de soporte Gestin del Cambio y configuraciones Gestin del proyecto Entorno La pregunta que hasta ahora se ha hecho la Ingeniera de Software es: Cmo hacer una verdadera gestin del cambio y configuraciones?. Para responder a ste pregunta se han establecido una serie de pasos a nivel metodolgico y algunos de estos pasos se encuentran incluso dentro de metodologas como CMM cuando la incluyen en las primeras etapas para llevar a los equipos de desarrollo a niveles de calidad altos[Ref 12], pero lo interesante es que hasta hace muy poco se cuenta con herramientas computaciones que permitan el desarrollo de sta tarea en forma efectiva, es entonces cuando surge CSV como un sistema que se puede implementar para el control de versiones y por supuesto las grandes empresas de software han ahondado en esfuerzos tendientes a dar soluciones al problema del control de versiones e incluso como se ver ms adelante algunas no solamente se quedan en el problema de las versiones, sino que quieren detallar ms el proceso y piensan en el problema de las subversiones.
Es importante notar que personas como el Dr Jess M. Gonzlez Barahona profesor de la Universidad de Juan Rey en Espaa dicen que aegis tiene una funcionalidad similar a los CVS. Al doctor lo podemos encontrar en la direccin eletrnica: jgb@computer.org jgb@gsyc.escet.urjc.es
el manejo de versiones. De todas formas lo nico cierto es que ha tenido gran aceptacin mundial y un crecimiento grande del nmero de empresas y entidades que lo implementan. Existe un sistema llamado Vesta[Ref 8], el cual permite el control de versiones y adicionalmente est concebido con nfasis en el rendimiento y ha sido pensado para grandes sistemas, lo malo es que hasta el momento ha sido difcil de portar, por cuanto actualmente funciona solamente sobre LINUX. Para el caso de Microsoft tenemos que esta gran empresa de desarrollo de soluciones informticas ha pensado en dar soluciones especficas para desarrolladores pequeos y para desarrolladores grandes. Para las empresas de desarrollo pequeas y/o desarrolladores independientes la solucin es Visual Source Safe 2005 y para desarrollos complejos la solucin est basada en Visual Studio 2005 Team System: Enterprise Class Source Control and work Item Tracking[Ref 9]. Entre las cosas ms atractivas de las soluciones ofrecidas por Microsoft, podemos citar el hecho que dichas herramientas ofrecidas por esta empresa para el control de versiones cubren aspectos como el modelado, la documentacin, las pruebas, la administracin del software y en s se podra decir que son herramientas que satisfacen las necesidades completas para la administracin del ciclo de vida del software.
Si quiere saber ms sobre GNU puede entrar a la direccin electrnica: http://www.gnu.org Estos programas ayudan a catalogar programas y algunos autores lo denominan catlogo de mensajes
VI
Es importante notar que para automatizar la gestin de cambio de idioma se deben primero establecer reglas simples para especificar las traducciones que se deben hacer, tal como lo menciona el Dr Jess M. Gonzlez Barahona a quien le podemos escribir a la direccin: jgb@computer.org jgb@gsyc.escet.urjc.es
la documentacin. El establecer cuando se llega a una versin es algo importante y debe obedecer a polticas institucionales de desarrollo de versiones. Es importante pues en este sentido que no se establezcan versiones definitivas sin antes haber pasado dichos productos por otro tipo de versiones. En este sentido tenemos pues que un buen mecanismo para establecer versiones, es definir tipos de versiones como pueden ser: versiones alfa, versiones beta y versiones definitivas. Ahora bien, veamos entonces algunas de las caractersticas que debe tener un buen control de versiones: Un sistema de control de versiones debe primero que todo tener la posibilidad de darle al desarrollador la posibilidad de establecer el momento en el que desea indicarle al sistema que tiene una versin. Obviamente este momento tiene que estar acompaado de un almacenamiento confiable de toda la informacin del proyecto en el momento de tomar la decisin de establecer la fijacin de una versin. De otra parte podemos pensar que de la anterior caracterstica surge otra bien importante y que tiene que ver con la posibilidad que debe tener el desarrollador de sistemas de conocer cuales son las diferencias que se tienen entre lo que se tiene actualmente con la ltima versin, esto con el fin de saber si ya es el momento preciso para tener una nueva versin, o de si todava los esfuerzos hechos no ameritan el lanzamiento de una nueva versin. Los sistemas de control de versiones deben ser sistemas que soporten varios programadores trabajando al mismo tiempo, algo similar a lo que pasaba cuando comenzaron los primeros entornos de desarrollo para trabajar en aplicaciones web. Recordemos por ejemplo lo que hizo Microsoft con su herramienta inicial Microsoft Visual Interdev 6.0 en la que se trabajaban simultneamente los conceptos de servidor de produccin (que procesaba las pginas), servidor maestro (que procesaba las copias principales) y servidor local (que se encontraba en una estacin de trabajo y proporcionaba funcionalidades necesarias para probar todos los tipos de elementos web antes de extenderlos a la aplicacin web maestra) [Ref Bib 4, pag 476]. Pues bien en los sistemas de control de versiones se mejoran estos conceptos y se permiten seguridades ms grandes y controles no solamente a nivel de cdigo fuente, sino a nivel de auditora para saber en determinado momento que desarrollador hizo un cambio que da el desarrollo del sistema, para que sea almacenado por medio de registros recuperables que permitan con un gran alto grado de seguridad recuperar la versin con toda su funcionalidad. Los buenos sistemas de control de versiones deben permitir al equipo desarrollador recuperar versiones previas en el desarrollo del ciclo de vida del software que muestren no solamente las lneas que han cambiado, sino la documentacin que ha sido agregada y/o eliminada, entendiendo por documentacin los diagramas, los diccionarios, la documentacin del cdigo fuente, tal como por ejemplo lo implementa Visual Source Safe [Ref 13] Los sistemas de control de versiones deben tener capacidades de compartir y enlazar archivos de desarrollo para promover la reutilizacin de cdigo y componentes entre proyectos y simplificarel mantenimiento de cdigo al preparar los cambios entre todos los
archivos compartidos y enlazados cuando un archivo sea actualizado, lo cual por ejemplo es algo que tambin implementa Visual Source Save[Ref 13] Las caractersticas de desarrollo en parelelo, como el "branching", permite que los equipos separen el proceso de desarrollo en proyectos y archivos paralelos, creando copias idnticas que heredan toda la documentacin de versiones pero que se les puede dar seguimiento como proyectos nuevos e individuales[Ref 13]. Esto obviamente debe estar soportado por una alta tecnologa que permita reconciliar diferencias entre diferentes versiones del mismo archivo y permita ver como se comportara una determinada versin al ser incluida dentro del proyecto, pero todo esto bajo la premisa de evitar al mximo la prdida potencial de cambios valiosos. Al igual que con los usuarios de cualquier otro sistema, los sistemas de control de versiones deben permitir manejar niveles de usuarios aunque globalmente todos sean desarrolladores de software y de sistemas es bueno que el sistema de control de versiones permita la gestin de usuarios en el equipo de desarrollo basado en polticas de seguridad y niveles de permisos [Ref 3] [Ref 4].
Cuando surgen problemas en el desarrollo del sistema y se toma la decisin de volver a una versin previamente almacenada se puede fcilmente volver con las herramientas actuales, pero si por desgracia se quiere volver a un tiempo en el ciclo de desarrollo del sistema que no halla sido previamente almacenado y establecido en el sistema, se tienen actualmente muchas limitaciones en todos los sistemas CVS actuales. Tambin podemos decir que aunque los CVS actuales permiten combinar archivos diferentes que correspondan a versiones diferentes, existe todava un alto grado de posibilidad que al hacerlo un archivo pueda estropear indirectamente otras cosas, pero que no sea tan evidente. En estos casos, decimos que para reconciliar de una mejor manera los problemas al mezclar archivos se deben hacer simulaciones de cmo sera la integracin del sistema, pero dichas simulaciones todava no son posibles con los CVS actuales. Otra cuestin bien relacionada con la conclusin anterior es que al combinar diversas versiones se toman decisiones basadas en la experiencia, el buen conocimiento de programacin y otras cuestiones que de ninguna manera pueden ser reemplazadas por sistemas actuales. Decimos entonces que tcnicas como la inteligencia artificial todava no se han integrado de forma plena a los CVS actuales. Podemos pensar que los actuales CVS estn diseados para gestionar versiones de desarrollo de software en lenguajes especficos, por ejemplo los sistemas creados por Microsoft, son para ser utilizados en equipos de desarrollo que usen herramientas de Microsoft, de la misma forma otros sistemas en software amparado por GNU siguen siendo especficos para ciertos lenguajes de programacin y esto obviamente lleva a pensar que estamos muy lejos de construir sistemas de control de versiones que soporten desarrollos de sistemas basados en mltiples lenguajes.
El Lengueje Unificado de Modelado Grady Booch, James Rumbaugh, Ivar Jacobson Addison Wesley 1999 El Lengueje Unificado de Modelado Grady Booch, James Rumbaugh, Ivar Jacobson Addison Wesley 2002 The Unified Software Development Process Grady Booch, James Rumbaugh, Ivar Jacobson
Addison Wesley Object Technology Series 2003 Microsoft Visual Interdev 6.0 Manual del programador Microsort Press Mc Graw Hill 1999
Direccin:
http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnvsent/html/vsts-arch.asp Fecha: 5 de Febrero de 2005 [Ref 10] Direccin: http://www.gnu.org/software/gettext/gettext.html Fecha: 10 de septiembre de 2004 [Ref 11] Direccin: http://subversion.tigris.org Fecha: 17 de diciembre de 2005 [Ref 12] Direccin: http://www.acis.org.co/index.php?id=108 Fecha: 18 de octubre de 2005 [Ref 13] Direccin: http://www.microsoft.com/latam/ssafe/producto/resumen.asp Fecha: 29 de diciembre de 2004
25. BIBLIOGRAFIA