Существуют ли какие-либо инструменты для помощи сложной логике "если"?

Один из моих персональных демонов программирования всегда был сложной логикой, которая должна контролироваться операторами if (или аналогичными). Не всегда обязательно это сложное, иногда просто несколько состояний, которые нужно учитывать.

Существуют ли какие-либо инструменты или шаги, которые разработчик может выполнять во время разработки, чтобы помочь увидеть "состояния" и принять меры для реорганизации кода, чтобы упростить полученный код? Я думаю, что нужно составить матрицу или что-то в этом роде...?

Ответ 1

Я бы порекомендовал базовый курс в пропозициональную логику для каждого стремящегося программиста. Во-первых, обозначения и греческие буквы могут казаться непринужденными, но это действительно один из самых мощных (и часто забытых) инструментов в вашем наборе навыков и довольно простой, в основе.

основные операторы, de Morgan's и другие основные законы, таблицы истинности и существование, например, disjunctive и конъюнктивные нормальные формы были открытыми мне. Прежде чем я узнал о них, условные выражения ощущались как опасные звери. С тех пор я знаю, что могу приложить их к подчинению, когда это необходимо, разрывая тяжелую артиллерию!

Ответ 2

Таблицы прав в основном являются исчерпывающим подходом и будут (надеюсь) выделить все возможности.

Вам может понравиться Microsoft Pex, что может быть полезно для определения случаев, о которых вы не думали.

Ответ 3

Я думаю, что разработчик спрашивает, как облегчить свою жизнь при работе с сложным кодом.

Способ, которым я обрабатываю сложный код, чтобы код был как можно более плоским, и сначала отсеивал все отрицания. Если вы можете избавиться от соединения, если, поместив часть его выше, сделайте это.

Красота простоты заключается в том, что для ее изучения не требуется книга или класс. Если вы можете разбить его, сделайте это. Если вы можете удалить любую его часть, сделайте это. Если вы этого не понимаете, делайте это по-другому. И квартира почти всегда лучше вложенных (спасибо python!).

Проще читать:

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

чем читать:

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

Ответ 4

Таблицы истинности и модульные тесты - составляйте таблицы (n мерные для n переменных), а затем используйте их как входы для вашего unit test, который может проверять каждую комбинацию переменных и проверять результаты.

Ответ 5

Самая большая проблема, с которой я сталкивался на протяжении многих лет с сложными IF, заключается в том, что люди не тестируют все ветки. Обязательно напишите тест на каждую возможную ветку независимо от того, насколько маловероятно, что вы ударите ее.

Ответ 6

Вы также можете попробовать карты Карно, которые подходят для 4 переменных.

Ответ 7

Если вы еще этого не сделали, я настоятельно рекомендую прочитать Code Complete. В нем есть много советов по таким темам. На данный момент у меня нет моей копии, иначе я бы опубликовал резюме этого раздела в книге.

Ответ 8

Разделите логику на дискретные единицы (a & b и т.д.), каждая со своей собственной переменной. Затем создайте их, используя нужную вам логику. Назовите каждую переменную чем-то подходящим, чтобы ваш сложный оператор был достаточно читабельным (хотя может потребоваться несколько дополнительных строк и несколько временных переменных).

Ответ 9

По какой-либо причине вы не можете просто обрабатывать логику с помощью инструкций охраны?

Ответ 10

карты Карно могут быть приятными способами получения информации из таблицы истинности (предложенной Visage) и превращения их в компактные и/или/а не выражений. Обычно они преподаются в цифровом логическом курсе EE.

Ответ 12

Проверьте ядерную опцию: Drools. Там очень много - я потратил пару дней на изучение литературы, чтобы понять ее возможности. Но если у вас есть приложения, где сложная логика if-then является развивающейся частью проекта (например, приложение с модульными алгоритмами), это может быть только что-то.