Корисник:ОгњенИвановиц/Супституција

Супституција

уреди

Супституција је концепт у програмирању који се односи на замену једног објекта, функције или другог дела програма другим, при чему нова компонента задовољава услове и очекивања оригинала. Она је основа за примену многих програмских принципа и техника, укључујући полиморфизам и наслеђивање.

Концепт супституције

уреди

Супституција је кључна у објектно-оријентисаном програмирању. Она омогућава да се класе и објекти замењују једни другима без нарушавања функционалности програма. Главни разлог за коришћење супституције је унапређење модуларности и проширивости кода.

Најчешће се овај концепт јавља у ситуацијама када се користи апстрактна класа или интерфејс као основа за рад, док конкретна имплементација долази у облику изведене класе. Програмери овако могу писати код који је мање зависан од детаља имплементације, чиме се побољшава могућност рефакторисања и проширења.

Пример 1: Замена објеката

У програмском језику C#, ако имамо базну класу Возило и изведену класу Аутомобил, можемо заменити објекат типа Возило објектом типа Аутомобил.

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.
    }
}

Лисковљев принцип супституције (LSP)

уреди

Лисковљев принцип супституције, који је формулисала Барбара Лисков, представља основу супституције у ООП-у. Он гласи:Објекти изведене класе треба да могу заменити објекте базне класе без нарушавања исправности програма.“

Применом овог принципа постиже се:

  • јаснији дизајн,
  • избегавање грешака,
  • лакше тестирање класа.

Пример 2: Кршење LSP-а

Уколико имамо класу Четвороугао и изведену класу Квадрат, логика класе Четвороугао може бити нарушена када се користи објекат типа Квадрат.

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.

У овом примеру класа Квадрат нарушава понашање базне класе Четвороугао, јер постављање ширине аутоматски утиче на висину, што није предвиђено у базној класи. Ово је класично кршење Лисковљевог принципа супституције.

Врсте супституције

уреди
  • Супституција објеката: Замена једног објекта другим, под условом да изведени објекат задовољава интерфејс или контракт који дефинише оригинал.
  • Супституција функција: Замена једне функције другом, при чему обе функције морају имати исту структуру (параметре и резултат).
  • Супституција компоненти: Замена целокупног модула или библиотеке другом, на пример у контексту тестирања или промене базе података.

Практичне примене супституције

уреди
  • Управљање базама података: Замена различитих типова база у софтверским системима, као што је прелазак са MySQL на PostgreSQL, без промене кода апликације.
  • Тестирање веб апликација: Могућност замене стварног веб сервера мок сервером током развоја.
  • Дизајн интерфејса: У графичким корисничким интерфејсима, различите компоненте (нпр. дугмад, поља за унос) могу наследити заједничку базну класу и бити коришћене на исти начин.

Референце

уреди