Уменьшение цикломатической сложности объектно-ориентированного кода Python

Я пытаюсь уменьшить киломатическую сложность кода, потому что, согласно pylama, мое определение "слишком сложное" и Предлагаемое решение включает вызов функций с сопоставлением словарей.

Поэтому я попробовал это на своем объектно-ориентированном коде, но с треском провалился.

class trial:
    def __init__(self):
        self.a = 'a'
        self.b = 'b'

    def a(self):
        return self.a

    def b(self):
        return self.b

    def select_one(self, option):
        map_func = {
        1 : self.a,
        2 : self.b
        }
        return map_func[option]()

t = trial()
print(t.select_one(1))

Если это невозможно, каковы другие возможные решения для уменьшения цикломатической сложности.


person Chinmaya B    schedule 14.11.2018    source источник
comment
вы должны определить map_func раз и навсегда в __init__, чтобы это не переделывалось каждый раз, иначе какой смысл в словаре   -  person Jean-François Fabre    schedule 14.11.2018
comment
кроме того, что я не вижу никакой сложности...   -  person Jean-François Fabre    schedule 14.11.2018
comment
также у вас есть функции и строки, называемые одинаковыми. Пожалуйста, измените это. Наверное поэтому у вас не работает   -  person Jean-François Fabre    schedule 14.11.2018
comment
Почему это уменьшит цикломатическую сложность? Вы представляете фабричную функцию, которая вызывает одну из двух других функций, которые вы могли бы вызвать по имени самостоятельно? Кроме того: используйте dict.get() или умрите ужасно на alosdfböoads, данных вашему мапперу. Это почти запутывание кода — кто знает, что могут сделать 1 или 2?   -  person Patrick Artner    schedule 14.11.2018
comment
@PatrickArtner Это было просто, например, я изменю свои параметры с 1,2 на что-то более разумное, мой предыдущий (слишком сложный код имел) единственный метод с лестницей if else для выбора параметра.   -  person Chinmaya B    schedule 14.11.2018


Ответы (1)


во-первых, словарь должен быть определен в __init__, иначе у вас будет сложность O(n) каждый раз, когда вы вводите свою функцию select_one (словарь создается каждый раз, что делает пример в вашей ссылке неправильным)

во-вторых, ваши методы имеют то же имя, что и ваши атрибуты. Измените это:

class trial:
    def __init__(self):
        self.a = 'a'
        self.b = 'b'
        self.map_func = {
        1 : self.f_a,
        2 : self.f_b
        }

    def f_a(self):
        return self.a

    def f_b(self):
        return self.b

    def select_one(self, option):
        return self.map_func[option]()

t = trial()
print(t.select_one(1))
person Jean-François Fabre    schedule 14.11.2018
comment
Ваш код выдает ошибку Traceback (most recent call last): File "function_call_dict.py", line 20, in <module> print(t.select_one(1)) return map_func[option]() TypeError: 'str' object is not callable - person Chinmaya B; 14.11.2018
comment
странно, как я проверил это как есть. Вы уверены, что точно скопировали? - person Jean-François Fabre; 14.11.2018