ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are...

Post on 05-Jul-2018

216 views 0 download

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