Корисник:OgnjenIvanovic/Супституција
Супституција
уредиСупституција је концепт у програмирању који се односи на замену једног објекта, функције или другог дела програма другим, при чему нова компонента задовољава услове и очекивања оригинала. Она је основа за примену многих програмских принципа и техника, укључујући полиморфизам и наслеђивање.
Концепт супституције
уредиСупституција је кључна у објектно-оријентисаном програмирању. Она омогућава да се класе и објекти замењују једни другима без нарушавања функционалности програма. Главни разлог за коришћење супституције је унапређење модуларности и проширивости кода.
Најчешће се овај концепт јавља у ситуацијама када се користи апстрактна класа или интерфејс као основа за рад, док конкретна имплементација долази у облику изведене класе. Програмери овако могу писати код који је мање зависан од детаља имплементације, чиме се побољшава могућност рефакторисања и проширења.
Пример 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, без промене кода апликације.
- Тестирање веб апликација: Могућност замене стварног веб сервера мок сервером током развоја.
- Дизајн интерфејса: У графичким корисничким интерфејсима, различите компоненте (нпр. дугмад, поља за унос) могу наследити заједничку базну класу и бити коришћене на исти начин.