Обновить

Комментарии 17

никогда не занимался перлом, но предположу что надо проверять что обработаны все альтернативные сценарии работы, допустим если после блок if есть else, то оно тоже тестируется.

P.S. В последнем абзаце «вложденность» -> «вложенность»?
> P.S. В последнем абзаце «вложденность» -> «вложенность»?

спасибо, поправил
А Вы в работе используете этот набор тестов?
У Вас большой проект?
Много легаси-кода?
1. этот окончательный вид только сформировался, в работе предыдущие версии этого набора
2. на небольших проектах
3. к легаси коду только собираемся подобраться с тестами (там как раз проекты побольше), пока тесты на новых

Понятное дело что с легаси кодом будут проблемы, возможно прижется скипать Perl::Critic и корректировать параметры остальных
НЛО прилетело и опубликовало эту надпись здесь
Кстати критик можно и не выключать — у него есть параметр -severity
Что-то цикломатическая сложность как-то криво считается.

sub test {

    if (1) {
    } else {
    }

    if (2) {
    } else {
    }

    if (3) {
    } else {
    }
}

countperl выдает на это 7, хотя должно быть 8.
По этому вопросу лучше конечно писать автору модуля Perl::Metrics::Simple, но почему должна быть 8? Судя по определению формула M = E − N + 2P, построить граф этой программы легко, ниже код для plantuml, тут http://plantuml.com его можно вставить в формочку и увидеть граф

@startuml

start

if (1) then (yes)
  :one;
else (no)
  :noone;
endif

if (2) then (yes)
  :two;
else (no)
  :notwo;
endif

if (3) then (yes)
  :three;
else (no)
  :nothree;
endif

stop

@enduml

граф имеет 14 рёбер (вход/выход это не часть графа программы), 9 узлов и вроде как состоит из одного компонента: 14-9+2*1 = 7
Так… Боюсь мы оба не правы. Думаю что на выше пример должно быть 12 — 10 + 2 = 4.

Возьмем пример попроще — всего 2 if

    if (1) {
    } else {
    }

    if (2) {
    } else {
    }

Тут должно быть 8 — 7 + 2 = 3. Такого же мнения и википедия. А вот countperl возвращает 5
Похоже на то, видимо по мнению Perl::Metrics каждое условие даёт +2 к сложности т.е. получается ещё более строгая метрика.
В принципе абсолютные значение не критичны — главное относительные, судя по википедии цикломатическая сложность не должна превышать 10-15, у меня в perlqual по умолчанию 20, как раз с учётом поправки получается примерно как надо.
Но если хочется точности, то надо писать авторам модулей.
Да… и с исключениями беда, они по идее должны в разы сложность программы поднимать, т.к. добавляют большое кол-во рёбер. Но я согласен, что эту реализацию McCube нужно использовать как примерная оценка сложности.

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

PS. PPI, кстати, совсем не хочет работать с utf8 кодом. Причем легко парсер токенов там не исправить, потому у меня в проекте его полноценно использовать никак не получается. Не сталкивался с этим?
PPI, кстати, совсем не хочет работать с utf8 кодом.

Не сталкивался, а что значит не хочет? и что такое uft8 код?
По идее если все utf8 строки вынести в конфиг, то в коде не будет ничего отличного от latin1, если конечно utf8 нет в именах переменных, но надеюсь такого ни у кого нет.
Под "utf8 код" я понимал имена переменных, методов и т.д. с использованием юникода
Достаточно распространенное сейчас явление, т.к. сам perl прекрасно с этим работает. Но "perl может распарсить только сам perl", потому такие решения как PPI с таким кодом не работают и нормально пофиксить сам PPI достаточно сложно.
ну в случае разработки какого-нибудь DSL типа 1С это имеет смысл, но мне не приходилось встречаться с ситуациями когда стоило именовать переменные не на английском
Не 1С, но российская бухгалтерия. Данные приезжают с большим кол-во атрибутов на русском языке. Попробовали на уникоде имена методов создавать — никаких вообще проблем и трудностей. Но вот некоторые дополнительные средства, типа Ciritic, увы, теперь не работают )
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации