Korisnik:OgnjenIvanovic/Supstitucija
Supstitucija
urediSupstitucija 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
urediSupstitucija 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)
urediLiskovljev 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.