2009-07-27 10 views
5

Ho lavorato a un progetto che implicava una complessa logica booleana. Questa complessità ha reso il codice molto efficiente, ma sfortunatamente difficile da leggere.Esistono raccomandazioni o convenzioni di guide di stile per la formattazione della logica booleana complessa?

Così abbiamo definito la logica come qui di seguito, che ha reso più facile vedere i gruppi all'interno delle istruzioni composte, ed ha anche permesso di aggiungere commenti alle parti della logica.

(Questo codice non è il codice vero e proprio dal progetto, la vera logica era più complessa)

Avete mai visto fare altrove?

Vi sono convenzioni o raccomandazioni di guida stile su come lay out molto complessa logica booleana?

+0

punti bonus se si può aiutarlo ad ottenere il codice x per formattare il codice sorgente come questo –

risposta

7

Riforterà il codice per utilizzare metodi esterni per renderlo più facile da leggere.

if(ValidAngle(angle, previousAngle) && ValidAngle(pairedAngle, previousPairedAngle)) 

ValidAngle(angle, prevAngle){ 
    return angle.angle < kQuiteLow && (previousAngle.angle > kQuiteHigh || previousAngle.time == kUnknownTime) 
} 
+1

OP ha fatto sottolineare l'efficienza in modo da aggiungere il suggerimento che le funzioni siano inline, se possibile. – Duck

+0

@Duck: lascia che sia il compilatore a gestirlo. Usa un profiler se hai dei dubbi. – jason

+1

@Jason È solo un suggerimento per il compilatore che potrebbe rifiutare comunque. Non posso fare a meno di lasciare un suggerimento a meno che il codice non guasta. – Duck

1

Un suggerimento è rompere la logica in metodi. Più facile anche trasformare i tuoi commenti nel nome del metodo, quindi non ne avrai bisogno. Oppure, se sono troppo complessi, sono inclusi nella documentazione del metodo.

if (anglesAreOk(...)) 
{ 
} 

public bool analyseAngles() { 
    return angleOk(...) && previousAngleOk(...) && pairedAngleOk(...) 
} 

È g.t l'idea ...

0

Concordo con samuelcarrijo e PB, estrarre le espressioni complesse in entrambi i metodi o variabili.

Se non è possibile estrarre un metodo per un'astrazione significativo, si potrebbe prendere in considerazione code fragments or blocks.

0

dal libro refactoring di Fowler, sono d'accordo con il consiglio che complessa logica booleana deve essere sostituito con i metodi con nomi significativi, per esempio

if(x && y || !b) { } 

vs

if(customerIsRepeatCustomerFromIdaho(x,y,b)){ } 

o una varietà di test di unità con nomi significativi

esempio

[Test] 
public void CustomersFromIdahoGetDiscountsOnAlternatingTuesdays() 
{ 
    isRepeat=true;isFromIdaho=false;isTuesday=true; 
    Assert.AreEqual(Customer.CalclateDiscount(isRepeat,isFromIdaho,isTuesday),.10) 
} 
0

Come aggiungere i limiti alle classi?

ad es.

if (angle.isQuiteLow() && previousAngle.isQuiteHigh() && previousAngle.isUnknownTime()) 
Problemi correlati