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

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

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

чем читать:

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top