Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 1438

.pdf
Скачиваний:
2
Добавлен:
30.04.2022
Размер:
1.16 Mб
Скачать

Отказ - нарушение работоспособности программы и ее технической документации. Причины отказа – нарушения кода программы, «стирание» данных в памяти, нарушение нормального хода процесса.

Сбой программы – самоустраняющийся отказ, не требующий постороннего вмешательства.

Восстановление – это выход программы из состояния сбоя или отказа.

При оценке надежности используют две величины:

1.Наработка на отказ (время между двумя соседними отказами – tнорм ф).

2.Коэффициент готовности – доля времени

полезной работы ( kгот = tнорм / tобщ ).

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

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

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

Контрольные вопросы

173

1.В чем состоит оценка качества ПС?

2.Как оценивается надежность ПС?

3.Что такое отказ ПС?

4.Что такое сбой ПС?

11. ПРОБЛЕМА СЕРТИФИКАЦИИ ПРОГРАММНЫХ СИСТЕМ

На Западе существуют специальные лаборатории по сертификации программного обеспечения: Software Certification Laboratories (SCL).

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

Лаборатории выгоднее использовать следующую модель: сертификация выполняется на стабильной версии (а не на β-версии), производитель не участвует в сертификации, он просто предоставляет лаборатории фиксированное число версий. В представленные версии встраиваются резидентные датчики, а версии передаются предварительно отобранным пользователям, работающим в разных областях. Методы тестирования и тип собираемой информации определяет SCL. Пользователи ставятся в известность о том, какого рода информация собирается тестовыми датчиками. При этом пользователи не должны тратить никаких дополнительных ресурсов для поиска информации, производительность их версии не должна страдать от датчиков. Тестовые данные поступают только в SCL и являются собственностью только SCL. Лаборатория анализирует, обрабатывает полученную информацию и передает ре-

174

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

Существуют и другие подходы к сертификации.

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

Компания Software Testing Assurance Corporation, осно-

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

Компания Microsoft использовала β-версии, из которых получала информацию о том, как работает их продукция. Затем фирма детально прорабатывала пользовательские файлы отчета.

Контрольные вопросы

1.Какие способы сертификации программных систем известны? В чем их отличия?

2.Какие преимущества дает тестирование ПС пользовате-

лями?

12. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

Цель объектно-ориентированнного программирования (ООП) - максимально приблизить систему понятий, которой человек пользуется повседневно, общаясь на естественном языке, к языку программирования [1, 7, 9 - 11]. Человек, говоря о каком–то объекте, подсознательно связывает с ним присущие

175

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

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

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

ООП начинается там, где определены классы и приме-

няются концепции инкапсуляции, наследования и полиморфизма.

Для определения класса применима запись:

класс = данные + функции работы с ними.

Класс - это абстрактный тип данных, созданный специально программистом. Класс содержит члены–данные (data members) и члены-функции (member functions).

Синтаксис описания класса похож на синтаксис описания структур и объединений в стандартном языке C и записей в Паскале. Класс описывает некоторые объекты (object). Чле- ны-данные объекта описывают его состояние (статику), членыфункции - поведение объекта (динамику).

Если обращение к функции–члену рассматривать как запрос объекту совершить некоторое действие, то набор функ-

176

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

Например: class A_Class {

рrivate:

int x; double y, z; void f1(); int f2(int);

рublic:

char ch, ch1; int f3(int, int);

int GetX() {return x;} };

Рrivate: и рublic: - это метки, которые определяют режим доступа к членам класса. Метки могут использоваться многократно, в любом порядке.

К рrivate: (закрытым) членам класса имеют доступ только члены класса и их друзья. Рublic: (открытые) члены класса доступны для программы, в которой объекты класса существуют. Они нужны для интерфейса объектов класса. Если необходимо прочитать значения закрытого класса извне, то пишется специальная функция, которая возвращает значения этих данных.

Вызов функций-членов и связывание их с конкретным классом происходит на этапе компиляции. Это так называемое

раннее связывание.

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

177

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

1. Инкапсуляция подразумевает объединение данных и функций в новый тип данных (объектный), т.е. объекту присущи какие-то качества и способы изменения этих качеств

– реакции на внешний мир в виде функций.

Примером объектного типа может быть тип «точка». для него члены-данные – это координаты точки, членыфункции – это функции, изменяющие положение точки на экране.

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

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

Среди функций объекта выделяют специальные функции: конструкторы и деструкторы.

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

Деструктор уничтожает объект. Деструктор может быть только один.

178

2. Наследование без использования наследования ООП не имеет смысла. Наследование предполагает заимствование свойств другого объекта, т.е. данных и функций объекта. Принята своя терминология: «наследник», «потомок» и «предок», «родитель».

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

Объекты одного класса имеют разные имена (зависящие от произвола программиста), но реагируют на сообщения одинаково. Объекты разных классов хотелось бы тоже как–то связать между собой. Эта связь может проявляться как наследование. В отношении наследования могут находиться как объекты, так и классы.

Наследование подразумевает определенную заранее иерархию классов, т.е. определение новых классов на основе уже имеющихся.

Имеющиеся классы называются базовыми или порождающими.

Новые классы называются производными или порождаемыми, или классами–потомками, или наследниками.

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

179

Таким образом, определяется приоритет обработки сообщений. Например, базовым классом может быть точка на экране, а наследником - окно на экране. Точка на экране определяется двумя координатами, а окно - двумя точками.

Члены–данные наследника - окна на экране:

точка левого верхнего угла;

точка правого нижнего угла. Члены–функции наследника:

смещение окна вдоль ox на dx;

смещение окна вдоль oy на dy;

сообщение координат левого верхнего угла;

сообщение координат правого нижнего угла;

сообщение размера окна вдоль оси ox;

сообщение размера окна вдоль оси oy.

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

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

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

180

Во многих языках программирования допускается множественное наследование.

A

B

 

С

 

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E

Рис. 29. Пример иерархии наследования

Е – наследник С и D. Вопрос: каким образом происходит двойное копирование данных и функций по двум веткам? Потомок наследует все данные и функции предка. Он может переопределять функции, унаследованные от предка. Это свойство называется полиморфизмом, но потомок не может переопределять данные, унаследованные от предка. Каждый предок может иметь несколько потомков, и каждый наследник может иметь несколько предков.

3. Полиморфизм – это переопределение действия или функции в иерархии наследования, унаследованного от предка.

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

181

зывается динамическим связыванием или разрешением типов во время выполнения.

Чтобы создать виртуальную функцию, надо: поместить эту функцию в базовый класс; сделать зависящим от потомка способ реализации функции.

Существует два вида полиморфизма: статический и виртуальный.

Статический полиморфизм принимается по умолчанию. При этом на этапе компиляции определяется применимость функции к конкретному объекту.

Виртуальный полиморфизм подчиняется правилам: преопределенные функции должны быть объявлены в предке словом virtual. Особым правилам подчиняются конструкторы, они не могут быть виртуальными. Для реализации виртуального полиморфизма используется так называемый механизм позднего связывания, по которому переопределенная функция связывается с объектом на этапе выполнения.

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

Для проектирования иерархии класса используется UML – унифицированный язык моделирования и автоматизированные пакеты поддержки этого языка.

Контрольные вопросы

1.В чем заключаются особенности объектноориентированнного прогаммирования?

2.Чем характерен объект? Каким типом данных он представлен в ООП?

3.Что такое инкапсуляция?

182