пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

ООП и ППП

Простые и сложные программные системы

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

Примеры ППП:

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

Причины сложности ППП

Сложность ППП вызывается четырьмя основными причинами:

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

Сложность промышленных программ превышает возможности человеческого интеллекта.

Задача разработчиков программной системы – создать иллюзию простоты

Признаки сложной системы

  1. Сложные системы являются иерархическими и состоят из взаимозависимых подсистем, которые в свою очередь также могут быть разделены на подсистемы, и т.д., вплоть до самого низкого уровням.
  2. Выбор, какие компоненты в данной системе считаются элементарными, относительно произволен и в большой степени оставляется на усмотрение исследователя.
  3. Внутрикомпонентная связь обычно сильнее, чем связь между компонентами. Это обстоятельство позволяет отделять "высокочастотные" взаимодействия внутри компонентов от "низкочастотной" динамики взаимодействия между компонентами
  4. Иерархические системы обычно состоят из немногих типов подсистем, по-разному скомбинированных и организованных
  5. Любая работающая сложная система является результатом развития работавшей более простой системы. Сложная система, спроектированная "с нуля", никогда не заработает. Следует начинать с работающей простой системы

Каноническая форма сложной системы.

Структура классов – иерархия типа «быть частью» («part of»). В самолете, например, можно выделить несколько систем: питания, управления полетом и т.д.

Структура объектов – иерархия типа «от общего к частному» («is a»). Например, турбореактивный двигатель - особый тип реактивного двигателя

Каноническая форма сложной системы

Каноническая форма сложной системы

Декомпозиция

Дейкстра: «Способ управления сложными системами был известен еще в древности - divide et impera (разделяй и властвуй)»

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

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

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

Смысл проектирования

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

Цель проектирования – создание системы, которая:

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

Технологии проектирования

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

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

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

  • период "стихийного" программирования (60 гг. ХХ в.). В этот период отсутствовало понятие структуры программы, типов данных и т.д. Вследствие этого код получался запутанным, противоречивым. Программирование тех лет считалось искусством. Конец 60-х — кризис в программирование.
  • В основе структурного подхода (70 гг. XX в.: Э. Дейкстра, Н. Вирт, Д. Кнут) лежит декомпозиция (разбиение на части) сложных систем с целью последующей реализации в виде отдельных небольших подпрограмм (процедурная декомпозиция).

Несколько слов о структурном подходе

Теорема Бома-Якопини (1966):

Любую схему алгоритма можно представить в виде композиции вложенных блоков begin и end, условных операторов if, then, else, циклов с предусловием (while) и может быть дополнительных логических переменных (флагов).

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

Повторяющиеся фрагменты программы (либо не повторяющиеся, но представляющие собой логически целостные вычислительные блоки) могут оформляться в виде подпрограмм (процедур или функций).

Принципы восходящего и нисходящего проектирования

Восходящее проектирование:

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

Нисходящее проектирование:

  • Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент.
  • Вместо настоящих, работающих подпрограмм, в программу вставляются «заглушки», которые ничего не делают. Полученная программа проверяется и отлаживается.
  • После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы-заглушки последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы.

Технологии проектирования

Главная проблема структурного проектирования и программирования состоит в том, что нет возможности объединить данные и методы их обработки.

Модульное проектирование предполагает выделение групп подпрограмм, использующих одни и те же глобальные данные, в отдельно компилируемые модули (библиотеки подпрограмм), например, модуль графических ресурсов. Связи между модулями при использовании данной технологии осуществляются через специальный интерфейс, в то время как доступ к реализации модуля (телам подпрограмм и некоторым "внутренним" переменным) запрещен. Эту технологию поддерживают современные версии языков Pascal и С (C++), языки Ада и Modula.

Объектно-ориентированное программирование и проектирование (ООП, Simula – 1967 г., А. Кей, Б. Страуструп, Г. Буч) определяется как технология создания ПО, основанная на представлении программы в виде совокупности автономно действующих лиц (объектов), каждый из которых является экземпляром определенного класса (типа), а классы образуют иерархию с наследованием свойств. Взаимодействие программных объектов в такой системе осуществляется путем передачи сообщений между ними.

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

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

Объектно-ориентированные модели

Объектно-ориентированные модели

Объектно-ориентированный подход

Объектно-ориентированный подход заключается в следующем наборе основных принципов (Алан Кей):

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

Каждый объект является представителем класса, который выражает общие свойства объектов.

В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.

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

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

Концепция объектной модели

Для объектно-ориентированного стиля концептуальная база – это объектная модель. Она имеет четыре главных элемента:

  • абстрагирование;
  • инкапсуляция;
  • модульность;
  • иерархия.

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

  • типизация;
  • параллелизм;
  • сохраняемость.

Абстрагирование

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

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

Инкапсуляция

Добавление к полям записи методов их обработки.

Таким образом, в одном структуре объединяются данные и функции работы с ними.

Идея инкапсуляции делает объект максимально независимым от других частей программы.

Преимущество ООП проявляется при разработке больших программных продуктов.

Ингалс: «Никакая часть сложной системы не должна зависеть от внутреннего устройства какой-либо другой части».

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

Модульность, иерархия

Модульность – это свойство системы, которая была разложена на внутренне связные, но слабо связанные между собой модули.

Например, полезно «выносить» отдельные блоки программы в отдельные файлы (модули), имея возможность интегрировать их в любую сложную программу впоследствии.

Иерархия – это упорядочение абстракций, расположение их по уровням.

Основными видами иерархических структур применительно к сложным системам являются иерархия «is-a» и иерархия «part of».

Наследование означает такое отношение между классами (отношение родитель/потомок), когда один класс заимствует структурную или функциональную часть одного или нескольких других классов (одиночное и множественное наследование). Иными словами, наследование создает такую иерархию абстракций, в которой подклассы наследуют строение от одного или нескольких суперклассов. Часто подкласс достраивает или переписывает компоненты вышестоящего класса.

Типизация

Типизация – это способ защититься от использования объектов одного класса вместо другого, или по крайней мере управлять таким использованием.

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

В Pascal соблюдение правил использования типов контролируется непреклонно. В сильно типизированных языках нарушение согласования типов может быть обнаружено во время трансляции программы.

C++ тяготеет к сильной типизации, но в этом языке правила типизации можно игнорировать или подавить полностью.

в Smalltalk типов нет. Нарушение согласования типов обычно проявляется как ошибка исполнения.

Ранее и позднее связывание

Вид типизации определяет время, когда имена связываются с типами:

  • Статическая связь (ранее связывание) означает, что типы всех переменных и выражений известны во время компиляции;
  • Динамическое связывание (называемое также поздним связыванием) означает, что типы неизвестны до момента выполнения программы.

Концепции типизации и связывания являются независимыми, поэтому в языке программирования может быть:

  • типизация – сильная, связывание – статическое (Ada),
  • типизация – сильная, связывание – динамическое (C++, Object Pascal),
  • или и типов нет, и связывание динамическое (Smalltalk).

Параллелизм

Параллелизм – это свойство, отличающее активные объекты от пассивных.

Параллелизм позволяет различным объектам действовать одновременно.

Сохраняемость

Любой программный объект существует в памяти и живет во времени.

Сохраняемость – способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства.

Сохраняемость поддерживает состояние и класс объекта в пространстве и во времени.

Понятия класса и объекта

Объектный тип (класс) представляет собой объединение данных и правил их преобразования. Переменные объектного типа называются экземплярами класса или просто объектами.

Другими словами, класс – это тип объекта; объект – это конкретный экземпляр класса.

Гради Буч: «Каждый объект является экземпляром какого-либо класса, а класс может порождать любое количество объектов».

Понятие объекта

Объект обладает состоянием, поведением и идентичностью;

Структуру и поведение схожих объектов определяет общий для них класс;

Термины "экземпляр класса" и "объект" взаимозаменяемы.


11.11.2019; 14:00
хиты: 88
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь