ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are...
Transcript of ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are...
Paradigma Orientata Obiect
ouape
2
Descompunerea functionala se muta la top down/bottom up
• O maniera naturala pentru gestiuneacomplexitatii unei probleme
• Exemplu: Sa se acceseze descrierea unor formeexistenta intr-o baza de date si apoi sa se afisezeaceste forme
• O prima abordare ar fi:1. Identifica lista de forme in baza de date
2. Deschide lista de forme din baza de date
3. Ordoneaza aceasta lista conform cu un set de reguli
4. Afiseaza formele pe monitor
• Detailere la pasul 4
– Identifica tipul formei
– Obtine locatia acesteia
– Apeleaza functia care poate sa afiseze aceastaforma (poilorfism?) furnizandu-I locatia formei
• Se observa ca ideea este sa descompunemproblema pana la elementele functionale / pasii care o compun
specificatiile
• Sunt:– Incomplete
– De multe ori gresite partial sau total
– Inselatoare (din cauza diferentelor de limbaj sireprezentare a unor concepte dintre proiectant sibeneficiar
– Niciodata nu prind toate aspectele implicate
5
Tratarea schimbarilor in descompunereafunctionala
functie : afiseaza formadisplay shape
intrare: tip de forma, descriere de forma
actiune:switch (tipul formei)
case patrat: apeleaza functia care afiseaza un patrat
case cerc:
peleaza functia care afiseaza un cerc
6
Coeziune scazuta si cuplarea stransa• Telul ar fi
– Sa se creeze functii• cu integritate interna (coeziune stransa)
• Care au relatii directe, vizibile, flexibile si directe (nu prinintermediari) (strans cuplate)
• Efecte colaterale– Nedorit
– Dorit:
7
Proiectarea orientata obiect
O metodologie orientata pe rezolvareaproblemei care produce o solutie a problemeiin termeni de entitati incapsulate numiteobiecte
Obiect
O entitate sau un lucru care are sens in contextul problemei
De exemplu un student, o masina, o data si o ora
8
Privire generala
Problemele sunt rezolvate prin
• Izolarea obiectelor implicate
• Determinarea proprietatilor si actiunilor (sauresponsabilitatilor) acestora si
• Descrierea colaborarii intre obiecte cu scopulrezolvaii problemei
9
Exemplu
Tu si cu prietena stabiliti o “intalinire de lucru”Obiecte: tu, prietena, cinaClasa: tu si cu prietena sunteti oameni
Oamenii au nume, culoare ochi etc… Oamenii pot face cumparaturi, gati
Instanta clasei: tu si cu prietena sunteiti instante ale clasei Oameni. Fiecare
aveti propriul nume, culoare a ochilor etc siputeti gati sau face cumparaturi
Voi colaborati la pregatirea mesei
10
Definitii primare
Clasa (sau obiectul clasei)O descriere a unui grup de obiecte similareObiect (instanta unei clase)Un caz concret al modelului definit in clasaClasele contin campuri care reprezinta
proprietati (numele, culoarea ochilor) siComportamente (responsabilitati) (gateste, face
cumparaturi) ale clasei
MetodaUn algoritm care defineste comportamentul (gateste,
face cumparaturi)
11
Proiectarea orientata obiecte
Proiectare Top-Down
descompune problema in task-uri
Proiectare Orientata obiect
descompune problema in obiecte care colaboareaza
12
Top-Down vs proiectare OO
Abordarea Top-down Abordarea Orientat Obiect
13
Proiectarea OO - “oua”
Pasi
– izoleaza
– abstractizeaza
– determina
14
OOP
Data denastere
datacastorie
Data de nasterea catel
Clasa cudate
Obiecte Clase de obiecte
15
Metodologie OO
Exista patru etape in procesul de descompunere
– Brainstorming
– Filtrarea
– Scenarii
– Algoritmi
16
Brainstorming-ul
• Este o tehnica de grup care implica contributiaspontana de idei din partea tuturor membrilordin grup
17
Filtrarea
Determina care sunt clasele de baza folosite in rezolvarea problemei
18
Scenarii
In aceasta etapa se atribuie responsabilitati fiecareiclase
Sunt doua tipuri de responsabilitati- determinarea informatiei despre ea insasi pecare o clasa trebuie sa o cunoasca(responsabilitati de cunoastere)- determinarea a ceea ce poate o clasa sa faca(responsabilitati comportamentale)
Incapsularea
19
Algoritmii
Trebuie scrisi pentru a descrie responsablitatileobiectului:
– Responsabilitatile de cunoastere
– Responsabilitatile de actiune
20
Fisele Class Responsibility Collaboration (CRC)
21
Exemplu
Sa analizam procesul de rezolvarea crearii uneiliste de adrese
Brainstorming si filtrare– Incercuirea subiectelor in propozitie poate fi un
punct bun de plecare
22
Examplu
23
CRC Cards
Propuneti alte responsabilitati
Nume Clasa:
PersoanaSuperclasa: Subclase
Responsabilitati Colaborari
Se autoinitializeaza (nume, adresa, telefon, email
Nume, Adresa, Telefon, Email
Afiseaza Nume, Adresa, Telefon, Email
24
Nume Clasa: Nume Superclasa: Subclase
Responsabilitati Colaborari
Se autoinitializeaza (nume) String
Se auto-afiseaza String
Nume Clasa:
ListaSortata(din bilioteca)
Superclasa: Subclase
Responsabilitati Colaborari
Insert (persoana) Persoana
Print Persoana
Cum difera aceasta clasa de Nume si Persoana ?
25
Algoritm
Clasa Persoana
Initializare
name.initialize()Write “Introduceti numele; apasati enter."Cere si initializeaza numeleWrite “Introduceti adresa de email; apasati enter."Cere si initializeaza adresa
Afisare
name.print() Write “Numar telefon: " + telephoneNumberWrite “Adresa de e-mail: " + emailAddress
Asigura autoinitializarea nume
Asigura autoafisarea nume
26
AlgoritmClasa Nume
Initializare
“Introduceti Prenumele; apasati enter."Read Prenume"Introduceti Numele; apasati enter."Read Numele
Afisare
Print “Prenumele: " + firstNamePrint “Numele: " + lastName
27
Fazele pentru rezolvarea si implementareaproblemei in OO
28
Functionalitati oferite de OOPIncapsularea
Clase
Mostenirea
Polimorfism
Incapsularea datelor si operatiilor
Programatorul poate defini accesul la atributele simetodele clasei
• Privat
• Protected
• Public
Incapsularea datelor si operatiilor
(“friend”)
class Node {
friend class LinkedList;
private:
itemtype key;
Node * next;
}
Cand se poate folosi “friend”
Link si LinkedList sau Link, LinkedList, si ListIterator
class Account {
private:
double balance, credit_limit;
public:
//other operations
void deposit(double amount);
friend void transfer (Account & target, Account & source, double amount);
}
Metode friendclass Node { private: int data; int key; // ...
friend int BinaryTree::find(); // numai metoda find din BinaryTree are access};
Clase friendclass Node { private: int data; int key; // ...
friend class BinaryTree; // clasa BinaryTree poate accesa acum data direct};
Mostenirea
Clase abstracteclass Shape {
protected: //data members needed if used for substitution
int X, Y;
double R1, R2;
public:
Shape (int x, y, double u, v);
virtual double area ( ) = 0;
virtual double perimeter ( ) = 0;
}
Metodele nu au implementare
Mostenirea din clase abstracte
class Circle : public Shape {
public:
Circle (int x, int y, double r) : X(x), Y(y), R1(r ), R2(0) {}
double area ( ) {return M_PI * R1 *R1; }
double perimeter ( ) {return 2 *M_PI * R1; }
//other methods for Circle
}
Utilizarea claselor abstracte
• Clasele abstracte pun la dispozitie un cadrupentru a adauga un comportament specific aplicatiei
• Utilizatorul lor trebuie sa furnizeze detalii de implementare pentru toate metdele nedefinite
37
O forma ierarhica de polimorfism
toString( )equals( Object obj )getClass( )
Shapeextends
extends
Object
Circle
colorborderWidth
Color getColor( )void setBorderWidth( int m )
int computeArea( )
radius
Polimorfism
Abilitatea unui limbaj de a suporta metodecu nume similar intr-o structura ierarhicade clase (functie de limbaj) sau la nivel de operatori si aplicarea metodei/operatorului care este cea/cel mai potrivitpentru obiectul / zona de cod in care esteapelat/aplicat .
Polimorfism prin mostenire
exempluclass Car
{
public virtual boolean start() = 0;
}
class VolkswagenBeetle : Car
{
public boolean start() {// implementare pt Beetle}
}
class SportsCar : Car
{
public boolean start() { implementare pentru Sport}
}
//Si utilizarea
Car cars[] = { new VolkswagenBeetle(), new SportsCar() };
for( i = 0; i < 2; i++)
Cars[i].start();
Imbunatatirea conceptului
Fieinterface Car
{ public boolean start(); }class VolkswagenBeetle implements Car
{ public boolean start() { //cod }}class SportsCar implements Car
{ public boolean start() { // cod }}
atunciclass Jalopy implements Car { …} // va fi polimorfica
Polimorfism# polimorfism sub Python
class VolkswagenBeetle(Car):
def start(): # codul pentru Volkswagen
class SportsCar(Car):
def start(): # Codul pentru SportsCar
# apelul polimorfismului
cars = [ VolkswagenBeetle(), SportsCar() ]
for car in cars:
car.start()
43
O forma ierarhica de polimorfism
toString( )equals( Object obj )getClass( )
Shapeextends
extends
Object
Circle
colorborderWidth
Color getColor( )void setBorderWidth( int m )
int computeArea( )
radius
Shape
Circle
Object
Un obiect Cerc are trei parti
44
Cum sunt create obiecteleCircle c = new Circle( );
45
Cum sunt create obiecteleCircle c = new Circle( );
c
Shape
Circle
Object
1.
Execution Time
46
Cum sunt create obiecteleCircle c = new Circle( );
c
Shape
Circle
Object
c
Shape
Circle
Object
1. 2.
Execution Time
47
Cum sunt create obiecteleCircle c = new Circle( );
c
Shape
Circle
Object
c
Shape
Circle
Object
c
Shape
Circle
Object
1. 2. 3.
Execution Time
48
Utilizari comune ale polimorfismului
1. In tablouri
2. Ca argument pentru metode
3. In cazul valorii (obiect) trimisainapoi de o metoda
49
1) Folosirea polimorfism in tablouri
extends
toString( )equals( Object obj )getClass( )
Shape
Rectangle
extends
extends
Object
Circle Triangleextends
colorborderWidth
Color getColor( )void setBorderWidth( int m )
int computeArea( )
lengthwidth
int computeArea( )
radius baseheight
int computeArea( )
50
1) Folosirea polimorfism in tablouri
[0] [1] [2]
[2]
firstShape
Attributes:length = 17width = 35
Methods:int computeArea( )
secondShape
Attributes:radius = 11
Methods:int computeArea( )
thirdShape
Attributes:base = 15height = 7
Methods:int computeArea( )
samples(an arrayof Shapeobjects)
51
1) Folosirea polimorfism in tablouri
[0] [1] [2]
[2]
firstShape
Attributes:length = 17width = 35
Methods:int computeArea( )
secondShape
Attributes:radius = 11
Methods:int computeArea( )
thirdShape
Attributes:base = 15height = 7
Methods:int computeArea( )
samples(an arrayof Shapeobjects)
52
2) Folosirea polimorfism ca argument al metodelor
public int calculatePaint (Shape myFigure) {
final int PRICE = 5;
int totalCost = PRICE * myFigure.computeArea( );return totalCost;
}
53
2) Folosirea polimorfism ca argument al metodelor
public int calculatePaint (Shape myFigure) {
final int PRICE = 5;
int totalCost = PRICE * myFigure.computeArea( );return totalCost;
}
54
2) Folosirea polimorfism ca argument al metodelor
public Shape createPicture ( ) {
/* Read in choice from user */System.out.println(“1 for rectangle, ” +“2 for circle, 3 for triangle:”);
SimpleInput sp = new SimpleInput(System.in);int i = sp.readInt( );
if ( i == 1 ) return new Rectangle(17, 35);if ( i == 2 ) return new Circle(11);if ( i == 3 ) return new Triangle(15, 7);
}
Generalizarea
• Se bazeaza pe obiecte container ca lists,stacks si queues
• Acestea au comportamente similareindifernet de tipul de obiect pe care ilcontin (de fapt ele jongleaza numai cu referintele catre ele)
• Prima oara apare in Template pus la dispozitie de CPP care de fapt suntimplementari ale conceptului de ADT
TemplateExample
template <class T>
class Stack {
}
Notatie pentru template
private:T * buffer;
int first;
int capacity;
public:
Stack(int cap);
~Stack( );
void push(T item);
void pop( );
T top ( );
boolean empty ( );
#include Stack.cpp Se include fisierul cu implementarea
Utilizatorul trebuie sa precizezedimesiunea stivei implementateca un tablou
Implementare cu template
template <class T> Stack <T> :: Stack (int cap) {
buffer = new T[cap];
first = 0;
capacity = cap;
}
Tablou rezervat dinamic
Implementare cu templates
template <class T> void Stack<T>:::push (T item) {
if (first ==capacity) //va genera o exceptie
error (OVERFLOW);
buffer[first] = item;
first++;
}
template <class T> T Stack<T>:: top( ) {
if (first ==0) //exceptie UNDERFLOW
error (UNDERFLOW);
return buffer[first];
}
function()template <class T> return_type class_name <T> ::
Limitarile Template in cazul generalizarii
• Data elementele continute intr-un container sunt ordonate ele trebuie sa fie capabile sa raspunda operatorilorrelationali cum ar fi: < or ==
• Nu toate clasele au obiecte care suntcomparabile pentru ca operatoriirelationali nu au fost supraincarcati saumai rau obiectele nu pot fi comparabile(nu are sens logic operatia)
Supraincarcare operatori
Restrictii de utilizare
• Se pot supraincarca majoritatea operatorilor in afara de . :: ?: sizeof
• Nu se pot defini noi operatori prin“supraincarcarea ” simbolurilor care nu sunt incaoperatori
•
Supraincarcare operatori
Exemplu – Lista inlantuita
Lista
dim = 2
prim
ultim
Supraincarcare operatori
Lista
dim = 2
prim
ultim
Copiere superficiala folosind operatorul implicit “=“
Lista
dim = 2
prim
ultim
A
B
B = A;
B.dim = A.dim;B.prim = A.prim;B.ultim = A.ultim;
Supraincarcare operatori
Copiere reala:
List & List::operator = (const List & rhs) {
//daca tinta nu este goala o goleste
while (first != NULL) {
link * temp = first;
first = first -> next;
delete temp;
}
link * ptr = rhs.first;
while (ptr) {
insert ( ptr -> key); //se presupune inserarea la sfarsit lista
ptr = ptr -> next;
}
return *this;
}
Supraincarcare operatori
class Complex {
private:
double: re, im;
public:
Complex ( ); //constructor implicit
Complex (double x, double y);
//other member functions
Complex & operator += (const Complex & rhs);friend Complex operator + (const Complex & scr1,
const Complex & scr2);
friend ostream & operator << (ostream & out, Complex & rhs);
}
target of message is lhs
Tinta nu este un membru a clasei Complex
Supraincarcare operatori
Complex & Complex:: operator += (const Complex & rhs) {
re += rhs.re;
im += rhs.im;
return * this;
}
Exemplu: Complex z1(2, 3);
Complex z2 (21, -24) ;
z2 += z1;
Se creaza 2 obiecteComplex
z2 destinatia opratiei +=
Intoarce obiectul curent
Operator Overloading (cont.)
Complex operator + (const Complex & src1, const Complex & src2) {
Complex z;
z,re = src1.re + src2.re;
z,im = src1.im + src2.im;
return z;
}
Complex z1, z2(1, 2), z3(-2, 4);
z1 = z2 + z3;
z2 = z2 + z3;
cout << z2 + z3;
Destinatia poate fi diferita sau identicaca la operatorul original
Operator Overloading (cont.)
ostream & operator << (ostream & out, const Complex & rhs) {
out << ‘(‘ << rhs.re << “, “ << rhs.im << ‘)’;
return out;
}
Complex z1(1.2, -2.1), z2(24, 44);
cout << z1 << “+ “ << z2 “ = “ << z1 + z2 << endl;
Substitutia tipurilor la Runtime
• Cel care substituie trebuie sa fie o subclasa a tipului declarat
• Clasa originala (adica tipul referit) trebuie sa fie refererit de un pointer
• Metodele suprascrise trebuie declaratevirtuale
Substituire
Animal
string name, says;
int x_pos, y_pos;
Animal( ); //default
Animal(const char aname[];
//other non virtual methods
virtual void speak( );
Dog
string name, says;
int x_pos, y_pos;
Dog ( ); //default
Dog(const char aname[]);
//inherited methods
void speak( ); //override
void chase_cats(Cat & acat);
Substituire
Fie un tabel de pointeri catre animale
Animal * theBarn[4];
Acum se creaza niste animale si se pun in hambar
Animal MickeyMouse(“Mickey”);
Cat Sly (“Sylvester”);
Dog Fred;
Dog Spot (“Spot”);
theBarn[0] = &MickeyMouse;
theBarn[1] = &Sly;
theBarn[2] = &Fred;
theBarn[3] = &Spot;
Constructor implicit nici un nume atribuit
Substitutie
Acum I se spune fiecarui animal sa “vorbeasca” evident fiecare pre limba lui
for (int i = 0; i < 4; i++)
theBarn[i] -> speak( );
Substituirea
Ferma
Hambarul
Dog
ruff
Spot
Cat
Felix
meow
Cat
Nonamemeow
Animal
Donald
mute
C# and OOP
• C# este proiectat pentru .NET Framework– Acesta este OOP
• In C#– Se poate accesa SO direct prin obiecte
– FCL (Framework class library) sunt proiectate(cica) pentru extinder si integrare in codulutilizator
Definirea Claselorclass Name:BaseType{
// Members}
Namespace NameName{class Name:BaseType{}
}
class MyType{public static String someTypeState;public Int32 x;public Int32 y;
}
Accesibilitatea• In C#, private este nivelul implicit de access
(protectie anti prost)• Optiunile de accesibilitate (scopingul)
– public – Accesibil la toti– private – Accesibil la clasa care il contine– protected – Accesibil la clasele care il contin dar si la
derivatele lor– internal – Accesibil la nivelul codului in cadrul aceluiasi
assembly– protected internal – inseamna ori protected oriinternal
• Clasele pot fi declarate ca public sau internal– Sunt private implicit– Accesibile numai codului din acelasi modul sursa
Tipuri Membri in C#• Fields
– Starea unui obiect sau tip
• Metode– Constructori– Functiii– Proprietati (campuri inteligente(smart))
• Membrii exista in doua forme de baza– Instanta – pentru datele obiect si metodele
• Default
– Statice – pentru tip data si metode• Use the static keyword
Metode
• Declarare inline cu definirea tipului
•
class MyType{public Int32 SomeMethod(){
return x;}
public static void StaticMethod(){// fa ceva}
}
Proprietati• Metodele care arata ca niste campuri (smart
fields)
•
class Point{Int32 x;Int32 y;public Int32 X{
get{return x;}set{x = value;}
}public Int32 Y{
get{return y;}set{y = value;}
}}
Constructori pentru instante
• Constructorii sunt de obicei folositi sa initializeze campurile• Constructorii pot fi descrisi “mai clar” in cazuri mai complexe
daca se foloseste this
•
class Point{Int32 x;Int32 y;
public Point():this(0, 0){}
public Point(Int32 x, Int32 y){this.x = x;this.y = y;
}}
Constructori de tip (static)
• Sunt folositi pentru initializarea campurilorstatic
• Se admite un singur constructir static per tip– Sunt apelati in Common Language Runtime
– Sunt garantati a fi apelati inainte de orice referintacatre un tip sau o instanta a acestuia
– NU accepta parametri
• Folosirea static indica tipul constructorului
Derivarea si obiectul
• Toate tipurile din sistem sunt derivate din Object
• Se poate totusi specifica alta clasa de baza– Fara aceasta compilatorul va asuma implicit Object
• Referintele la variabile obiect sunt folosite ca referinte generice– Clasele sunt grupate in Framework Class Library
• Objectele implementeaza metode utile de genul– ToString(), GetType()
– ReferenceEquals()
Polimorfism si funcntii virtuale
• O metoda este declarata virtuala cu virtual
• In clasele derivate, metodele suprascrise sunt marcate cu override
• Exemplu– ToString()metoda din Object class
– UN exemplu de clasa care o suprascrie
public virtual string ToString();
class SomeClass:Object{public override String ToString(){
return “Some String Representing State”;}
}
C# si evenimentele
• C# are suport nativ pentru evenimente (suporta siparadigma cu pricina)
• Great for dealing with objects in an event-driven operating system
• Dezvoltare rapida a GUI
• Se pot inregistra diferite tipuri la un eveniment (veziobserver si generice)
• UN tip se poate inregistra la oricate evenimente
Gestiune de eveniment
using System;using System.Windows.Forms;class MyForm:Form{
MyForm(){Button button = new Button();button.Text = "Button";button.Click += new EventHandler(HandleClick);Controls.Add(button);
}void HandleClick(Object sender, EventArgs e){
MessageBox.Show("The Click event fired!");}public static void Main(){
Application.Run(new MyForm());}
}
Definirea unui eveniment• Bazata pe un mecanism standard de tratare “callback” cu delegate
class EventInt{Int32 val; public Int32 Value{
get{return val;}set{
if(Changed != null)Changed(value, val);
val = value; }
}public event Callback Changed;public delegate
void Callback(Int32 newVal, Int32 oldVal);}
Metodele callback (delegati)
using System;delegate void MyDelegate(String message);class App{
public static void Main(){MyDelegate call = new MyDelegate(FirstMethod);call += new MyDelegate(SecondMethod);call("Message A");call("Message B");
}static void FirstMethod(String str){
Console.WriteLine("1st method: "+str);}static void SecondMethod(String str){
Console.WriteLine("2nd method: "+str);}
}
Interfete
• C# suporta interfete
– Tipurile proprii pot implementa interfete
• Dupa cum era de asteptat in lipsa unui adapter suplimenta trebuieimplementat tot ce este in interfata
– Accepta definirea de interfete proprii
• Interfetele pot suporta NUMAI metode NU SI campuri
– Proprietati si evenimente incluse
– Constructorii nu sunt permisi in interfete
• Cuvantul cheie interfaceinterface Name{
// Members}
Supraincarcarea operator si conversia de tip
• C# permite supraincarcarea metodelor
• Sunt apelate cand un tip propriu este folositintr-o expresie cu operatori– Poate supraincarca +, -, *, |, etc.
• Poate crea metode proprii pentru conversia de tip (cast)
• Acestia pot fi apelati implicit sau explicit
OOP design results