Оценка трудности изменений в коде с помощью O большое

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

Классический пример изменений требований бизнеса - к нам приходит менеджер и говорит: товары теперь делятся на активные (с флагом active=true) и не активные. Активные товары необходимо показывать в тех же 3 местах, не активные - нигде не показывать.

Теперь мы можем оценить - плохая ли у нас архитектура или хорошая. У нас всего 3 функции получения товаров, и ровно в 3 функциях и надо добавить проверку на active=true. Получается сложность изменений в нашем коде O(n), где n - количество функций. Было бы 5 функций: getProductsCatalog, getProductsByAction, getProductsByArticle, getRecommendedProducts, getMostViewedProducts - необходимо было бы сделать изменения в 5 функциях, но опять же сложность кода - только O(n).

Если добавить 1 уровень абстрации, то можно уменьшить количество необходимых изменений в коде до O(1)!

На данном примере мы ввели 1 уровень абстракции, и теперь необходимо внести изменения только в 1 месте.

Еще рассмотрим ситуацию если у нас есть админка, где показываются все товары, и front часть сайта, где показываются только активные и продающиеся товары. Первоначально код будет выглядеть так:

Если нам необходимо опять добавить какой-то флаг только в front части магазина, то сложность изменения O(1). Если нам необходимо добавить флаг для админки - то сложность изменения O(n) - т.к. у нас нет абстракции, и сколько функций у нас будет в админке, столько их и нужно будет изменить. Сейчас - только 1 функция. Если нам необходимо добавить код и в front часть и в админку, то сложность будет O(1+n) - где 1 - сложность фронтальной части, n - сложность админской части. Если бы мы не ввели слой абстрации во фронтальной части, то сложно была бы O(n+m), где n - количество функций во фронтальной части сайта, а m - в админской части.

Теперь чтобы снова свести сложность изменения кода при изменениях требований бизнеса с O(1+n) до O(1) необходимо добавить ни 1 уровень абстрации, а целых 2.

Какие оценки вообще бывают:

O(n^2) - лапшекод. Одна логика используется в 2 местах, 1 место разбито на несколько функций, все перемешано, функции разбиты в коде совершенно по разным местам.

O(n) - в целом все неплохо. Скорее всего функции разбиты или можно разбить по папкам хорошо.

O(n+m) - то же самое, что и O(n), только если в первом случае у нас 1 модуль, в этом случае у нас 2 модуля и надо править n функций в 1 модуле и m функций в 2 модуле.

O(1) - достаточное количество абстракций, легкие изменения.

O(0) - мы установили CMS и все настраиваем из админки. Код уже написан.

Заключение:

Оценка сложности изменений кода с помощью оценки сложности алгоритмов O, вполне возможна.

В этой статье я не заморачивался над названием функций. Советую почитать статью по именованию функций P/A/HC/LC и follow-up той статьи от участника хабра.

Источник: https://habr.com/ru/post/559532/


Интересные статьи

Интересные статьи

Прямых доказательств, связывающих рождение технологии Motion Amplification с силовыми ведомствами США, у нас нет, но косвенных достаточно. Неслучайно среди примеров испол...
Всем привет! Сегодня мы с Вами познакомимся с одним интересным сервисом от компании Microsoft, под названием Power Automate Desktop. Про облачный Power Automate мы уже с Вами не раз говор...
В процессе работы над проектами в качестве тимлида я столкнулся с одним процессом, который неизбежно возникает практически в любой команде — переоценка сотрудника в ходе его работы. Далее...
Привет Хабр. Сегодня мы продолжим тему SDR-приема и обработки сигналов. Приемом аналогового ТВ я заинтересовался совершенно случайно, после вопроса одного из читателей. Однако это оказалось не...
Сол Смит-Райан в студии ITV News. Статья ITV News переведена для вас Top 3D Shop. Отец ребёнка, руку которого пришлось ампутировать, сделал решительный шаг и создал бионическую конечность...