Korisnik:OgnjenIvanovic/Supstitucija

Supstitucija

uredi

Supstitucija je koncept u programiranju koji se odnosi na zamenu jednog objekta, funkcije ili drugog dela programa drugim, pri čemu nova komponenta zadovoljava uslove i očekivanja originala. Ona je osnova za primenu mnogih programskih principa i tehnika, uključujući polimorfizam i nasleđivanje.

Koncept supstitucije

uredi

Supstitucija je ključna u objektno-orijentisanom programiranju. Ona omogućava da se klase i objekti zamenjuju jedni drugima bez narušavanja funkcionalnosti programa. Glavni razlog za korišćenje supstitucije je unapređenje modularnosti i proširivosti koda.

Najčešće se ovaj koncept javlja u situacijama kada se koristi apstraktna klasa ili interfejs kao osnova za rad, dok konkretna implementacija dolazi u obliku izvedene klase. Programeri ovako mogu pisati kod koji je manje zavisan od detalja implementacije, čime se poboljšava mogućnost refaktorisanja i proširenja.

Primer 1: Zamena objekata

U programskom jeziku C#, ako imamo baznu klasu Vozilo i izvedenu klasu Automobil, možemo zameniti objekat tipa Vozilo objektom tipa Automobil.

public class Vozilo
{
    public virtual void Pokreni()
    {
        Console.WriteLine("Vozilo je u pokretu.");
    }
}

public class Automobil : Vozilo
{
    public override void Pokreni()
    {
        Console.WriteLine("Automobil se kreće.");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Vozilo mojeVozilo = new Automobil();
        mojeVozilo.Pokreni(); // Ispisuje: Automobil se kreće.
    }
}

Liskovljev princip supstitucije (LSP)

uredi

Liskovljev princip supstitucije, koji je formulisala Barbara Liskov, predstavlja osnovu supstitucije u OOP-u. On glasi:Objekti izvedene klase treba da mogu zameniti objekte bazne klase bez narušavanja ispravnosti programa.“

Primenom ovog principa postiže se:

  • jasniji dizajn,
  • izbegavanje grešaka,
  • lakše testiranje klasa.

Primer 2: Kršenje LSP-a

Ukoliko imamo klasu Četvorougao i izvedenu klasu Kvadrat, logika klase Četvorougao može biti narušena kada se koristi objekat tipa Kvadrat.

public class Cetvorougao
{
    public virtual int Sirina { get; set; }
    public virtual int Visina { get; set; }

    public int IzracunajPovrsinu()
    {
        return Sirina * Visina;
    }
}

public class Kvadrat : Cetvorougao
{
    public override int Sirina
    {
        set { base.Sirina = base.Visina = value; }
    }

    public override int Visina
    {
        set { base.Visina = base.Sirina = value; }
    }
}

// Potencijalni problem
Cetvorougao figura = new Kvadrat();
figura.Sirina = 4;
figura.Visina = 5;

Console.WriteLine(figura.IzracunajPovrsinu()); // Očekuje se 20, ali rezultat je 25.

U ovom primeru klasa Kvadrat narušava ponašanje bazne klase Četvorougao, jer postavljanje širine automatski utiče na visinu, što nije predviđeno u baznoj klasi. Ovo je klasično kršenje Liskovljevog principa supstitucije.

Vrste supstitucije

uredi
  • Supstitucija objekata: Zamena jednog objekta drugim, pod uslovom da izvedeni objekat zadovoljava interfejs ili kontrakt koji definiše original.
  • Supstitucija funkcija: Zamena jedne funkcije drugom, pri čemu obe funkcije moraju imati istu strukturu (parametre i rezultat).
  • Supstitucija komponenti: Zamena celokupnog modula ili biblioteke drugom, na primer u kontekstu testiranja ili promene baze podataka.

Praktične primene supstitucije

uredi
  • Upravljanje bazama podataka: Zamena različitih tipova baza u softverskim sistemima, kao što je prelazak sa MySQL na PostgreSQL, bez promene koda aplikacije.
  • Testiranje veb aplikacija: Mogućnost zamene stvarnog veb servera mok serverom tokom razvoja.
  • Dizajn interfejsa: U grafičkim korisničkim interfejsima, različite komponente (npr. dugmad, polja za unos) mogu naslediti zajedničku baznu klasu i biti korišćene na isti način.

Reference

uredi