На этом шаге рассмотрим некоторые вопросы проектирования сложных систем.
В любой инженерной дисциплине под проектированием обычно понимается некий формальный метод, с помощью которого изобретается решение определенной проблемы, чем обеспечивается переход от технического задания к его реализации. В контексте проектирования программных систем определим цель проектирования как конструирование системы, которая:
Цель проектирования — создать ясную и относительно простую внутреннюю структуру, иногда называемую архитектурой. Проект — это окончательный продукт процесса проектирования. Проектирование подразумевает согласование противоречивых требований. Результатом проектирования являются модели, позволяющие понять структуру будущей системы, достичь компромисса между противоречивыми требованиями и наметить план их реализации.
Моделирование широко распространено во всех инженерных дисциплинах, в основном из-за того, что оно основано на принципах декомпозиции, абстракции и иерархии. Каждая модель, включенная в проект, описывает конкретный аспект рассматриваемой системы. Модели позволяют выявлять отказы системы в контролируемых условиях. Каждая модель оценивается как в обычных, так и в необычных ситуациях, а затем уточняется в случае нежелательного поведения.
Для того чтобы выразить все особенности поведения сложной системы, необходимо использовать несколько моделей. Например, проектируя персональный компьютер, инженер-электронщик должен рассматривать систему как на уровне функциональных компонентов, так и на уровне микросхем. Анализ функциональных компонентов позволяет создать логическую схему проекта, позволяющую разобраться в тонкостях их взаимодействия. На уровне микросхем инженер анализирует проблемы, связанные с размещением аппаратных средств и ограничениями их размера, допустимой мощности и состава. На этом уровне инженер должен независимо оценивать такие факторы, как рассеяние тепла и сложность производства.
Проектирование сложной программной системы представляет собой поступательный и итерационный процесс. Надежные методы проектирования вносят в процесс разработки программного обеспечения необходимую дисциплину. Разработчики программного обеспечения создали десятки различных методов, которые можно грубо разделить на три категории (метод структурного проектирования сверху вниз; информационное программирование; объектно-ориентированное проектирование).
Несмотря на различия, все эти методы имеют нечто общее. В частности, их объединяют следующие свойства:
Надежный метод проектирования основывается на прочном теоретическом фундаменте и предоставляет программисту известную степень свободы самовыражения.
В ходе проектирования очень полезно создавать модели, заостряющие внимание на сущностях, характерных для исследуемой предметной области, и образующие то, что мы назвали объектно-ориентированной декомпозицией.
Объектно-ориентированный анализ и проектирование приводят к объектно-ориентированной декомпозиции. Применяя объектно-ориентированное проектирование, можно создавать гибкие программы, написанные экономными средствами. При разумном разделении пространства состояний можно добиться большей уверенности в правильности разработанного программного обеспечения. В итоге уменьшается риск, характерный для разработки сложных программных систем.
На следующем шаге рассмотрим основные положения и применение объектной модели.