Декомпозиция в программировании



Разделяй и властвуй

Способ управления сложными системами известен уже очень давно, еще со времен Древнего Рима – divide et impera (разделяй и властвуй). При проектировании сложной программной системы необходимо ее разделять на все меньшие и меньшие подсистемы, каждую из которых можно создать и совершенствовать независимо, – вот первый шаг в борьбе со сложностью.

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

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

Что лучше: алгоритмическая или объектная декомпозиция? Ответ – обе хороши (или недостаточно хороши). Разделяя алгоритмы, мы концентрируем внимание на порядке действий, разделяя по объектам, мы концентрируемся на агентах, являющихся или объектами, или субъектами действий.

Объектная декомпозиция имеет несколько преимуществ перед алгоритмической:

· объектная декомпозиция уменьшает размер программных систем за счет повторного использования общих механизмов, что приводит к существенной экономии выразительных средств;

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

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

Абстракция

У человека есть средство, позволяющее бороться со сложностью, задолго до появления первых компьютеров. Люди абстрагировались от сложности. Не имея возможности объять необъятное, они игнорировали мелкие и не важные детали, сосредоточив свое внимание на основных, ключевых моментах. Мы пытаемся создать некую обобщенную модель действительности. Объекты, полученные в результате декомпозиции, представляют собой абстракции реального мира.

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

· все предметы в этом множестве имеют один и тот же набор характеристик;

· все предметы подчинены и согласовываются с одним и тем же набором правил, нормами поведения, законами природы.

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

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

После чего декомпозиция такой задачи окажется более простой по сравнению с исходной.

Иерархия

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

Модульность

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

Модули разрабатываются отдельно, но при сборке между ними легко могут быть установлены связи. Это позволяет собирать программы из модулей. Со временем практическое программирование позволяет накопить большое количество разнообразных модулей, из которых программист может быстро собирать программу. Отдельные модули уже протестированы и отлажены многократным использованием в различных проектах. Не нужно одно и то же разрабатывать по несколько раз. Кроме своих модулей, программист может использовать модули своих коллег или различных библиотек.

Т.о. модульность способствует сокращению времени разработки и повторному использованию кода, работе в команде. Модульность дополняет абстракцию и инкапсуляцию в процессе практической реализации.

 


Дата добавления: 2020-01-07; просмотров: 644; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!