giova95 (Normal User)
Rookie
Messaggi: 29
Iscritto: 23/12/2011
|
ciao a tutti e buon anno
Ho un dubbio che mi gira in testa già da tempo...
cerco di esporre il mio dubbio con un esempio (quindi il mio dubbio non è sul programma che vi espongo ma sul concetto in generale)
Ipotizziamo che io debba realizzare un programma che risponda (tramite msgbox x esempio) a delle domande poste dall'utente.
Per semplificare ipotizziamo che l'utente possa inserire solo frasi standard...
Facendo nel modo "classico" (quello che è venuto in mente a me) bisognerebbe verificare tramite struttura If o Case quale domanda è stata fatta e andrebbe anche bene nel caso in cui il programma sia "limitato"
Però se volessimo fare in modo che le domande possibili siano molte, ipotizziamo un numero spropositato... 100.000 domande diverse (alle quali corrispondono risposte diverse), suppongo che il processo sarebbe molto lento no?
Quindi ho pensato, un ipotetico programma del genere sarebbe molto più veloce ed efficiente se si potesse creare un evento per ogni "domanda"
Del tipo: (scrivo un ipotetico codice, so anche io che è sbagliato)
Codice sorgente - presumibilmente VB.NET |
Public evento1 As Event Public evento2 As Event '... Public evento 100000 As Event evento1.generated when textbox1.text = "ciao come stai?" evento2.generated when textbox1.text = "come hai passato il natale?" '... evento513.generated when textbox1.text = "quanto fa 2 +2 meno le zampe di una gallina?" '... evento100000.generated when textbox1.text = "come posso prevedere il futuro?" Private Sub evento1(ByVal ..., ByVal ....) Handles event1 msgbox("bene grazie") End Sub Private Sub evento2(ByVal ..., ByVal ....) Handles event2 msgbox("il mio natale è stato bellissimo") End Sub 'non vado avanti tanto avete capito il meccanismo :)
|
Senza stare a guardare le boiate che ho scritto a livello logico e di ragionamento è giusto?
si può fare in una qualche maniera?
grazie
Ultima modifica effettuata da giova95 il 02/01/2012 alle 17:37 |
|
Renny (Normal User)
Expert
Messaggi: 231
Iscritto: 30/07/2011
|
Credo che il procedimento sia sbagliato a posteriori.
Mi spiego: devi organizzare il tuo codice in modo da separare la parte dei "dati" da quella del codice logico che li elabora. Il fatto di separare le informazioni permette di scrivere del codice efficace che può essere utilizzato e richiamato iterando i dati.
Nel pratico: ha senso mettere domande, fossero anche 100000 in un database, a cui associare anche la risposta. Questa è la parte dei dati. Il resto del codice, cioè la verifica della correttezza della risposta e dell'interfaccia grafica per "interagire" con l'utente invece va scritta 1 sola volta e riutilizzata sempre. Per questo ha senso spezzare il codice in funzioni e routine. Meglio ancora: impara a ragionare per oggetti e questi dubbi non ti verranno mai. Un'altra cosa: non ha senso pensare ad operazioni che possano mettere in difficoltà il tuo pc: un buon programma, strutturato bene, deve avere veramente una mole enorme di dati da trattare, prima di rallentare molto o esaurire la ram a disposizione.
Ciao.
|
|
Qwertj (Dev Team)
Guru
Messaggi: 678
Iscritto: 30/05/2011
|
Come dice Renny la cosa migliore sarebbe un Database, altrimenti crei un Hashtable che ha come chiavi le domande e come valori le risposte, così per mostrare la risposta basta che fai
Codice sorgente - presumibilmente Plain Text |
MessageBox.Show(Questions(Question))
|
Dove Questions è l'Hashtable e Question la domanda dell'utente
|
|
giova95 (Normal User)
Rookie
Messaggi: 29
Iscritto: 23/12/2011
|
renny, hai ragione, scusa... il codice l'ho scritto in fretta
Comunque fai conto che il codice effettivo era questo
Codice sorgente - presumibilmente VB.NET |
Private Sub evento1(ByVal ..., ByVal ....) Handles event1 msgbox("bene grazie") End Sub Private Sub evento2(ByVal ..., ByVal ....) Handles event2 msgbox("il mio natale è stato bellissimo") End Sub
|
ed è inevitabile una cosa del genere in quanto sono eventi diversi e devono essere gestiti in sub diversi.
La parte precedente era la creazione degli eventi... non so nemmeno se sia possibile una cosa del genere.
Io voglio creare un evento nuovo... un evento tipo il click di un bottone ma che non è "previsto" di default da vb e quindi è necessario che lo crei io
x qwerty: il programma "domande - risposte" è un esempio... il mio dubbio è sul gestire degli eventuali nuovi eventi
Per capirci meglio... quando si verifica l'azione di cliccare su un bottone (x esempio) il programma non deve verificare quale tra tutto l'elenco degli eventi è stato generato ma si crea subito un collegamento con il codice corrispondente, giusto? (se fino a qui ho sbagliato, avvisatemi O.o)
Nel caso di un ipotetico programma del genere dovrei verificare che domanda è stata digitata confrontandola con tutte le domande nel database e funzionerebbe anche nel modo giusto ma io vorrei sapere se fosse possibile generare un evento in modo che non sia necessario fare inutili confronti che fanno perdere tempo
spero di essere riuscito a spiegarmi... scusate se il mio ragionamento è poco comprensibile ma non trovo un altro modo di spiegarmi...
Ultima modifica effettuata da giova95 il 02/01/2012 alle 17:40 |
|
Renny (Normal User)
Expert
Messaggi: 231
Iscritto: 30/07/2011
|
Se il tuo scopo è imparare come creare nuovi eventi e associarli magari ad un oggetto nuovo, creato da te, ti consiglio di leggerti questa guida.
http://www.pierotofy.it/pages/guide/Guida_al_Visual_Basic_ ...
Se proprio vuol esercitarti su quello, potresti creare un oggetto "quiz", che contiene la domanda e la risposta. Poi crei una sub "interroga" che può "generare" 2 eventi: l'evento risposta giusta e l'evento risposta sbagliata.
Creare 100000 eventi quante sono le domande è concettualmente sbagliato: quello che devi fare è astrarre: costruisci un codice riusabile che vada bene a prescindere dalla domanda che stai analizzando. In fondo, tu imposti la domanda come string, la risposta come string, fai un check e restituisci true o false a seconda se la risposta sia giusta. Questo "processo" logico vale per tutte le possibili domande che decidi di inserire...
Ultima modifica effettuata da Renny il 02/01/2012 alle 17:42 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Secondo me tutto il discorso è insensato ...
Gli eventi non si applicano alla ricerca di una particolare frase (o a dei dati in genere) per cui un database (con i suoi indici) è la soluzione normale.
Quindi, o non hai utilizzato l'esempio giusto o non riesci a dire quello che vorresti fare.
Ultima modifica effettuata da nessuno il 02/01/2012 alle 20:26
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
giova95 (Normal User)
Rookie
Messaggi: 29
Iscritto: 23/12/2011
|
Grande renny
Le guide le avevo lette ma quella probabilmente devo averla saltata .-. mea culpa
Leggo e se ci sono eventuali dubbi chiedo
grazie ancora renny
|
|
VMikle (Ex-Member)
Rookie
Messaggi: 52
Iscritto: 14/09/2011
|
Io penso che siano stati posti principalmente due problemi:
1) come definire degli eventi personalizzati e scatenarli
2) come evitare un controllo diretto di valori
Il primo sarà risolto dopo la lettura di qualche guida ma, per evitare situazioni analoghe in futuro, è necessario che tu sappia che l'intero framework è basato su alcuni elementi di livello basso utilizzati per creare una logica riciclata per creare nuove caratteristiche.
In parole povere si ha un punto di partenza "grezzo" e poi uno sviluppo dato combinazioni di strutture precedentemente create, quindi spesso risulta utile chiedersi come sia possibile che avvenga un determinato fenomeno dietro le quinte (ad esempio se textbox.textchanged fosse il fenomeno e basterebbe osservare il controllo textbox come classe e domandarsi sulla sua meccanica).
Il secondo invece è qualcosa di più complesso, infatti in tutti casi sin ora postati (vedasi database, if e compagnia bella) viene sempre effettuato un controllo diretto in un modo o nell'altro, addirittura anche nel tuo esempio è logico immaginare la clausola "when" come una verifica.
Cose del genere credo vadano risolte sfruttando tecniche di ricerca per pattern e\o metodi di apprendimento da intelligenza artificiale, ma non sapendone un granché preferisco rimanere in forse
Ultima modifica effettuata da VMikle il 03/01/2012 alle 12:14 |
|