Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: toni_apr en 18 de Junio 2014, 15:31

Título: Ejercicio CU00641B clases con campos objetos java
Publicado por: toni_apr en 18 de Junio 2014, 15:31
Hola. A mi me funciona la compilación y ejecución. Pido que me marquéis deficiencias y mejoras.
Van 3 clases Casa, Salon y Cocina
Gracias.

Código: [Seleccionar]
/**
 * Detalles de la clase.
 *
 * @author (Toni)
 * @version (0)
 */
public class Casa {

    // Atributos de la clase Casa
    private double superficie;
    private String direccion;
    private Salon salonCasa; //Declaracion de objeto tipo Salon
    private Cocina cocinaCasa; // idem tipo Casa

    /**
     * Constructor para objetos de la clase Casa
     */
    public Casa() {
        // Inicializa atributos
        superficie = 0.0d;
        direccion = "DesConocida";
        salonCasa = new Salon(); //Inicializa con nuevo salon
        cocinaCasa = new Cocina(); // Inicializa con nueva cocina
    } // Fin del constructor Casa

    // Siguen los setters para los atributos de la clase Casa
    public void setSuperficie ( double valorSuperficie ) {
        superficie = valorSuperficie;
    }

    public void setDireccion ( String valorDireccion ) {
        direccion = valorDireccion;
    }
   
    public void setSalon ( int numeroTV, String valorTipoSalon ) {
        salonCasa.setNumeroDeTelevisores ( numeroTV );
        salonCasa.setTipoSalon ( valorTipoSalon );
    }
   
    public void setCocina ( boolean valorEsIndependiente, int valorNumeroDeFuegos ) {
        cocinaCasa.setEsIndependiente ( valorEsIndependiente );
        cocinaCasa.setNumeroDeFuegos ( valorNumeroDeFuegos );
    }

    // Ahora los getters para los atributos de la clase Casa
    public double getSuperficie () {
        return superficie;
    }

    public String getDireccion () {
        return direccion;
    }

    public String getSalon () {
        return "Salón tipo " + salonCasa.getTipoSalon() + ", con " +
        salonCasa.getNumeroDeTelevisores() + " televisor/es.";
    }

    public String getCocina () {
        String negacion = "";
        if ( cocinaCasa.getEsIndependiente() == false ) { negacion = "no "; }
        return "En cuanto a la cocina, " + negacion + "es independiente, y tiene " +
        cocinaCasa.getNumeroDeFuegos() + " fuego/s.";
    }
    // Y seguidamente, procedimientos y funciones varios.
    public void dimeloTodoTodoTodo () {
        String mensaje = "Casa con una superficie de " + superficie + " unidades.\n";
        mensaje = mensaje + "Localizada en: " + direccion + ".\n";
        mensaje = mensaje + "Donde destacamos lo siguiente:\n";
        mensaje = mensaje + getSalon () + "\n";
        mensaje = mensaje + getCocina ();
        mensaje = mensaje + "\n\n\tFin del comunicado.";
        System.out.println ( mensaje ) ;
    }
} // Fin de la clase Casa

Código: [Seleccionar]
/**
 * Detalles de la clase.
 *
 * @author (Toni)
 * @version (0)
 */
public class Salon {

    // Atributos de la clase Salon
    private int numeroDeTelevisores;
    private String tipoSalon;

    /**
     * Constructor para objetos de la clase Salon
     */
    public Salon() {
        // Inicializa atributos
        numeroDeTelevisores = 0;
        tipoSalon = "DesConocido";
    } // Fin del constructor Salon
   
    // Siguen los setters para los atributos de la clase Salon
    public void setNumeroDeTelevisores ( int valorNumeroDeTelevisores ) {
        numeroDeTelevisores = valorNumeroDeTelevisores;
    }
   
    public void setTipoSalon ( String valorTipoSalon ) {
        tipoSalon = valorTipoSalon;
    }
   
    // Ahora los getters para los atributos de la clase Salon
    public int getNumeroDeTelevisores () {
        return numeroDeTelevisores;
    }
    public String getTipoSalon () {
        return tipoSalon;
    }
    // Y seguidamente, procedimientos y funciones varios.

} // Fin de la clase Salon

Código: [Seleccionar]
/**
 * Detalles de la clase.
 *
 * @author (Toni)
 * @version (0)
 */
public class Cocina {

    // Atributos de la clase Cocina
    private boolean esIndependiente;
    private int numeroDeFuegos;

    /**
     * Constructor para objetos de la clase Cocina
     */
    public Cocina() {
        // Inicializa atributos
        esIndependiente = false;
        numeroDeFuegos = 0;
    } // Fin del constructor Cocina
   
    // Siguen los setters para los atributos de la clase Cocina
    public void setEsIndependiente ( boolean valorEsIndependiente ) {
        esIndependiente = valorEsIndependiente;
    }
   
    public void setNumeroDeFuegos ( int valorNumeroDeFuegos ) {
        numeroDeFuegos = valorNumeroDeFuegos;
    }
   
    // Ahora los getters para los atributos de la clase Cocina
    public boolean getEsIndependiente () {
        return esIndependiente;
    }
   
    public int getNumeroDeFuegos () {
        return numeroDeFuegos;
    }
    // Y seguidamente, procedimientos y funciones varios.

} // Fin de la clase Cocina
Título: Re:Ejercicio CU00641B para revisar
Publicado por: Alex Rodríguez en 18 de Junio 2014, 17:48
El código es en general correcto pero algunas cosas merecen ser comentadas:

NO CORRECTO

    public String getSalon () {
        return "Salón tipo " + salonCasa.getTipoSalon() + ", con " +
        salonCasa.getNumeroDeTelevisores() + " televisor/es.";
    }

Se haría como:

    public Salon getSalon () {
        return salonCasa;
    }

Un método get devuelve un atributo. En este caso si el atributo es un objeto, debemos devolver un objeto. Aunque al principio cuesta, hay que habituarse a trabajar con objetos  ::)

Lo mismo podemos decir de getCocina ()


CORRECTO PERO NO IDÓNEO

En lugar de (modo 1):

    public void setSalon ( int numeroTV, String valorTipoSalon ) {
        salonCasa.setNumeroDeTelevisores ( numeroTV );
        salonCasa.setTipoSalon ( valorTipoSalon );
    }

Podríamos pensar en (modo 2):

    public void setSalon ( Salon valorSalon ) {
        salonCasa = new Salon();
        salonCasa.setNumeroDeTelevisores(valorSalon.getNumeroDeTelevisores());
        salonCasa.setTipoSalon(valorSalon.getTipoSalon());
    }

Ambas formas son posibles, y quizás debieras volver a revisar esto un poco más adelante (es decir, no le des ahora muchas vueltas porque más adelante lo verás más claro). La idea del modo 2 es copiar el objeto que se recibe para no inmiscuirnos en tareas que son propias de la clase Salon.

Con el modo 1 la clase Casa se estaría haciendo responsable de inicializar un objeto Salon, al crearlo con new y establecer sus atributos con setSalon. La responsabilidad de inicializar un Salon es (preferentemente) de la clase Salon y una clase no debe inmiscuirse en las tareas propias de otra clase (al menos en la medida de lo posible).

Como te digo no le des muchas vueltas, retén la idea para más adelante...

Título: Re:Ejercicio CU00641B para revisar
Publicado por: toni_apr en 19 de Junio 2014, 07:20
Hola Alex. Gracias por tu exposición.
Y gracias por tus ánimos.

Entiendo que un -get- ha de devolver un atributo. Si el atributo es un objeto, pues eso, que devuelva un objeto. Hay que cambiar el chip.

En cuanto al código:
Citar
CORRECTO PERO NO IDÓNEO

En lugar de (modo 1):

    public void setSalon ( int numeroTV, String valorTipoSalon ) {
        salonCasa.setNumeroDeTelevisores ( numeroTV );
        salonCasa.setTipoSalon ( valorTipoSalon );
    }

Podríamos pensar en (modo 2):

    public void setSalon ( Salon valorSalon ) {
        salonCasa = new Salon();
        salonCasa.setNumeroDeTelevisores(valorSalon.getNumeroDeTelevisores());
        salonCasa.setTipoSalon(valorSalon.getTipoSalon());
    }

Ha habido momentos en que mi coco ha visto la lógica del argumento, y al momento siguiente la ha perdido.
He visto, tomando el ejemplo del código escrito, indentaciones dentro de otras indentaciones hasta perder el hilo.

En fin. Voy a hacer caso de lo que dices. Espero verlo más claro en adelante.

Saludos y gracias.