[HashMap] switch case

di il
8 risposte

[HashMap] switch case

Buongiorno ,

Vorrei sostituire il mio switch case con qualcosa di oop.
Leggendo e rileggendo sono arrivato a sostituirlo con una hashmap dove ogni valore è rappresentato da una CallBack.
NetBeans ha fatto la sua parte è ha "complicato" le cose suggerendomi di trasformare tutta l'espressione in una Lambda , cosa che per me è ancora lontano da affrontare. Sembra una cosa complicata.
La domanda è : Come faccio in main a leggere il valore di "val" ?

public class Command {
    
    private final  HashMap<String, Callback> cmd = new HashMap<>();
    
    public void add (String name){    // Aggiungo un comando 
        
        cmd.put(name, (Callback) (String val) -> {
            
            val ="Esempio di commando: Stringa aggiornata";
            System.out.println( val );
            return val;  //<<<--- dove "va a finire" questo val ?
        });    
    }
}

public interface Callback {
    public String value (String value);
}

public class Main {
	private static Command command;
	
	public static void main(String[] args)  {
		command = new Command();
		command.add("User");                 //Creo il comando "User".
	}
}	

8 Risposte

  • Re: [HashMap] switch case

    Edit:

    Forse ho capito . Devo creare un metodo nella classe Command e ritornare un oggetto di tipo Callback
    
       public Callback get(String string) {
    	Callback val =  cmd.get(string );
       	return val;
        }
    
    e nel main , leggerlo così:
    
        Callback cbk = command.get("User");
            System.out.println(cbk.value("prova"));   // <<<----- ??? perchè mi chiede una stringa
    
    Però mi chiede una stringa per ovvie ragioni che non conosco.
  • Re: [HashMap] switch case

    Cyrano ha scritto:


    Vorrei sostituire il mio switch case con qualcosa di oop.
    A dire il vero .... dovresti spiegare prima meglio cosa vuoi fare in generale e perché.

    P.S. Lascia perdere cosa NetBeans possa averti suggerito/trasformato/complicato ....
  • Re: [HashMap] switch case

    Ciao AndBin ,

    Ho uno switch con una serie di case per gestire alcuni comandi dell'utente. Ogni case richiama un metodo.
    Dovrei creare un altro switch e richiamare anche qui ogni metodo ma di classe differente.
    Vorrei sapere se esiste un modo più elegante per sostituire tutti questi swich.
    Ovviamente devo usare il poliformismo. Leggendo su internet mi sono imbattuto nell'utilizzo dell'hashMap.
    Il quale dovrebbe indicizzare ogni comando ed eseguirne la funzione associata come riportato sopra.
    Infine ho visto come è possibile aggiungere comandi in modo dinamico. Purtroppo sono finito in argomenti per ora ,nuovi.

    Grazie
  • Re: [HashMap] switch case

    Cyrano ha scritto:


    Ho uno switch con una serie di case per gestire alcuni comandi dell'utente.
    Lo switch sarebbe su dei numeri .... o stringhe (Java 7+)?

    Cyrano ha scritto:


    Ogni case richiama un metodo.
    Dovrei creare un altro switch e richiamare anche qui ogni metodo ma di classe differente.
    I metodi nelle varie classi fanno tutti la stessa cosa concettuale o cose radicalmente differenti? Devono poter operare su un oggetto di "contesto" comune oppure no?
    Detto in altro modo? Come generalizzi la forma del metodo?

    Cyrano ha scritto:


    Vorrei sapere se esiste un modo più elegante per sostituire tutti questi swich.
    Sicuramente, c'è solo da chiarire meglio il contesto.
  • Re: [HashMap] switch case

    - Lo switch opera su un oggetto String
    - I metodi fanno cose differenti ma appartengono ad un constesto comune. Ovvero inviano comandi ad un server.
    Ogni server quando riceve quel comando risponde e tutto finisce. Tutti i servers di questo genere fanno così.
    Cosa cambia ?
    Nonostante i servers rispondano tutti nello stesso modo , alcuni di loro parlano una lingua diversa e quindi necessario un metodo che richieda sempre la
    stessa cosa ma in modo differente.Questo deve valere per tutta la serie di comandi per quei servers.

    Edit:
    dimenticavo: i nomi dei comandi sono gusti personali (1).Infatti è nel metodo che viene richiamato la sintassi corretta per comunicare con il server.
    I nomi dei comandi che scelgo devono essere quindi comuni a tutti i server a prescindere dalla differenze sopracitate.
    Questo particolare aggiunge un altro grado di difficoltà che è quello di fare il parsing dei comandi inputati dall'utente per verificare se sono
    corretti ( quindi altro metodo che precede un qualsiasi switch).
    Il tutto funziona, ma vorrei sapere se esiste un modo più semplice per poter faticare di meno in caso di modifica o aggiunte

    non mi sembra molto semplice

    Edit2:
    Mi è venuto in mente come posso affrontare almeno in parte il problema:
    - Creo una classe Astratta con tutti i metodi comuni ai nomi dei comandi che scelgo(1)
    - eredito dalla classe astratta e creo una classe per ogni server implementando i metodi necessari

    Ora in base al server che l'utente sceglie tramite comando inputato dovrò creare un oggetto della classe associata : esempio
    L'utente scrive:
    /server serverA ->creo un oggetto ServerA server = new serverA();

    Ora dovrei capire come Non utilizzare uno switch per richiamare ogni metodo dell'oggetto server dopo ogni comando inputato dall'utente
  • Re: [HashMap] switch case

    Quello che ti serve e' la conoscenza dei Deisgn Patterns:

    https://en.wikipedia.org/wiki/Design_patter

    Leggiti questo:

    https://en.wikipedia.org/wiki/Command_patter

    E' OVVIO che sia complicato, per chi e' alle prime esperienze! Programmare E' COMPLICATO, e non e' questione di linguaggio.

    Certi linguaggi SEMBRANO piu' semplici, ma SOLO SUPERFICIALMENTE: se semplificano da una parte, stai pur certo che complicano da qualche altra.
  • Re: [HashMap] switch case

    Grazie Migliorabile ! Ho letto subito la risposta , mi si è aperto un altro mondo.Da li ho iniziato a leggere.
    Edit:
    Come si ottiene il valore di tipo String di ritorno.Ad esempio nel mio caso
    
            cf.addCommand("!getnick", () ->   { irc.getNick(); });  //Edit : risolto anche questo
    
    L' executeCommand(String name) Rappresenta l'invoker ?

    Qui si riferisce ad apply() ?
    
    The invoker does not know anything about a concrete command, it knows only about command interface 
    
    Il metodo apply nell' interfaccia Command dove viene implementata fisicamente ?

    Mi confermate che :
    il receiver è il metodo che compie l'azione ?

    La stringa "!getnick" , rappresenta il client ?

    Vi ringrazio.
  • Re: [HashMap] switch case

    Non avevo capito che dentro le parentesi graffe si potesse scrivere codice come in qualunque altra parte del programma
    cf.addCommand("!getnick", () ->   { irc.getNick(); }); 
    si può scrivere anche per ottenere il return
    cf.addCommand("!getnick", () ->   {  nick = irc.getNick(); }); 
    fantastico !
Devi accedere o registrarti per scrivere nel forum
8 risposte