Существуют ли какие-либо инструменты для помощи со сложной логикой «если»? - PullRequest
10 голосов
/ 09 марта 2009

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

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

Ответы [ 12 ]

17 голосов
/ 09 марта 2009

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

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

5 голосов
/ 09 марта 2009

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

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

4 голосов
/ 21 октября 2011

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

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

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

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

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

чем читать:

if(!broken && (simple || complicated)){
 ....
}
return false;
3 голосов
/ 09 марта 2009

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

2 голосов
/ 09 марта 2009

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

2 голосов
/ 09 марта 2009

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

1 голос
/ 09 марта 2009

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

0 голосов
/ 11 мая 2012

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

0 голосов
/ 05 марта 2010

Вы пробовали шаблон дизайна? Вы можете посмотреть на то, что известно как шаблон стратегии: http://en.wikipedia.org/wiki/Strategy_pattern

0 голосов
/ 09 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...