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

of 89/89
Paradigma Orientata Obiect ouape
  • date post

    05-Jul-2018
  • Category

    Documents

  • view

    215
  • download

    0

Embed Size (px)

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 lucruObiecte: 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 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 Stack :: Stack (int cap) {

    buffer = new T[cap];

    first = 0;

    capacity = cap;

    }

    Tablou rezervat dinamic

  • Implementare cu templates

    template void Stack:::push (T item) {

    if (first ==capacity) //va genera o exceptie

    error (OVERFLOW);

    buffer[first] = item;

    first++;

    }

    template T Stack:: top( ) {

    if (first ==0) //exceptie UNDERFLOW

    error (UNDERFLOW);

    return buffer[first];

    }

    function()template return_type class_name ::

  • 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 prinsupraincarcarea 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

  • 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

  • Operator Overloading (cont.)

    ostream & operator

  • 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