Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726

    [JAVA] Un consiglio di programmazione

    Ciao,
    avrei bisogno di un vostro veloce consiglio approposito di approcci di programmazione, in particolare vorrei sapere voi come vi comportate di fronte alla necessità di verificare che i parametri passati ad un metodo siano corretti.

    Vi faccio un esempio:
    mettete il caso in cui in una mappa ho dei codici (di una dimensione fissata, e che possono essere composti solo da determinati caratteri), e a questi codici è associato un qualcosa (non ci interessa cosa).
    Ora, i 2 metodi fanno la medesima cosa, ovvero tornare true se un determinato codice è presente nella mappa, e false altrimenti.

    codice:
    public boolean controlloCodice(String code) {
     if (!controlloCode(code) || !map.containsKey(code)) return false;
    
     return true;
    }
    codice:
    public boolean controlloCodice(String code) {
     if (!map.containsKey(code)) return false;
    
     return true;
    }
    Il primo metodo però si preoccupa prima di verificare che il codice passato sia corretto, ovvero che sia di una certa lunghezza e che non sia composto da caratteri proibiti.
    Il secondo invece non se ne cura e delega tutto al metodo della mappa (che presumo ci metta un po' più tempo a fare i suoi controlli).

    Ora, a vostro parere qual'è la soluzione più corretta?
    Io sono molto combatutto, perchè da un lato mi dico che è sempre corretto verificare i parametri che si passano ad un metodo, dall'altro però mi parrebbe un controllo inutile (o perlomeno in più) dal momento che ci penserà il metodo della mappa a dirmi se il codice esiste o meno, indifferentemente dal codice che gli passo.

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Continuo ad essere particolarmente indeciso.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Tutto dipende dal contesto.
    Se nella mappa hai la garanzia di trovare solamente codici corretti (ovvero, privi di caratteri non validi e di lunghezza corretta), allora non ha alcun senso controllare queste cose, per verificare la presenza o meno di tale codice nella mappa.

    Se, al contrario, la mappa non è coerente (ovvero, può contenere associazioni con codici errati), il controllo preventivo è d'obbligo.

    In entrambi i casi, comunque, è del tutto inutile restituire true/false dopo una valutazione booleana fatta con if: restituisci direttamente il risultato della valutazione.

    Esempio, nel caso di mappa coerente:
    codice:
    public boolean controlloCodice(String code) {
      return map.containsKey(code);
    }
    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Grazie.
    Il fatto del controllo preventivo era fatto anche perchè mi pareva inutile andare a cercare qualcosa che sapevo già che non fosse corretto, e dunque presente.
    Dal momento che comunque immagino che scorrere una mappa dall'inizio alla fine sia una operazione più lunga rispetto a controllare una stringa.

    Per quanto riguarda il fatto di come ho scritto il metodo, quello era solo per fare un veloce esempio.

    Grazie ancora.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Downloader
    Dal momento che comunque immagino che scorrere una mappa dall'inizio alla fine sia una operazione più lunga rispetto a controllare una stringa.
    Ma le mappe non funzionano in questo modo: non si effettua alcuno scorrimento per la ricerca di una chiave. La mappa effettua un hash sulla chiave da cercare e la ricerca è diretta con quell'hash...

    Dalla documentazione di HashMap, ad esempio:

    This implementation provides constant-time performance for the basic operations (get and put), assuming the hash function disperses the elements properly among the buckets.
    Detto in soldoni, data una chiave, viene data in pasto ad una funzione che ritorna un numero "univoco". Quindi, viene effettuata una ricerca all'interno di una struttura (ad esempio un array) usando quel numero (o uno similmente adeguato) come indice.


    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 2003
    Messaggi
    726
    Grazie.

    Ultima cosa:
    se invece all'interno della mappa ho tutto quanto corretto, ma devo scorrerla tutta con un foreach per vedere se è presente una certa stringa passata come parametro (non posso usare containsValue), allora avrebbe senso fare un controllo sulla stringa passata?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Downloader
    Grazie.

    Ultima cosa:
    se invece all'interno della mappa ho tutto quanto corretto, ma devo scorrerla tutta con un foreach per vedere se è presente una certa stringa passata come parametro (non posso usare containsValue), allora avrebbe senso fare un controllo sulla stringa passata?
    In questo caso potrebbe essere conveniente controllare prima la correttezza della stringa passata. Se la stringa passata non è corretta, non può trovarsi all'interno della mappa, quindi non ha senso scorrere tutto il contenuto alla ricerca di una stringa che sicuramente non è presente.

    Ho scritto "potrebbe essere conveniente" perchè bisognerebbe valutare quanti casi di incorrettezza si verificano. Se la percentuale è alta, sicuramente è conveniente.

    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Il numero di casi non corretti non saprei proprio quantificarla.
    Aggiungerò il controllo, anche perchè come hai detto tu pare una soluzione conveniente.

    Grazie 1000 per il preziosissimo aiuto!!

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.