2009-03-09 13 views
10

Uno dei miei demoni di programmazione personali è sempre stata una logica complessa che deve essere controllata da istruzioni if ​​(o simili). Non sempre è necessariamente così complesso, a volte solo alcuni stati che devono essere considerati.Esistono strumenti per semplificare la logica "se" complessa?

Esistono strumenti o procedure che uno sviluppatore può eseguire durante la fase di progettazione per aiutare a vedere gli "stati" e adottare misure per ridimensionare il codice per semplificare il codice risultante? Sto pensando di disegnare una matrice o qualcosa del genere ...?

risposta

17

Suggerirei un corso base in propositional logic per ogni aspirante programmatore. All'inizio, la notazione e le lettere greche potrebbero sembrare scoraggianti per la matematica, ma in realtà è uno degli strumenti più potenti (e spesso trascurati) del tuo skillset, e piuttosto semplice, al centro.

Il basic operators, de Morgan's e other basic laws, truth tables, e l'esistenza di esempio disjunctive e conjunctive normal forms mi hanno aperto gli occhi. Prima che venissi a conoscenza di loro, le espressioni condizionali sembravano bestie pericolose. Da allora, so che posso frustarli in sottomissione ogni volta che è necessario, rompendo la pesante artiglieria!

3

Tabelle di verità e test di unità - elaborare le tabelle (n dimensionale per n variabili) e quindi utilizzarle come input per il test dell'unità, in grado di testare ciascuna combinazione di variabili e verificare i risultati.

+0

Le tabelle di verità sono sempre a 2 dimensioni (a meno che non ci siano stati nuovi sviluppi?). Intendi n colonne per n variabili? –

+0

tabelle di verità multidimensionali? sembra interessante! –

+1

Er ... le tabelle di verità hanno colonne per tutte le variabili e le righe per tutte le combinazioni di valori. Puoi rappresentare tutte le variabili che vuoi. – cletus

0

Dividere la logica in unità discrete (a & & b, ecc.) Ciascuna con la propria variabile. Quindi costruiscile usando la logica che ti serve. Assegna un nome a ogni variabile con qualcosa di appropriato, in modo che la tua dichiarazione complessa sia abbastanza leggibile (anche se potrebbe richiedere diverse righe aggiuntive e alcune poche variabili temporanee).

+0

Ok, questo è più o meno l'approccio che prendo, il problema è che mi ritrovo a riempire le nuove filiali nel momento in cui identifico la necessità per loro e non riesco a trovare un ramo esistente. Questo ovviamente risulta nel codice spaghetti ... ho bisogno di un modo per prendere questo e 'vedere l'immagine più grande' –

5

Le tabelle di verità sono fondamentalmente l'approccio esauriente e (si spera) evidenzieranno tutte le possibilità.

Si potrebbe dare un'occhiata a Microsoft Pex, che può essere utile per individuare i casi marginali a cui non avevate pensato.

+1

+1 per le informazioni su Pex. Sembra un ottimo strumento. –

2

Il problema più grande che ho visto negli anni con IF complessi è che le persone non testano tutti i rami. Assicurati di scrivere un test per ogni possibile ramo, non importa quanto sia improbabile che tu lo colpisca.

0

Qualsiasi motivo non è possibile gestire la logica con istruzioni di protezione?

2

Si potrebbe anche voler provare Karnaugh maps, che sono buoni per un massimo di 4 variabili.

+0

mi hai battuto su di esso. –

+0

Le mappe di Karnaugh sono buone per questo. Peccato che li odio con passione. Sono ciò che mi ha convinto che non voglio mai diventare un ingegnere informatico. :-) –

0

Karnaugh maps può essere un modo piacevole di prendere informazioni da una tabella di verità (suggerita da Visage) e trasformarle in espressioni compatte e/o/non. Questi sono in genere insegnati in un corso di logica digitale EE.

1

Se non l'hai già, ti consiglio caldamente di leggere Code Complete. Ha molti consigli su argomenti come questo. Al momento non ho la mia copia a portata di mano, altrimenti pubblicheremo un riassunto di questa sezione nel libro.

4

Penso che lo sviluppatore sta chiedendo come rendere la vita più facile quando si tratta di codice complesso se.

Il modo in cui gestisco il codice complesso se il codice è il più pianeggiante possibile ed estirpare prima tutte le negazioni. Se riesci a liberarti del composto se ne metti una parte sopra, fallo.

La bellezza della semplicità è che non ci vuole un libro o una lezione per impararlo. Se riesci a romperlo, fallo. Se è possibile rimuovere qualsiasi parte di esso, farlo. Se non lo capisci, fallo diversamente. E flat è quasi sempre meglio di nidificato (grazie a Python!).

E 'più semplice da leggere:

if(broken){ 
    return false; 
} 
if (simple){ 
    doit(); 
    return true; 
} 
if(complicated){ 
    divide(); 
    conquor(); 
} 
if(extra){ 
    extra(); 
} 

di quello che è da leggere:

if(!broken && (simple || complicated)){ 
.... 
} 
return false; 
0

Partenza l'opzione nucleare: Drools. C'è molto da fare-- mi ci sono voluti un giorno o due per esaminare la letteratura solo per avere un'idea delle sue capacità. Ma se si dispone di applicazioni in cui la complessa logica if-then è una parte in evoluzione del progetto (ad esempio un'applicazione con algoritmi modulari) potrebbe essere proprio la cosa.

Problemi correlati