Помощь в учёбе, очень быстро...
Работаем вместе до победы

Основные понятия объектно-ориентированного подхода: объекты, классы и методы

РефератПомощь в написанииУзнать стоимостьмоей работы

В 1990;е гг. В. Вольфенгагеном (Vyatcheslav Е. Wolfengagen) была создана так называемая двухуровневая схема концептуализации, основанная на двукратном применении постулата свертывания (до известной степени аналогичной операции лямбда-абстракции). Заметим, что последняя модель позволяет вполне адекватно и непротиворечиво описывать объекты предметных областей с учетом их рассмотрения как… Читать ещё >

Основные понятия объектно-ориентированного подхода: объекты, классы и методы (реферат, курсовая, диплом, контрольная)

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

Прежде всего, необходимо составить предварительное представление об основных элементах ООП (объектах, классах и методах) на интуитивном уровне. Затем речь пойдет о соотношении понятий объекта и класса и особенностях каждого из этих элементов ООП. В качестве теоретической формализации понятий «класс» и «объект» будет предложена так называемая концептуальная модель.

Особенности реализации основных аспектов ООП применительно к Microsoft .NET проиллюстрированы такими конструкциями языка программирования С#, как объекты, свойства и методы. Значительное внимание уделено сравнительному исследованию классов и структур языка программирования С#.

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

Напомним ход эволюции теорий, лежащих в основе современных подходов к моделированию ООП. Еще в 1924 г. М. Шенфинкель разработал простую теорию функций, которая фактически являлась исчислением объектов-функций и предвосхитила появление лямбда-исчисления. В 1934 г. Л. Черч предложил лямбда-исчисление и применил его для исследования теории множеств. В конце 1960;х гг. Д. Скотт предложил использовать для формализации семантики математических теорий так называемые домены (множества, адекватно формализующие рекурсивные вычисления). При этом на основе доменов Д. Скоттом был предложен так называемый денотационный подход к семантике. В 1980;е гг. Д. Скоттом совместно с М. Фурманом (Michael Р. Fourman) были проведены исследования аппарата определенных дескрипций, который является адекватным средством для формализации определений. В книге мы будем использовать именно этот аппарат для математически строгой сокращенной записи определений объектов, типов и классов.

В 1990;е гг. В. Вольфенгагеном (Vyatcheslav Е. Wolfengagen) была создана так называемая двухуровневая схема концептуализации, основанная на двукратном применении постулата свертывания (до известной степени аналогичной операции лямбда-абстракции). Заметим, что последняя модель позволяет вполне адекватно и непротиворечиво описывать объекты предметных областей с учетом их рассмотрения как в динамике, так и в статике. При этом двухуровневая схема концептуализации позволяет моделировать как объекты той или иной предметной области, так и объекты языков программирования. Еще одним существенным преимуществом данной модели является возможность ее использования применительно как к объектам данных (ОД), так и к объектам метаданных (ОМД).

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

Сформулируем на интуитивном уровне определения таких основополагающих для объектно-ориентированного подхода к программированию понятий, как объект, класс, свойство и метод. Под объектом будем понимать математическое представление сущности реального мира (или предметной области), которое используется для моделирования. Классом будем называть весьма общую сущность, которая может быть определена как совокупность элементов (нужно заметить, что класс при объектно-ориентированном подходе к программированию — это, как правило, первичное, неопределяемое понятие, до некоторой степени аналогичное теоретикоматематическому понятию множества, или, точнее, домена). Под свойством (или атрибутом) будем понимать пропозициональную функцию, определенную на произвольном типе (данных). Методом (или функцией) назовем операцию, которая определена над объектами того или иного класса. Первичным понятием ООП является понятие класса как совокупности объектов. Заметим, что класс при ООП является аналогом понятия типа в том смысле, что к нему относят лишь объекты, отобранные по определенному правилу. Это правило можно формализовать математически посредством предикатной функции, т. е. функции, область значений которой совпадает со значениями истинности: «истина» и «ложь». При этом тот или иной объект относится к классу, если значение аппликации функции к данному объекту истинно, и не относится в противном случае. Функцию такого рода принято называть индивидуализирующей функцией. Индивидуализирующая функция фактически является моделью экспертной классификации.

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

В рамках ООП произвольный класс может быть элементарным либо подразделяться на подклассы (подобно тому как множество или домен подразделяется на подмножества, или субдомены). Например, более общий класс PERSON может содержать внутри себя подкласс STUDENT, который, в свою очередь, содержит конкретный объект John_Smith. Рассмотрим более подробно основные аспекты данной формализации ООП. В общих чертах схема построения модели выглядит следующим образом. Основу модели составляет типизированный вариант лямбда-исчисления, семантика которого моделируется посредством полных и непрерывных решеток Д. Скотта. Для описания объектов произвольной сложности вводятся аипликативные структуры с приписыванием типов. Последнее обстоятельство необходимо для формализации иерархии классов, в которые объединяются объекты.

Для формализации определений используются определенные дескрипции Скотта — Фурмана вида.

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

.

составляющие которой соединены соотнесениями.

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

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

| 11х (х)Ф (х) | | I=d {d}={deD | | |o (d)| | i=true}.

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

С точки зрения рассматриваемой формальной теории, произвольный объект d предметной области D может быть единственным образом индивидуализирован посредством функции Ф (где i означает соотнесение). Заметим, что при соотнесении общей теории с языками программирования домен D можно также интерпретировать как класс, а элемент домена d — как объект языка программирования.

Рассмотрев интуитивное определение понятия класса, а также представив домены как формальную модель классов языков программирования в целом, остановимся более подробно на классах в языке объектно-ориентированного программирования С#.

По аналогии с другими известными языками объектно-ориентированного программирования (в частности, C++ и Java), под классом в языке C# понимается не что иное, как ссылочный тип, определенный пользователем. При этом для классов языка программирования C# допустимо только единичное наследование. В случае необходимости реализации множественного наследования возможно наследование посредством механизма интерфейсов, который будет подробнее рассмотрен далее.

Членами (или, иначе, элементами) класса языка программирования C# могут являться следующие конструкции:

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

Доступ к членам класса определяется исходя из значения модификатора области действия идентификатора класса, который может принимать следующие значения: public, protected, private (данное значение используется по умолчанию), internal, protected internal.

Инициализация объекта класса языка программирования C# производится посредством оператора new, о котором будет рассказано ниже. Рассмотрим манипулирование классами на примере следующих фрагментов программ на языке С#. Прежде всего, приведем простейшее описание класса. Описание класса С с целочисленным нолем value на языке C# имеет вид.

class С {.

int value=0;

}.

Заметим, что в описании класса С на языке программирования C# кроме рассмотренного поля value могут присутствовать и другие поля (т.е. атрибуты объектов класса) допустимых в языке C# типов, а также методы (т.е. способы манипулирования объектами данного класса).

В языке программирования C# инициализация поля (т.е. связывание его с начальным значением) не является обязательной. Для обеспечения безопасности программного кода и в силу реализации принципа инкапсуляции инициализация поля некоторого класса С не должна открывать возможностей для доступа к полям и методам данного типа. При этом доступ к элементам класса внутри класса реализуется посредством обращения и не требует полного имени объекта:

… value …

В отличие от предыдущего случая, доступ из сторонних классов требует указания полного имени объекта (в примере последовательно производятся инициализация и обращение):

С c=new С ();

… c. value …

Рассмотрим развернутый пример описания классов и манипулирования их элементами. Приведем описание класса 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), шириной и высотой в пять единиц (г.е. квадрата), подсчет его площади area и перемещение начала отсчета в точку с координатами (3,3).

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

class Rectangle {.

static Color defaultColor;

// для каждого класса static readonly int scale;

// для каждого класса int x, у, width, height;

// для каждого объекта…

}.

Заметим, что статические поля defaultColor и scale остаются неизменными внутри класса, тогда как динамические поля х, у, width и height индивидуально изменяются в зависимости от состояния каждого из объектов класса. Доступ изнутри класса осуществляется посредством обращения.

… defaultColor … scale …

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

… Rectangle.defaultColor.

… Rectangle. scale …

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

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

Рассмотрим особенности использования методов на примере следующей программы на языке С#, представляющей описание класса С с полями sum и п и методами Add и Mean:

class С {.

int sum=0, n=0; public void Add (int x){ sum=sum=x; n++;

//процедура.

}.

public float Mean (){.

return (float)sum/n;

//функция (должна возвратить значение).

}.

}.

Прежде всего, отметим, что методы в языке программирования C# делятся на функции (которые обязаны возвращать значение) и процедуры (которые могут и не возвращать значение, на что указывает тип void). В данном примере Add — процедура, a Mean — функция, в которой возврат значения явно указывается оператором return. Доступ к методу, как и к полю, можно получить изнутри класса:

this.Add (3);float х=Меап ();

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

С c=new С ();

c.Add (3);

float x=c.Mean ();

Заметим, что оператор this представляет собой указатель на текущий объект.

Продолжая аналогию между полями и методами как элементами классов, мы приходим к понятию статического метода. Рассмотрим особенности реализации статических методов в языке программирования C# на следующем примере:

class Rectangle {.

static Color defaultColor; public static void ResetColor () { defaultColor=Color. white;

}.

Как явствует из приведенного примера, под статическим методом понимается операция, определенная над статическими элементами классов (т.е. над статическими полями). В данном примере описания класса Rectangle статическим является метод ResetColor (заметим, что он не возвращает значения, т. е. ResetColor — это статическая процедура).

По аналогии с предыдущими случаями, для доступа к статическому методу изнутри класса достаточно указать только краткое имя данного метода:

ResetColor ();

В случае доступа из сторонних классов необходимо указать полное имя статического метода:

Rectangle. ResetColor ();

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

class Stack { int[] values; int top=0;

public Stack (int size){.

}.

public void Push (int x){.

}.

public int Pop (){.

} }.

В данной программе приведено (с сокращениями) описание класса, моделирующего стек (аналогичный стеку КАМ) посредством массива элементов values с вершиной top, функциями создания стека Stack размером size и выталкивания Push элемента х из стека, а также вталкивания Pop элемента в стек.

Аналогично объектам ссылочных типов, объекты классов (как принципиально динамические) хранятся в динамической области памяти (или так называемой «куче»). В силу ограничений безопасности программного кода любой объект языка программирования C# до использования необходимо инициализировать оператором new, например:

Stack s=new Stack (lOO);

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

Подводя итоги обсуждения основных понятий ООП (классов, объектов и методов) применительно к языку программирования С#, кратко отметим достоинства и недостатки подхода.

К преимуществам ООН следует отнести:

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

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

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

Вариант 1: что понимается под термином «объект»?

  • а) собственно сущность реального мира;
  • б) абстрактное представление сущности реального мира;
  • в) математическое представление сущности реального мира (+).

Вариант 2: каково соотношение понятий «объект» и «класс»?

  • а) понятие «объект» является более общим;
  • б) понятие «класс» является более общим (+);
  • в) эти понятия несопоставимы.

Вариант 3: в чем состоит назначение аппарата определенных дескрипций?

  • а) в формализации типов;
  • б) в формализации определений (+);
  • в) в формализации объектов.

Вопрос 2.

Вариант 1: что понимается под термином «свойство»?

  • а) абстрактная характеристика объекта;
  • б) математическая характеристика объекта;
  • в) пропозициональная операция над объектами (+).

Вариант 2: чем является объект по отношению к классу?

  • а) экземпляром (+);
  • б) типом;
  • в) реализацией.

Вариант 3: что определяет объект в концептуальной модели?

  • а) тройка ;
  • б) тройка ;
  • в) тройка (+).

Вопрос 3.

Вариант 1: что понимается под термином «метод»?

  • а) алгоритм решения задачи;
  • б) операция над объектами (+);
  • в) подход к программированию.

Вариант 2: на каких математических теориях основана концептуальная модель?

  • а) на типизированном лямбда-исчислении и теории решеток (+);
  • б) па бестиповом лямбда-исчислении и теории решеток;
  • в) на теории категорий и теории решеток.

Вариант 3: чем соединены составляющие концептуальной модели?

  • а) состояниями;
  • б) индивидами;
  • в) соотнесениями (+).
Показать весь текст
Заполнить форму текущей работой