Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    metodi "getter" o accesso diretto attributi

    Esiste una ragione fondata per cui prediligere un metodo "getter" piuttosto che accedere direttamente all'attributo (variabile d'istanza) di un determinato oggetto?
    Mi spiego meglio tramite codice..
    Supponiamo di avere una classe del tipo:

    codice:
    class Classe {
         public Oggetto o;
         
         public Classe () {
                //in qualche modo inizializzo o
         }
    
         public Oggetto getO () {
                return o;
         }
    
    }
    perchè si dovrebbe preferire la procedura:
    codice:
    OggettoClasse.getO ();
    piuttosto che:
    codice:
    OggettoClasse.o;
    Pongo questa domanda perchè ho effettuato dei test (parlo in termini di tempo) riguardo le due procedure e ho riscontrato che con un numero di operazioni dell'ordine di qualche migliaio (di entrambe le procedure) l'accesso diretto è più veloce rispetto alla procedura via metodo di addirittura qualche secondo..


  2. #2
    Ma in questo modo leghi l'utilizzare di quella proprietà a come essa è implementata e sicuramente vai contro uno dei principi dell'OOP che è L'Information Hiding

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da francesco.muia
    Ma in questo modo leghi l'utilizzare di quella proprietà a come essa è implementata e sicuramente vai contro uno dei principi dell'OOP che è L'Information Hiding
    Sì certo , che si andasse contro la logica dell'OOP ne ero più che consapevole , però in alcuni casi può sembrare un po' farraginosa come cosa..è come se io avessi una persona davanti a me e volessi sapere il colore dei suoi occhi , quindi vado a chiederglielo piuttosto che vederlo direttamente da me..ahahah lo so che è un esempio di una demenzialità assurda

    Il motivo che sta dietro a questa domanda riguarda un videogioco creato da me e in particolare un rallentamento dell'animazione che vorrei ridurre al minimo.Ho creato un biliardo , che ridisegna continuamente e "iperfrequentemente" piccole aree di disegno (quello relativo alle signole palline) e per farlo ogni volta devo ottenere delle informazioni dai vari oggetti "Palla" , cosa che , per la sua grande frequenza , può un po' essere velocizzata magari con un accesso diretto piuttosto che un accesso via "getter" , a discapito ovviamente della logica OOP..

  4. #4
    Bè mi sa che hai sbagliato la progettazione di questo gioco, perchè non inserisci un metodo disegna nella palla che appunto gestisce il disegno di questa classe...

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Tutto ciò che è pubblico in una classe rappresenta l'interfaccia di quella classe verso l'esterno.
    Ciò significa che le classi che andranno ad utilizzarla dovranno interfacciarsi con essa mediante questa "interfaccia".

    Prendiamo, per esempio, il campo di una classe che rappresenta il prezzo di un prodotto:

    codice:
    public class Prodotto {
       public double prezzo;
       ...
    }
    Una classe che andrà ad utilizzare il prodotto potrà accedere direttamente al prezzo:

    codice:
    Prodotto p = ...;
    p.prezzo = 8.0d;
    Tutto ok, per il momento. Supponiamo che un domani tu voglia essere notificato via mail del cambiamento di prezzo di un prodotto... come fai? Devi correre dietro a tutti i punti in cui effettui quell'operazione (assegnazione di un prezzo) ed includere del codice (magari la chiamata ad un altro metodo) che invii una mail.

    Se io avessi progettato la classe in questo modo:

    codice:
    public class Prodotto {
       private double prezzo;
       public void setPrezzo(double d) { prezzo = d; }
       public double getPrezzo() { return prezzo; }
    }
    Il codice che usa tale classe sarebbe costretto ad utilizzare il metodo setPrezzo():

    codice:
    Prodotto p = ...;
    p.setPrezzo( 8.0d );
    Ed io avrei potuto, semplicemente, modificare l'implementazione di tale metodo in questo modo:

    codice:
    public void setPrezzo(double d) {
       prezzo = d;
       Mailer.inviaMail("Nuovo prezzo = " + d);
    }
    Senza dover correre dietro a nessuno, senza fare miliardi di modifiche in tutto il codice del progetto.

    Questo è un esempio banalissimo che riguarda un semplice metodo setter... pensa alle potenzialità dei metodi getter che permettono, in qualunque momento, di modificare la logica di business che regola l'accesso ad un determinato dato, senza intaccare alcuna parte di codice che quel dato lo usa.
    O pensa, ad esempio, a tutte quelle proprietà che rappresentano lo "stato interno" di un oggetto che, a causa di una modifica ad un valore, devono essere in qualche modo notificate o, comunque, aggiornate per garantirne la consistenza. Se i campi sono pubblici e, quindi, direttamente accessibili, garantire la consistenza diventa quasi impossibile.


    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Innanzitutto grazie LeleFT e francesco.muia per le delucidazioni e consigli che mi avete dato (nella pratica conoscevo già tutto ciò , ma a volte guardare le cose da un occhio critico penso che non possa che essere costruttivo)..

    Nella pratica , forse potrei andare fuori regolamento forum (??) , ma questo è il gioco in questione Gioco JPool

    Qualora vogliate scaricarlo e avviare il programma noterete (spererei di no ma è probabile che avvenga) che le animazioni di movimento delle palle spesso non sono fluidissime , vuoi per una progettazione non adeguata , vuoi per i limiti in termini di giochi del java, vuoi per altre ragioni ma..potrei migliorarne la fluidità?
    Ovviamente non chiedo che vi mettiate ad estrarre , decompilare e studiare il codice ma se semplicemente , anche magari ad occhio , sapreste consigliarmi qualche miglioria per la fluidità..che ben venga!

    In ogni caso questo è il sorgente sorgente JPool


  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Penso di aver risolto , effettuavo troppi repaint di piccole aree mentre rimpiazzando con un repaint totale (quindi una sola volta) è tutto molto più fluido (ovviamente quando parlo di repaint , in questo contesto che sto parlando di un gioco , mi riferisco alla chiamata di ridisegnamento istantaneo , "paintImmediately")

    Grazie a tutti!


  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Intanto i complimenti per il bel progetto.

    Una domanda: a che ti serve la libreria TopLink? Noto che non fai uso di persistenza e, effettivamente, anche togliendola di mezzo il tutto funziona.

    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

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da LeleFT
    Intanto i complimenti per il bel progetto.
    Grazie!!

    Originariamente inviato da LeleFT
    Una domanda: a che ti serve la libreria TopLink? Noto che non fai uso di persistenza e, effettivamente, anche togliendola di mezzo il tutto funziona.

    Ciao. .
    Mmm sinceramente vorrei saperlo anche io , per creare la grafica mi sono appoggiato a Netbeans ed è lui che ha aggiunto automaticamente queste librerie (neanche troppo leggere) e non ho mai capito la loro utilità..ho notato che anche levandole il tutto funziona ma anche cercando sul web non ho trovato risposta sulla loro utilità..


  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da zipangulu
    per creare la grafica mi sono appoggiato a Netbeans
    Sì, me n'ero accorto e devo dire che questo è stato il primo errore.

    ed è lui che ha aggiunto automaticamente queste librerie (neanche troppo leggere)
    Secondo errore, dipendente dal prmio.

    e non ho mai capito la loro utilità..ho notato che anche levandole il tutto funziona ma anche cercando sul web non ho trovato risposta sulla loro utilità..
    TopLink è un ORM (come Hibernate). Serve per la persistenza dei dati (mapping fra classi Java e tabelle di un DB, detto in soldoni).

    In buona sostanza, a te non serve a nulla, ti appesantisce davvero inutilmente il progetto.


    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

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.