2009-07-27 10 views
5

Trabajé en un proyecto que involucraba lógica booleana compleja. Esta complejidad hizo que el código fuera muy eficiente, pero desafortunadamente difícil de leer.¿Existen recomendaciones de guías de estilo o convenciones para formatear lógica booleana compleja?

Así que establecimos la lógica como a continuación, lo que hizo más fácil ver los grupos dentro de las declaraciones compuestas, y también hizo posible agregar comentarios a partes de la lógica.

(Este código no es código real del proyecto, la lógica real era más compleja)

¿Alguna vez ha visto este hecho en otro sitio?

¿Existen convenciones o recomendaciones de guías de estilo sobre cómo diseñar una lógica booleana muy compleja?

+0

puntos de bonificación si usted puede ayudar a conseguir x código para formatear el código fuente como esta –

Respuesta

7

Refactorizaría el código para usar métodos externos para facilitar la lectura.

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

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

OP hizo hincapié en la eficiencia por lo que añadir sugerencia de que las funciones de ser inline si es posible. – Duck

+0

@Duck: deje que el compilador maneje eso. Use un generador de perfiles si tiene dudas. – jason

+1

@Jason Es solo una sugerencia para el compilador que podría rechazar de todos modos. No se puede hacer daño para dejar caer una pista a menos que la inflamación del código sea una preocupación. – Duck

1

Una sugerencia es romper la lógica en los métodos. También es más fácil transformar tus comentarios en el nombre del método, por lo que no los necesitarás. O, si son demasiado complejos, se incluyen en la documentación del método.

if (anglesAreOk(...)) 
{ 
} 

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

Usted g.t la idea ...

0

Estoy de acuerdo con samuelcarrijo y Pb, extraer las expresiones complejas en cualquiera de los métodos o variables.

Si no puede extraer un método para una abstracción significativa, puede considerar code fragments or blocks.

0

Del libro de refactorización de Fowler, estoy de acuerdo con el consejo de que la lógica booleana compleja debe reemplazarse por métodos con nombres significativos, p.

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

vs

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

o una variedad de pruebas de unidad con nombres significativos

por ejemplo

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

¿Qué le parece agregar los límites a sus clases?

p. Ej.

if (angle.isQuiteLow() && previousAngle.isQuiteHigh() && previousAngle.isUnknownTime()) 
Cuestiones relacionadas