Click here to load reader

Objektno orjentirano programiranje . semestar/Objektno orijentirano... · PDF file Dizajn s objektima •Dobar OO dizajn proces uključuje sljedeće: 1. Kvalitetna analiza i istraživanje

  • View
    17

  • Download
    2

Embed Size (px)

Text of Objektno orjentirano programiranje . semestar/Objektno orijentirano... · PDF file Dizajn...

  • Objektno orjentirano programiranje

    Predavanje 5

    Klase – nastavak

    Dizajn s objektima

  • Detalji klase

    • Pri izboru što će biti sučelje a što implementacija treba imati na umu koliko će klasa biti korisna

    • Klasa nije izolirana cjelina – otok za sebe

    • Nakon instanciranja objekti međusobno obavljaju interakciju

    • Jedan objekt može biti dio drugog objekta ili dio hijerarhije

    • Izbor imena klase je vrlo važan i ime treba biti deskriptivno

    • Ime nam pruža informacije o tome što klasa radi i u kakvoj je interakciji s ostatkom sustava

  • /* Ova klasa definira avion kojeg nadzire

    sustav kontrole leta*/

    class Avion

    {

    private:

    int sifraAviona; //serijski broj aviona

    string modelAviona;

    string imePiota;

    int trenutnaVisina;

    int trenutnaBrzina;

    static int trenutniBrojAvionaIznadAerodroma;

    public:

    Avion()

    {

    sifraAviona = null;

    modelAviona = null;

    trenutnaVisina = 0;

    ...

    }

    Avion(int sifAviona, string modAviona)

    {

    sifraAviona = sifAviona;

    modelAviona = modAviona;

    }

    void ZapocniSlijetanje();

    void ZapocniPolijetanje();

    int DohvatiVisinu();

    int DohvatiBrzinu; }

  • Komentari

    • Važno je kvalitetno dokumentirati klasu i kroz korištenje komentara

    • Ponekad je potrebno detaljnije opisati funkcionalnost pojedinih metoda ako iz imena nije lako zaključiti kako se ona koristi

    • Većina OO jezika ima dvije standardne vrste komentara /* komentar u više

    linija (moramo paziti da zatvorimo komentar */

    //komentar u jednoj liniji (nije potrebno zatvarati)

  • Atributi

    • Public ili private?

    • Potrebno je skriti što je više moguće podataka i korisniku dati samo ono što mu je potrebno

    • static int trenutniBrojAvionaIznadAerodroma;

  • Konstruktori

    • Ako ne definiramo svoj konstruktor klasi se dodjeljuje defaultni konstruktor

    Avion() {

    sifraAviona=null;

    modelAviona=null;

    trenutnaVisina=0;

    ...

    }

    • Konstruktor može i primati parametre

  • null

    • Null predstavlja vrijednost „ništa”

    • Može biti korisno u programiranju

    • Provjera da li je neka varijabla ili objekt null govori nam da li je postavljena vrijednost

    • Varijable/objekta možemo postaviti na null prije nego imamo neku smislenu vrijednost (npr. Prije nego korisnik upiše neki traženi unos)

    • Null je validno stanje objekta

  • Atributi i metode

    • Osim atributa i metode mogu biti definirane kao static

    • Svi objekti iz iste klase imaju zajedničke statičke metode

    • Statična metoda može se koristiti npr. za manipulaciju static atributima

    • Public metode – dio sučelja

    • Private metode – dio implementacije

  • Dizajn klasa

    • Osnovni cilj OO programiranja je modeliranje stvarnog svijeta na način kako ljudi prirodno razmišljaju – u okvirima objekata

    • Kada dizajniramo klasu potrebno je ponašanje predstaviti na način kako se stvarno u svijetu i odvija

    • Jedna od najčešćih pogrešaka je dizajn klasa koje imaju ponašanje ali nemaju podatke

    • Dizajn interfejsa • Minimalni mogući interfejs čini klasu konciznom i „čistom”

    • Uključiti korisnika u definiranje dizajna od samog početka

  • Dizajn klasa

    • Robusni konstruktori i destruktori • Destruktor prilikom završetka života objekta treba osloboditi memoriju koju je

    objekt alocirao

    • U protivnom dolazi do memory leak-a

    • Uključiti error-handling u samu klasu

    • Dokumentiranje klase i korištenje komentara • Dobra praksa

    • Potrebno je uložiti vrijeme

    • Izrazito bitno kod većih projekata i za rad u timovima

    • Stvaranje objekata imajući na umu njihovu suradnju

  • Dizajn klasa • Dizajn s naglaskom na ponovno

    korištenje

    • Dizajn s naglaskom na proširivost

    • Deskriptivna imena • Ako koristimo neku konvenciju ili standard

    imenovanja bitno je da ga slijedimo do kraja

    • Kada netko pročita ime trebao bi znati što taj objekt predstavlja

    • Apstrahiranje ne-portabilnog koda (kod koji na nekoj specifičnoj hardverskoj platformi)

  • Dizajn klasa

    • Pružanje načina za kopiranje i usporedbu objekata

    • Dizajnirati kod s malim dosegom • Lokaliziranje atributa i ponašanja

    • Pojednostavljuje održavanje, testiranje i proširivanje klasa

    • Primjer nepotrebnog povećanja dosega

    class Matematika{ int temp; public int zamijeni(int a, int b){

    temp = a; a = b; b = temp; return temp;

    } };

  • Dizajn klasa

    • Klasa bi trebala biti odgovorna za svoje funkcionalnosti

    • Primjer ne-OO pristupa IspisiKrug(krug); IspisiPravokutnik(pravokutnik);

    switch (oblik){ case 1: IspisiKrug(krug); break; case 2: IspisiPravokutnik(pravokutnik); break; case 3: IspisiTrokut(trokut); break; default: System.out.println("Nedefinirani oblik"); break; }

  • Dizajn klasa

  • Dizajn klasa

    • Primjer OO pristupa - polimorfizam

  • Dizajn s naglaskom na lako održavanje

    • Dizajn konciznih i korisnih klasa olakšava održavanje

    • Organiziramo kod u više manjih zasebnih jedinica koje je lakše održavati

    • Potrebno je reducirati međuzavisni kod – promjena u jednom dijelu koda ne bi trebala imati utjecaj na ostatak koda

    • Ako su klase ispravno dizajnirane promjene u sustavu bi se trebale odnositi samo na implementaciju

    • Promjene na javnom interfejsu bi se trebale izbjegavati – takve promjene uzrokuju velike promjene u ostatku koda

  • Povezane klase

    • Situacija kada dvije (ili više) klase u velikoj mjeri ovise jedna o drugoj naziva se jako povezane klase

    • Promjena na jednoj klasi vrlo vjerojatno znači da će biti potrebno mijenjati i drugu klasu

    • Ponekad na priroda problema iz domene nameće jaku povezanost klasa

  • Iterativan razvojni proces

    • Ne treba cijeli kod napisati odjednom

    • Kod se radi u manjim koracima, i iza svakog koraka obavlja se potrebno testiranje

    • Dobar plan testiranja otkriva greške u ranom stupnju razvoja gdje je ispravljanje jednostavnije

    • Ako se greška uoči u zadnjem stadiju developmenta puno skuplje je popraviti

  • Testiranje interfejsa

    • Testiranje počinje sa minimalnim implementacijama interfejsa (eng. stubs)

    • Na taj način možemo testirati interfejs bez pisanja stvarnog koda

    • Služi samo da testiramo da interfejsi dobro rade

    • Nakon runde testiranja stub možemo ostaviti sakriven od korisnika u slučaju da nam opet zatreba

  • Testiranje interfejsa

  • Testiranje interfejsa class CitacBazePodataka{

    private string baza[] = { "Zapis1", "Zapis2", "Zapis3", "Zapis4", "Zapis5" }; private bool bazaOtvorena = false; private int pozicija; public void Otvori(string ime){

    bazaOtvorena = true; } public void Zatvori(){

    bazaOtvorena = false; } public void IdiNaPrviZapis(){ pozicija = 0; }

    public void IdiNaZadnjiZapis(){ pozicija = 4;

    } public int KolikoImaZapisa(){

    int brojZapisa = 5; return brojZapisa;

    } public string DohvatiZapis(int redniBroj){

    /* implementacija specifična za konkretnu bazu*/ return baza[redniBroj];

    } public string DohvatiSljedećcZapis(){

    /* implementacija specifična za konkretnu bazu*/ pozicija++; return baza[pozicija];

    } };

  • Postojanost objekata (eng. object persistence)

    • Postojanost (eng. persistence) je koncept čuvanja stanja objekta

    • Kada se pokrene program, ako ne sačuvamo stanje objekta on nakon nekog vremena nestaje (tokom ili na kraju programa) i podaci se ne mogu vratiti

    • U nekim situacijama nam nije bitno da sačuvamo stanje objekta, ali u određenim situacijama to trebamo uzeti u obzir

    • Najjednostavniji način osiguravanja postojanosti objekta je serijalizacija u obični file (obično se radi o xml formatu)

  • Postojanost objekata

    • Postoje tri primarne lokacije za čuvanje objekata:

    • File system – serijalizacija

    • Relacijska baza podataka – potreban je middleware da bi se objekt pretvorio u relacijski model

    • OO baza podataka – učinkovitiji način spremanja objekata, ali većina tvrtki ima svoje podatke u starijim sustavima i težak je proces konverzije starih podataka iz relacijskog u OO model

  • Serijalizacija

    • Da bi objekt slali kroz kanal (npr. putem interneta) potrebno ga je dekonstruirati (razbiti u elementarne podatke, npr. byte stream), poslati i onda ga ponovno složiti na drugom kraju kanala – ovaj proces naziva se serijalizacija (eng. serialization)

    • Proces samog slanja kroz mrežu zove se „marshaling”

    • Serijalizirani objekt se može zapisati u file i poslije opet vratiti u originalno stanje

    • Serijaliziacija i deserijalizacjia trebaju koristiti iste specifikacije (metodu dekompozicije