Top Banner
Programare orientata- obiect (POO) utilizand C++ Gheorghe Grigoras Dorel Lucanu
56

Programare orientata- obiect (POO) utilizand C

Jan 25, 2023

Download

Documents

Viorel Robu
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Programare orientata- obiect (POO) utilizand C

Programare orientata- obiect (POO) utilizand C++

Gheorghe Grigoras Dorel Lucanu

Page 2: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Bibliografie l  H. Schildt: C++ manual complet, Teora, 2000 l  D. Kaler, M.J. Tobler, J. Valter: C++, Teora, 2000 l  Bjarne Stroustrup: The C++ Programming Language,

Adisson-Wesley, 3nd edition, 1997 l  Martin Fowler. UML Distilled: A Brief Guide to the Standard

Object Modeling Language (3rd Edition). Addison-Wesley Professional, 3 edition, 2003

Manuale electronice

l  Bruce Eckel : Thinking in C++, 2nd Edition l  *** : Online C++ tutorial l  Donald Bell. UML basics: An introduction to the Unified

Modeling Language l  SGI Standard Template Library Programmer's Guide

Page 3: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Organizare l  pagina curs: !  se vor face (cel putin) saptamanal schimbari http://portal.info.uaic.ro/curs/poo/default.aspx

l  laboratoarele •  prima parte - 3 teme individuale •  a doua parte – 1 proiect individual

l  examinare •  pe parcurs: 1 test (sapt. 16)

• 50% din nota finala •  laborator – 2 evaluari a temelor (sapt. 8, 15)

• 50% din nota finala l  conditii de promovabilitate

•  50% din punctajul total maxim •  40% din punctajul maxim la fiecare proba (lab., test)

Page 4: Programare orientata- obiect (POO) utilizand C

Organizare cursuri 17.02 Introducere in POO (D. Lucanu) 24.02 Clase in C++ 03.03 Parametrizare + STL(I) 10.03 Ierarhii in C++ 17.03 Polimorfism in C++ 24.03 Exceptii in C++ 31.03 Principii OO - Modelare (I) 07.04-13.04 Verificare (laboratoare) 14.04 Proiectare (I) 21.04-27.04 Vacanta de Paste 28.04 Proiectare (II) 05.05 Proiectare (III) 12.05 Proiectare (IV) 19.05 STL (II) 26.05 Programare avansata in C++ 2.06 – 7.06 Verificare proiecte 9.06 – 14.06 Test scris

D. Lucanu POO – Proiectarea de clase

Page 5: Programare orientata- obiect (POO) utilizand C

Teme laborator

D. Lucanu POO – Proiectarea de clase

Page 6: Programare orientata- obiect (POO) utilizand C

Tema  1 l  Termen de predare: laboratorul din săptămâna a III--‐a l  Obiective: l  Încapsularea (izolarea detaliilor implementării): private,

protected, public l  Atribute şi metode: la nivel de instanţă (pointerul this) l  Atribute şi metode: la nivel de clasă l  Metode constante l  Apelul şi returul prin referinţă l  Controlul iniţializării: constructori şi destructori l  Alocarea de memorie: operatorii new şi delete l  Spaţii de nume l  Fluxuri de intrare/iesire: utilizarea consolei l  Polimorfism static: supraîncărcarea funcţiilor l  Polimorfism static: supraîncărcarea operatorilor (=, ==, !=, +=,

--‐=, *=) l  Utilizare STL: vector

D. Lucanu POO – Proiectarea de clase

Page 7: Programare orientata- obiect (POO) utilizand C

Tema  2 l  Termen de predare: laboratorul din săptămâna a V-a l  Obiective: l  Relaţia de compoziţie (HAS--‐A) : sub--‐obiecte dependente

•  Tare: obiectul posedă sub--‐obiectele •  Slabă: obiectul nu posedă sub--‐obiectele

l  Relaţia de moştenire (IS--‐A) l  Ordinea de apel pentru constructori/destructori l  Liste de iniţializare pentru constructori l  Vizibilitatea membrilor din clasa de bază în clasa derivată l  Redefinirea metodelor l  Polimorfism static: supraîncărcarea operatorilor l  Fluxuri de intrare/iesire: utilizarea fişierelor l  Utilizare STL: list, string, stack

D. Lucanu POO – Proiectarea de clase

Page 8: Programare orientata- obiect (POO) utilizand C

Tema  3 l  Termen de predare: laboratorul din săptămâna a

VII--‐a. l  Obiective: l  Relaţia de moştenire (IS--‐A) l  Early binding şi late binding l  Metode virtuale l  Metode virtuale pure l  Design patterns: composite, factory method,

singleton l  Polimorfism static: parametrizări de clase l  Excepţii

D. Lucanu POO – Proiectarea de clase

Page 9: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Curs 1 l  Primul pas in POO

•  principii de baza •  concepte •  Clase si obiecte

• atribute, metode, stari • declararea claselor si obiectelor in C++ • utilizarea obiectelor in C++ •  constructori, destructori •  exemple

•  dezvoltarea unei aplicatii utilizand patternul model-view-controller (cu interfata text)

Page 10: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Principii 10

Principii de baza ale POO l  abstractizare

•  pastrarea aspectelor importante (generale) si ignorarea detaliilor nesemnificative (specifice)

l  incapsulare •  ascunderea implementarii fata de client; clientul

depinde doar interfata l  modularizare

•  impartirea unui sistem complex in parti (module) manevrabile

l  ierarhizare •  clasificarea pe nivele de abstractizare

l  polimorfism •  aceeasi forma sintactica poate avea diferite intelesuri

in functie de contextul de utilizare

Page 11: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Principii 11

Concepte POO

obiecte clase atribute metode mesaje supraincarcare suprascriere legare dinamica interfata

relatii dintre clase generalizare specializare mostenire compozitie asociere

pachet subsistem modelare

Page 12: Programare orientata- obiect (POO) utilizand C

Obiecte - informal l  un obiect reprezinta o entitate care poate fi fizica,

conceptuala sau software •  entitate fizica

•  tren, angajat CFR (?) •  entitate conceptuala

• proces chimic, rationament matematic •  entitate software

• structura de date, program

D. Lucanu POO – Proiectarea de clase

Page 13: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Obiecte – definitie mai formala

l  un obiect este o abstractie, concept sau orice alt lucru ce are un inteles strans legat de domeniul problemei

l  un obiect este caracterizat de: •  identitate

• nume, … •  stare

• exprimata prin atribute • valorile atributelor la un moment dat definesc o

stare •  comportare

• data de multimea metode (servicii, operatii publice)

Page 14: Programare orientata- obiect (POO) utilizand C

Un obiect are identitate l  fiecare obiect are identitate unica, chiar daca starea sa

este identica cu a altui obiect

D. Lucanu POO – Proiectarea de clase

Page 15: Programare orientata- obiect (POO) utilizand C

Un obiect are stare l  starea unui obiect este una dintre conditiile in care acesta

poate exista l  starea se poate schimba de-a lungul timpului l  este data de valorile atributelor + legaturi (instante ale

relatiilor)

D. Lucanu POO – Proiectarea de clase

nume Ion Ion nr. marca 2143576 functia conferentiar status preda POO

Page 16: Programare orientata- obiect (POO) utilizand C

Un obiect are comportament l  determina cum un obiect actioneaza si reactioneaza la

cererile altor obiecte

D. Lucanu POO – Proiectarea de clase

atribuie(CS1207)

confirma(CS1207)

Page 17: Programare orientata- obiect (POO) utilizand C

Clase

l  O clasa descrie unul sau mai multe obiecte ce pot fi precizate printr-un set uniform de atribute si metode. •  un obiect este o instanta a clasei

l  o clasa este o abstractizare •  pastreaza trasaturile (atribute, metode) esentiale •  ignora ce nu este esential

D. Lucanu POO – Proiectarea de clase

Page 18: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Clase - reprezentare grafica

nume

atribute

metode

Page 19: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Clasa Cont (versiunea 01)

l  Specificarea clasei

•  Un cont bancar: •  are un titular, sold, o rata a dobinzii, numar de cont si •  se pot efectua operatii de depunere, extragere,

actualizare sold

l  Extragerea atributelor: •  titular, sold, rata a dobinzii, numar de cont

l  Extragerea metodelor • depunere, extragere, actualizare sold

l  Completarea specificatiei (analiza) • actualizare sold ð data ultimei operatii

Page 20: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Clase (continuare)

l  o clasa joaca roluri diferite in cadrul unei aplicatii software •  furnizor de servicii pentru clasele client •  client pentru clasele ale caror servicii sunt necesare in

descrierea propriei comportari l  definitia unei clase presupune:

•  combinarea datelor cu operatii •  ascunderea informatiei

• clasele client nu acces la implementarea metodelor

Page 21: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Combinarea datelor cu operatiile asupra lor l  datele si operatiile asupra lor sint incluse in aceeasi unitate

sintactica • datele si procesele devin legate

sold

depune( )

sold

depune( )

Cont

ð C++: clase, structuri

Page 22: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Ascunderea informatiei l  modul de structurare a datelor nu este cunoscut l  actiunile asupra datelor sint realizate numai prin

operatiile (metodele) clasei l  si anumite actiuni pot fi ascunse: e.g., validare a contului l  clientul clasei Cont:

cont.sold += suma

cont.depune(suma) OK!

Page 23: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Incapsulare

Incapsulare = Ascundere Combinare +

Page 24: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Combinarea: avantaje l  defineste clar ce structuri de date sint manevrate si care

sunt operatiile legale asupra lor

l  adauga programului modularitate

l  scade riscul ca datele sa fie alterate de programele "slabe"

l  faciliteaza ascunderea informatiei

Page 25: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Ascunderea informatiei: avantaje l  programe mai sigure si fiabile

l  elibereaza clasele client de grija cum sint manevrate datele

l  previne aparitia erorilor produse de clasele client ce manevreaza datele utizind cod "slab"

Page 26: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Incapsulare (Combinare + Ascundere): avantaje

l  combinare + ascunderea informatiei = protejarea datelor

l  previne aparitia erorilor prin limitarea accesului la date

l  asigura portabilitatea programelor

l  faciliteaza utilizarea exceptiilor

l  interfata unei clase = operatiile cu care o clasa utilizator poate manevra datele

Page 27: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Structurarea nivelului de acces la informatie

limitarea accesului la informatii

sectiuni publice

sectiuni private

Page 28: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Count.h

private: string *owner; string countNo; double sold; assignCountNo(); releaseCountNo();

};

class Count { public:

Count(char*); ~Count(); void deposit(double); void draw(double); double balance();

constructor

destructor

Page 29: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Count.cpp void Count::deposit(double ammount) {

sold += ammount; } double Count::balance() {

return sold; } . . .

Count::Count(char *s) { owner = new string(s); sold = 0; assignCountNo(); } Count::~Count() { delete owner; releaseCountNo(); }

creare obiect nou

distrugere obiect

Page 30: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Demo.cpp

void main() {

Count count("Ionescu"); count.deposit(2000);

}

error C2248: 'sold' : cannot access private member

cont.sold += 5000;

main() joaca rol de client pentru Cont

Page 31: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Tipuri de date abstracte si obiecte

l  tip de data abstract = o descriere a unui tip de data

independent de reprezentarea datelor si implementarea operatiilor

l  O clasa este o implementare a unui tip de date abstract. Ea defineste atribute si metode care implementeaza structura de date respectiv operatiile tipului de date abstract.

Page 32: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Stiva

Ø  tipul de data abstract Stiva q  entitati de tip data: liste LIFO q  operatii

ð  push() ð  pop() ð  top() ð is_empty()

Stack

arr[0..MAX-1] top_index

push() pop() top() is_empty()

Page 33: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Stiva.h class Stack { public: Stack(); ~Stack(); void push(char); void pop(); char top(); bool is_empty(); private: char arr[MAX_STACK]; int top_index; };

Page 34: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Stiva.cpp void Stack::push(char c) { if (top_index == MAX_STACK-1) throw "Depasire superioara."; arr[++top_index] = c; } char Stack::top() { if (top_index < 0) throw "Depasire inferioara."; return arr[top_index]; }

Page 35: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Stiva_demo Stack s;

char c = 'a'; try { while (true) { s.push(c++); cout << s.top() << endl; } } catch (char *mes_err) { cout << mes_err << endl; }

a b c d e f g h i j Depasire superioara. Press any key to ...

Page 36: Programare orientata- obiect (POO) utilizand C

D. Lucanu POO – Proiectarea de clase

Utilizarea de clase l  exista multe bibloteci de clase

•  STL •  MFC •  etc

l  pentru utilizare, trebuie cunoscuta doar interfata (elementele publice)

l  nu intereseaza implementarea l  programul care utlizeaza clasa este independent de

implementarea clasei l  Exemple:

•  string •  iostream

Page 37: Programare orientata- obiect (POO) utilizand C

clasa string l  pentru a utiliza clasa string trebuie inclus fisierul antet

(header): #include <string>

l  clasa string face parte din biblioteca STL (Standard template Library)

l  aceasta biblioteca defineste toate numele in spatiul de nume std, pentru evitarea de conflicte

l  pentru inceput e bine sa includeti declaratia: using namespace std;

D. Lucanu POO – Proiectarea de clase

Page 38: Programare orientata- obiect (POO) utilizand C

clasa string – exemple de constructori l  string ()

- creeaza sirul vid ("") string s1;!

l  string ( other_string ) - creeaza un sir identic cu alt sir string s2(“Curs POO”); string s3(s2);!

l  string ( count, character ) - creeaza un sir ce contine un caracter repetat de un numar de ori string s4(8, ‘=’);

D. Lucanu POO – Proiectarea de clase

Page 39: Programare orientata- obiect (POO) utilizand C

clasa string – ex. functii membre constante

nu modifica sirul l  const char * c_str()

- intoarce un sir reprezentat ca in C egal cu continutul obiectului curent

l  unsigned int length()

- intoarce lungimea sirului l  l  unsigned int size()

- la fel ca length!l  l  bool empty()

- inraorec true daca sirul este vid, false altfel

D. Lucanu POO – Proiectarea de clase

Page 40: Programare orientata- obiect (POO) utilizand C

clasa string – exemple functii membre l  void swap ( other_string )

- interschimba continuturile a doua siruri

l  string & append ( other_string ) - adauga sirul parametru la sfarsit

l  string & insert ( position, other_string ) - insereaza sirul parametru la pozitia data

l  string & erase ( position, count ) - elimina un subsir de lungime data de la o pozitie data

l  unsigned int find(other_string, position ) - intoarce pozitia primei aparitii a subsirului dat ca parametru; cautarea incepe de la pozitia data ca param.

D. Lucanu POO – Proiectarea de clase

Page 41: Programare orientata- obiect (POO) utilizand C

clasa string - aplicatie l  separarea unui sir in cuvinte string s("Acesta este un sir demonstrativ ! pentru cursul de POO.");!while (s[0] == ' ') s.erase(0,1);!int p;!while (! s.empty()) {!!p = s.find(" ");!!if (p < 0) p = s.length();!!cout << s.substr(0, p) << endl;!

!s.erase(0, p);!!while (s[0] == ' ') s.erase(0,1);!

}!

D. Lucanu POO – Proiectarea de clase

Acesta este un sir demonstrativ pentru cursul de POO.

Page 42: Programare orientata- obiect (POO) utilizand C

Intrari/iesiri l  Flux (stream) = tip de date ce descrie la nivel abstract

fisiere “destepte” l  C++ : pachetul de clase iostream este responsabil cu

fluxurile de intrare/iesire •  Fluxuri de intrare: istream

• Operatorul >> input_stream >> l_value_expr!

• Obiectul cin modeleaza fis. std. de intrare •  Fluxuri de iesire: ostream

• Operatorul << output_stream << r_value_expr!

• Obiectul cout fisierul standard de iesire

Page 43: Programare orientata- obiect (POO) utilizand C

Intrari/iesiri l  introducerea unui numar

int nr; cout << "Numar>"; cin >> nr;

l  introducerea unui sir C string s; cout << "Sir>"; cin >> s;

l  prototipul operatorilor istream& operator>>(int& n) istream& operator>>(char* s) ...

Page 44: Programare orientata- obiect (POO) utilizand C

Intrari/iesiri (continuare)

l  Declararea fisierelor ca fluxuri

#include <fstream> ifstream f_inp("c2cpp10.cpp"); ofstream f_out("c2cpp10.cp1");

l  Semnificatie ifstream ≡ input file stream ofstream ≡ output file stream

Page 45: Programare orientata- obiect (POO) utilizand C

Copierea unui flux – varianta 1

if (f_out && f_inp) while (f_inp >> c) f_out << c;

•  nu-i prea OK

c2cpp10.cpp c2cpp10.cp1

#include <iostream.h> #include <fstream.h> int main(void) { // copierea unui ...

#include<iostream.h>#include<fstream.h>intmain(void){//copiereaunuifisier ...

Page 46: Programare orientata- obiect (POO) utilizand C

Copierea unui flux – varianta 2 ifstream f_inp("c2cpp10.cpp"); ofstream f_out("c2cpp10.cp2"); if (f_out && f_inp) while (f_inp.get(c)) f_out << c;

⇒  mai fidela

c2cpp10.cpp c2cpp10.cp2

#include <iostream.h> #include <fstream.h> int main(void) { // copierea unui ...

#include <iostream.h> #include <fstream.h> int main(void) { // copierea unui ...

Page 47: Programare orientata- obiect (POO) utilizand C

Cum construim o aplicatie OO? l  constructia unei aplicatii OO este similara cu cea a unei

case: daca nu are o structura solida se darama usor l  ca si in cazul proiectarii cladirilor (urbanisticii), patternurile

(sablaonele) sunt aplicate cu succes l  patternurile pentru POO sunt similare structurilor de

control (programarea structurata) pentru pogramarea imperativa

l  noi vom studia •  un pattern arhitectural (MVC) •  cateva patternuri de proiectare

l  mai mult la cursul de IP din anul II

D. Lucanu POO – Proiectarea de clase

Page 48: Programare orientata- obiect (POO) utilizand C

Patternul model-view-controller (MVC) l  isi are radacinile in Smalltalk

•  maparea intrarilor, iesirilor si procesarii intr-un GUI model

l  model – reprezinta datele si regulile care guverneaza actualizarile •  este o aproximare software a sist. din lumea reala

l  view – “interpreteaza” continutul modelului •  are responsabilitateaa de a mentine consistenta dintre

schimbarile in model si reprezentare l  controller – translateaza interactiunili cu “view”-ul in

actiuni asupra modelului •  actiunile utilizatorului pot fi selectii de meniu, clickuri

de butoane sau mouse •  in functie de interactiunea cu utliz. si informatiile de la

model, poate alege “view”-ul potrivit D. Lucanu POO – Proiectarea de clase

Page 49: Programare orientata- obiect (POO) utilizand C

MVC

D. Lucanu POO – Proiectarea de clase

Model • incapsuleaza starea aplicatiei • raspunde la interogari despre stare • expune functionalitatea modelului • notifica schimbarea starii

View • vizualizeaza modelul • cere actualizari de la model • trimite evenimentele utilizator la controller • permite controllerului sa schimbe modul de vizualizare

Controller • defineste comportarea aplicatiei • mapeaza actiunile utilizator pe actulizare model • selecteaza vizulizarea raspunsului • unul pentru fiecare functionalitate

notif. sch. inte

rog.

sta

re

actiuni utilizator

selectie vizualizare

schi

mba

re s

tare

Page 50: Programare orientata- obiect (POO) utilizand C

MVC – studiu de caz

D. Lucanu POO – Proiectarea de clase

l  MVC poate fi aplicat si pentru interactiune utilizator in mod text

l  un studiu de caz simplu: l  model = clasa Cont l  view = afisare sold (interogare stare) si un meniu de

actiuni (similar bancomat) l  controller = transpune optiunile meniu in actualizare

cont l  (deocamdata) fara notificari ale modelului

Page 51: Programare orientata- obiect (POO) utilizand C

View

class View { private: Controller *controller; Count *model; public: View(Controller *newController, Count *newCount); void display(); int getUserAction(); };

D. Lucanu POO – Proiectarea de clase

Page 52: Programare orientata- obiect (POO) utilizand C

View::display

void View::display() { cout << endl << "New window" << endl; cout << "Balanta: " << model->balance() << endl; cout << "Commands:" << endl; cout << "1. Depune 50" << endl; cout << "2. Depune 100" << endl; cout << "3. Extrage 50" << endl; cout << "4. Extrage 100" << endl; cout << "0. Exit" << endl; }

D. Lucanu POO – Proiectarea de clase

Page 53: Programare orientata- obiect (POO) utilizand C

View::getUserAction

int View::getUserAction() { int option; cout << "Option: "; cin >> option; return option; }

D. Lucanu POO – Proiectarea de clase

Page 54: Programare orientata- obiect (POO) utilizand C

Controller

class Controller { private: Count *model; View *view; public: Controller(Count *newModel); public: void setView(View *newView); void execute(); void finish(); };

D. Lucanu POO – Proiectarea de clase

Page 55: Programare orientata- obiect (POO) utilizand C

Controller::execute void Controller::execute() { int option = view->getUserAction(); switch (option) { case 0:

finish(); break; case 1: model->deposit(50); break; ... default: exit(1); } }

D. Lucanu POO – Proiectarea de clase

Page 56: Programare orientata- obiect (POO) utilizand C

Demo int main(){ Count *model = new Count("Ionescu"); Controller *controller = new Controller(model); View *view = new View(controller, model); controller->setView(view); try { while (true) { view->display(); controller->execute(); } } catch (char *mes_err) { cout << mes_err << endl; } return 0;

}

D. Lucanu POO – Proiectarea de clase