Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие по ТП 2006 _Зеленко_2_часть.doc
Скачиваний:
21
Добавлен:
11.11.2019
Размер:
830.98 Кб
Скачать
    1. Основные подходы к созданию сложных программных систем

Обнаружение общих абстракций и механизмов значительно облегчает понимание и разработку сложных систем, абстрагирование следует рассматривать как один из методов, используемый для решения сложных задач. Это понятие рассматривалось многими выдающимися программистами всех времен. «Следует рассматривать абстракцию как основной интеллектуальный прием, позволяющий ослабить количественные ограничения, которые накладываются на рассуждения с перечислением», – писал один из основоположников структурного программирования Э. Дейкстра7, кроме того, он считал, что «абстракция проникает во все аспекты программирования». К. Хоор считает, что «абстрагирование проявляется в нахождении сходств между определенными объектами, ситуациями или процессами реального мира, и в принятии решений на основе этих сходств, отвлекаясь на время от имеющихся различий».8 М. Шоу определила это понятие так: «Упрощенное описание или изложение системы, при котором одни свойства и детали выделяются, а другие опускаются. Хорошей является такая абстракция, которая подчеркивает детали, существенные для рассмотрения и использования, и опускает те, которые на данный момент несущественны»9.

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

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

Существует два вида иерархий:

  1. «часть-целое», когда систему можно разделить на подсистемы, взаимосвязанные между собой, но при этом внутренние связи элементов внутри подсистем сильнее, чем связь между подсистемами;

  2. «простое-сложное», которая показывает развитие систем в процессе их эволюции и построена на механизме наследования свойств.

Таким образом, программные системы, будучи в значительной степени отражением природных и технических систем, строятся путем разбиения сложного объекта на сравнительно независимые части путем декомпозиции. При создании очень сложных объектов процесс декомпозиции повторяется многократно, данный метод разработки получил название пошаговой детализации. На каждом уровне детализации используется свой уровень абстракции (Level of abstraction).

В настоящее время рассматривают два вида декомпозиции систем:

  • алгоритмическую, когда она рассматривается как обычное разделение алгоритмов, где каждый модуль системы выполняет один из этапов общего процесса (используется при структурном проектировании систем, в качестве примера можно привести структурную схему системы);

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

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

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

С чего лучше начать? Опыт многих программистов подсказывает, что полезнее начинать с объектной декомпозиции [34], которая имеет несколько чрезвычайно важных преимуществ перед алгоритмической:

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

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

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