10/7/2006

Цикломатическая сложность

Давече Гарри Вильсон писал о цикломатической сложности кода Django Мне показалось это интересным, и я получил статистику по пакетам, установленным у меня. top20 выглядит так:
Цикломатическая сложность
Пакет Наиболее "сложная" функция/метод Сложность
1 wxglade-0.3.5 codegen.cpp_codegen.add_class 87
2 crypto-2.0.1 Util.test.TestBlockModules 84
3 moinmoin-1.5.3 userform.UserSettingsHandler.handleData 81
4 ipython-0.7.1 ipmaker.make_IPython 62
5 wxglade-0.3.5 codegen.pl_codegen.add_class 57
6 wxpython-2.6.1.2 wx.lib.ogl._composit.Constraint.Evaluate 55
7 wxpython-2.6.1.2 wx.lib.masked.numctrl.NumCtrl.SetParameters 55
8 dnspython-1.3.4 tokenizer.Tokenizer.get 51
9 ClientForm.HTMLForm._find_control 51
10 dabo-0.5 lib.reportWriter.ReportWriter.draw 49
11 wxpython-2.6.1.2 wx.lib.masked.maskededit.MaskedEditMixin._Undo 47
12 moinmoin-1.5.3 macro.Include.execute 46
13 wxpython-2.6.1.2 wx.lib.masked.maskededit.MaskedEditMixin.SetCtrlParameters 45
14 twisted-2.4.0 python.rebuild.rebuild 43
15 protocol.display.Display.send_and_recv 42
16 wxpython-2.6.1.2 wx.lib.masked.maskededit.MaskedEditMixin._OnChar 42
17 mxtexttools-2.0.6 Misc.ConfigFile.ConfigFile.read 42
18 moinmoin-1.5.3 Page.Page.send_page 42
19 clientcookie-1.1.1 _ClientCookie.bool 42
20 parsedir.parsedir 42
При оценке сложности возникли проблемы (по, видимому, связанные с размером файла) со следующими файлами:
  • libxml2.py (пакет ), 332 кб, 8989 строк;
  • wx-2.6/wx/_controls.py (пакет wxpython-2.6.1.2), 260 кб, 6487 строк;
  • wx-2.6/wx/_core.py (пакет wxpython-2.6.1.2), 480 кб, 13415 строк;
  • wx-2.6/wx/_misc.py (пакет wxpython-2.6.1.2), 220 кб, 6090 строк;
  • wx-2.6/wx/_windows.py (пакет wxpython-2.6.1.2), 194 кб, 5039 строк.
Напомню, что сложность больше 50 означает очень высокий риск и практически не тестируемый код. И по статистике видно, что первый кандидат на редизайн - wxPython. У него явно наблюдаются проблемы с избыточной сложностью. Потестировал свой код (в большинстве своем - мелкие библиотеки/скрипты), который был под рукой, оказалось большинство кода укладывается в 10-12, лишь малая часть 13-15.

Комментарии

Все статьи