stringtranslate.com

Разделение интересов

Диаграмма, иллюстрирующая принцип разделения ответственности, который гласит, что сущность действия может содержать только один тип задач

В информатике разделение интересов (иногда сокращенно SoC ) — это принцип проектирования для разделения компьютерной программы на отдельные разделы. Каждый раздел рассматривает отдельный вопрос , набор информации , которая влияет на код компьютерной программы. Вопрос может быть как общим, например «детали оборудования для приложения», так и конкретным, например «имя класса, экземпляр которого нужно создать ». Программа, которая хорошо воплощает SoC, называется модульной [1] программой. Модульность и, следовательно, разделение интересов достигаются путем инкапсуляции информации внутри раздела кода, имеющего четко определенный интерфейс. Инкапсуляция — это средство сокрытия информации . [2] Многоуровневые конструкции в информационных системах являются еще одним воплощением разделения интересов (например, уровень представления, уровень бизнес-логики, уровень доступа к данным, уровень сохранения). [3]

Разделение интересов приводит к большей свободе для некоторых аспектов проектирования, развертывания или использования программы. Распространенным среди них является увеличение свободы для упрощения и обслуживания кода. Когда интересы хорошо разделены, появляется больше возможностей для обновления модулей, повторного использования и независимой разработки. Скрытие деталей реализации модулей за интерфейсом позволяет улучшать или изменять раздел кода одного интереса без необходимости знать детали других разделов и без необходимости вносить соответствующие изменения в эти другие разделы. Модули также могут предоставлять различные версии интерфейса, что увеличивает свободу обновления сложной системы по частям без временной потери функциональности. [ необходима цитата ]

Разделение интересов — это форма абстракции . Как и в случае с большинством абстракций, разделение интересов означает добавление дополнительных интерфейсов кода, что обычно создает больше кода для выполнения. Дополнительный код может привести к более высоким затратам на вычисления в некоторых случаях, но в других случаях также может привести к повторному использованию более оптимизированного кода. Таким образом, несмотря на многочисленные преимущества хорошо разделенных интересов, может возникнуть связанное с этим наказание за выполнение. [ необходима цитата ]

Выполнение

Механизмы для модульного или объектно-ориентированного программирования, предоставляемые языком программирования, являются механизмами, которые позволяют разработчикам предоставлять SoC. [4] Например, объектно-ориентированные языки программирования, такие как C# , C++ , Delphi и Java, могут разделять задачи на объекты , а архитектурные шаблоны проектирования , такие как MVC или MVP, могут разделять представление и обработку данных (модель) от контента . Сервисно-ориентированное проектирование может разделять задачи на службы . Процедурные языки программирования , такие как C и Pascal , могут разделять задачи на процедуры или функции . Аспектно-ориентированные языки программирования могут разделять задачи на аспекты и объекты .

Разделение интересов является важным принципом проектирования и во многих других областях, таких как городское планирование , архитектура и информационный дизайн . [5] Цель состоит в том, чтобы более эффективно понимать, проектировать и управлять сложными взаимозависимыми системами, чтобы функции можно было повторно использовать, оптимизировать независимо от других функций и изолировать от потенциального сбоя других функций.

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

Источник

Термин «разделение интересов» , вероятно, был введен Эдсгером В. Дейкстрой в его статье 1974 года «О роли научной мысли». [6]

Позвольте мне попытаться объяснить вам, что, по моему вкусу, характерно для всякого интеллектуального мышления. Это то, что человек готов глубоко изучать аспект своего предмета изолированно ради его собственной последовательности, все время зная, что он занимается только одним из аспектов. Мы знаем, что программа должна быть правильной, и мы можем изучать ее только с этой точки зрения; мы также знаем, что она должна быть эффективной, и мы можем изучить ее эффективность в другой день, так сказать. В другом настроении мы можем спросить себя, желательна ли программа, и если да, то почему. Но ничего не достигается — наоборот! — если заниматься этими различными аспектами одновременно. Это то, что я иногда называл «разделением интересов», что, даже если и не вполне возможно, все же является единственным доступным методом эффективного упорядочивания мыслей, о котором я знаю. Вот что я имею в виду под «сосредоточением внимания на каком-то аспекте»: это не означает игнорирование других аспектов, это просто отдача должного тому факту, что с точки зрения этого аспекта другой не имеет значения. Это одновременное однонаправленное и многонаправленное мышление.

Пятнадцать лет спустя стало очевидно, что термин «разделение интересов» становится общепринятой идеей. В 1989 году Крис Рид написал книгу под названием «Элементы функционального программирования» [7] , в которой описывается разделение интересов:

Программисту приходится делать несколько дел одновременно, а именно:

  1. описать, что должно быть вычислено;
  2. организовать последовательность вычислений на небольшие шаги;
  3. организовать управление памятью во время вычислений.

Рид продолжает говорить:

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

Разделение интересов имеет и другие преимущества. Например, проверка программ становится гораздо более осуществимой, когда в программе отсутствуют детали последовательности и управления памятью. Более того, описания того, что должно быть вычислено, должны быть свободны от таких подробных пошаговых описаний того, как это сделать, если они должны оцениваться с помощью различных архитектур машин. Последовательности небольших изменений в объекте данных, хранящемся в хранилище, могут быть неподходящим описанием того, как вычислить что-либо, когда используется высокопараллельная машина с тысячами процессоров, распределенных по всей машине, и локальными, а не глобальными хранилищами.

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

Примеры

Стек интернет-протоколов

Разделение интересов имеет решающее значение для проектирования Интернета. В Internet Protocol Suite были предприняты большие усилия для разделения интересов на четко определенные уровни . Это позволяет разработчикам протоколов сосредоточиться на проблемах одного уровня и игнорировать другие уровни. Например, протокол прикладного уровня SMTP заботится обо всех деталях проведения сеанса электронной почты через надежную транспортную службу (обычно TCP ), но нисколько не заботится о том, как транспортная служба делает эту службу надежной. Аналогично, TCP не заботится о маршрутизации пакетов данных, которая обрабатывается на уровне Интернета .

HTML, CSS, JavaScript

Язык гипертекстовой разметки (HTML), каскадные таблицы стилей (CSS) и JavaScript (JS) являются взаимодополняющими языками, используемыми при разработке веб-страниц и веб-сайтов. HTML в основном используется для организации содержимого веб-страниц, CSS используется для определения стиля представления содержимого, а JS определяет, как содержимое взаимодействует и ведет себя с пользователем. Исторически это было не так: до появления CSS HTML выполнял обе функции: определение семантики и стиля.

Предметно-ориентированное программирование

Субъектно-ориентированное программирование позволяет рассматривать отдельные проблемы как отдельные программные конструкции, каждая на равных основаниях с другими. Каждая проблема предоставляет свою собственную структуру классов, в которую организованы общие объекты, и вносит состояние и методы в составной результат, где они пересекаются друг с другом. Правила соответствия описывают, как классы и методы в различных проблемах связаны друг с другом в точках, где они взаимодействуют, позволяя выводить составное поведение метода из нескольких проблем. Многомерное разделение проблем позволяет манипулировать анализом и композицией проблем как многомерной «матрицей», в которой каждая проблема предоставляет измерение, в котором перечислены различные точки выбора, с ячейками матрицы, занятыми соответствующими программными артефактами.

Аспектно-ориентированное программирование

Аспектно-ориентированное программирование позволяет рассматривать сквозные проблемы как основные. Например, большинство программ требуют некоторой формы безопасности и ведения журнала . Безопасность и ведение журнала часто являются вторичными проблемами, в то время как основная проблема часто заключается в достижении бизнес-целей. Однако при проектировании программы ее безопасность должна быть встроена в дизайн с самого начала, а не рассматриваться как вторичная проблема. Последующее применение безопасности часто приводит к недостаточной модели безопасности, которая оставляет слишком много пробелов для будущих атак. Это можно решить с помощью аспектно-ориентированного программирования. Например, аспект может быть написан для обеспечения того, чтобы вызовы определенного API всегда регистрировались, или чтобы ошибки всегда регистрировались при возникновении исключения, независимо от того, обрабатывает ли процедурный код программы исключение или распространяет его. [8]

Уровни анализа в искусственном интеллекте

В когнитивной науке и искусственном интеллекте принято ссылаться на уровни анализа Дэвида Марра . В любой момент времени исследователь может сосредоточиться на (1) том, что какой-то аспект интеллекта должен вычислить, (2) какой алгоритм он использует или (3) как этот алгоритм реализован в оборудовании. Такое разделение интересов похоже на различие интерфейса /реализации в программной и аппаратной инженерии.

Нормализованные системы

В нормализованных системах разделение интересов является одним из четырех руководящих принципов. Соблюдение этого принципа является одним из инструментов, помогающих снизить комбинаторные эффекты, которые со временем появляются в поддерживаемом программном обеспечении. В нормализованных системах разделение интересов активно поддерживается инструментами.

SoC через частичные классы

Разделение интересов может быть реализовано и обеспечено посредством частичных классов . [9]

SoC через частичные классы в Ruby

bear_hunting.rb
класс Медведь определение охота лес . выберите ( & :еда? ) конец конец     
bear_eating.rb
класс Медведь def eat ( food ) raise " #{ food } не съедобен!" unless food . response_to? :nutrition_value food . nutrition_value end end          
bear_hunger.rb
класс Медведь attr_accessor :hunger def monitor_hunger если голод > 50 еда = охота голод -= есть ( еда ) конец конец конец                 

Смотрите также

Ссылки

  1. ^ Лапланте, Филлип (2007). Что каждый инженер должен знать о программной инженерии. CRC Press. ISBN 978-0-8493-7228-5.
  2. ^ Митчелл, Р. Дж. (1990). Управление сложностью в программной инженерии. IEE. стр. 5. ISBN 0-86341-171-1.
  3. ^ Руководство по архитектуре приложений Microsoft. Microsoft Press. 2009. ISBN 978-0-7356-2710-9.
  4. ^ Пейнтер, Роберт Ричард (2006). «Планы программного обеспечения: многомерное мелкозернистое разделение интересов». CiteSeerX 10.1.1.110.9227 . 
  5. ^ Гарофало, Раффаэле (2011). Создание корпоративных приложений с помощью Windows Presentation Foundation и шаблона Model View ViewModel. Microsoft Press. стр. 18. ISBN 978-0-7356-5092-3.
  6. ^ Дейкстра, Эдсгер В. (1982). «О роли научной мысли». Избранные труды по вычислительной технике: личная точка зрения. Нью-Йорк, США: Springer-Verlag. С. 60–66. ISBN 0-387-90652-5.
  7. ^ Reade, Chris (1989). Элементы функционального программирования . Бостон, Массачусетс, США: Addison-Wesley Longman. ISBN 0-201-12915-9.
  8. ^ Джесс Нильсен (июнь 2006 г.). "Создание безопасных приложений" (PDF) . Получено 2012-02-08 .
  9. ^ Тьяго Диас (октябрь 2006 г.). "Hyper/Net: Поддержка MDSoC для .NET" (PDF) . DSOA 2006 . Получено 25-09-2007 .

Внешние ссылки