Обектно-ориентирано проектиране (ООП). Правила за обектно-ориентирано проектиране
Проектиране на класове и обекти
ПЪРВИ ЕТАП
ОТДЕЛЯНЕ НА КЛАСОВЕТЕ И ОБЕКТИТЕ ОТ ПО НА ЗАДАЧАТА
- Класове и обекти могат да бъдат:
- реални неща от програмиране на обекти
- абстракции в програмиране на обекти
- роли на реалните неща
- възгледи, мнения, преценки
- отношения и взаимоотношения между отделните елементи
- събития, в които участват различните елементи
- и не на последно място неща, които биха участвали в изграждането на програмна система
- Правило: Поведението на класовете и обектите в ПО е определящо при тяхната идентификация
ВТОРИ ЕТАП
ПРОЕКТИРАНЕ НА ХАРАКТЕРИСТИКИТЕ НА ОБЕКТИТЕ И КЛАСОВЕТЕ
- Проектиране на състоянието
Правила: адекватност, икономичност на представянето, лекота и ефективност на обработката
- Проектиране на поведението
Правило 1: Моделираното поведение трябва да осигурява присъщата за обекта функционалност
Правило 2: Моделът на поведение трябва да осигурява херметизацията на обекта
ОО модел на класа се изгражда на две нива: от гледна точка на интерфейса и от гледна точка на разработчика на клас
ОО ДИАГРАМИ
- Пример: ОО проектиране на понятието “рационално число”, с възможности за привеждане в правилна форма (несъкратима дроб)
Реализация на понятието клас, екземпляр, състояние, поведение, херметизация (клаузи Private и Public), предаване на съобщения в MS Visual C++. Примери.
Обекти, класове, екземпляри и съобщения в С++
- Класът (class) е реализиран като стандартен структурен тип, подобен на типа struct и представлява съвкупност от компоненти от два вида – данни (възможно от различен тип) и съответстващо на тях множество от функции
- Компонентите на класа се наричат членове на класа: член–променливи (членове–данни ) и член-функции
- Синтаксис:
class <име на класа> {
private: // частна секция
<декларации на променливи и функции>;
public: // публична секция
<декларации на променливи и функции>;
protected: //секция с ограничен достъп
<декларации на променливи и функции>;
};
- Член-прменливите могат да бъдат от всеки вграден или дефиниран от потребителя тип. Те се декларират точно както полетата на типа struct
- Член–функциите се дефинират непосредствено в класа или в тялото на класа се посочва само техният прототип
„public” и „private” (херметизация)
- Наричат се атрибути за достъп – определят какъв достъп е разрешен за членовете на класа
- Членовете от public: секцията са достъпни навсякъде
- Членовете от private: секцията (по подразбиране) са достъпни само от други член-функции на класа. Извън класа те са недостъпни и опитът да се използват извън класа ще бъде сигнализиран от компилатора като грешка.
Особености при деклариране на класове:
- Секциите private, public и protected се разполагат в произволен ред и могат да се повтарят. Всяка секция има област на действие от спецификатора й до следващия спецификатор или до края на класа
- Счита се, че блокът на член-функциите е вложен в блока на класа. Ако имената на формалните параметри на методите съвпадат с имената на полетата на класа, те ги препокриват – полетата са недостъпни (за метода SetValue от примера е избран v, а не myValue)
- Разрешава се да се декларират методи с еднакви имена, но те трябва да се различават по списъка от формални параметри. Това обикновено се налага, когато една и съща характеристика на поведението на обекта може да се реализира по няколко различни начина (натоварване, overloading)
- В декл. на клас могат да се вкл. декл. на изброен тип, тип struct и др.
Достъп до характеристиките на обекта в MS Visual C++. Неявен параметът „THIS”. Примери.
Дефиниране на член-функции
- Всеки метод се дефинира непосредствено в класа или по-късно.
- Синтаксисът за описание на метод (член-функция) е сходен със синтаксиса за описание на функции, които не са членове:
<заглавие на функцията> { <тяло на функцията >}
– Синтаксис на заглавието при дефиниране на член-функция непосредствено в класа (in-line):
<тип резултат> <име_ на_функцията> (<сп._форм._параметри>)
– Синтаксис на заглавието при дефиниране на член-функция извън класа:
<тип резултат> <име_на_класа> :: <име_ на_функцията>
(< списък_формални_параметри>)
- Тъй като блокът на член-функциите е вложен в блока на класа, то ако имената на локални променливи съвпадат с имената на полета на класа, те ги препокриват – полетата са недостъпни.
- Имената на полетата и методите на класа са достъпни без допълнително уточняване при описание на метода.
- При описанието на методите е достъпен така нареченият параметър this, който представлява неявно деклариран указател към обекта, с когото е свързан методът. Използването на параметъра this в метод на даден обект всъщност е обръщение на обекта към самия себе си
Обработка на екземпляри. Предаване на съобщения
- Операции с обекти: Обработката на екземпляри се осъществява главно чрез използване на техните полета и методи. За целта е въведена операция селектор на членовете на обекта (напълно аналогична на селектор на членовете на struct) – достъпни са само публичните членове
Пример 1:
#include “Coeffs.h”
Coefficient gCoeff; // глобален автоматичен обект
int main() {
Coefficient lCoeff1; // локален автоматичен обект
Coefficient * pCoeff = new Coefficient; // указател към динамичен обект
// …
lCoeff1.SetValue(0.001);
//достъп до метод на автоматичен обект
pCoeff->SetValue(0.001);
//достъп до метод на динамичен обект
}
Пример 2:
c1.r=1; c1.i=1; //достъп до public полета
Механизъм на предаване на съобщения: Съобщението се задава, като за обекта получател на съобщението, се описва селектор на метода, който трябва да бъде изпълнен.
ООП – създаване, инициализация и унищожаване на обекти, конструктури и деструктури.
Обработка на екземпляри: Инициализиране на обекти. Конструктори
Конструкторът представлява специален вид метод, който преди да изпълни алгоритъма, заложен в него от програмиста (може и да няма такъв), извършва и някои допълнителни служебни функции, необходими за правилното създаване на обекта и за осъществяването на т.н. МКС (Механизъм на “късно свързване”)
служебните функции на конструктора ще бъдат разгледани по-късно!!!
- Деклариране и дефиниране
– Конструкторите са член-функции, които имат име, съвпадащо с това на класа и нямат тип на резултата (дори void!)
- Синтаксис: <заглавие на конструктора> { <тяло >} //няма тип на резултата
- Пример:
class Coefficient
{
public:
Coefficient()
{ myValue = 0.0001; }// конструктор по подразбиране Coefficient(double initValue)
{ myValue = initValue; }// конструктор
//…
};
– Декларират се обикновено в секцията public на класа (ако са декларирани в секцията private те не могат да се активират автоматично)
– Могат да се дефинират в тялото на класа или извън него. При описанието им са достъпни всички членове на класа (дори и private):
Coefficient :: Coefficient(double initValue)
{ myValue = initValue; }
– Един клас може да да няма конструктор или да има няколко конструктора (с различни формални параметри) подобно на всички други методи
– Конструкторът може да няма параметри (или всичките му параметри имат стойности по подразбиране). Тогава той се нарича конструктор по подразбиране
- Активиране на конструктори
– Конструкторът се активира обикновено автоматично при създаване на обект от този клас (Coefficient Cff= Coefficient(0.0005);//явно активиране, в такива сл. Се създава временен безименен обект)
– Ако класът декларира един или повече конструктори, то един от тях се активира винаги щом се създава обект от този клас
– Конструкторът по подразбиране се активира в случай, че се създава обект без всякаква допълнителна информация:
Coefficient lCoeff1; // CALLS lCoeff1.Coefficient()
Coefficient * pCoeff = new Coefficient;
// CALLS pCoeff-> Coefficient()
– В случай, че при създаване на обект, след декларацията е зададен списък с параметри, то се активира конструкторът със съответния списък параметри:
Coefficient lCoeff1(0.0005);
// CALLS lCoeff1.Coefficient(0.0005)
– Ако класът не декларира конструктори, то компилаторът се опитва да създаде конструктор по подразбиране и използва при нужда него
– Конструктор може да бъде извикан неявно при активиране конструктора на обект-наследник или на обект с подобекти, при използване на обект в изрази, при предаване на обект като параметър на функция или когато се връща като резултат на функция. В някои от тези случай е добре за класа да се декларира т.н. копиращ конструктор
Обработка на екземпляри: Унищожаване на обекти. Деструктори
Деструкторите са специални методи (противоположни на конструкторите), които освен алгоритъма, заложен от програмиста (може и да няма такъв), изпълняват и някои допълнителни “изчистващи” функции при унищожаването на обектите (служебните функции на деструкторите ще бъдат разгледани по-късно!!!)
- Деклариране и дефиниране
– Деструкторите са член-функции, които имат име, съвпадащо с това на класа и префикс тилда “~”. Те нямат тип на резултата (дори void!), както и параметри:
class Coefficient
{
public:
Coefficient()
{ myValue = 0.0001; }// конструктор по подразбиране ~Coefficient()
{myValue = 0.0;}// деструктор
//…
};
– Декларират се обикновено в секцията public на класа (ако са декларирани в секцията private те не могат да се активират автоматично)
– Могат да се дефинират в тялото на класа или извън него. При описанието им са достъпни всички членове на класа (дори и private):
– Един клас може да да няма деструктор или да има само един деструктор
- Активиране на деструктори
– Деструкторът се извиква обикновено автоматично без явно указание от програмиста. Извикването става, след като се излезе от областта на действие на обекта, чийто деструктор се активира:
Coefficient gCoeff;
int main(void)
{
Coefficient lCoeff;
//…
} // активиране на lCoeff.~Coefficient()
// [КРАЙ НА ФАЙЛА]
// ТУК СЕ АКТИВИРА gCoeff.~Coefficient()
– Деструкторът може да се извиква явно (използва се рядко, но е позволено дори, когато класът не декларира деструктор):
lCoeff.~Coefficient()
– Деструктор по подразбиране се генерира от компилатора само за класове-наследници, за които не е деклариран деструктор, а предшественикът им декларира такъв
Сходни статии:
- Пример за обектно ориентирана реализация на свързан стек Ще се възползваме от тясната връзка между св. списъци и стекове чрез повторно използване на класа на списъците. Ще приложим 2 разновидности на повторното използване. Отначало ще реализираме класа на...
- Пример за обектно – ориентирана реализация на свързан списък В примера се използва шаблон на класа List за обработка на списък от данни от цял тип и списък от данни с плаваща точка. Програма driver дава възможност да се...
- Изпълнението на C++ конструктори и деструктори за обекти от произволен клас Задача на C++ за конструктори и деструктори от произволен клас Да се дефинират класовете People, Student и PStudent, така че инициализиращите действия да се изпълняват от подходящи конструктори. Разрушителните действия...
- Релизация на херметизацията в MS Visual C++ Цели на херметизацията да скрие подробностите на реализацията (абстракция) да обедини всички необходими физически и функционални характеристики, за да може обектът правилно да изпълнява предназначението си, т. е. да съвместява...
- Проектиране и разработка на Web системи и приложения Проектиране на системата Основни стъпки в проектирането Проектирането е ключов момент в разработването на всяка една система и проект като цяло. На този етап от цялостният проект трябва да се...