Gestire i comandi ricevuti senza if-else if

sabato 05 aprile 2008 - 11.00

JohnAsh Profilo | Junior Member

Ciao a tutti,

ho creato un'applicazione che riceve dei comandi tramite una socket aperta verso un client.
Ho un metodo che si occupa di ricevere la stringa inviata dal client, dopodicchè ci sono un'infinità di if-else if (uno per ogni comando) che si occupano di "inoltrare" il comando alla relativa funzione per svolgere l'operazione richiesta.

Sto cercando un modo più "elegante" di gestire i comandi, in C usavo un array bidimensionale, in cui creavo una corrispondeza tra il comando ed un puntatore alla funzione che si occupa della sua gestione. In questo modo, alla ricezione della stringa dal client, facevo un semplice for all'interno del'array e richiamavo la funzione referenziata dal puntatore corrispondente al comando ricevuto.

Il problema è che non ho la minima idea di come replicare lo stesso meccanismo in .NET (C++).

Qualcuno può aiutarmi? Anche suggerendo altri metodi per la gestione, basta che tolgo da mezzo tutti questi if .. che mi fanno letteralmente impazzire.

Grazie in anticipo.

aiedail92 Profilo | Expert

Ciao

Non conosco il c++, però posso darti un suggerimento su come io risolverei il problema:

Creerei un Dictionary generico con chiavi di tipo string e valori di tipo Action (un delegato che rappresenta un metodo che non accetta argomenti e non restituisce alcun valore), che corrisponderebbe al tuo array bidimensionale. In questo memorizzerei tutte le coppie (string, Action), corrispondenti a nomeMetodo, metodo; un po' come tu memorizzavi il nome del metodo e il puntatore alla funzione. A questo punto quando ricevi il comando basta ottenere il valore del dictionary mediante il nome del metodo e quindi invocare il delegato. Naturalmente ho dovuto presupporre che il metodo non richieda argomenti e non restituisca valori.

Ti scrivo un esempietto in C#, sperando che tu riesca a capirlo:

//Questo contiene tutte le coppie nomeMetodo, Metodo Dictionary<string, Action> dict = null; //Popola il Dictionary con il nome del comando //e la funzione rappresentata private void PopulateDictionary() { dict = new Dictionary<string, Action>(); dict.Add("Funzione1", new Action(funzione1)); dict.Add("Funzione2", new Action(funzione2)); dict.Add("Funzione3", new Action(funzione3)); dict.Add("Funzione4", new Action(funzione4)); } //Le funzioni usate per l'esempio private void funzione1() { MessageBox.Show("Chiamata la funzione 1"); } private void funzione2() { MessageBox.Show("Chiamata la funzione 2"); } private void funzione3() { MessageBox.Show("Chiamata la funzione 3"); } private void funzione4() { MessageBox.Show("Chiamata la funzione 4"); } //Questa funzione la chiami quando ricevi un comando //Passando come parametro il nome del comando void OnCommandRecived(string command) { //Se il dictionary è null... if (dict == null) { //... lo popoli PopulateDictionary(); } try { dict[command].Invoke(); } catch (KeyNotFoundException ) { MessageBox.Show("Comando non valido"); } }

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5