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

Введение в теорию программирования. Объектно-ориентированный подход. Учебное пособие для СПО

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
значений представляет собой дизъюнктную сумму доменов, содержащих существующие в языке C# типы Int и Bool.
В соответствии с намеченной схемой рассуждений, перейдем к описанию семантических предложений, которые описывают значение денотатов (т.е. правильно построенных конструкций) языка C#.
Приведем семантические предложения для выражений языка программирования C#:
E : Exp -> [State -> [[Value ( State] + {error}]];
E[E]s = (v,s'),
если
v - значение E в s,
s' - состояние после означивания ;
E[E]s = error,
если возникает ошибка несоответствия типов.
Из приведенных соотношений следует, что вычисление значения выражения языка программирования C# приводит к такому изменению состояния, что происходит связывание переменной со значением, либо (в случае невозможности связывания по причине несоответствия типов переменной и значения ) вырабатывается ошибка. При этом состояние программы изменяется с s на s'.
Приведем семантическое предложение для команд языка программирования C#:
С:Com->[State->[State+{error}]].
Из приведенного соотношения следует, что вычисление значения команды языка программирования C# приводит, вообще говоря, к изменению состояния, причем возможно возникновение ситуации
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
61
(например, несоответствия типов в ходе присваивания), при которой вырабатывается ошибка.
В соответствии с намеченной схемой рассуждений, перейдем к описанию семантических предложений, которые описывают значение конкретных денотатов (т.е. правильно построенных конструкций) языка C#. Рассмотрим семантические предложения для денотатов констант целочисленного типа языка C#:
E[0]s=(0,s); E[1]s=(1,s);
Как видно из приведенных соотношений, денотатами констант целочисленного типа являются значения этих констант (в форме упорядоченных пар вида " значение "-" состояние "), причем смены состояния программы не происходит. Рассмотрим семантические предложения для денотатов констант логического типа языка C#:
E[true]s=(true,s); E[false]s=(false,s);
Как видно из приведенных соотношений, денотатами констант логического типа являются значения этих констант (в форме упорядоченных пар вида " значение "-" состояние "), причем смены состояния программы не происходит. Рассмотрим семантическое предложение для денотатов идентификаторов языка C#:
E[I]s=(m,I=unbound) error, -> (m,I,s).
Как видно из приведенного соотношения, при возможности связывания денотатами идентификаторов являются идентификаторы, связанные со значениями (в форме упорядоченных троек вида " значение в памяти "-" идентификатор "-" состояние "), причем смены состояния программы не происходит, а при невозможности - выдается сообщение об ошибке.
Рассмотрим семантические предложения для денотатов выражений языка C#:
E[!E]s = (E [E] s=(v, s'))
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
62
(isBool -> (not v, s'), error), error; E [E1=E2] s = (E [E1]s = (v1, s1)) -> (E [E2] s1 = (v2, s2)) -> (v1 = v2, s2), error), error; E [E1+E2] s = (E [E1] s=(v1, s1)) -> (E [E2] s1 = (v2, s2)) -> (IsNum v1 and IsNum v2 -> v1 + v2, s2), error),error),error.
Проанализируем полученные соотношения.
Денотатом отрицания выражения является отрицание его значения ; причем состояние программы изменяется. В случае несоответствия типов или небулевости выражения генерируется сообщение об ошибке.
Денотатом присваивания является присвоенное значение в новом состоянии. В случае несоответствия типов генерируется сообщение об ошибке.
Денотатом сложения является значение суммы в новом состоянии. В случае несоответствия типов генерируется сообщение об ошибке.
В качестве упражнения предлагается самостоятельно разработать семантические предложения для денотатов команд языка программирования C#.
В ходе лекции была представлена классификация подходов к семантике языков программирования, признан целесообразным денотационный подход, который проиллюстрирован примером языка C# ­ограниченного подмножества C#.
Важнейший вывод, к которому мы неизбежно приходим к концу лекции, заключается в том, что семантики рассмотренных нами языков программирования SMalL и C# (которые являются подмножествами реальных языков SML и C#) имеют весьма много общего.
Более того, сходство семантики рассмотренных нами конструкций ( команд и выражений ) языков программирования SMalL и C# весьма прозрачно и очевидно. Для иллюстрации справедливости этого
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
63
утверждения достаточно сопоставить результаты исследования семантики рассматриваемых языков программирования.
По результатам такого сопоставления можно прийти к закономерному выводу о том, что существует явное, непосредственное отображение конструкций рассмотренных языковых подмножеств друг в друга, причем это отображение носит взаимно однозначный характер.
Попутно мы можем сделать еще один важный вывод. Формализация денотационной семантики на основе доменов с помощью теории вычислений Д. Скотта является адекватной моделью семантики выражений и команд рассмотренных языков программирования (а также функционального и объектно-ориентированного подходов в целом). Таким образом, семантика языков функционального и объектно­ориентированного программирования достаточно близка к семантике формальных теорий, на которых они основаны (в частности, это справедливо для ламбда-исчисления и языков SML и C#). Кроме того, теория вычислений является актуальной и адекватной формализацией семантики, а денотационный подход - целесообразным для моделирования семантики различных языков программирования.
В завершение лекции хотелось бы указать на аналогию теории вычислений Д. Скотта и ламбда-исчисления (как метатеорий ) со средой Microsoft .NET (как метасредой ), которые принципиально обеспечивают возможность "погружения" в себя различных языков и подходов к программированию.
Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [ 24, 35, 39, 42,
45, 53, 69, 73].
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
64
Основные понятия объектно-ориентированного подхода: объекты, классы и методы
В данной лекции будут рассмотрены вопросы, относящиеся к идеологии, методологии и практике моделирования основных элементов объектно-ориентированного подхода к программированию посредством двухуровневой концептуализации. Особенности практической реализации основных аспектов концепции ООП описаны на примере языка программирования C#.
Изложим понятийный аппарат объектно-ориентированного подхода к программированию.
Прежде чем будут изложены математически строгие определения (в том числе в терминах теории дескрипций), попытаемся сформировать предварительное представление об основных сущностях данного подхода.
Сформулируем на интуитивном уровне определения таких основополагающих для объектно-ориентированного подхода к программированию понятий, как объект, класс, свойство и метод.
Под объектом будем понимать математическое представление сущности реального мира (или предметной области), которое используется для моделирования.
Классом будем называть весьма общую сущность, которая может быть определена как совокупность элементов (нужно заметить, что класс при объектно-ориентированном подходе к программированию - это, как правило, первичное, неопределяемое понятие, до некоторой степени аналогичное теоретико-математическому понятию множества, или, точнее, домена ).
Под свойством (или атрибутом ) будем понимать пропозициональную функцию, определенную на произвольном типе (данных).
Методом (или функцией) назовем операцию, которая определена над объектами того или иного класса .
Заметим, что класс при объектно-ориентированном подходе является
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
65
аналогом понятия типа в том смысле, что к нему относят лишь объекты, отобранные по определенному правилу. Это правило можно формализовать математически посредством предикатной функции, т.е. функции, область значений которой совпадает со значениями истинности: "истина" и "ложь". При этом тот или иной объект относится к классу, если значение аппликации функции к данному объекту истинно, и не относится в противном случае.
Функцию такого рода принято называть индивидуализирующей функцией. Индивидуализирующая функция фактически является моделью экспертной классификации.
Важным условием при исследовании объектно-ориентированного подхода к программированию является установление взаимосвязей фундаментальных сущностей. Отметим в этой связи, что понятие класса является изначально более общим, чем понятие объекта. Точнее, говорят, что объект является экземпляром (instantiation) класса.
Таким образом, класс может рассматриваться как совокупность объектов (подобно тому как множество или домен есть совокупность элементов).
В рамках объектно-ориентированного подхода к программированию произвольный класс может быть элементарным либо подразделяться на подклассы (подобно тому как множество или домен подразделяется на подмножества или субдомены).
Например, более общий класс PERSON может содержать внутри себя подкласс STUDENT, который, в свою очередь, содержит конкретный объект John_Smith.
Как отмечалось во вступительной лекции, в 90-е годы В.Э. Вольфенгагеном (Vyatcheslav E. Wolfengagen) была создана так называемая двухуровневая схема концептуализации, основанная на двукратном применении постулата свертывания, до известной степени аналогичной операции ламбда-абстракции.
Рассмотрим более подробно основные аспекты данной формализации объектно-ориентированного подхода к программированию. В общих чертах схема построения модели выглядит следующим образом.
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
66
Основу модели составляет типизированный вариант ламбда­исчисления, семантика которого моделируется посредством полных и непрерывных решеток Д. Скотта.
Для описания объектов произвольной сложности вводятся аппликативные структуры с приписыванием типов. Последнее обстоятельство необходимо для формализации иерархии классов, в которые объединяются объекты.
Для формализации определений используются определенные дескрипции Скотта-Фурмана вида:
IxФ,
что означает "тот единственный объект x, для которого значение индивидуализирующей функции Ф истинно".
При таком подходе произвольный объект моделируется упорядоченной тройкой элементов вида
<концепт, индивид, состояние>,
составляющие которой соединены соотнесениями.
Основным соотношением формальной схемы двухуровневой концептуализации является так называемый принцип концептуализации, подобный принципам свертывания, которые (в той или иной форме) присутствуют практически во всех математических теориях, исследованных ранее в рамках курса (в частности, в исследованных ранее в рамках курса ламбда-исчислении и комбинаторной логике).
Формальная запись принципа концептуализации посредством определенных дескрипций выглядит следующим образом:
Приведем словесную интерпретацию формулы:
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
67
Значением индивидного концепта является функция из соотнесений в индивиды.
С точки зрения рассматриваемой формальной теории, произвольный объект d предметной области D может быть единственным образом индивидуализирован посредством функции Ф (где i означает соотнесение ).
Заметим, что при соотнесении общей теории с языками программирования домен D можно также интерпретировать как класс, а элемент домена d - как объект языка программирования.
Рассмотрев интуитивное определение понятия класса, а также представив домены как формальную модель классов языков программирования в целом, остановимся более подробно на классах в языке объектно-ориентированного программирования C#.
По аналогии с другими известными языками объектно­ориентированного программирования (в частности, C++ и Java), под классом в языке C# понимается ни что иное, как ссылочный тип, определенный пользователем.
При этом для классов языка программирования C# допустимо только единичное наследование. В случае необходимости реализации множественного наследования возможно наследование посредством механизма интерфейсов, который будет подробнее рассмотрен далее в ходе курса.
Членами (или, иначе, элементами) класса языка программирования C# могут являться следующие конструкции:
константа, поле, метод, оператор, конструктор, деструктор ; свойство, индексатор, событие ; статические и инициализированные члены.
Доступ к членам класса определяется исходя из значения модификатора области действия идентификатора класса, который может принимать следующие значения: public, protected, private (данное
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
68
значение используется по умолчанию), internal, protected
internal .
Инициализация объекта класса языка программирования C# производится посредством оператора new, о котором будет рассказано ниже.
Рассмотрим манипулирование классами на примере следующих фрагментов программ на языке C#.
Прежде всего, приведем простейшее описание класса. Описание класса
C c целочисленным полем value на языке C# имеет вид:
class C { ... int value = 0; ... }
Заметим, что в описании класса C на языке программирования C# кроме рассмотренного поля value могут присутствовать и другие поля (т.е. атрибуты объектов класса ) допустимых в языке C# типов, а также методы (т.е. способы манипулирования объектами данного класса ).
В языке программирования C# инициализация поля (т.е. связывание его с начальным значением) не является обязательной. Для обеспечения безопасности программного кода и в силу реализации принципа инкапсуляции, инициализация поля некоторого класса C не должна открывать возможностей для доступа к полям и методам данного типа. При этом доступ к элементам класса внутри класса реализуется посредством обращения и не требует полного имени объекта:
... value ...
В отличие от предыдущего случая, доступ из сторонних классов требует указания полного имени объекта (в примере последовательно производятся инициализация и обращение ):
C c = new C(); ... c.value ...
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
69
Рассмотрим более развернутый пример описания классов и манипулирования их элементами.
Приведем описание класса Rectangle, моделирующего прямоугольник с полями origin, width и height, моделирующими, соответственно, начальную точку (с парой координат), ширину и высоту, а также методом MoveTo, моделирующим перемещение начальной точки в заданную:
class Rectangle { Point origin; public int width, height; public Rectangle(){ origin = new Point(0,0); width=height=0; } public Rectangle ( Point p, int w, int h){ origin = p; width = w; height = h; } public void MoveTo (Point p) { origin = p; } }
Заметим, что модификатор области видимости для данного класса и его элементов разрешает общедоступное применение ( public ). Рассмотрим пример использования класса Rectangle:
Rectangle r = new Rectangle( new Point(10,20),5,5); int area = r.width * r.height; r.MoveTo(new Point(3,3));
Заметим, что в данном примере последовательно осуществляются инициализация объекта класса Rectangle с начальной точкой
(10,20), шириной и высотой в пять единиц (т.е. квадрата), подсчет
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]