Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Abbiamo provato le nuove CPU Intel Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: più core e ottimizzazioni al funzionamento interno migliorano le prestazioni, anche in virtù di prezzi annunciati interessanti. A questo si aggiungono nuove ottimizzazioni software. Purtroppo, a fronte di prestazioni di calcolo elevate, il quadro rimane incerto nel gaming, dove l'andamento rimane altalenante. Infine, rimane il problema della piattaforma a fine vita.
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-02-2008, 14:28   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
[C#]Liberatemi dagli if !

Eccomi

Spero di riuscire a dare una descrizione precisa del problema:

Ho una griglia, sulla quale devo valutare alcuni dati inseriti dall'utente.

Di volta in volta devo accertarmi che se una determinata cella non ha un dato al suo interno, il programma deve fare determinate cose:

questo è il mio horror code:

Codice:
private void btnSave_Click(object Sender, EventArgs e)
{
    try
    {
           DataBaseManager dbm = new DataBaseManager();
           dbm.OpenConnection();
           InitializeParameter();
           for(int count = 0; count < grid.Rows.Count; count++)
           {
                if(grid.Rows[i].Cells[2].Value != null)
                {
                   //blablabla
                }

                else if (grid.Rows[i].Cells[3].Value != null)
                {
                   //blablabla
                 }
                 
                 else if (grid.Rows[i].Cells[5].Value != null)
                 //blablabla
             }
          }
          catch(MySqlException ex)
          {
              blablabl
          }
}
Come potete vedere, credo che tra il for, la catena infinita di if/else... credo proprio di poter meritare un posto sul the daily wtf


Grazie per l'aiuto.

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 15:36   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quanti if hai ? Solo 3 o ne hai altri ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 15:55   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da cionci Guarda i messaggi
Quanti if hai ? Solo 3 o ne hai altri ?
Sono 6, senza considerare che poi dovrei anche immaginare a delle combinazioni del tipo:

se cella[1] e cella[2] sono vuote; oppure se cella[5] oppure cella[7] non sono vuote....

ma se continuo così avrò una catena di if else pari alle righe di codice di un sistema operativo
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 16:08   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Allora fai un vettore di vettori.
Ogni vettore dovrà contenere la lista delle celle che devono essere != null per il verificarsi della condizione.
Dovresti aggiungere per ogni riga anche un method object (tutti derivati da uno base) che deve essere richiamato al momento in cui tutte le condizioni sono verificate.
A questo punto ti scorri tutte le condizioni e le verifichi. La complessità di tempo è sicuramente maggiore, ma ti eviti tutti gli if.

Se le condizioni dovessero diventare più complicate dovresti organizzare il tutto in un albero binario in modo da non dover verificare tante volte le stesse condizioni le condizioni.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 16:30   #5
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Uhm credo sia troppo complicato allora da fare per le mie conoscenze attuali
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 17:22   #6
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
per me basterebbe scorrerti anche le colonne oltre le righe e riduci tutto a qualcosa del genere:
Codice:
for(int i = 0; i < grid.Rows.Count; i++)
{
    for(int j = 0; j < grid.Rows.Cells.Count; j++)
    {
        getClass().getMethod("cellNotNull" + j).invoke();
    }
}
ovviamente getClass().getMethod("cellNotNull" + j).invoke(); è pseudo codice e dovresti usare la reflction di c# (di cui non ho idea della sintassi ) e quindi semplicemente crearti dei metodi (anche in una classe Handler a parte) che gestiscano correttamente l'azione che deve essere eseguita nei vari casi.

P.S. e cmq non è per nulla complicato dato che per usare la reflection dubito che tu debba scrivere + di 5 righe di codice
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2008, 17:34   #7
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Credo allora di dovermi leggere qualcosa sulla reflection, dato che sinceramente non so cosa sia
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 22:19   #8
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Lascia perdere.
Se le varie blablabla sono tutte diverse l'una dall'altra, a seconda della colonna che stai processando, usare i 2 for annidati con la reflection non fa che spostare il problema.
Il codice dei vari blablabla lo dovrai scrivere comunque, da un'altra parte, e forse renderendo il tutto meno leggibile.

farei cosi'

Codice:
for(int i = 0; i < grid.Rows.Count; i++)
{
    for(int j = 0; j < grid.Rows.Cells.Count; j++)
    {
        if (grid[i][j]!=null)
        {
            switch(j)
            {
                case 1:blablabl
                        break;
                case 2: balbalbalb
                        break;


                case n: blbalblablablab
                         break;
            }

        }
    }
}

Se invece i vari blablabla fossero tutti uguali o molto simili tra loro, allora se ne puo' discutere ed ottimizzare.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 08-02-2008 alle 22:22.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 22:27   #9
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Lascia perdere.
Se le varie blablabla sono tutte diverse l'una dall'altra, a seconda della colonna che stai processando, usare i 2 for annidati con la reflection non fa che spostare il problema.
Il codice dei vari blablabla lo dovrai scrivere comunque, da un'altra parte, e forse renderendo il tutto meno leggibile.

farei cosi'

Codice:
for(int i = 0; i < grid.Rows.Count; i++)
{
    for(int j = 0; j < grid.Rows.Cells.Count; j++)
    {
        if (grid[i][j]!=null)
        {
            switch(j)
            {
                case 1:blablabl
                        break;
                case 2: balbalbalb
                        break;


                case n: blbalblablablab
                         break;
            }

        }
    }
}

Se invece i vari blablabla fossero tutti uguali o molto simili tra loro, allora se ne puo' discutere ed ottimizzare.
Il codice è normale che deve essere scritto.
Ma può benissimo crearsi una classe ValidationHandler (o quello che è a seconda di quello che deve fare) e, volendo, anche utilizzare dei metodi dal nome significativo (tipo validateNameNull e cose del genere) semplicemente inserendo in una mappa l'intero corrispondente alla posizione corrente della colonna con il nome del metodo.
Per me è MOOOLTO + leggibile di uno switch case che trovo orribile al pari degli if
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 22:31   #10
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Ma tanto non funzionerebbe.
Se i contenuti di 2 celle sono dello stesso tipo, i cui 2 blablabla da farsi sono pero' diversi, durante l'invocazione del metodo in reflection come li distingui?
(PS con il C#3.0 ci sono i metodi extension, quindi sarebbe anche possibile e piu' elegante della reflection)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 22:46   #11
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Ho capito cosa vuoi dire.
L'if lo faresti fare alla reflection.
Si puo' fare anche senza reflection, facendo fare l'if al polimorfismo, ma per me resta meno leggibile.
E soprattutto meno leggibile anche per il mio vicino di scrivania, che magari fra un anno e mezzo deve cambiare qualcosa.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 22:49   #12
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Ma tanto non funzionerebbe.
Se i contenuti di 2 celle sono dello stesso tipo, i cui 2 blablabla da farsi sono pero' diversi, durante l'invocazione del metodo in reflection come li distingui?
(PS con il C#3.0 ci sono i metodi extension, quindi sarebbe anche possibile e piu' elegante della reflection)
e mica deve distinguerli in base al contenuto..
in base alla posizione.
Immagina questa situazione:
Codice:
 cella1  cella2  cella3  cella4
 code1   code2   code3   code4
scorrendo orizzontalmente la tabella andresti da 0 a 3.
Ora immagine uno string array così fatto:
Codice:
string[] handlerMethodsNames = new string[] {"handleThis", "handleThat", "handleAnother", handleAnotherOne"};
e questo ciclo (scritto in pseudo-java):
Codice:
for(int i = 0; i < grid.Rows.Count; i++)
{
    for(int j = 0; j < grid.Rows.Cells.Count; j++)
    {
        getClass().getMethod(handlerMethodsNames[j]).invoke();
    }
}
e la classe ValidatorHandler che contenga l'implementazione dei metodi con i nomi contenuti del vettore.
In questo modo hai concentrato nella classe handler tutti i metodi da invocare per la validazione (o quello che è) delle celle e, se hai usato un nome significativo, sai esattamente quale metodo andare a cercare nel caso tu debba modificare il codice di qualche cella.
Ma soprattutto, cosa non banale, hai ridotto di n volte la complessità ciclomatica del metodo originale della tua classe e aumentato conseguentemente la leggibilità del tutto
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 22:51   #13
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Si', esatto come pensavo volessi fare.
Sparpagli il codice in giro, in funzioni che vengono chiamate da un punto solo del programma.

Comunque basta un array di delegate per fare quello che proponi.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 08-02-2008 alle 22:55.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 23:02   #14
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Si', esatto come pensavo volessi fare.
Sparpagli il codice in giro, in funzioni che vengono chiamate da un punto solo del programma.

Comunque basta un array di delegate per fare quello che proponi.
ah ok..
i delegate li ho usati solo negli handlers dei listener per ora...
Ancora non so una mazza di C#
dovessi mai trovare un attimo di tempo dovrei leggermi giusto un paio di libri al riguardo
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 23:07   #15
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Te li consiglio, risolvono tantissimi problemi e talvolta non se ne puo' fare a meno (come nei thread)
Ho inziato a studiare una nuova forma di delegate del C#3.0, le lambda function.
Su alcuni esempi che ho visto sono davvero concise e potenti.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 23:15   #16
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Te li consiglio, risolvono tantissimi problemi e talvolta non se ne puo' fare a meno (come nei thread)
Ho inziato a studiare una nuova forma di delegate del C#3.0, le lambda function.
Su alcuni esempi che ho visto sono davvero concise e potenti.
è che l'unico libro che avevo iniziato a leggere di C# era il sempreverde "extreme programming adventures in C#" del mitico Ron Jeffries, ma quello + che sul linguaggio C# era concentrato sulle metodologie di programmazione agili (anzi.. ricordo che all'inizio nemmeno lui sapeva dell'esistenza dei delegates che ha dovuto utilizzare per implementare un command pattern ).
Ora mi sa che me ne servirebbe qualcuno in particolare sul linguaggio perchè ho notato che, nonostante le similitudini con java, per alcune cose che in java mi verrebbero immediate ci perdo troppo tempo in C#....
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 23:18   #17
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quelli rossi con copertina in sfondo nero, della Microsoft Press sono fatti abbastanza bene.
E soprattutto la gente che li scrive e' davvero disponibile. Mi e' capitato piu' volte di mandare mail chiedendo spiegazioni e si sono dimostrati piu' volte tutti molto disponibili.
Quelli che hanno scritto il manuale della LINQ extension sono italiani!
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2008, 23:20   #18
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Eccolo, con i delegate.
Ma continuo a pensare che in azienda avrebbero preferito lo switch.

Codice:
 class Program
    {

        delegate int ProcessaColonna(object val);

        static int PRCol1(object val)
        {
            //BLABLABLA
            return 0;
        }

        static int PRCol2(object val)
        {
            //BLABLABLA
            return 0;
        }

        static int PRCol3(object val)
        {
            //BLABLABLA
            return 0;
        }

        static int[][] cella = null; //solo per compilare.
                    
        static void Main(string[] args)
        {            
            List<ProcessaColonna> fnarr=new List<ProcessaColonna>();
            fnarr.Add(PRCol1);
            fnarr.Add(PRCol2);
            fnarr.Add(PRCol3);

            for (int t = 0; t < 10; t++)
            {
                for (int u = 0; u < 10; u++)
                {
                    object obj=cella[t][u];
                    if (obj!=null) fnarr[u].Invoke(obj);
                }
            }
                                   
        }
    }
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 08-02-2008 alle 23:26. Motivo: mancava l'if, la cosa piu' importante
gugoXX è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ayaneo non ce la fa: la crisi di RAM e S...
Roborock F25 Ultra è la vera novi...
Dopo Bluepoint, Sony chiude un altro stu...
Windows e il caos delle interfacce: l'ex...
HP lancia i nuovi HyperX OMEN MAX 45L e ...
Amazon compra Fauna Robotics: il futuro ...
Arm entra direttamente nel mercato delle...
Epic Games licenzia 1000 persone, il mot...
Offerte OLED su Amazon: protagonisti gli...
Non solo smartphone: ecco come 'Human x ...
Offerte Amazon sui componenti PC: schede...
La Switch 2 ha venduto meno del previsto...
Crimson Desert si ferma: il lancio &egra...
LG è ancora leader indiscussa del...
Apple non si accontenta: arriva la pubbl...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:21.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v