Pagina 1 di 8 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 75

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315

    valutazione codice "migliore"

    Un esercizio che ho svolto chiede la costruzione della classe TestQuadrato contenente un metodo main() che istanzi un oggetto di tipo Quadrato con lato di valore 5. Successivamente bisogna stampare perimetro e area dell'oggetto appena creato.
    La mia soluzione è la seguente:
    codice:
    public class TestQuadrato
    {
        public static void main(String args[])
        {
            Quadrato oggetto = new Quadrato(5);
        }
    }
    codice:
    public class Quadrato
    {
        public int lato;
    
        public Quadrato(int lato)
        {
            int perimetro = lato * 4;
            int area = lato * lato;
            System.out.println("il perimetro è: " + perimetro);
            System.out.println("l'area è: " + area);        
        }    
    }
    mentre la soluzione proposta dal manuale è questa:
    codice:
    public class TestQuadrato {
        public static void main(String args[]) {
            Quadrato quadrato = new Quadrato();
            quadrato.lato = 5;
            int perimetro = quadrato.perimetro();
            System.out.println(perimetro);
            int area = quadrato.area();
            System.out.println(area);
        }
    }
    codice:
    public class Quadrato {
        public int lato;
        public int perimetro() {
            int perimetro = lato * 4;
            return perimetro;
        }
        public int area() {
            int area = lato * lato;
            return area;
        }
    }
    La mia soluzione funziona però vorrei capire se concettualmente è più corretto fare le "operazioni" all'interno del metodo main (come fatto nella soluzione proposta dal manuale) oppure all'interno del costruttore (come fatto da me).

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    La soluzione corretta è quella proposta dal manuale.
    Un costruttore è un particolare "metodo" che serve, appunto, a costruire (nel senso di rendere consistente) un oggetto. Un costruttore, solitamente, si occupa di valorizzare i campi di un oggetto e di fare piccole operazioni preliminari, ma non dovrebbe avere codice "operativo".

    Il calcolo dell'area del quadrato dovrebbe essere relegato, appunto, ad un metodo idoneo, che possa essere facilmente invocato da chi usa la classe. Se io costruisco un oggetto Quadrato è perchè intendo lavorare con quell'oggetto... uno dei lavori che vorrò fare è, appunto, calcolare l'area o il perimetro di tale quadrato. Queste sono operazioni che io posso voler fare, ma che non debbono per forza essere fatte a tutti i costi. Se voglio solo ottenere l'area, non ha senso che calcoli anche il perimetro... se metto queste operazioni nel costruttore, verranno sempre eseguite ad ogni istanziazione dell'oggetto. Lavoro inutile, che comunque non posso usare perchè come l'hai fatto tu non funziona: la classe non mi restituisce alcuna informazione utile... semplicemente fa un calcolo e lo stampa a video... e se io volessi farci qualcos'altro (che alla classe non interessa)? Ad esempio, se avessi 4 quadrati e volessi calcolare la somma delle loro aree?


    Rifletti su questa cosa.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Quindi se non ho capito male una soluzione concettualmente corretta potrebbe essere questa:
    codice:
    public class Test
    {
        public static void main(String args[])
        {
            Rettangolo rettangolo1 = new Rettangolo(5,6);
            System.out.println("il perimetro del rettangolo 1 è: " + rettangolo1.perimetro());
            System.out.println("l'area del rettangolo 1 è: " + rettangolo1.area());
            Rettangolo rettangolo2 = new Rettangolo(7,8);
            System.out.println("il perimetro del rettangolo 2 è: " + rettangolo2.perimetro());
            System.out.println("l'area del rettangolo 2 è: " + rettangolo2.area());
        }    
    }
    codice:
    public class Rettangolo
    {
        public final int NUMERO_LATI_UGUALI = 2;
        public int base;    
        public int altezza;
    
        public Rettangolo(int b, int a)
        {
            base = b;
            altezza = a;
        }
    
        public int perimetro()
        {
            int perimetro = (base + altezza) * NUMERO_LATI_UGUALI; 
            return (perimetro);
        }
    
        public int area()
        {
            int area = (base * altezza);
            return (area);
        }
    }

    Giusto?


    p.s. ho fatto l'esempio del rettangolo ma è analogo al quadrato.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Sì, corretto.
    Come pura puntualizzazione (al manuale, non a te), i metodi di questo tipo (che restituiscono qualcosa) si chiamano "getter" e dovrebbero, appunto, chiamarsi getXXX(). Nel tuo caso, quindi, i due metodi dovrebbero chiamarsi, rispettivamente, getPerimetro() e getArea().

    E' molto più di una banale "convenzione": è diventata una specifica per quanto riguarda i Java Bean.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    grazie per la precisazione. immagino comunque che siano stati scelti dei nomi più semplici per facilitare l'apprendimento.

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Vorrei un vostro parere su un altro esercizio.
    La traccia è la seguente:
    Creare una classe con un metodo main() che selezioni i primi 10 numeri divisibili per 3 e li stampi dopo averli concatenati con una stringa in modo tale che l'output del programma sia:
    Numero multiplo di 3 = 3
    Numero multiplo di 3 = 6
    Numero multiplo di 3 = 9
    ...
    La mia soluzione è questa:
    codice:
    public class Divisibili
    {
        public static void main(String args[])
        {
            for(int i=1; i<=30; i++)
            {
                if (i%3!=0)
                {
                    continue;
                }
                else
                {
                    System.out.println("Numero multiplo di 3 = " + i);
                }
            }
        }
    }
    mentre quella del manuale è questa:
    codice:
    public class Esercizio4h {
               public static void main(String args[]) {
                              for (int i = 1, j = 1; j <= 10; i++) {
                                         if (i % 3 == 0){
                                                   System.out.println("Numero multiplo di 3 = " + i);
                                                   j++;
                                         }
                              }
               }
    }
    Voi che dite? Qual è la soluzione corretta?

  7. #7
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Vorrei un vostro parere su un altro esercizio.
    La traccia è la seguente:
    Creare una classe con un metodo main() che selezioni i primi 10 numeri divisibili per 3....
    La tua soluzione qui ha un errore di base che nessuno ti ha fatto notare.
    Ti si chiede di trovare i primi 10 numeri divisibili per 3, ed è quello che fa la soluzione del tuo libro. Il tuo codice invece trova i numeri divisibili per 3 contando fino a 30, senza preoccuparsi di quanti sono. Ovviamente il risultato è lo stesso, ma solo perché tu hai fatto preventivamente il calcolo a mente. Il tuo codice però non fa ciò che ti viene chiesto.

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Quote Originariamente inviata da luca200 Visualizza il messaggio
    La tua soluzione qui ha un errore di base che nessuno ti ha fatto notare.
    Ti si chiede di trovare i primi 10 numeri divisibili per 3, ed è quello che fa la soluzione del tuo libro. Il tuo codice invece trova i numeri divisibili per 3 contando fino a 30, senza preoccuparsi di quanti sono. Ovviamente il risultato è lo stesso, ma solo perché tu hai fatto preventivamente il calcolo a mente. Il tuo codice però non fa ciò che ti viene chiesto.
    hai ragione, grazie per la precisazione.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    A mio parere le due soluzione sono esattamente uguali.
    Se tu provassi a togliere l'else e mettere il codice che c'è dentro nel tuo if cambiandogli la condizione con (i % 3 == 0) otterresti proprio un codice equivalente a quello proposto dal tuo manuale.
    Diciamo che il tuo codice è ridondante poichè quel continue può essere tranquillamente tolto.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Una nota ti faccio a priori: un'unica soluzione ad un problema non esiste, se il programma dato un input produce l'output che ti aspetti, va bene.
    A dire il vero poi nessuno dei due rispetta realmente la consegna (voleva un'unica stringa), ma possiamo passare oltre, visto che a video è impossibile capire se sono 10 println differenti o è un'unica print di uno stringone.
    La migliore soluzione varia a seconda di quale aspetto/tecnica era richiesto tu mettessi l'attenzione e a seconda se vengono rispettati o meno i paradigmi del linguaggio di programmazione (es. se fai codice contorto o poco manutenibile) scelto.
    RTFM Read That F*** Manual!!!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.