Proceduralno i OO programiranje

Razmotrićemo sada i uporediti dve najčešće korišćene programske paradigme: Proceduralnu i Objektno orjentisanu. Proceduralno programiranje zasniva se na Tjuringovom teorijskom modelu algoritamskog rešavanja problema. Tjuringova teorijska mašina realizovana je Fon Nojmnovim modelom računara sa procesorom koji izvršava programske instrukcije koje se, zajedno sa podacima, nalaze u zajedničkoj memoriji. Ova dva rezultata, jedan matematičko teorijski i drugi inženjersko-tehnički predstavljaju osnovu savremenih računara.

Oba gornja modela su se bazirala na jednostavnim jezicima za njihovo programiranje. Ovi jezici su bili preteče današnjim mašinskim jezicima (asemblerima) koje koriste naši računari. Iako su takvi jezici, teorijski gledano, dovoljni za rešavanje bilo kojeg problema (koji se može rešiti putem računara), programiranje bilo kog složenijeg zadatka bi bilo praktično nemoguće. Zato su razvijani novi složeniji jezici koje su mogli da nauče ljudi sa manje znanja iz matematike i elektronike, tako da se danas programiranje ući čak i u osnovnim školama.

Sve veća potreba za softverom zahteva sve veće nivoe za komunikaciju čovek računar, a samim tim i za programiranje sve složenijih sistema. Proceduralna paradigma, koja je bila vladajuća skoro 50 godina, unapređena je objektno orjentisanom, tako da ove paradigme skladno koegzistiraju u savremenim softverskim sistemima.

Od proceduralnog ka OO programiranju

Svi programski jezici sadrže sledeća četiri koncepta:

  • Sekvencu – kojom se izvršava niz instrukcija (naredbi, komandi)
  • Selekciju – donošenje odluke (if..then…else, switch….case)
  • Iteraciju – ponavljanja (repeticija, petlja, ciklus)
  • Apstrakciju – procesa kreiranja softvera kojim se omogućava parametrizacija rešenja čime se postiže da softver dobija generalan karakter

Upravo se na konceptu apstrakcije razlikuju proceduralni (kao što je C) i OO jezici (kao što su C++,C#,Java, Python).

Apstrakcija kod proceduralnih jezika

Apstrakcija kod proceduralnih jezika se postiže korišćenjem potprograma (funkcija i procedura).

Funkcije služe za transformaciju eksternih podataka u neki finalni rezultat, kao na primer funkcija koja određuje srednju vrednost između dva broja:

float SrednjaVrednost(float a, float b)
{
        float result;
        result = (a+b)/2;
        return result;
}

Na ovaj način se problem, top-daun (top-down) pristupom, može podeliti u potprobleme (metoda poznata kao »podeli pa vladaj« - »divide and conquer«) koji se rešavaju kroz posebne procedure ili funkcije što se može izraziti na sledeći način:

F(G(x1,x2,...,xn), H(y1,y2,...,ym))

gde se funkcijom F rešava problem koji je podeljen na dva potproblema koji se rešavaju funkcijama G i H. Vrednosti x1,x2,...,xn i y1,y2,...,ym nazivaju se parametrima funkcija.

Prenos parametara

U jeziku C#, na primer, parametri mogu biti prenošeni na tri načina: po vrednosti, po referenci i kao izlazni parametri. Razmotrićemo samo prva dva načina (po vrednosti i po referenci).

Prenos parametara „po vrednosti“

Kod prenosa parametara kao vrednosti u potprogram (metodu) se prenosi vrednost koja se dalje u metodi koristi, ali se ne menja vrednost varijable koja je bila korišćena u pozivu potprograma (metode).

To je ilustrovano u sledećem primeru:

// PassingParams1.cs
using System;
class PassingValByVal
{
    static void SquareIt(int x)
    // The parameter x is passed by value.
    // Changes to x will not affect the original value of myInt.
    {
        x *= x;
        Console.WriteLine("The value inside the method: {0}", x);
    }
    public static void Main()
    {
        int myInt = 5;
        Console.WriteLine("The value before calling the method: {0}",myInt);
        SquareIt(myInt);   // Passing myInt by value.
        Console.WriteLine("The value after calling the method: {0}",myInt);
    }
}

Vrednost varijable x pre pozivanja metode: 5 Vrednost varijable x unutar metode: 25 Vrednost varijavle x posle pozivanja metode: 5

Prenos parametara »po referneci«

Kod prenosa parametara »po referenci« u potprogram (metod) se prenosi referenca (adresa) varijable koja se dalje u metodi koristi, pa se menja i vrednost varijable koja je bila korišćena u pozivu potprograma (metode).

To je ilustrovano u sledećem primeru:

// // PassingParams2.cs
using System;
class PassingValByRef
{
    static void SquareIt(ref int x)
    {
        // The parameter x is passed by reference.
        // Changes to x will affect the original value of myInt.

        x *= x;
        Console.WriteLine("The value inside the method: {0}", x);
    }
    public static void Main()
    {
        int myInt = 5;
        Console.WriteLine("The value before calling the method: {0}",myInt);
        SquareIt(ref myInt);   // Passing myInt by reference.
        Console.WriteLine("The value after calling the method: {0}",myInt);
    }
}

Vrednost varijable x pre pozivanja metode: 5 Vrednost varijable x unutar metode: 25 Vrednost varijavle x posle pozivanja metode: 25

Apstrakcija u OO jezicima

Apstrakcija u OO jezicima se postiže kroz takozvane apstraktne tipove podataka (ADT – Abstract Data Type), koji sadrže istovremeno i podatke i operacije (metode) koji se nad njima mogu vršiti.

U OO jezicima apstrakcija se postiže preko programske konstrukcije koja se naziva klasa.

U OO terminologiji podaci se nazivaju atributima a operacije koje se nad njiva izvršavaju nazivaju se metodama.

Dakle klasa sadrži atribute i metode. Klasa predstavlja generalizaciju (model) nekog entiteta (objekta) iz realnog sveta.

Klasom se modeliraju podaci (atributi) i procedure (metode). Primeri entiteta koji se mogu modelirati klasama su: student, faktura, bankarski račun, itd.

Primer klase – Bankovni račun

@startuml
scale 1.5
class BankarskiRacun {
  {field} naziv_racuna
  {field} broj_racuna
  {field} stanje_racuna
  {method} podizanjeGotovine
  {method} ulaganjeGotovine
  {method} proveraStanja
}

@enduml

Pseudo kod:

// Pseudokod za klasu Bankovni račun
class BankovniRacun
{
  string naziv_racuna;   // atributi
  long broj_racuna;
  float stanje_racuna;

  podizanjeGotovine();  // metode
  ulaganjeGotovine();
  proveraStanja();
} // Klasa Bankovni račun

Evo još jednog primera

@startuml
scale 1.5
class Krug {
  {field} centar
  {field} poluprecnik
  {method} obimKrug
  {method} povrsinaKruga
  {method} pomeriKrug
}

@enduml

Pseudokod:

// Pseudokod za klasu Krug
class Krug
{
  double cetarX, centarY;  // atributi
  double poluprecnik;
  povrsinaKruga();   // metode
  obimKruga();
  pomeriKrug();
} // Klasa Krug

Objekat je jedan konkretan slučaj (instanca) klase – na primer Petrov račun u banci je jedan objekat tipa bankovni račun.

Objekat Jelenin račun je drugi objekat iz iste klase. Dakle, objekti sadrže konkretne podatke dok klasa ne sadrži podatke. Klasa je samo okvir (templejt) za podatke – pokazuje koje će podatke objekat iz date klase imati.

Na primer Petrov račun može izgledati ovako:

nazivRacuna  = Petar Petrovic
brojRacuna  = 423838634543
stanjeRacuna = 150.850,00

Obično aplikacija koju želimo da razvijemo OO metodologijom sadrži veći broj objekata koji su međusobno povezani i u nekoj interakciji. Recimo, ako želimo da izgradimo informacioni sistem neke banke možemo imati sledeće klase: bankovni račun, korisnik usluga (klijent), bankovni automat, krediti, itd.

Ili, u slučaju trgovine, moguće klase su: skladište, faktura, kupci, dobavljaci, itd.

Objektno orijentisani sistem je skup međusobno interagujućih objekata.

Pitanja

  1. Koja su četiri osnovna elementa u programiranja?
  2. Kako se princip apstrakcija izražava u proceduralnim jezicima?
  3. Koji načini prenosa parametara se najčešće primenjuju u OO jezicima?
  4. Koja je razlika između prenosa po vrednosti i prenosa po referenci?