Oppure

Loading
01/02/10 19:21
netarrow
si, come avrai già letto nella OOP c'è l'incapsulamento, ereditarietà e polimorfismo, le ultime due cose tienile in sospeso approfondirai più avanti.

l'incapsulamento era già presente nella strutturata quindi dovrebbe esserti familiare, praticamente devi "nascondere" i dati grezzi al codice utente, e renderlo accessibile tramite codice controllato dalla classe che espone quei dati, per implementare la così detta "programmazione per contratto", vale a dire verificare i dati in input quando setti, e verificati i dati di output quando elabori, se non si fosse l'incapsulamento con i metodi getQualcosa e setQualcosa il codice utente avrebbe diretto accesso a un semplice intero per dire e i contrilli sarebbero a lui delagati (delegati si intende al codice utente, e questo romberebbe quel discorso sulle responsabilità di prima, se la classe X è responsabile a portare a termine determinati lavori su determinati dati, è anche responsabile di verificare che l'input e l'output siano corretti, chi userà la classe non dovrà essere responsabile di questo).

In altri linguaggi al posto dei metodi get e set si implementano ad esempio le proprietà molto simili alla logica che c'era in vb6.
Ultima modifica effettuata da netarrow 01/02/10 19:22
aaa
02/02/10 14:40
zerg
Ok, credo di aver fatto un buon lavoro, ecco il risultato dei tuoi consigli.
Ti prego di essere critico e commentare eventuali errori di progettazione e magari (non credo) esecuzione

Classe
public class Automobilista
{
    private String nomeAutomobilista; // Campo che identifica il nome di un Automobilista
    private double kmPercConUnLt; // Campo che identifica i Km percorsi con un Lt da un pieno all'altro
    private double kmPercConUnLtTot; // Campo che identifica i Km percorsi con un Lt Totali

    // metodo per inizializzare il nome dell'automobilista
    public void setNomeAut( String nome )
    {
        nomeAutomobilista = nome;
    } // fine metodo setNomeAut

    // metodo che calcola i Km percorsi con un Lt da un pieno all'altro
    // e inizializza il corrispondente campo di istanza
    public void setKmPercConUnLt( int km, int lt )
    {
        kmPercConUnLt = (double) km / lt;
    } // fine metodo setKmPercConUnLt

    // metodo per memorizzare il totale dei Km percorsi con un lt
    public void setKmPercConUnLtTot()
    {
        kmPercConUnLtTot += kmPercConUnLt;
    } // fine metodo setKmPercConUnLtTot

    // metodo per ottenere il nome dell'Automobilista
    public String getNomeAuto()
    {
        return nomeAutomobilista;
    } // fine metodo getNomeAuto

    // metodo per ottenere i Km percorsi con un Lt da un pieno all'altro
    public double getKmPercConUnLt()
    {
        return kmPercConUnLt;
    } // fine metodo getKmPercConUnLt

    // metodo per ottenere i Km percorsi Totali
    public double getKmPercConUnLtTot()
    {
        return kmPercConUnLtTot;
    } // fine metodo getKmPercConUnLtTot
} // fine classe Automobilista


Prova classe

import java.util.Scanner;

public class ProvaAutomobilista
{
    public static void main( String args[] )
    {
        // creo i 3 oggetti per inizializzare i 3 insiemi di dati
        Automobilista auto1 = new Automobilista();
        Automobilista auto2 = new Automobilista();
        Automobilista auto3 = new Automobilista();

        // creo lo Scanner per acquisire i dati
        Scanner input = new Scanner( System.in );

        // chiedo al primo utente di inserire i dati
        System.out.println( "Inserisci i dati del pieno per il primo Automobilista" );
        System.out.print("Nome: ");
        String N = input.next();
        auto1.setNomeAut(N);
        System.out.print("Km (-1 per uscire): ");
        int K = input.nextInt();
        System.out.print("Lt: ");
        int L = input.nextInt();
        int contatore = 0;

        // ripeto il ciclo finchè non viene inserita la sentinella
        while ( K != -1 )
        {
            ++contatore;
            auto1.setKmPercConUnLt(K, L);
            System.out.printf( "I Km percorsi con questo pieno sono %.2f\n", auto1.getKmPercConUnLt() );
            auto1.setKmPercConUnLtTot();
            System.out.print("Km (-1 per terminare): ");
            K = input.nextInt();
            System.out.print("Lt: ");
            L = input.nextInt();
        } // fine di while
        
        // controllo che sia stato inserito almeno un dato per l'automobilista
        if ( contatore == 0 )
            System.out.println( "Non hai inserito nessun dato per il primo automobilista" );

        // chiedo al secondo utente di inserire i dati
        System.out.println( "Inserisci i dati del pieno per il secondo Automobilista" );
        System.out.print("Nome: ");
        N = input.next();
        auto2.setNomeAut(N);
        System.out.print("Km (-1 per uscire): ");
        K = input.nextInt();
        System.out.print("Lt: ");
        L = input.nextInt();
        contatore = 0;

        // ripeto il ciclo finchè non viene inserita la sentinella
        while ( K != -1 )
        {
            ++contatore;
            auto2.setKmPercConUnLt(K, L);
            System.out.printf( "I Km percorsi con questo pieno sono %.2f\n", auto2.getKmPercConUnLt() );
            auto2.setKmPercConUnLtTot();
            System.out.print("Km (-1 per terminare): ");
            K = input.nextInt();
            System.out.print("Lt: ");
            L = input.nextInt();
        } // fine di while

        // controllo che sia stato inserito almeno un dato per il secondo automobilista
        if ( contatore == 0 )
            System.out.println( "Non hai inserito nessun dato per il secondo automobilista" );

        // chiedo al terzo utente di inserire i dati
        System.out.println( "Inserisci i dati del pieno per il terzo Automobilista" );
        System.out.print("Nome: ");
        N = input.next();
        auto3.setNomeAut(N);
        System.out.print("Km (-1 per uscire): ");
        K = input.nextInt();
        System.out.print("Lt: ");
        L = input.nextInt();
        contatore = 0;

        // ripeto il ciclo finchè non viene inserita la sentinella
        while ( K != -1 )
        {
            ++contatore;
            auto3.setKmPercConUnLt(K, L);
            System.out.printf( "I Km percorsi con questo pieno sono %.2f\n", auto3.getKmPercConUnLt() );
            auto3.setKmPercConUnLtTot();
            System.out.print("Km (-1 per terminare): ");
            K = input.nextInt();
            System.out.print("Lt: ");
            L = input.nextInt();
        } // fine di while

        // controllo che sia stato inserito almeno un dato per il terzo automobilista
        if ( contatore == 0 )
            System.out.println( "Non hai inserito nessun dato" );

        System.out.println(); // stampa una riga vuota

        // visualizzo le medie dei tre automobilisti
        System.out.printf( "La media dei Km percorsi da %s è %.2f Km/Lt\n", auto1.getNomeAuto(), auto1.getKmPercConUnLtTot());
        System.out.printf( "La media dei Km percorsi da %s è %.2f Km/Lt\n", auto2.getNomeAuto(), auto2.getKmPercConUnLtTot());
        System.out.printf( "La media dei Km percorsi da %s è %.2f Km/Lt\n", auto3.getNomeAuto(), auto3.getKmPercConUnLtTot());
    } // fine metodo main
} // fine classe ProvaAutomobilsta





aaa
02/02/10 18:59
netarrow
Ok molto meglio!

non ho provato che non ho tempo cmq questo:

  public void setKmPercConUnLtTot() 
    { 
        kmPercConUnLtTot += kmPercConUnLt; 
    } // fine metodo setKmPercC


mi pare un pò ridondante, inserisci questo:

kmPercConUnLtTot += kmPercConUnLt;

direttamente nel metodo setKmPercConUnLt.

Altra cosa: i metodi di utilità esclusivamente interna alla classe (e che quindi non verranno richiamato da codice esterno) sarebbe meglio dichiararli come private o eventualmente protected, cmq approfondirai più avanti per ora quelli interni dichiarali private.
aaa
02/02/10 20:37
zerg
Postato originariamente da netarrow:
Altra cosa: i metodi di utilità esclusivamente interna alla classe (e che quindi non verranno richiamato da codice esterno) sarebbe meglio dichiararli come private o eventualmente protected, cmq approfondirai più avanti per ora quelli interni dichiarali private.


Allora... i metodi della classe Automobilista, vengono tutti usati nella classe ProvaAutomobilista (che poi è il main), quindi se li dichiaro Private, poi non posso usarli nella classe col main, o sbaglio?
aaa
02/02/10 20:40
netarrow
sisi certo, ma non avevo provato e guardato se effettivamente tutti vengono richiamati nel main, i metodi interni quando ne farai non esporli pubblicamnte
aaa