Как вы оцениваете сложность дизайна, оценивая его?

Мы все знаем, что все должно быть просто, верно?

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

Какие ваши любимые правила или эвристики?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
566
7

Ответы 7

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

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

Вот мои:

1) Насколько сложно объяснить кому-то, кто понимает проблему, но не думал о ее решении? Если я объясню проблему кому-то в зале (который, вероятно, уже понимает проблему, если он находится в зале) и могу объяснить решение, то это не слишком сложно. Если на это уйдет больше часа, велика вероятность, что решение слишком продумано.

2) Насколько глубоко нужно углубляться во вложенные функции? Если у меня есть объект, которому требуется свойство, принадлежащее объекту, принадлежащему другому объекту, то велики шансы, что то, что я пытаюсь сделать, слишком далеко от самого объекта. Эти ситуации становятся проблематичными при попытке сделать объекты потокобезопасными, потому что будет много объектов разной глубины от вашего текущего положения для блокировки.

3) Вы пытаетесь решить проблемы, которые уже были решены ранее? Не все проблемы новы (и некоторые утверждают, что на самом деле нет). Есть ли какой-либо шаблон или группа шаблонов, которые вы можете использовать? Если не можешь, почему бы и нет? Придумывать собственные новые решения - это хорошо, и я полностью за это, но иногда люди уже решили проблему. Я не собираюсь переписывать STL (хотя в какой-то момент я пробовал), потому что решение уже существует, и оно хорошее.

Когда я посетил семинар по моделированию сложных систем в Институте сложных систем Новой Англии (http://necsi.org/), одной из мер, которые они использовали, было количество состояний системы.

Например, если у вас есть два взаимодействующих узла, A и B, и каждый из них может иметь значение 0 или 1, ваши возможные состояния:

A B
0 0
1 0
0 1
1 1

Таким образом, система только одного взаимодействия между компонентами бинарной системы может фактически привести к 4 различным состояниям. Дело в том, что сложность системы не обязательно увеличивается линейно с увеличением числа взаимодействий.

Сложность можно оценить с помощью связь и того, как сплоченный - все ваши объекты. Если что-то слишком связно или недостаточно связно, то дизайн станет более сложным.

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

Примеры:

.- файлы свойств, конфигурация базы данных, файлы xml для хранения связанной информации.

.- десятки тысяч классов с интерфейсами и отображениями баз данных

.- очень длинный и сложный файл сборки (build.xml, Makefile, другие ..

Не сложность кода, а дизайн, сложно понять, сколько файлов при проектировании;)

Patrick Desjardins 31.10.2008 18:20

Есть формальные метрики. Прочтите, например, Цикломатическая сложность.


Редактировать.

Также посмотрите Функциональные точки. Они дают вам не интуитивно понятное количественное измерение сложности системы.

цикломатическая сложность - это метрика, вычисляемая из исходного кода - у вас нет исходного кода во время проектирования!

Steven A. Lowe 31.10.2008 18:36

@Steven A. Lowe: Однако у вас есть те же концепции if-операторов. Вы можете легко оценить сложность частей вашего дизайна на основе вариантов и решений, описанных в спецификациях или требованиях.

S.Lott 31.10.2008 18:38

Cyclomatic лучше, когда у вас есть исходный код. В дизайне просто непродуктивно пытаться оценить количество петель и сравнение.

Patrick Desjardins 31.10.2008 18:51

Наконец то, что LOC действительно может помочь в измерении? :)

Я думаю, что сложность лучше всего рассматривать как количество вещей, которые должны взаимодействовать.

Сложный дизайн будет иметь n ярусов, тогда как простой дизайн будет иметь только два.

Сложность является необходима для решения проблем, которые простота не может преодолеть, поэтому это не всегда будет проблемой.

Существует проблема с определением сложности в целом, поскольку со сложностью обычно связана задача. Что-то может быть сложным для понимания, но простым для восприятия (например, очень сжатый код) Количество взаимодействий, передающих эту веб-страницу с сервера на ваш компьютер, очень сложно, но абстракция протокола http очень проста.

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

Другие вопросы по теме