Обектно-ориентирано проектиране (ООП). Правила за обектно-ориентирано проектиране

Проектиране на класове и обекти

ПЪРВИ ЕТАП

ОТДЕЛЯНЕ НА КЛАСОВЕТЕ И ОБЕКТИТЕ ОТ ПО НА ЗАДАЧАТА

  • Класове и обекти могат да бъдат:
    • реални неща от програмиране на обекти
    • абстракции в програмиране на обекти
    • роли на реалните неща
    • възгледи, мнения, преценки
    • отношения и взаимоотношения между отделните елементи
    • събития, в които участват различните елементи
    • и не на последно място неща, които биха участвали в изграждането на програмна система
  • Правило: Поведението на класовете и обектите в ПО е определящо при тяхната идентификация

ВТОРИ ЕТАП

ПРОЕКТИРАНЕ НА ХАРАКТЕРИСТИКИТЕ НА ОБЕКТИТЕ И КЛАСОВЕТЕ

  • Проектиране на състоянието

Правила: адекватност, икономичност на представянето, лекота и ефективност на обработката

  • Проектиране на поведението

Правило 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()

–         Деструктор по подразбиране се генерира от компилатора само за класове-наследници, за които не е деклариран деструктор, а предшественикът им декларира такъв

Сходни статии:

  1. Пример за обектно ориентирана реализация на свързан стек Ще се възползваме от тясната връзка между св. списъци и стекове чрез повторно използване на класа на списъците. Ще приложим 2 разновидности на повторното използване. Отначало ще реализираме класа на...
  2. Пример за обектно – ориентирана реализация на свързан списък В примера се използва шаблон на класа List за обработка на списък от данни от цял тип и списък от данни с плаваща точка. Програма driver дава възможност да се...
  3. Изпълнението на C++ конструктори и деструктори за обекти от произволен клас Задача на C++ за конструктори и деструктори от произволен клас Да се дефинират класовете People, Student и PStudent, така че инициализиращите действия да се изпълняват от подходящи конструктори. Разрушителните действия...
  4. Релизация на херметизацията в MS Visual C++ Цели на херметизацията да скрие подробностите на реализацията (абстракция) да обедини всички необходими физически и функционални характеристики, за да може обектът правилно да изпълнява предназначението си, т. е. да съвместява...
  5. Проектиране и разработка на Web системи и приложения Проектиране на системата Основни стъпки в проектирането Проектирането е ключов момент в разработването на всяка една система и проект като цяло. На този етап от цялостният проект трябва да се...

Студио за уеб дизайн услуги, изработка на сайтове, SEO оптимизация и Интернет реклама Seven Web Design представя своите професионални уеб дизайн умения на високо ниво. Seven Web Design е продукт на Уеб Дизайн България Груп ООД ®
Comments are closed.