Введение
Принцип проектирования для компьютерного программирования
В информатике, разделение ответственности – это принцип проектирования, направленный на разделение компьютерной программы на отдельные секции. Каждая секция решает отдельную задачу, представляющую собой набор информации, влияющей на код компьютерной программы. Задача может быть как общей, например, "детали аппаратного обеспечения для приложения", так и конкретной, например, "имя класса, который необходимо создать". Программа, хорошо реализующая разделение ответственности, называется модульной программой. Модульность, и, следовательно, разделение ответственности, достигается путем инкапсуляции информации внутри секции кода, имеющей четко определенный интерфейс. Инкапсуляция – это способ сокрытия информации. Многослойные архитектуры в информационных системах являются еще одним воплощением разделения ответственности (например, слой представления, слой бизнес-логики, слой доступа к данным, слой хранения данных). Разделение ответственности обеспечивает большую гибкость в отношении проектирования, развертывания или использования программы. Распространенным преимуществом является повышение свободы упрощения и поддержки кода. Когда задачи хорошо разделены, появляется больше возможностей для обновления модуля, повторного использования и независимой разработки. Сокрытие деталей реализации модулей за интерфейсом позволяет улучшать или изменять секцию кода, отвечающую за определенную задачу, без необходимости знать детали других секций и вносить соответствующие изменения в них. Модули также могут предоставлять различные версии интерфейса, что повышает гибкость при поэтапном обновлении сложной системы без временной потери функциональности. Разделение ответственности – это форма абстракции. Как и большинство абстракций, разделение ответственности подразумевает добавление дополнительных программных интерфейсов, что обычно приводит к увеличению объема выполняемого кода. Дополнительный код в некоторых случаях может привести к увеличению вычислительных затрат, но в других случаях – к повторному использованию более оптимизированного кода. Таким образом, несмотря на многочисленные преимущества хорошо разделенных задач, может возникать дополнительная вычислительная нагрузка.
Реализация
Механизмы модульного или объектно-ориентированного программирования, предоставляемые языком программирования, позволяют разработчикам реализовывать разделение ответственности (SoC). Например, объектно-ориентированные языки программирования, такие как C#, C++, Delphi и Java, позволяют разделять задачи на объекты, а архитектурные шаблоны, такие как MVC или MVP, отделяют представление и обработку данных (модель) от содержимого. Сервис-ориентированная архитектура позволяет разделять задачи на сервисы. Процедурные языки программирования, такие как C и Pascal, позволяют разделять задачи на процедуры или функции. Языки аспектно-ориентированного программирования позволяют разделять задачи на аспекты и объекты. Разделение ответственности – важный принцип проектирования, применяемый и в других областях, таких как градостроительство, архитектура и информационный дизайн. Цель состоит в том, чтобы более эффективно понимать, проектировать и управлять сложными взаимозависимыми системами, обеспечивая возможность повторного использования функций, их независимой оптимизации и изоляции от потенциальных сбоев других функций. Типичные примеры включают разделение пространства на комнаты, чтобы действия в одной комнате не влияли на людей в других, а также выделение электропитания для плиты и освещения на разные цепи, чтобы перегрузка плиты не приводила к отключению света. Пример с комнатами демонстрирует инкапсуляцию, когда информация внутри комнаты, например, степень её беспорядка, недоступна другим комнатам, за исключением взаимодействия через интерфейс – дверь. Пример с электрическими цепями показывает, что действия внутри одного модуля, представляющего собой цепь с подключенными потребителями электроэнергии, не влияют на действия в другом модуле, поэтому каждый модуль не зависит от происходящего в другом.
Стек протоколов интернета
Разделение ответственности критически важно для архитектуры Интернета. В семействе протоколов TCP/IP предприняты значительные усилия для разделения задач на чётко определённые уровни. Это позволяет разработчикам протоколов сосредоточиться на задачах конкретного уровня, не принимая во внимание другие уровни. Например, протокол SMTP прикладного уровня отвечает за все детали установления сеанса электронной почты через надёжный транспорт (обычно TCP), но совершенно не заботится о том, как транспорт обеспечивает эту надёжность. Аналогично, TCP не занимается маршрутизацией пакетов данных, которая осуществляется на сетевом уровне.
HTML, CSS, JavaScript
Язык разметки гипертекста (HTML), каскадные таблицы стилей (CSS) и JavaScript (JS) — это взаимодополняющие языки, используемые при разработке веб-страниц и веб-сайтов. HTML в основном применяется для организации содержимого веб-страницы, CSS — для определения стиля оформления этого содержимого, а JS — для определения способов взаимодействия содержимого с пользователем и его поведения. Исторически сложилось иначе: до появления CSS, HTML выполнял обе функции — определял как семантику, так и стиль.
Предметно-ориентированное программирование
Предметно-ориентированное программирование позволяет рассматривать отдельные аспекты как отдельные программные конструкции, равноправные друг другу. Каждый аспект предоставляет собственную классовую структуру, в которой организуются общие объекты, и вносит свой вклад в состояние и методы в составной результат, где они пересекаются. Правила соответствия описывают взаимосвязь классов и методов в различных аспектах в точках их взаимодействия, позволяя получить составное поведение метода из нескольких аспектов. Многомерное разделение аспектов позволяет анализировать и компоновать аспекты как многомерную "матрицу", в которой каждый аспект определяет измерение, содержащее различные варианты выбора, а ячейки матрицы заполняются соответствующими программными артефактами.
Ориентированное на аспекты программирование
Аспектно-ориентированное программирование позволяет рассматривать сквозные задачи как основные. Например, большинству программ требуется та или иная форма защиты и ведения журналов. Защита и ведение журналов часто являются второстепенными задачами, в то время как основное внимание обычно уделяется достижению бизнес-целей. Однако при проектировании программы её защита должна быть заложена в основу проекта с самого начала, а не рассматриваться как второстепенная задача. Попытки внедрения защиты на более поздних этапах часто приводят к созданию недостаточной модели защиты с множеством уязвимостей для будущих атак. Это можно решить с помощью аспектно-ориентированного программирования. Например, можно создать аспект, который будет обеспечивать обязательную регистрацию всех вызовов определенного API или обязательную регистрацию ошибок при возникновении исключения, независимо от того, обрабатывает ли процедурный код программы это исключение или передает его дальше.
Уровни анализа в искусственном интеллекте
В когнитивной науке и искусственном интеллекте принято ссылаться на уровни анализа Дэвида Марра. В любой момент времени исследователь может сосредотачиваться на (1) том, что конкретный аспект интеллекта должен вычислять, (2) какой алгоритм он применяет, или (3) как этот алгоритм реализован на аппаратном уровне. Это разделение задач аналогично разграничению интерфейса и реализации в разработке программного и аппаратного обеспечения.
Нормированные системы
В нормализованных системах разделение ответственности – один из четырех основополагающих принципов. Соблюдение этого принципа является одним из инструментов, помогающих снизить комбинаторный рост сложности, который со временем возникает в поддерживаемом программном обеспечении. В нормализованных системах разделение ответственности активно поддерживается средствами разработки.
SoC через частичные классы
Разделение ответственности можно реализовать и обеспечить с помощью частичных классов.