Ограничение доступа
Созданию абстракции какого-либо объекта должны предшествовать определенные решения о способе ее реализации. Выбранный способ реализации должен быть скрыт и защищен для большинства объектов-пользователей (обращающихся к данной абстракции). Ограничение доступа позволяет вносить в программу изменения, сохраняя ее надежность и минимизируя затраты на этот процесс.
Абстрагирование и ограничение доступа являются взаимодополняющими операциями: абстрагирование фокусирует внимание на внешних особенностях объекта, а ограничение доступа – или иначе защита информации – не позволяет объектам пользователям различать внутреннее устройство объекта. Практически, в описании класса существуют две части: интерфейс и реализация. Интерфейс отражает внешнее проявление объекта, создавая абстракцию поведения всех объектов данного класса. Внутренняя реализация описывает механизмы достижения желаемого поведения объекта. Принцип такого различения интерфейса и реализации соответствует разделению по сути: в интерфейсной части собрано все, что касается взаимодействия данного объекта с любыми другими объектами; реализация скрывает от других объектов все детали, не имеющие отношения к процессу взаимодействия объектов.
Ограничение доступа – это процесс защиты отдельных элементов объекта, не затрагивающий существенных характеристик объекта как целого.
В языке С ++ элементы объекта могут быть общедоступны, обособлены или защищены. Общедоступная часть “видима” для всех объектов, обособленная “скрыта” от других объектов, а защищенная “скрыта” от всех объектов.
Модульность
Разделение программы на фрагменты позволяет частично уменьшить ее сложность. Однако гораздо важнее тот факт, что разделение программы улучшает проработку ее частей. Это свойство особенно полезно, когда программа состоит из огромного количества классов. Итак,
Модульность – это разделение программы на отдельно компилируемые фрагменты, имеющие между собой средства сообщения.
В большинстве языков ведется разделение интерфейсной части и реализации. Таким образом, модульность и ограничение доступа идут неразрывно друг от друга. В традиционном структурном проектировании модульность связывается прежде всего с логической группировкой подпрограмм на основе принципов взаимной связи и общей логики. В объектно-ориентированном программировании ситуация несколько иная: необходимо физически разделить классы и объекты, составляющие логическую структуру проекта и явно отличающиеся от подпрограмм. Программист должен находить баланс между двумя противоположными тенденциями: стремлением ограничить доступ к данным и необходимости обеспечения видимости тех или других абстракций в нескольких модулях. Доступ к данным из другого модуля должен осуществляться только через процедуры данного модуля.
Модульность – это свойство системы, связанное с возможностью декомпозиции ее на ряд тесно связанных модулей.
Иерархия.
Значительное упрощение в понимании сложных задач достигается за счет образования иерархической структуры из абстракций. Определим иерархию следующим образом:
Иерархия – это ранжированная или упорядоченная система абстракций.
Основными видами иерархических структур применительно к сложным системам являются структура классов (иерархия по номенклатуре) и структура объектов (иерархия по составу).
Важным элементом объектно-ориентированных систем и основным видом иерархии по номенклатуре является упоминавшаяся выше концепция наследования. Наследование означает такое соотношение между классами, когда один класс использует структурную или функциональную часть одного или нескольких других классов (простое и множественное наследование). Иными словами, наследование – такая иерархия абстракций, в которой подклассы наследуют строение от одного или нескольких суперклассов.
Принципы абстрагирования, ограничения доступа и иерархии конкурируют между собой. Данфорт и Томлисон утверждают: “Абстрагирование данных состоит в установлении жестких границ, защищающих состояние и функции объекта; принцип наследования требует открыть доступ и к состоянию, и к функциям объекта для производных объектов”. Для любого класса обычно существуют два вида объектов пользователей: объекты, которые используют операции данного класса для доступа к его элементам, и объекты-подклассы, полученные наследованием данного класса.
Различные языки программирования по-разному реализуют механизмы наследования и ограничения доступа, наиболее гибким в этом отношении является С++. В нем интерфейсная часть класса может быть разделена на три части: обособленную – видимую только для самого класса, защищенную – видимую также для подклассов; общедоступную – видимую для всех. В ряде случаев наследование носит множественный характер.
Типизация.
Несмотря на схожесть понятий ”класс” и ”тип”, в качестве отдельного элемента объектного подхода выделяется типизация, поскольку эта концепция подчеркивает различные особенности абстракций. Определим типизацию следующим образом:
Типизация – это ограничение, накладываемое на класс объектов и препятствующее взаимозамене различных классов (или сильно сужающее возможность такой взаимозамены). Типизация позволяет выполнять описание абстракций таким образом, что реализуется поддержка проектных решений на уровне языка программирования.
Параллелизм.
Любая программа включает по меньшей мере один канал управления, но в параллельной системе таких каналов может быть несколько: одни могут быть временными, а другие могут сохраняться в течении всего времени выполнения программы. Реальная параллельность достигается только на многопроцессорных системах, а системы с одним процессором имитируют параллельность за счет алгоритмов разделения времени.
Объект является основой, которая объединяет две концепции: каждый объект (как абстракция реальности) может представлять собой отдельный канал управления (абстракцию процесса). Такой объект называется активным. Для систем, построенных на основе OOD, реальность может быть представлена как совокупность взаимодействующих объектов, часть которых является активной и выступает в роли узлов независимых действий.
Параллелизм – свойство объектов находиться в активном, либо пассивном состоянии.
Устойчивость.
Устойчивость – понятие, связанное не только с временем существования данных. В OODB сохраняется не только состояние объекта, но и способ интерпретации класса любой другой программы должен быть определен однозначно. Из этого можно понять всю сложность управления базой данных в процессе ее наращивания, в частности при изменении классов объектов. Рассмотрим только устойчивость объектов во времени.
Устойчивость – свойство объекта существовать во времени (вне зависимости от процесса, породившего данный объект) и (или) в пространстве (перемещение объекта из адресного пространства, в котором он был создан).
Объектный подход создает множество существенных удобств, которые при других условиях не могут быть обеспечены. Наиболее важным является то, что объектный подход позволяет создавать системы, которые воплощают пять атрибутов хорошо структурированных сложных систем. Кроме того, можно назвать еще пять преимуществ, которые связаны с применением объектного подхода.
Глава 3.Разработка программы реализации программных фильтров для определения моментов подачи импульсов дефибриляции
Программа, управляемая событиями
Известно, что приложения для Windows можно разрабатывать как с использованием библиотеки классов MFC, так и без нее. Использование всей мощи MFC, конечно, облегчает процесс разработки приложений, однако каждому разработчику необходимо иметь представление о структуре и принципах функционирования традиционного Windows – приложения, созданного с помощью функций API (Application Programming Interface). Это утверждение объясняется тем, что каркас приложения MFC содержит внутри себя структуру традиционного Windows – приложения. Кроме того, многие методы классов MFC содержат, инкапсулируют, вызовы API – функций. В состав API входят не только функции (более 2000), но и множество структур, более 700 сообщений, макросы и интерфейсы. Цель этой главы – показать традиционную структуру Windows – приложения, созданного на основе классов MFC .
Основной чертой всех Windows – приложений является то, что они поддерживают оконный интерфейс, используя при этом множество стандартных элементов управления (кнопки, линейки, шкалы, списки и т. д.). Эти элементы поддерживаются с помощью динамических библиотек (DLL), которые являются частью операционной системы. Именно поэтому элементы доступны любым приложениям, и даже самое первое приложение будет иметь почти такой же облик, как и любое другое.
Все Windows – приложения являются программами, управляемыми событиями (event-driven applications), что коренным образом отличает их от программ с фиксированной последовательностью выполнения. Программы, управляемые событиями, обладают большей гибкостью в смысле выбора пользователем порядка выполнения операций. Однако разработчик не может заранее предсказать последовательность вызовов функций и даже выполнения операторов своего приложения, так как эта последовательность определяется на этапе выполнения кода. Характерно то, что последовательность большей частью определяется не программой, а системой Windows и зависит от потока сообщений о событиях в системе. Большую часть времени приложение, управляемое событиями, находится в состоянии ожидания событий, точнее, сообщений о событиях. Сообщения могут поступать от различных источников, но все они попадают в очередь системных сообщений. Только некоторые из них система передаст в очередь сообщений вашего приложения. Все это время приложение выполняет цикл ожидания сообщений. Как только придет сообщение, адресованное вашему приложению, система передаст управление вашей оконной процедуре. Можно отметить факт, что в случае многопотокового приложения (multithreaded application) сообщение приходит активному потоку (thread) приложения.