Come strutturare un'enorme istruzione condizionale?

0

Sto creando una specie di applicazione "assistente personale" che è fondamentalmente un servizio web che riceve un messaggio e poi fa qualcosa in base ad esso.

Ad esempio, invio "che ore sono?" e ricevo l'ora corrente come risposta. Altri esempi:

  • "dimmi una barzelletta" - > interroga e invia alcuni scherzi da una API pubblica
  • "Devo [X] - > imposta [X] nella lista cose
  • "Che cosa devo fare?" - > invia la lista di cose da fare
  • "Avvia il mio pc" - > Avvia PC tramite Wake On Lan

o qualsiasi altra cosa mi venga in mente.

Il mio primo prototipo utilizza solo una dichiarazione if else che assomiglia a

if message.contains("foo"):
  # do foo stuff
elif message.contains("bar"):
  # do bar stuff

Ovviamente questo sarà un disastro totale dopo l'aggiunta di diversi comandi, quindi sto pensando a quale sarebbe un buon concetto per strutturare una dichiarazione condizionale così grande.

(Sto usando Python con il framework web.py)

Un'idea è di usare qualche lista / mappa per creare una mappatura tra parole chiave e funzioni associate e suddividere le funzionalità in classi diverse (come un modulo di elenco delle cose da fare e così via).

Esistono applicazioni come WolframAlpha o Siri che hanno solo un singolo metodo di input ma diverse centinaia o migliaia di funzioni diverse nel brackground. Naturalmente quelli sono a un livello completamente diverso, ma in generale, come si crea una ramificazione bella e pulita da un singolo input a un gran numero di diverse funzioni?

    
posta das Keks 02.03.2016 - 16:19
fonte

1 risposta

1

Il solito approccio per mappare le stringhe alle funzioni consiste nell'utilizzare un dizionario o una tabella hash. Ecco come apparire in C #:

var commands = new Dictionary<string, Action<string>>();

Questo crea una tabella hash con una chiave stringa e un metodo delegato prendendo un parametro (in questo caso una stringa. Puoi usare il parametro come vuoi).

Puoi creare i comandi in fase di compilazione:

var commands = new Dictionary<string, Action<string>>
{
    { "Tell me a joke", TellJoke }, 
    { "I have to",  IHaveTo }
};

o in fase di esecuzione:

commands.add("Tell me a joke", TellJoke);

Dove TellJoke è un metodo che accetta un parametro e non restituisce nulla. Dopo un po 'di pre-elaborazione della stringa di ricerca, la funzione mappata verrà quindi chiamata così:

Commands[searchKey](searchString);

o più robusto:

bool ExecuteCommand(string key, string search)
{
    if (commands.Contains(key))
    {
        Commands[searchKey](search);
        return true;
    }
    return false;
}

Ovviamente, un vero assistente personale non funzionerebbe in questo modo. Avresti una sorta di motore che può essere modificato in fase di esecuzione, non in fase di compilazione, in modo che possa imparare.

    
risposta data 02.03.2016 - 16:57
fonte

Leggi altre domande sui tag