Тема 11. Проектирование программного обеспечения
Основные этапы. Способы конструирования доказательства правильности программ. В ходе лекции будут рассмотрены важнейшие научные исследования, относящиеся к эволюции подходов к математическому моделированию одной из важнейших для объектно-ориентированного подхода к программированию концепций, а именно, наследования.
Прежде всего, будет сформулировано определение наследования.
Затем будет представлен сравнительный анализ путей реализации концепции наследования в языках объектно-ориентированного программирования и в computer science.
При этом будут подробно исследованы особенности формализации концепции наследования посредством диаграмм Х.Хассе и фреймов Н.Руссопулоса.
Особое внимание будет уделено реализации механизмов наследования для объектов языка программирования C#, включая иерархическую организацию классов, а также множественное наследование.
Отображение классов Microsoft .NET в классы языков программирования SML и C# проиллюстрирует практику применения концепции наследования.
Напомним ход эволюции теорий, лежащих в основе современного подхода к наследованию.
Еще в 50-х г.г. прошлого столетия Хельмут Хассе (Helmut Hasse, 1898-1979) предложил использовать диаграммы особого рода для графической интерпретации отношения частичного порядка. Заметим, что позднее диаграммы, открытые ученым, получили название в его автора и стали называться диаграммами Хассе. И по сей день диаграммы Хассе являются наиболее широко распространенной графической формализацией механизма наследования.
Затем, в 1976 году Н.Руссопулос (N.D.Roussopulos) впервые применил фреймовую нотацию для моделирования отношений между объектами тех или иных предметных областей. Ученым было также введено так называемое ISA-отношение частичного порядка, которое адекватно моделирует понятие наследования. Заметим, что обозначение ISA возникло от английских слов “… is a …”?, означающих «… является одним из … » и хорошо иллюстрирует суть понятия наследования на естественном языке.
Позднее, в 1979 году, Д.Скотт (Dana S. Scott) сформулировал теорию полных и непрерывных решеток, которая используется в диаграммах потоков данных. Решетка Д.Скотта представляет собой модель частично упорядоченного множества, или, иначе, модель иерархии классов.
Затем, в 1988-90 г.г. учеными Л.Карделли (Luca Cardelli), У.Куком (William R. Cook) и др. была исследована семантика наследования. При этом был построен вариант денотационной семантики, который, как оказалось, адекватно формализовал не только единичное, но и множественное наследование.
Кратко обсудив историю развития концепции наследования и ее формализаций, перейдем к понятийному аппарату.
Под наследованием в дальнейшем будем понимать свойство производного объекта сохранять поведение родительского объекта. Под поведением будем иметь в виду для математического объекта его атрибуты и операции над ним, а для языкового объекта ООП – поля и методы.
Таким образом, применительно к языку программирования концепция наследования означает, что свойства и методы базового класса равно применимы к его производным объектам. Заметим, что дочерний объект не обязательно наследует все без исключения атрибуты и операции родительского, а лишь некоторые из них. Такой подход характерен к как для классов объектов в целом, так и для отдельных их конкретизаций, или, иначе, экземпляров.
Как уже упоминалось в ходе лекции, теоретическая концепция наследования удовлетворительно моделируется посредством отношения (или, точнее, иерархии) частичного порядка. Существует целый ряд формализаций наследования, но наиболее адекватными и концептуально ясными являются графические модели. Среди них следует выделить уже упомянутые ранее подходы: фреймовую нотацию Н.Руссопулоса и диаграмы Хассе.
Отношение частичного порядка обладает следующими теоретически интересными и практически полезными свойствами.
Во-первых, оно является рефлексивным, т.е. любой объект языка программирования или формальной модели предметной области находится отношении частичного порядка с самим собой. Формальная запись свойства рефлексивности для отношения частичного порядка выглядит следующим образом:
∀ a: a ISA a.
Другой важной особенностью отношения частичного порядка является транзитивность. Суть транзитивности состоит в том, что если существует цепочка из (трех) объектов, связанных отношением частичного порядка, то первый и последний элементы этой цепочки можно связать тем же отношением. Это свойство гарантирует построение на множестве графа отношения частичного порядка в форме «решетки». Формальная запись свойства транзитивности для отношения частичного порядка выглядит следующим образом:
∀ a,b,c: a ISA b, b ISA c ⇒ a ISA c.
Наконец, еще одним фундаментальным свойством отношения частичного порядка как модели наследования является антисимметричность. Это свойство разрешает наследование только в одном направлении (и запрещает его в противоположном).
Формальная запись свойства антисимметричности для отношения частичного порядка выглядит следующим образом:
∀ a,b : a ISA b ⇒ NOT (b ISA a).