Visualizzazione dei risultati da 1 a 4 su 4

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13

    Consigli su esercizio progeammazione ad oggetii

    Salve ho il seguente esercizio diviso in parti:
    Testo
    codice:
    B) Fare in modo che ogni oggetto di questa classe contenga sempre dei dati validi
        1) si offre un costruttore che richiede ora, minuti e secondi (in caso di uno o più valori non validi l’orario viene inizializzato a 0:00:00).
        2) si offre un altro costruttore che richiede solo ora e minuti e imposta i secondi a zero (in caso di uno o più valori non validi l’orario viene inizializzato a 0:00:00).
        3) si offre un altro costruttore che non richiede alcun parametro e imposta ore, minuti e secondi a zero
        4) qualsiasi modifica richiesta con qualsiasi altro metodo viene annullata se porta ad un orario non valido (ovvero viene ripristinato l’ultimo orario valido)
    codice:
    public class MyOrario {
        private int ore;
        private int minuti;
        private int secondi;
        private boolean formatoSecondi;
    
        //Costruttore che richiede ora, minuti e secondi
        public MyOrario(int ore, int minuti, int secondi) {
            this.ore = ore;
            this.minuti = minuti;
            this.secondi = secondi;
            if (orarioNonValido()) {
                setDefault();
            }
            setFormatoSecondiSi();
        }
    
        //Costruttore che richiede solo ora e minuti e imposta i secondi a zero
        public MyOrario(int ore, int minuti) {
            this.ore = ore;
            this.minuti = minuti;
            secondi = 0;
            if (orarioNonValido()) {
                setDefault();
            }
            setFormatoSecondiSi();
        }
    
        //Costruttore che non richiede alcun parametro e imposta ore, minuti e secondi a zero
        public MyOrario() {
            setDefault();
            setFormatoSecondiSi();
        }
    
        //Metodi Getter e Setter
        public int getOre() {
            return ore;
        }
    
        public void setOre(int ore) {
            this.ore = ore;
            if (orarioNonValido()) {
                setDefault();
            }
        }
    
        public int getMinuti() {
            return minuti;
        }
    
        public void setMinuti(int minuti) {
            this.minuti = minuti;
            if (orarioNonValido()) {
                setDefault();
            }
        }
    
        public int getSecondi() {
            return secondi;
        }
    
        public void setSecondi(int secondi) {
            this.secondi = secondi;
            if (orarioNonValido()) {
                setDefault();
            }
        }
    
        //Metodo verifica correttezza orario inserito
        protected boolean orarioNonValido() {
            boolean nonValido = false;
            if ((ore < 1 || ore > 24) || (minuti < 0 || minuti > 59) || (secondi < 0 || secondi > 59)) {
                nonValido = true;
            }
            return nonValido;
        }
    
        //Metodo setter orario a 0 in caso di errore
        protected void setDefault() {
            ore = minuti = secondi = 0;
        }
    1- I costruttori sono concettualmente corretti? Cioè si possono fare in quel modo?
    2 - Inoltre è lecito fare il metodo setDefault che setta a a 0 (ore, secondi, minuti) ? invece di usare ogni volta ore=minuti=secondi=0???

    Testo
    codice:
    C) Consentire all’utente due tipi di stampe:
        1) con i secondi (15:05:38)
        2) senza secondi (15:05)
    Il valore di default è il primo (con i secondi). Si offrono all’utente tre metodi per gestire la presenza dei secondi nella stampa di un oggetto di tipo MyOrario:
        3) setFormatoSecondiSi che imposta il formato di cui al punto 1
        4) setFormatoSecondiNo che imposta il formato di cui al punto 2
        5) getFormatoSecondi  che restituisce vero se ci troviamo nella condizione di cui al punto 1 e falso in caso contrario.
    codice:
        //Metodi setter e getter per variabile boolean formatoSecondi
        public boolean setFormatoSecondiSi() {
            return formatoSecondi = true;
        }
    
        public boolean setFormatoSecondiNo() {
            return formatoSecondi = false;
        }
    
        public boolean getFormatoSecondi() {
            return formatoSecondi;
        }
    
        //Metodo toString
        public String toString() {
            String stringaOrario ="";
            if(formatoSecondi) {
                if(minuti < 10 && secondi < 10) {
                    stringaOrario = ore + ":0" + minuti + ":0" + secondi;
                }else if(minuti < 10) {
                    stringaOrario = ore + ":0" + minuti + ":" + secondi;
                } else if(secondi < 10){
                    stringaOrario = ore + ":" + minuti + ":0" + secondi;
                } else {
                    stringaOrario = ore + ":" + minuti + ":" + secondi;
                }
            }else {
                if(minuti < 10) {
                    stringaOrario = ore + ":0" + minuti;
                }else {
                    stringaOrario = ore + ":" + minuti;
                }
            }
            return stringaOrario;
        }
    3- Si può fare in un altro modo (più efficente, o corretto) il metodo toString, magari utilizzando meglio gli if?

    Testo
    codice:
    E) Offrire all’utente dei metodi per confrontare degli orari
        1) un metodo per confrontare l’oggetto in questione con un altro oggetto di tipo MyOrario passato al metodo come argomento (che restituirà 0 se i due orari coincidono, 1 se il nostro orario è maggiore di quello passato, -1 se il nostro orario è inferiore a quello passato)
        2) un metodo statico per confrontare due oggetti di tipo MyOrario passati al metodo come argomenti (che restituirà 0 se i due orari coincidono, 1 se il primo orario è maggiore del secondo, -1 se il primo orario è inferiore al secondo)
    codice:
     //Metodo per confrontare l’oggetto in questione con un altro oggetto di tipo MyOrario
        //restituirà 0 se i due orari coincidono, 1 se il nostro orario è maggiore di quello passato, -1 se il
        //nostro orario è inferiore a quello passato
        public int confronto (MyOrario orarioDaConfrontare) {
            int risConfronto;
            if( (this.getOre() == orarioDaConfrontare.getOre() && this.getMinuti() == orarioDaConfrontare.getMinuti() && this.getSecondi() > orarioDaConfrontare.getSecondi())
                    || (this.getOre() == orarioDaConfrontare.getOre() && this.getMinuti() > orarioDaConfrontare.getMinuti())
                    || ( this.getOre() > orarioDaConfrontare.getOre()) ) {
                 risConfronto = 1;
            }else if ( this.getOre() == orarioDaConfrontare.getOre() && this.getMinuti() == orarioDaConfrontare.getMinuti() && this.getSecondi() == orarioDaConfrontare.getSecondi() ){
                risConfronto = 0;
            }else {
                risConfronto = -1;
            }
            return risConfronto;
        }
    
        //Metodo statico per confrontare due oggetti di tipo MyOrario passati al metodo come argomenti
        static int confronto (MyOrario orario, MyOrario orarioDaConfrontare){
          return  orario.confronto(orarioDaConfrontare);
        }
    4- Qui il problema sta nella leggibilità del codice, in seguito alle condizioni, come posso migliorarlo o renderlo più leggibile??

    Grazie mille fin da ora

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    1- I costruttori sono concettualmente corretti? Cioè si possono fare in quel modo?
    2 - Inoltre è lecito fare il metodo setDefault che setta a a 0 (ore, secondi, minuti) ? invece di usare ogni volta ore=minuti=secondi=0???
    Si può fare di meglio. E tra l'altro il tuo codice non sta considerando e applicando uno dei punti indicati:

    4) qualsiasi modifica richiesta con qualsiasi altro metodo viene annullata se porta ad un orario non valido (ovvero viene ripristinato l’ultimo orario valido)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Trento
    Messaggi
    13
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Si può fare di meglio.
    potresti farmi un esempio di cosa cambieresti? ed e lecito usare li metodi nel costruttore?
    potresti dirmi qualcosa anche su punti
    3- Si può fare in un altro modo (più efficente, o corretto) il metodo toString, magari utilizzando meglio gli if?
    Ho usato il String.format
    4- Qui il problema sta nella leggibilità del codice, in seguito alle condizioni, come posso migliorarlo o renderlo più leggibile??

    Ti ringrazio
    Ultima modifica di megaorso; 24-11-2016 a 20:58

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da megaorso Visualizza il messaggio
    potresti farmi un esempio di cosa cambieresti?
    Ho un po' di tempo stasera, vediamo i due punti importanti della classe per l'orario:
    1) Deve essere "mutabile" (cioè ci sono i metodi "setter" per cambiare lo stato dell'oggetto)
    2) Un qualunque tentativo di modifica con un valore errato, deve lasciare l'oggetto nello stato che aveva prima, attenzione, non metterlo a 0:00:00 (questo è il punto 4 "ovvero viene ripristinato l’ultimo orario valido"). In realtà non serve "ripristinare" nulla ... semplicemente basta non toccare lo stato se un valore è inappropriato.

    Quindi, siccome ciascun setter setOre/setMinuti/setSecondi cambia solo una variabile, io farei così:

    a) innanzitutto dei metodi privati (e statici) per il controllo di ciascun valore

    private static boolean oreValide(int ore)
    private static boolean minutiValidi(int minuti)
    private static boolean secondiValidi(int secondi)

    questi verificano il parametro e restituiscono true (=ok) o false.

    b) ciascun setter setOre/setMinuti/setSecondi PRIMA usa il metodo di test del rispettivo valore e POI solo se ok cambia la variabile di istanza dell'oggetto.

    c) per i costruttori è un pelino più lungo perché ci sono più valori. Nel costruttore più completo (quello con ore/minuti/secondi) userei i tre metodi di test dei valori. Se tutti danno ok, allora imposto lo stato, altrimenti resta tutto a 0 (che è appropriato secondo la richiesta).
    Per quello con solo ore/minuti, uso solo due metodi di test in modo simile all'altro. Come alternativa invoco quello completo passando 0 come secondi.
    Per quello senza argomenti, basta lasciare i valori di default predefiniti, che danno appunto 0:00:00
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.