Как уменьшить сложность длинного логического выражения?

У меня есть логическое выражение для оценки, которое довольно длинное с множеством разных случаев:

return (a && b && c) ||
(d && e && f) ||
...

Это должно вернуть логическое значение!

a, b, c, d, e и f представляют собой простое сравнение на равенство и все разные. Это продолжается для 12 строк и дает мне цикломатическую сложность 44.

Я попытался посмотреть на объект Map, чтобы уменьшить сложность, но не нашел способа сделать это.

Как я могу уменьшить сложность такого выражения?

"a, b, c, d, e и f - простое сравнение равенства" Имеет ли отношение к вопросу значение, используемое при сравнении на равенство? (Все ли они сравниваются с одним и тем же значением)
adiga 28.05.2019 15:15

@adiga Нет, значения не имеют отношения к вопросу. они все разные

Anthony Maffert 28.05.2019 15:23

@AnthonyMaffert ожидаемое значение от вашего возврата является логическим значением или последним значением группы, где все истинны, т.е. (a && b && c) c, если все значения верны

Code Maniac 28.05.2019 15:29

@CodeManiac ожидает возврата логического значения

Anthony Maffert 28.05.2019 15:32

Повторяются ли эти сравнения равенства? Например. есть ли несколько комбинаций положительных и/или отрицательных экземпляров от a до f или они от a до z практически без повторных сравнений?

hajef 28.05.2019 15:33

Это вопрос программирования или вопрос булевой логики? Если это вопрос логической логики, вы можете использовать стандартные методы для сокращения логических уравнений, как это делает Эспрессо (я полагаю, из Стэнфордского университета).

Toady 28.05.2019 15:35

@hajef Почти нет повторных сравнений

Anthony Maffert 28.05.2019 15:39

Существуют подходы к минимизации, такие как en.wikipedia.org/wiki/Карно_карта (визуальный метод, применимый только к нескольким переменным) или en.wikipedia.org/wiki/Quine%E2%80%93McCluskey_algorithm (произвольное количество переменных), если речь идет об упрощении самого логического выражения.

tevemadar 28.05.2019 15:48

Если нет избыточной информации, как вы собираетесь ее уменьшить? Вы можете изменить синтаксис, но не можете уменьшить логику. Вы можете взглянуть на Куайна-Маккласки, но если повторных сравнений почти нет, это мало поможет. Редактировать: @tevemadar, Carnaugh не будет работать для такого количества переменных. Нам бы повезло, если бы существовала пара предложений всего с тремя параметрами, а это примерно столько, сколько может просчитать Carnaught.

hajef 28.05.2019 15:50

@hajef: я не думаю, что замечание визуальный метод, применимый только к нескольким переменным предполагает, что оно применимо для многих переменных. Однако для понимания того, что и как, это лучше начать, чем напрямую прыгать на Куайна-МакКласки.

tevemadar 28.05.2019 15:56

@tevemadar правда. Кроме того, я перепутал некоторые вещи в своем последнем комментарии. Карно может разумно обрабатывать от 4 до 5 переменных, требуя от 2 до 3 измерений.

hajef 28.05.2019 15:59

@hajef: в конце OP не показал длинное логическое выражение для упрощения, а Нина Шольц не показала способ упростить длинное логическое выражение. Мир остается сбалансированным.

tevemadar 28.05.2019 16:03

Пожалуйста, уточните, что вы подразумеваете под «уменьшить сложность». (Сложность — это особенно многозначительный термин в информатике.)

גלעד ברקן 28.05.2019 21:20

Для логической минимизации я всегда использовал эспрессо (en.wikipedia.org/wiki/Espresso_heuristic_logic_minimizer). Я использовал его, когда проектировал цифровое оборудование (как для работы, так и для развлечения). Исходный код доступен онлайн - просто погуглите "эспрессо булев минимизация"

slebetman 29.05.2019 00:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
14
259
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете уменьшить сложность данного выражения.

Более медленный подход, но, возможно, немного более структурированный, заключается в группировании выражений и оценке с помощью Array#some для внешнего массива и Array#every для внутренних массивов с коротким замыканием.

return [[a, b, c], [d, e, f]].some(a => a.every(Boolean));

Хорошая идея, но это приведет к Boolean value, где as return (a && b && c) || ... приведет к значению

Code Maniac 28.05.2019 15:19

значения "простое сравнение равенства", согласно OP.

Nina Scholz 28.05.2019 15:20

@NinaScholz я запутался с вопросом, это прекрасно, так как ОП хочет логическое значение в качестве вывода

Code Maniac 28.05.2019 15:42

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

PopHip 28.05.2019 16:57

Попробовал прямо сейчас и на моем стенде (всего с 6 варами) ваш способ сделать в 1,2–2,5 раза медленнее, чем у ОП.

PopHip 28.05.2019 17:08

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