Существуют ли какие-либо инструменты для помощи со сложной логикой «если»?
-
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 является развивающейся частью проекта (например, приложение с модульными алгоритмами), это может быть просто вещь.