по 1к рублей за штуку Купить «малинку» и поставить дома Купить «мощный» сервер и поставить дома Купить N «мощных» серверов и арендовать помещение ❶ ❷ ❸ ❹ ❺
по 1к рублей за штуку Купить «малинку» и поставить дома Купить «мощный» сервер и поставить дома Купить N «мощных» серверов и арендовать помещение Купить N «мощных» серверов, арендовать помещение и нанять одного админа ❶ ❻ ❷ ❸ ❹ ❺
по 1к рублей за штуку Купить «малинку» и поставить дома Купить «мощный» сервер и поставить дома Купить N «мощных» серверов и арендовать помещение Купить N «мощных» серверов, арендовать помещение и нанять одного админа Купить N «мощных» серверов, арендовать помещение и нанять M админов ❶ ❻ ❼ ❷ ❸ ❹ ❺
по 1к рублей за штуку Купить «малинку» и поставить дома Купить «мощный» сервер и поставить дома Купить N «мощных» серверов и арендовать помещение Купить N «мощных» серверов, арендовать помещение и нанять одного админа Купить N «мощных» серверов, арендовать помещение и нанять M админов … и нанять одного HR ❶ ❻ ❼ ❽ ❷ ❸ ❹ ❺
по 1к рублей за штуку Купить «малинку» и поставить дома Купить «мощный» сервер и поставить дома Купить N «мощных» серверов и арендовать помещение Купить N «мощных» серверов, арендовать помещение и нанять одного админа Купить N «мощных» серверов, арендовать помещение и нанять M админов … и нанять одного HR … нанять двух HR ❶ ❻ ❼ ❽ ❾ ❷ ❸ ❹ ❺
по 1к рублей за штуку Купить «малинку» и поставить дома Купить «мощный» сервер и поставить дома Купить N «мощных» серверов и арендовать помещение Купить N «мощных» серверов, арендовать помещение и нанять одного админа Купить N «мощных» серверов, арендовать помещение и нанять M админов … и нанять одного HR … нанять двух HR … построить HR департамент ❶ ❻ ❼ ❽ ❾ ❿ ❷ ❸ ❹ ❺
+1 балл сложности за вложенность докидывается еще несколько с учетом глубины за else тоже накидывают, но без учета вложенности if process_order(order): if order.is_valid(): # +1 for 'if' if order.has_discount(): # +2 for nested 'if' if order.customer.is_premium(): # +3 for nested 'if' apply_premium_discount(order) else: # +1 for 'else' apply_standard_discount(order) else: # +1 for 'else' if order.is_expedited(): # +2 for nested 'if' process_expedited(order) else: # +1 for 'else' process_standard(order) else: # +1 for 'else' log_invalid_order(order) https://redirect.sonarsource.com/doc/ cognitive-complexity.html
(действий) Словарь программы (Program Vocabulary) n = + Длина программы (Program Length) N = + n1 n2 N1 N2 n1 — уникальных операторов — уникальных операндов — всего операторов — всего операндов n2 N1 N2
— 0.23* — 16.2*ln( ))*100/171) HV LoC Cycl. Complexity Коэффициенты как-то подбирали эмпирически для C++ в 90-ых В «новой» версии формулы сделали нормализацию от 0 до 100 В оригинальной было кол-во комментариев, но потом выкинули
этими формулами Не скажут, что кусок кода идеальный, но скажут, что он хуже другого куска Могут приврать, но если использовать сразу несколько, точность повышается ❶ ❷ ❸ Итого про метрики сложности функций
этими формулами Не скажут, что кусок кода идеальный, но скажут, что он хуже другого куска Могут приврать, но если использовать сразу несколько, точность повышается Удобно задавать границу, когда уже ну совсем ну точно ну 100% это плохо ❶ ❷ ❸ ❹ Итого про метрики сложности функций
наследования. Слишком глубокое наследование усложняет понимание потока выполнения (NOC): Количество непосредственных подклассов Высокий NOC может указывать на неправильное использование наследования Вариантов. Довольно. Много.
Class (DIT): Глубина дерева наследования. Слишком глубокое наследование усложняет понимание потока выполнения (NOC): Количество непосредственных подклассов Высокий NOC может указывать на неправильное использование наследования (RFC): Все методы, которые могут быть вызваны из методов класса Вариантов. Довольно. Много.
Class Weighted Method per Class (DIT): Глубина дерева наследования. Слишком глубокое наследование усложняет понимание потока выполнения (NOC): Количество непосредственных подклассов Высокий NOC может указывать на неправильное использование наследования (RFC): Все методы, которые могут быть вызваны из методов класса (WMC): Сумма сложностей всех методов класса Чаще всего считается как просто количество методов. Высокий WMC — признак «Божественного объекта» Вариантов. Довольно. Много.
Class Weighted Method per Class Lack of Cohesion in Methods (DIT): Глубина дерева наследования. Слишком глубокое наследование усложняет понимание потока выполнения (NOC): Количество непосредственных подклассов Высокий NOC может указывать на неправильное использование наследования (RFC): Все методы, которые могут быть вызваны из методов класса (WMC): Сумма сложностей всех методов класса Чаще всего считается как просто количество методов. Высокий WMC — признак «Божественного объекта» (LCOM): Измеряет, насколько методы класса связаны через использование полей Высокий LCOM — признак того, что класс, возможно, стоит разделить Вариантов. Довольно. Много.
слоев просто пишем код в лоб как угодно Transactional script контроллеры + все остальное • • трехзвенная, гексагональная — представление — логика — хранение данных DDD, чистая архитектура — представление — логика приложения — логика домена — инфраструктура (адаптеры)
вещи требуют больше сил и внимание, а какие можно отдать «под заказ» Можно использовать формулу стабильности классов Можно заметить, что тип зависимости-поддомена влияет на стабильность и учесть это в формуле Кол-во неправильно направленных зависимостей можно использовать при оценке техдолга
все из них полезны в использовании Нет никакого смысла тратить силы на вылизывание до идеальных цифр — но полезно знать, где есть проблемные места Если метрика не помогает в прогнозировании пути к своей цели — смело выкидывайте ее, она для вас бесполезна