Избегайте множественных IF, чтобы обеспечить сложность Mccabe - PullRequest
0 голосов
/ 17 октября 2018

Я хочу спросить вас о разных точках зрения на следующий сценарий: представьте, что у нас есть несколько списков, и что-то должно быть выполнено для тех, которые не пусты:

if l1 or l2 or l3 or l4 or l5 or l6 or l7 or l8 or l9:

    print 'we have to do something in one or more lists'

    if l1:
        print 'l1'
        f1()

    if l2:
        print 'l2'
        f2()

    if l3:
        print 'l3'
        f3()

    if l4:
        print 'l4'
        f4()

    if l5:
        print 'l5'
        f5()

    if l6:
        print 'l6'
        f6()

    if l7:
        print 'l7'
        f7()

    if l8:
        print 'l8'
        f8()

    if l9:
        print 'l9'
        f9()

Сам код этопросто и понятно, но это бросает значение (12) для сложности Mccabe.Чтобы уменьшить это значение, как бы вы подошли к нему?Мне очень интересно услышать ваши мысли.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Используйте список списков и список функций

def f1(l1):
   # do whatever is required to the  l1 list

def f2(l2):
   # similarly

# and similarly for f3 .. f9

...

lofl = [ l1, l2, l3, l4, l5, l6, l7, l8, l9 ]
loff = [ f1, f2, f3, f4, f5, f6, f7, f8, f9 ]

for f, l in zip( loff, lofl):
    if l:  # if the functions f cannot themselves safely do nothing for a falsy argument
        f( l) 

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

for f, l, p in zip( loff, lofl, lofp): # or, zip( loff, lofl, list(range(9)) )
    f(l, p)

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

lofargs=[ { 'foo':1, 'bar':'Monty' }, # kwargs for f1
          { 'foo':2, 'bar':'Python'}, 
          { 'foo':3 }, 
          {},                     # no kwargs at all for f4, 
          ...
        ]


for f, l, k in zip( loff, lofl, lofargs):
    f( l, **k )
0 голосов
/ 17 октября 2018

Если вы поместите все списки в список списков:

lol = [l1,l2,l3,l4,l5,l6,l7,l8,l9]

Затем вы можете перебрать список списков:

for l in lol:
    if l:
        # do something
...