Existem algumas ferramentas para ajudar com complexo de 'se' lógica?

StackOverflow https://stackoverflow.com/questions/626120

  •  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 ...?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top