Existem algumas ferramentas para ajudar com complexo de 'se' lógica?
-
06-07-2019 - |
Pergunta
Um dos meus demônios programação pessoal sempre foi lógica complexa que precisa ser controlado por comandos if (ou similar). Nem sempre, necessariamente, que o complexo seja, por vezes, apenas alguns estados que precisa ser explicada.
Existem algumas ferramentas ou as etapas de um desenvolvedor pode realizar durante o tempo de design para ajudar a ver os 'estados' e tomar medidas para refatorar o código para baixo para simplificar o código resultante? Estou pensando elaboração de uma matriz ou algo nesse sentido ...?
Solução
Eu recomendo um curso básico de lógica proposicional para cada programador aspirante. Na primeira, a notação e letras gregas pode parecer fora de colocar para a matemática avessos, mas é realmente um dos mais poderosos (e oft-negligenciadas) ferramentas em seu conjunto de habilidades, e bastante simples, no núcleo.
O operadores básicos , de de Morgan e outras leis básicas , verdade mesas , e existência de exemplo disjuntiva e forma normal conjuntiva foram uma grande surpresa para mim. Antes que eu aprendi sobre eles, expressões condicionais senti como animais perigosos. Desde então, eu sei que eu posso chicoteá-los em sua apresentação sempre que necessário, quebrando a artilharia pesada!
Outras dicas
Tabelas de verdade são, basicamente, a abordagem exaustiva e vai (espero) destacar todas as possibilidades.
Você pode gostar de dar uma olhada em Microsoft Pex , que pode ser útil para detectar os casos de franja que você não tinha pensado.
Eu acho que o desenvolvedor está perguntando como fazer sua vida mais fácil quando se lida com o complexo se o código.
A maneira que eu lidar com complexo se o código é o código o mais plano possível e eliminar todas as negações primeiro. Se você pode se livrar de composto se colocando uma parte dele acima, em seguida, fazer isso.
A beleza da simplicidade é que ele não leva um livro ou uma aula para aprender isso. Se você pode quebrá-lo, fazê-lo. Se você pode remover qualquer parte dela, fazê-lo. Se você não entender isso, faça isso de forma diferente. E plana é quase sempre melhor do que aninhados (graças python!).
É mais simples para ler:
if(broken){
return false;
}
if (simple){
doit();
return true;
}
if(complicated){
divide();
conquor();
}
if(extra){
extra();
}
do que está a ler:
if(!broken && (simple || complicated)){
....
}
return false;
Verdade mesas e unidades de testes -. elaborar as tabelas (n dimensional para n variáveis), e, em seguida, usá-los como entradas para o teste de unidade, que pode testar cada combinação de variáveis ??e verificar os resultados
O maior problema que eu vi ao longo dos anos com o IFS complexo é que as pessoas não testar todos os ramos. Certifique-se de escrever um teste para cada possível ramificação não importa o quão improvável, parece que você vai bater-lo.
Você também pode querer experimentar Karnaugh mapeia , que são bons para até 4 variáveis .
Se você não tiver, eu sugiro a leitura código completo . Ele tem um monte de conselhos sobre temas como este. Eu não tenho a minha cópia acessível no momento, caso contrário eu ia postar um resumo desta seção do livro.
Dividir a lógica em unidades discretas (a && b, etc.), cada um com sua própria variável. Em seguida, construir estes acima usando a lógica que você precisa. O nome de cada variável com algo apropriado, de modo que sua declaração complexo é bastante legível (embora possa demorar até várias linhas extras e uma feira de algumas variáveis ??temporárias).
Você tem algum motivo você não pode apenas lidar com a lógica com declarações de guarda?
Karnaugh mapeia pode ser agradáveis ??maneiras de levar informações de uma tabela verdade (sugerido por Visage ) e transformá-los em expressões compactas e / ou / não. Estes são normalmente ensinadas em um curso de lógica digital EE.
Você já tentou um padrão de design? Você pode olhar para o que é conhecido como o padrão Strategy: http://en.wikipedia.org/wiki/ Strategy_pattern
Confira a opção nuclear: Drools . Há muito para ele-- Levei um ou dois dias de exame aprofundado da literatura apenas para obter uma alça sobre suas capacidades. Mas se você tem aplicações onde o complexo se-então a lógica é uma parte evolução do projeto (por exemplo, uma aplicação com algoritmos modulares), pode ser apenas a coisa.