Как стать автором
Обновить

Комментарии 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, увы, теперь не работают )
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации