Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    Un aiuto per imparare a "ragionare a oggetti"

    Ciao a tutti, ho deciso di riprendere lo studio di Java coi tutorial della Oracle, che mi sembrano ben più comprensibili del mio libro di testo universitario.
    Non riesco però ancora a "ragionare a oggetti" come si deve.
    Faccio un esempio.
    Un esercizio mi chiede di scrivere una classe che definisca un oggetto che ho sulla scrivania e definirne il comportamento etc.
    E' una cosa che sembra semplice, tutto sommato il concetto mi è abbastanza chiaro, ma l'implementazione in codice non è così ovvia.
    Mi viene in mente di usare il mio lettore mp3.
    Gli stati del lettore quali potrebbero essere?
    Acceso/spento mi pare il più ovvio (boolean?)
    Il lettore potrebbe essere acceso e con una determinata canzone in riproduzione oppure acceso ma con la radio in funzione.
    Il volume corrente è uno stato?
    In pausa è uno stato?
    I metodi forse sono più semplici da capire: alza/abbassa il volume (incremento/decremento un int per esempio), cambia canzone (mmm...ma come lo implemento?), accendilo/spegnilo (cambio il boolean...).
    O una bottiglia. Se volessi scrivere una classe che definisce una bottiglia e i suoic omportamenti...
    La bottiglia può essere vuota o piena. E' uno stato? Quali altri stati potrebbe avere una bottiglia?
    Potrei riempirla o svuotarla. E' un metodo, ma in codice come lo definirei, teoricamente?
    Spero di essermi spiegata!
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: Un aiuto per imparare a "ragionare a oggetti"

    Originariamente inviato da Jamie04
    Ciao a tutti, ho deciso di riprendere lo studio di Java coi tutorial della Oracle, che mi sembrano ben più comprensibili del mio libro di testo universitario.
    Non riesco però ancora a "ragionare a oggetti" come si deve.
    Faccio un esempio.
    Un esercizio mi chiede di scrivere una classe che definisca un oggetto che ho sulla scrivania e definirne il comportamento etc.
    E' una cosa che sembra semplice, tutto sommato il concetto mi è abbastanza chiaro, ma l'implementazione in codice non è così ovvia.
    Mi viene in mente di usare il mio lettore mp3.
    Gli stati del lettore quali potrebbero essere?
    Acceso/spento mi pare il più ovvio (boolean?)
    Il lettore potrebbe essere acceso e con una determinata canzone in riproduzione oppure acceso ma con la radio in funzione.
    Il volume corrente è uno stato?
    In pausa è uno stato?
    I metodi forse sono più semplici da capire: alza/abbassa il volume (incremento/decremento un int per esempio), cambia canzone (mmm...ma come lo implemento?), accendilo/spegnilo (cambio il boolean...).
    O una bottiglia. Se volessi scrivere una classe che definisce una bottiglia e i suoic omportamenti...
    La bottiglia può essere vuota o piena. E' uno stato? Quali altri stati potrebbe avere una bottiglia?
    Potrei riempirla o svuotarla. E' un metodo, ma in codice come lo definirei, teoricamente?
    Spero di essermi spiegata!
    Grazie.
    Normalmente più che di stati si parla di attributi.

    Sì, acceso/spento può essere un attributo booleano, come il fatto che la radio sia in funzione o meno (cosa che può avvenire solo quando è acceso), o la pausa (anche qui con opportuni vincoli).
    Per le canzoni, il modo più banale sarebbe avere un attributo di tipo stringa contenente il titolo della canzone in ascolto, o null se non ce n'è. In modo più raffinato, potrebbe esserci una classe Canzone dedicata alle canzoni, con titolo artista eccetera, ed il lettore avrà un attributo di tipo Canzone.
    Il volume può essere un attributo di tipo intero, positivo.
    La canzone puoi cambiarla, sempre seguendo un approccio molto basilare, prendendo come parametro il titolo della nuova canzone. Oppure un attributo di tipo Canzone se hai definito tale classe.

    La bottiglia può essere vuota o pieno, quindi basta un attributo booleano. E ad esempio due metodi per svuotarla o riempirla, che in certi casi non faranno nulla ovviamente, perché non puoi svuotare una bottiglia vuota. Nella codifica, sarebbe due metodi senza parametri che non avrebbero alcun valore di ritorno.

    Nei tutorial che stai seguendo ci sono diversi esempi di codice, forse appena dopo quell'esercizio.
    effeffe

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Grazie!
    Una possibile, banale interpretazione potrebbe essere questa?

    codice:
    class Mp3Player {
        boolean acceso=false;
        int volume=0;
        String currentSong;
        void accendi() {
           acceso=true;
        }
        void changeVolume(int increment) {
            volume=volume+increment;
        }
        void changeCurrentSong(String newSong) {
            currentSong=newSong;
        }
        void printState() {
            System.out.println(currentSong + " " + volume);
        }
    I vincoli di cui parli potrei metterli con un if?
    Tipo che il volume dev'essere sempre > di 0...

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Jamie04
    Grazie!
    Una possibile, banale interpretazione potrebbe essere questa?

    codice:
    class Mp3Player {
        boolean acceso=false;
        int volume=0;
        String currentSong;
        void accendi() {
           acceso=true;
        }
        void changeVolume(int increment) {
            volume=volume+increment;
        }
        void changeCurrentSong(String newSong) {
            currentSong=newSong;
        }
        void printState() {
            System.out.println(currentSong + " " + volume);
        }
    I vincoli di cui parli potrei metterli con un if?
    Tipo che il volume dev'essere sempre > di 0...
    La classe è abbastamìnza corretta: gli attributi dovrebbero essere privati, ma se non hai ancora trattato quest'aspetto nel tuo studio tralascia questo aspetto; però dovresti aggiungere dei metodi "getter", ovvero che restituiscano informazioni sugli attributi, tipo getCurrentSong che ritorna una stringa, altrimenti chi usa la classe non può sapere nulla sullo stato del player. Prova poi ad usare la classe tramite un main per testarne il funzionamento.

    Sì, il costrutto if-then è lo strumento più comune per i controlli.
    effeffe

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Originariamente inviato da Kaamos
    La classe è abbastamìnza corretta: gli attributi dovrebbero essere privati, ma se non hai ancora trattato quest'aspetto nel tuo studio tralascia questo aspetto; però dovresti aggiungere dei metodi "getter", ovvero che restituiscano informazioni sugli attributi, tipo getCurrentSong che ritorna una stringa, altrimenti chi usa la classe non può sapere nulla sullo stato del player. Prova poi ad usare la classe tramite un main per testarne il funzionamento.

    Sì, il costrutto if-then è lo strumento più comune per i controlli.
    domanda: quando non ci sono i modificatori di accesso (che ho visto solo di sfuggita finora) java come si comporta? considera privato o pubblico?

    e supponendo di dover mettere questo controllo sul volume posso farlo già in questa classe?

    tipo

    voglio evitare che venga assegnato a volume un valore < di 0
    che faccio?

    (tieni conto che questo è solo un esercizio per imparare a ragionare sugli oggetti, non tanto per fare un programma funzionante e che faccia qualcosa di utile)

    grazie!

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Jamie04
    domanda: quando non ci sono i modificatori di accesso (che ho visto solo di sfuggita finora) java come si comporta? considera privato o pubblico?

    e supponendo di dover mettere questo controllo sul volume posso farlo già in questa classe?

    tipo

    voglio evitare che venga assegnato a volume un valore < di 0
    che faccio?

    (tieni conto che questo è solo un esercizio per imparare a ragionare sugli oggetti, non tanto per fare un programma funzionante e che faccia qualcosa di utile)

    grazie!
    Il modificatore d'accesso di default limita la visibilità alle classi dello stesso package. In genere limita sempre la visibilità degli attributi il più possibile.

    Per il controllo, basta controllare nel metodo per cambiare volume che la somma del volume attuale e dell'incremento sia un numero non negativo.
    effeffe

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Sono andata nella seconda parte dell'esercizio che chiede di implementare un'interfaccia e qui mi perdo, forse perché nella breve descrizione dell'interfaccia non c'e' nemmeno un esempio completo ma solo un accenno di teoria.

    Ho fatto queste 3 classi:

    codice:
    package objclasstest01;
    /**
     * Interfaccia lettore mp3
     */
    interface Mp3Interface {
        public void accendi(boolean acceso);
        public void cambiaVolume(int increment);
        public void changeCurrentSong(String newSong);
    }
    
    
    package objclasstest01;
    /**
     * Classe che implementa l'interfaccia
     */
     class Mp3Player implements Mp3Interface {
        boolean acceso=false;
        int volume=0;
        int increment=0;
        String currentSong, newSong;
        void accendi() {
           acceso=true;
        }
        public void cambiaVolume() {
            volume=volume+increment;
        }
        public void changeCurrentSong() {
            currentSong=newSong;
        }
        void printState() {
            if (acceso==true)
                System.out.println("Il lettore e' acceso e la canzone in play e': " + currentSong + " Volume " + volume);
            else
                System.out.println("Il lettore e' spento!");
        }
     }
    
    
    package objclasstest01;
    /**
     * Classe principale
     */
    public class ObjClassTest01 {
    
        public static void main(String[] args) {
            //credo due oggetti lettori mp3
            Mp3Player lettore1=new Mp3Player();
            Mp3Player lettore2=new Mp3Player();
            //invoco metodi sugli oggetti per cambiare attributi
            lettore1.changeCurrentSong("Bella Ciao");
            lettore1.cambiaVolume(-5);
            lettore1.printState();
            lettore1.accendi();
            lettore1.changeCurrentSong("Ciaoooo");
            lettore1.cambiaVolume(30);
            lettore1.printState();
            
        }
    }
    Ovviamente in compilazione mi dà errore:

    Exception in thread "main" java.lang.ExceptionInInitializerError
    at objclasstest01.ObjClassTest01.main(ObjClassTest01. java:18)
    Caused by: java.lang.RuntimeException: Uncompilable source code - objclasstest01.Mp3Player is not abstract and does not override abstract method changeCurrentSong(java.lang.String) in objclasstest01.Mp3Interface
    at objclasstest01.Mp3Player.<clinit>(Mp3Player.java:9 )
    ... 1 more
    Java Result: 1

    Non capisco :-/
    Anzi, a dire il vero mi sfugge quasi del tutto l'utilità delle interfacce, a livello pratico (teoricamente ci siamo...).

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Guarda bene le firme dei metodi dell'intefaccia e quelle dei metodi che hai scritto nella classe
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Le interfacce non sono classi comunque, e l'incremento dev'essere un parametro del metodo non un attributo della classe.

    Riguardo l'utilità delle interfacce, dovresti trovare qualcosa facendo una ricerca in questo forum (o con un motore di ricerca).
    effeffe

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ho guardato ma non capisco
    I parametri che metto nei metodi dell'interfaccia non sono utilizzabili nella classe che li implementa?
    Scusate le domande idiote ma forse la richiesta di implementare un'interfaccia dopo averne dato una descrizione appena sommaria e nessun esempio è un po' troppo per me...

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.