Почему эта диаграмма деятельности не имеет того же количества путей, что и число цикломатической сложности?

Почему эта диаграмма деятельности не имеет того же количества путей, что и число цикломатической сложности?
Почему эта диаграмма деятельности не имеет того же количества путей, что и число цикломатической сложности?

(i) как можно узнать, что (a>=0)&&(a<=100)&&(b>=0)&&(b<=100)&&(c>=0)&&(c<=100 ) должно привести к трем различным тестам

Ты не. Это не приводит к трем различным тестам.

(ii) почему на диаграмме деятельности нет семи путей от начального узла к конечному узлу? (Мне кажется, что есть пять путей.)

Он имеет пять исходов. Не то же самое. Некоторые пути переходят друг в друга. Вы можете увидеть это здесь:

Два теста (ромбики слева) кодируют свои результаты в validInput как -1, 0 или 1, что просто без необходимости приводит к еще двум тестам (ромбики справа). Это создает больше путей, чем результатов. Казалось бы, не по какой другой причине, кроме как сделать анализ цикломатической сложности нетривиальным.

На самом деле вы можете отображать напрямую от пути к пути. Здесь нет вариантов. Это просто взлом счетчика циклов.

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

Этот плохо выраженный логический кошмар здесь даже не при чем. Это просто большое отвлечение. Скажу по-человечески:

if (0 <= a && a <= 100) 
&& (0 <= b && b <= 100)
&& (0 <= c && c <= 100)

Здесь та же логика, но любой студент-математик, который помнит диапазоны неравенств, выраженные как

0 ≤ х ≤ 100

оценит это. Йода= будь проклят.

Теперь, когда мы можем прочитать код, позвольте мне объяснить, откуда я знаю, что это всего лишь отвлечение. Он вносит только один ромб в блок-схему, а ожидаемый CMC равен 7, что соответствует блок-схеме как есть. Это говорит мне о том, что они не используют расширение интервала Майерса= для цикломатической сложности, которое выделяло бы каждое логическое подвыражение как отдельное решение. Но мы этого не делаем и поэтому рассматриваем все составное логическое выражение как одно целое. Да это непорядок.

В любом случае, теперь, когда логический кошмар не съедает клетки мозга, давайте сосредоточимся на том, зачем нам вообще нужен validInput. Ага, понятно. Мы заботимся о a == 0. Дух. Теперь, когда я вижу, это легко исправить.

if (a == 0) {
    cout<<"Not quadratic";
    return;
}

Sorry but I refuse to use Ratliffs indentation style because it's icky. K&R for life.

Поставьте это перед кошмаром, и с этим покончено. Если вы придирчивы, вы можете даже сбрить то, что сейчас не нужно = off of 0 <= a.

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

Итак, может ли кто-нибудь помочь мне связать, что происходит в этом отношении с графиком / диаграммой деятельности и таблицей (9.32)?

Конечно, у вас есть какой-нибудь болван, который утверждает, что пути независимы, когда это не так. По крайней мере, не с этим ограниченным набором входных данных.

Давайте возьмем более простой пример из Википедии=:

Я пронумеровал узлы, чтобы мы могли поговорить о них. Допустим, вы пришли в 4. Вы хотите пойти в 6. Как говорят местные, «отсюда туда не попасть». Почему? Потому что вход, который позволяет вам получить 4, не позволит вам получить 6. Программное обеспечение просто не хочет, чтобы вы касались 4 и 6 в одном и том же прогоне. Почему статический анализ цикломатической сложности не говорит нам об этом? Потому что не может. Он предполагает, что пути независимы, поскольку он слепо подсчитывает сложность. Он понятия не имеет, что некоторые пути не являются независимыми. Если вы читали эту страницу в Википедии, вы знаете, что M здесь должно быть 3. Но это не означает, что ввод позволит вам выбрать любую комбинацию путей, если программист этого не хочет.

Обращаю ваше внимание на раздел тестирования той страницы Википедии

Последствия для тестирования программного обеспечения Еще одним применением цикломатической сложности является определение количества тестовых случаев, необходимых для достижения полного покрытия тестами конкретного модуля.

Это полезно из-за двух свойств цикломатической сложности M для конкретного модуля:

  • M — это верхняя граница количества тестовых случаев, необходимых для достижения полного покрытия ветвей.
  • M — нижняя граница количества путей через граф потока управления (CFG). Предполагая, что каждый тестовый пример использует один путь, количество случаев, необходимых для достижения покрытия пути, равно количеству путей, которые могут быть фактически выбраны. Но некоторые пути могут быть невозможными, поэтому, хотя количество путей через CFG явно является верхней границей количества тестовых случаев, необходимых для покрытия пути, это последнее число (возможных путей) иногда меньше, чем M.

Все три вышеуказанных числа могут быть равны: покрытие ветвей ≤ цикломатическая сложность ≤ количество путей.

Таким образом, в вашем примере верхняя граница тестового примера равна 7, но с программой, ограничивающей вас, ваши входные данные могут привести только к 5.

Если предположить независимость (это не так), то количество путей будет следующим: 3 * 2 * 1 + 3 * 1 * 3 = 15 путей. То есть 3 ведут к 2, которые ведут к 1. 3 ведут к 1, что ведет к 3. 15 больше, чем 7. Это нормально, потому что помните, что 7 — это нижняя граница для наших путей. Не обязательно количество путей.

Таким образом, в данном случае 7 — это не количество путей (15) и не покрытие ветвей (5). Это просто наша цикломатическая сложность.

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

Обратите внимание, что у нас есть 7 цветов. Но 2 из них довольно бесполезны.

Это хорошее введение в покрытие кода, но я не буду игнорировать то, что здесь пропущено много тестов. Я не доверяю этому булевому кошмару. Так что я также хочу увидеть граничные тесты= при -1, 0, 100 и 101 для a, b и c.


Меня все еще смущает "3 * 2 * 1 + 3 * 1 * 3 = 15 путей. - Альфред Камински

Хорошо, я просто собираюсь признать, что некоторые из того, что я сказал здесь, не поддерживаются. Я не могу найти доказательства того, что количество путей из 15 комбинаций, которое я придумал, - это то, что имела в виду эта статья в Википедии, когда в ней говорилось о количестве путей. Дело в том, что вы не можете просто посчитать пути и получить цикломатическую сложность. Это было бы легче сделать, если бы я мог найти, какой подсчет путей они имеют в виду. Я смотрел, и если они говорят, что я пропустил это. Я не думаю, что это глубина или широта, поэтому я просто предположил, что они имели в виду комбинации, которые вы получаете, если это независимые пути. Но, насколько я знаю, они означают подсчет всех ребер (я насчитываю 13 на этой блок-схеме). Если кто-то знает, пожалуйста, подскажите мне.

Я просмотрел редактирование ОП, и кажется, что они правильно поняли мой смысл, даже если я не могу доказать, что этот мой метод подсчета пути не был просто глупым.

диаграмма с семью цветами. Не могли бы вы уточнить это? - Альфред Камински

Опять же, кажется, я не могу поддержать свои претензии. Я сделал около 20 различных поисков изображений, и я ничего не нашел. Хорошо, позвольте мне объяснить цвета.

Вы когда-нибудь слышали о визуальном доказательстве? = Когда я изучал цикломатическую сложность, я увлекался ими. Также в Negative Space= примерно в то же время. С ними в моей голове я заметил, что все, что они делали, это считали дыры, простите, циклы в графе. Загрузите это в программу рисования, и вы сможете заполнить каждую петлю другим цветом, чтобы подсчитать их. Это похоже на подсчет дырок в рыболовной сети или паутине, а не на узлы или лески. Это просто хороший визуальный способ увидеть цикломатическую сложность на блок-схеме, не занимаясь математикой.

Конечно, у вас возникают проблемы, когда вы пересекаете линии без узлов. Вы получаете дыры, которые не считаются. Вот почему я переместил ошибку диапазона. Точно также. Я ненавижу запутанные блок-схемы.

Во всяком случае, кажется, никто не учит этому, так как мои поиски не увенчались успехом. Но когда-то, когда я спрашивал об этом в классе, это видели все, даже учитель. И в конце концов я запомнил это как то, что они на самом деле просили нас считать, и забыл, что этого даже не было в плане урока. Забавно, как разум играет трюки.

Вроде работает, но доказать не могу. Так что назовите это гипотезой цикломатической сложности candied_orange. А именно: просто посчитайте отверстия.

Мои исследования выявили кое-что, что немного проясняет, почему это работает. Даже если вы игнорируете математические формулы. Это определение Cyclomatic из википедии.

цикломатический

Английский Произношение IPA (ключ): /ˌsaɪkləˈmætɪk/ Имя прилагательное цикломатический (не сравнимый)

  1. (теория графов) Используется для описания количества ребер, которые необходимо удалить из графа, чтобы гарантировать, что не останется цикла графа; равно количеству ребер минус количество узлов плюс один.

цикломатика — wiktionary.org

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

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

Что я забыл, так это то, что многие люди, которые преподают это, просто бросают вам формулу и рассказывают, что это мера сложности программного обеспечения. Да, хорошо, но это просто нечеткая маркетинговая шумиха. Это основано на простой идее из теории графов. Просто потому, что у него причудливые имена, мы не должны соглашаться с тем, что его так трудно понять. Под всем этим шумом скрывается простая идея.

Давайте удалим шум информатики и покажем, как это выглядит для ботаника-математика в теории графов:

Что сводится к

Re: Серый цвет. Да, я знаю, что странно думать о бумаге как о дыре. Просто нарисуйте ребро от выхода (7) до начала (0), если вам от этого станет лучше.

Что, я думаю, вам нужно сделать, чтобы получить 7 циклов по определению. "В этом случае [...] цикломатическая сложность программы равна цикломатическому числу ее графа"= Без этого на самом деле нужно удалить 6 (давайте произвольно выберем ребра вокруг коричневого, зеленого и синего) . С ними больше нет циклов.


Note how you can't add an edge to this without creating a cycle. Not without also adding another node anyway. That's why M=E-N+2P works.

Вот хороший простой ациклический= граф. Добраться до этого и было тем, о чем была вся суета. Некоторым людям действительно не нравятся циклы в их графиках. Поэтому они научили нас считать их и чувствовать себя плохо из-за них.

Интересно, не поэтому ли большинство программистов больше не составляют блок-схемы?

Рекомендую посмотреть эти видео для лучшего погружения в вопрос:

Прикрепленное видео 1 - Когнитивная и цикломатическая сложность

Прикрепленное видео 2 - Графы, вершины, ребра, инцидентность, смежность


LetsCodeIt, 3 января 2023 г., 19:12