У меня есть логическое выражение для оценки, которое довольно длинное с множеством разных случаев:
return (a && b && c) ||
(d && e && f) ||
...
Это должно вернуть логическое значение!
a, b, c, d, e и f представляют собой простое сравнение на равенство и все разные. Это продолжается для 12 строк и дает мне цикломатическую сложность 44.
Я попытался посмотреть на объект Map, чтобы уменьшить сложность, но не нашел способа сделать это.
Как я могу уменьшить сложность такого выражения?
@adiga Нет, значения не имеют отношения к вопросу. они все разные
@AnthonyMaffert ожидаемое значение от вашего возврата является логическим значением или последним значением группы, где все истинны, т.е. (a && b && c)
c, если все значения верны
@CodeManiac ожидает возврата логического значения
Повторяются ли эти сравнения равенства? Например. есть ли несколько комбинаций положительных и/или отрицательных экземпляров от a до f или они от a до z практически без повторных сравнений?
Это вопрос программирования или вопрос булевой логики? Если это вопрос логической логики, вы можете использовать стандартные методы для сокращения логических уравнений, как это делает Эспрессо (я полагаю, из Стэнфордского университета).
@hajef Почти нет повторных сравнений
Существуют подходы к минимизации, такие как en.wikipedia.org/wiki/Карно_карта (визуальный метод, применимый только к нескольким переменным) или en.wikipedia.org/wiki/Quine%E2%80%93McCluskey_algorithm (произвольное количество переменных), если речь идет об упрощении самого логического выражения.
Если нет избыточной информации, как вы собираетесь ее уменьшить? Вы можете изменить синтаксис, но не можете уменьшить логику. Вы можете взглянуть на Куайна-Маккласки, но если повторных сравнений почти нет, это мало поможет. Редактировать: @tevemadar, Carnaugh не будет работать для такого количества переменных. Нам бы повезло, если бы существовала пара предложений всего с тремя параметрами, а это примерно столько, сколько может просчитать Carnaught.
@hajef: я не думаю, что замечание визуальный метод, применимый только к нескольким переменным предполагает, что оно применимо для многих переменных. Однако для понимания того, что и как, это лучше начать, чем напрямую прыгать на Куайна-МакКласки.
@tevemadar правда. Кроме того, я перепутал некоторые вещи в своем последнем комментарии. Карно может разумно обрабатывать от 4 до 5 переменных, требуя от 2 до 3 измерений.
@hajef: в конце OP не показал длинное логическое выражение для упрощения, а Нина Шольц не показала способ упростить длинное логическое выражение. Мир остается сбалансированным.
Пожалуйста, уточните, что вы подразумеваете под «уменьшить сложность». (Сложность — это особенно многозначительный термин в информатике.)
Для логической минимизации я всегда использовал эспрессо (en.wikipedia.org/wiki/Espresso_heuristic_logic_minimizer). Я использовал его, когда проектировал цифровое оборудование (как для работы, так и для развлечения). Исходный код доступен онлайн - просто погуглите "эспрессо булев минимизация"
Вы не можете уменьшить сложность данного выражения.
Более медленный подход, но, возможно, немного более структурированный, заключается в группировании выражений и оценке с помощью Array#some
для внешнего массива и Array#every
для внутренних массивов с коротким замыканием.
return [[a, b, c], [d, e, f]].some(a => a.every(Boolean));
Хорошая идея, но это приведет к Boolean value
, где as return (a && b && c) || ...
приведет к значению
значения "простое сравнение равенства", согласно OP.
@NinaScholz я запутался с вопросом, это прекрасно, так как ОП хочет логическое значение в качестве вывода
Поскольку js использует оценки короткого замыкания, почему это должно уменьшить сложность? Я бы даже подумал, что это увеличит время выполнения (2 разные вещи, но все же имеет значение)
Попробовал прямо сейчас и на моем стенде (всего с 6 варами) ваш способ сделать в 1,2–2,5 раза медленнее, чем у ОП.