Domanda Risolto Sistema di domotica con Java problema esame

jr_sottomajor

Utente Silver
2 Luglio 2017
96
33
4
79
Salve ragazzi avrei bisogno di un piccolo aiuto su un problema d'esame in java. La traccia è la seguente:
IoT.png

Di base il mio approccio è stato: DispositivoIoT superclasse-> LampadinaRGB,Climatizzatore e Persiana sottoclassi.
Java:
public abstract class DispositivoIoT {
    public DispositivoIoT(int oraSpegnimento,int minutiSpegnimento,double consumoOrario) {
        oraAttuale=new GregorianCalendar();
        this.oraSpegnimento=oraSpegnimento;
        this.minutiSpegnimento=minutiSpegnimento;
        this.consumoOrario=consumoOrario;
    }
    public DispositivoIoT(double consumoOrario) {
        oraAttuale=new GregorianCalendar();
        accendiDispositivo(oraAccensione,minutiAccensione);
        this.consumoOrario=consumoOrario;
    }
    public void accendiDispositivo() {
        if(acceso==false) {
            acceso=true;
            setOraAccensione(oraAttuale.get(GregorianCalendar.HOUR));
            setMinutiAccensione(oraAttuale.get(GregorianCalendar.MINUTE));
        }else
            return;
    }
    public void accendiDispositivo(int oraAccensione,int minutiAccensione) {
        
        if(acceso==false) {
            acceso=true;
            setOraAccensione(oraAccensione);
            setMinutiAccensione(minutiAccensione);
            }else
            System.out.println("Il dispositivo è già acceso.");
    }
    public void spegniDispositivo() {
        if(acceso==true) {
            acceso=false;
            setOraSpegnimento(oraAttuale.get(GregorianCalendar.HOUR));
            setMinutiSpegnimento(oraAttuale.get(GregorianCalendar.MINUTE));
        }else
            System.out.println("Il dispositivo è già spento.");
    }
    
    public void spegniDispositivo(int oraSpegnimento,int minutiSpegnimento) {
        if(acceso==true) {
            acceso=false;
            setOraSpegnimento(oraSpegnimento);
            setMinutiSpegnimento(minutiSpegnimento);   
        }else
            System.out.println("Il dispositivo è già spento.");
    }
    
    //set ora e minuti
    public void setOraAccensione(int oraAccensione) {this.oraAccensione=oraAccensione;}
    public void setMinutiAccensione(int minutiAccensione) {this.minutiAccensione=minutiAccensione;}
    public void setOraSpegnimento(int oraSpegnimento) {this.oraSpegnimento=oraSpegnimento;}
    public void setMinutiSpegnimento(int minutiSpegnimento) {this.minutiSpegnimento=minutiSpegnimento;}
    
    //get ora e minuti
    public int getOraAccensione() {return oraAccensione;}
    public int getMinutiAccensione() {return minutiAccensione;}
    public int getOraSpegnimento() {return oraSpegnimento;}
    public int getMinutiSpegnimento() {return minutiSpegnimento;}
    
    //metodi astratti
    public abstract void programmazioneSpegnimento(int oraSpegnimento,int minutiSpegnimento);
    public abstract String toString();
    
    
    
    //variabili istanza
    GregorianCalendar oraAttuale;
    private static boolean acceso=false;
    private int oraAccensione,oraSpegnimento,minutiAccensione,minutiSpegnimento;
    private double consumoOrario;

}

Questo è il codice della superclasse.. su un problema del genere va bene fare una implementazione del genere? Mi confonde il fatto che si abbia a che fare con date e orari , per cui la logica mi porta a pensare che, data la traccia, il ragionamento è del tipo : do(resta acceso) while (non si spegne volutamente o non si spegne in maniera programmata). Andava fatta una impostazione del genere o va bene semplicemente giocare sulle variabili oraAccensione/spegnimento,minutiAccensione/spegnimento come ho fatto io? Spero che i miei dubbi siano chiari.. Grazie in anticipo
 
Secondo me set setOraAccensione, setMinutiAccensione, setOraSpegnimento e setMinutiSpegnimento sono eccessivi: l'idea di avere setter e getter nasce dal fatto che stai cercando di rendere trasparente l'implementazione sottostante (information hiding). Chi vuole settare l'ora di accensione/spegnimento può usare accendiDispositivo e spegniDispositivo, rimanendo all'oscuro che sotto ci sono due variabili intere. È anche il caso di verificare che i valori inseriti per l'ora siano nel range [0, 24) e quelli dei minuti siano nel range [0, 60). Anche se il dispositivo è già acceso/spento devo poter essere in grado di cambiare l'orario di accensione/spento, quindi l'if-else all'interno di accendiDispositivo e spegniDispositivo io non li avrei messi. I metodi programmazioneSpegnimento e spegniDispositivo mi sembrano uguali: in spegniDispositivo stai programmando lo spegnimento. Aggiungerei accendi, spegni e isAcceso, visto che la variabile acceso è private e non public/protected.

Mi confonde il fatto che si abbia a che fare con date e orari , per cui la logica mi porta a pensare che, data la traccia, il ragionamento è del tipo : do(resta acceso) while (non si spegne volutamente o non si spegne in maniera programmata).
Concettualmente, sperando di non confonderti ancora di più le idee, puoi pensare che ci sia una classe Orologio che conta secondi/minuti/ore e si preoccupa di accendere/spegnere i dispositivi al loro orario di accensione/spegnimento. Secondo me è giusto non mettere nessun do-while.

else System.out.println("Il dispositivo è già spento.");
Piuttosto lancia un'eccezione.
 
Secondo me set setOraAccensione, setMinutiAccensione, setOraSpegnimento e setMinutiSpegnimento sono eccessivi: l'idea di avere setter e getter nasce dal fatto che stai cercando di rendere trasparente l'implementazione sottostante (information hiding). Chi vuole settare l'ora di accensione/spegnimento può usare accendiDispositivo e spegniDispositivo, rimanendo all'oscuro che sotto ci sono due variabili intere. È anche il caso di verificare che i valori inseriti per l'ora siano nel range [0, 24) e quelli dei minuti siano nel range [0, 60). Anche se il dispositivo è già acceso/spento devo poter essere in grado di cambiare l'orario di accensione/spento, quindi l'if-else all'interno di accendiDispositivo e spegniDispositivo io non li avrei messi. I metodi programmazioneSpegnimento e spegniDispositivo mi sembrano uguali: in spegniDispositivo stai programmando lo spegnimento. Aggiungerei accendi, spegni e isAcceso, visto che la variabile acceso è private e non public/protected.


Concettualmente, sperando di non confonderti ancora di più le idee, puoi pensare che ci sia una classe Orologio che conta secondi/minuti/ore e si preoccupa di accendere/spegnere i dispositivi al loro orario di accensione/spegnimento. Secondo me è giusto non mettere nessun do-while.
è proprio questo che non riesco a fare. Così come l'ho fatto io quando vengono chiamati i metodi accendi e spegni vado semplicemente a 1) settare a true/false la variabile acceso 2) registro l'orario a cui accendo/spengo il dispositivo. Stop. Non capisco se va bene fatto cosi o se non c'entra proprio nulla.
 
è proprio questo che non riesco a fare. Così come l'ho fatto io quando vengono chiamati i metodi accendi e spegni vado semplicemente a 1) settare a true/false la variabile acceso 2) registro l'orario a cui accendo/spengo il dispositivo. Stop. Non capisco se va bene fatto cosi o se non c'entra proprio nulla.
Non è il dispositivo ad accendersi/spegnersi automaticamente, è l'orologio che lo deve accendere/spegnere. Non ti è stato chiesto di modellare la classe Orologio né di fare un programma completo, probabilmente perché il modo pulito per farlo (i.e., publish/subscribe) non ti è stato spiegato. Va bene... anche se non è proprio risolto in modo ideale, perché ti ho evidenziato qualche difetto.
 
Non è il dispositivo ad accendersi/spegnersi automaticamente, è il timer che lo deve accendere/spegnere. Non ti è stato chiesto di modellare la classe Timer né di fare un programma completo, probabilmente perché il modo pulito per farlo (i.e., publish/subscribe) non ti è stato spiegato. Va bene... anche se non è proprio risolto in modo ideale, perché ti ho evidenziato qualche difetto.
In effetti mi sembra di notar che la traccia sia abbastanza "larga" e la si puo intendere in tanti modi.. comunque ti ringrazio per la disponibilità, gentilissimo
Messaggio unito automaticamente:

Per quanto riguarda l'eccezione ho fatto il seguente ragionamento: se il dispositivo è spento quando lo accendo setto semplicemente la variabile da false a true. Se il dispositivo è gia acceso resta acceso... aka non succede nulla di strano. Per cui avevo pensato anche di evitare di mettere l'else e di far correre solo l'if. Se è acceso e lo devo spegnere ok, se è gia spento resta spento e basta.. Sbaglio?
 
Ultima modifica:
Scritto di getto, io avrei fatto una cosa di questo tipo:
Java:
public abstract class DispositivoIoT {

    private static boolean acceso = false;
    private int oraAccensione, oraSpegnimento, minutiAccensione, minutiSpegnimento;
    private double consumoOrario;

    public void setAccensione() {
        GregorianCalendar now = new GregorianCalendar();
        this.oraAccensione(now.get(GregorianCalendar.HOUR));
        this.minutiAccensione(now.get(GregorianCalendar.MINUTE));
    }

    public void setAccensione(int ora, int minuti) {
        if (ora < 0 || ora >= 24 || minuti < 0 || minuti >= 60)
            throw new IllegalArguemntException("Bad time format");

        this.oraAccensione(ora);
        this.inutiAccensione(minuti);
    }

    public void setSpegnimento() {
        GregorianCalendar now = new GregorianCalendar();
        this.oraSpegnimento(now.get(GregorianCalendar.HOUR));
        this.minutiSpegnimento(now.get(GregorianCalendar.MINUTE));
    }

    public void setSpegnimento(int ora, int minuti) {
        if (ora < 0 || ora >= 24 || minuti < 0 || minuti >= 60)
            throw new IllegalArguemntException("Bad time format");

        this.oraSpegnimento(ora);
        this.minutiSpegnimento(minuti);
    }

    public int getOraAccensione() { return this.oraAccensione; }
    public int getMinutiAccensione() { return this.minutiAccensione; }
    public int getOraSpegnimento() { return this.oraSpegnimento; }
    public int getMinutiSpegnimento() { return this.minutiSpegnimento; }

    public void setConsumo(double consumoOrario) { this.consumoOrario=consumoOrario; }
    public double getConsumo(double consumoOrario) { return this.consumoOrario; }

    public void accendi() { this.acceso = true; }
    public void spegni() { this.acceso = false; }
    public boolean isAcceso() { return this.acceso; }

}