Ejemplo de clase: Manipulación directa usando NakedObjects

Introducción

Conceptos básicos

  • Agregamos alumnos, para eso:
    • Crear la clase Alumno en el package com.uqbar.progui.dom, extendiendo de AbstractDomainObject y le ponemos las propiedades nombre y apellido
    • Crear la clase Alumnos en el package com.uqbar.progui.service, extendiendo de AbstractFactoryAndRepository
    • Agregar la clase Alumnos a la propiedad nakedobjects.services en el archivo nakedobjects.properties.

    Con eso debería ser suficiente para poder ver los alumnos al ejecutar la aplicación, podemos crear un alumno y modificarlo.

  • De yapa podemos implementar un método title que devuelva un String que será utilizado como título en las ventanas donde se ven los alumnos, una implementación posible puede ser:
        public String title() {
            return this.getApellido() + ", " + this.getNombre();
        }

Referencias entre objetos

  • Siguiendo el mismo procedimiento anterior, agregamos los objetos Materia (que tenga una única propiedad nombre) y curso (que tenga dos propiedades: materia y comisión, donde naturalmente materia es de tipo Materia).

  • Es muy fácil ver que si creamos un curso y una materia, arrastrando la materia sobre la propiedad correspondiente del curso los podemos asociar.
    De nuevo, el title puede ser útil para mostrar el funcionamiento, armando un title que sea "Comisión <comision> de la materia <materia.getNombre>".

  • De la misma manera podemos hacer que el curso tenga una colección de inscriptos (colección de alumnos) y haciendo drag & drop podemos agregar alumnos al curso.
    Es importante no olvidarse de instanciar la colección al declararla.

  • Para verlo bien, se puede crearle una propiedad read-only que muestre la cantidad de inscriptos.

Acciones

  • Agregar una acción es tan sencillo como agregar un método público, aunque vamos a aprovechar para introducir algunos conceptos más, de forma de poder hacer cosas más complicadas con las acciones.

  • Podemos agregar un método "agregarCurso" en materia, que reciba por parámetro el String que indica la comisión y me cree un curso ya asociado a esa materia.

        public Curso crearCurso(String comision) {
            Curso nuevoCurso = new Curso();
            nuevoCurso.setMateria(this);
            nuevoCurso.setComision(comision);
            return nuevoCurso;
        }

    Si vamos ahora a ver todos los cursos, vamos a ver que el curso creado no está en la lista, es decir que no fue persistido, para eso hay que usar el objeto Cursos que creamos antes.
    Para eso solamente debemos tener en el objeto materia una propiedad de ese tipo (una variable con su getter y setter) y en lugar de crear el curso con su constructor, lo creamos a partir del objeto Cursos.

            Curso nuevoCurso = this.cursos.nuevoCurso();

    Nota:
    Un problema que podemos tener al hacer eso es que desde la clase Materia no podemos referenciar a la clase Cursos (depende de cómo hayamos creado los proyectos)... la solución más fácil para eso es poner todo en el mismo proyecto. Si bien el framework provee herramientas para solucionar eso, le quitan parte de sus simplicidad y no es el objetivo de esta clase aprender los detalles de NakedObjects.

  • Un detalle más que podemos tener en cuenta es ponerle nombre al parámetro (para que no aparezca como "String" en la ventanita), eso se hace con un annotation:

        public Curso crearCurso(@Named("Comision") String comision) {