Pregunta

Uno de mis demonios de programación personal siempre ha sido una lógica compleja que debe controlarse mediante sentencias if (o similares). No siempre es necesariamente tan complejo, a veces solo algunos estados que deben tenerse en cuenta.

¿Existen herramientas o pasos que un desarrollador pueda realizar durante el tiempo de diseño para ayudar a ver los "estados" y tomar medidas para refactorizar el código para simplificar el código resultante? Estoy pensando en dibujar una matriz o algo así ...?

¿Fue útil?

Solución

Recomiendo un curso básico en lógica proposicional para cada programador aspirante. Al principio, la notación y las letras griegas pueden parecer desagradables para el adversario matemático, pero en realidad es una de las herramientas más poderosas (y a menudo descuidadas) en su conjunto de habilidades, y bastante simple, en esencia.

Los operadores básicos , de Morgan's y otras leyes básicas , tablas de verdad , y existencia de, por ejemplo, disjunctive y las formas normales conjuntivas me abrieron los ojos. Antes de que aprendiera sobre ellos, las expresiones condicionales se sentían como bestias peligrosas. ¡Desde entonces, sé que puedo enviarlos cuando sea necesario rompiendo la artillería pesada!

Otros consejos

Las tablas de verdad son básicamente el enfoque exhaustivo y (con suerte) resaltarán todas las posibilidades.

Es posible que desee echar un vistazo a Microsoft Pex , que puede ser útil para detectar los casos marginales que no había pensado.

Creo que el desarrollador está preguntando cómo hacer su vida más fácil cuando se trata de código complejo.

La forma en que manejo el complejo si el código es codificar lo más plano posible y eliminar primero todas las negaciones. Si puedes deshacerte del compuesto si colocas una parte del mismo en la parte superior, hazlo.

La belleza de la simplicidad es que no se necesita un libro o una clase para aprenderlo. Si puedes romperlo, hazlo. Si puedes eliminar cualquier parte de él, hazlo. Si no lo entiendes, hazlo de manera diferente. Y el plano es casi siempre mejor que anidado (¡gracias Python!).

Es más simple de leer:

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

de lo que es leer:

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

Tablas de verdad y pruebas unitarias: dibuje las tablas (n dimensional para n variables) y luego utilícelas como entradas para su prueba de unidad, que puede probar cada combinación de variables y verificar los resultados.

El mayor problema que he visto a lo largo de los años con IF complejas es que la gente no prueba todas las sucursales. Asegúrate de escribir una prueba para cada rama posible, no importa lo poco probable que parezca que la alcanzarás.

También es posible que desee probar mapas de Karnaugh , que son buenos para hasta 4 variables .

Si aún no lo ha hecho, le sugiero que lea Código Completo . Tiene muchos consejos sobre temas como este. Por el momento no tengo mi copia a mano, de lo contrario, publicaría un resumen de esta sección en el libro.

Divida la lógica en unidades discretas (a & amp; & amp; b, etc.), cada una con su propia variable. Luego constrúyelos usando la lógica que necesitas. Nombre cada variable con algo apropiado, de modo que su declaración compleja sea bastante legible (aunque puede ocupar varias líneas adicionales y unas pocas variables temporales).

¿Alguna razón por la que no pueda manejar la lógica con declaraciones de protección?

Mapas de Karnaugh pueden ser buenas maneras de obtener información de una tabla de verdad (sugerida por Visage ) y convirtiéndolos en expresiones compactas y / o / o no. Estos se enseñan normalmente en un curso de lógica digital de EE.

¿Has probado un patrón de diseño? Puede examinar lo que se conoce como el patrón de estrategia: http://en.wikipedia.org/wiki/ Strategy_pattern

Consulte la opción nuclear: Drools . Hay muchas cosas: me llevó uno o dos días leer detenidamente la literatura solo para comprender sus capacidades. Pero si tiene aplicaciones en las que su compleja lógica if-then es una parte evolutiva del proyecto (por ejemplo, una aplicación con algoritmos modulares), podría ser la solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top