You are on page 1of 22

SVEUČILIŠTE/UNIVERZITET „VITEZ“

VITEZ FAKULTET INFORMACIONIH


TEHNOLOGIJA

STUDIJ I CIKLUSA; GODINA STUDIJA: FIT, I CIKLUS, IV GODINA


SMJER: INFORMACIONE TEHNOLOGIJE

„SOLID PRINCIPI”

SEMINARSKI RAD

Travnik, 24.03.2021.
SVEUČILIŠTE/UNIVERZITE
T “VITEZ” VITEZ
FAKULTET

FAKULTET INFORMACIONIH
TEHNOLOGIJA

STUDIJ I CIKLUSA; GODINA STUDIJA: FIT, I CIKLUS, IV GODINA


SMJER: INFORMACIONE TEHNOLOGIJE

„SOLID PRINCIPI”

SEMINARSKI RAD

IZJAVA: Ja Ahmed Srebrenica student Sveučilišta/Univerziteta “Vitez” Travnik,


Index broj: 006-17/RIT odgovorno i uz moralnu i akademsku odgovornost
izjavljujem da sam ovaj rad izradio potpuno samostalno uz korištenje
citirane literature i pomoć profesora odnosno asistenata.

Potpis studenta: Ahmed Srebrenica

STUDENT: Ahmed Srebrenica

PREDMET: Softverski uzori

PROFESOR: Namik Nuhanović

ASISTENT: Namik Nuhanović


SADRŽAJ

SEMINARSKI RAD...................................................................................................1
1.UVOD........................................................................................................................1
1.1. PROBLEM I PREDMET ISTRAŽIVANJA.....................................................1
1.2. SVRHA I CILJEVI ISTRAŽIVANJA..............................................................1
1.3. RADNA HIPOTEZA I POMOĆNE HIPOTEZE..............................................1
1.4. ZNANSTVENE METODE...............................................................................1
1.5. STRUKTURA RADA.......................................................................................1
2. UVOD U SOLID PRINCIPE...................................................................................3
3. SINGLE RESPONSIBILITY PRINCIP...................................................................4
4. OPEN-CLOSE PRINCIP..........................................................................................7
5. LISKOV SUBSTITUTION PRINCIP....................................................................10
6. INTERFACE SEGREGATION PRINCIP.............................................................13
7. DEPENDENCY INVERSION PRINCIP...............................................................17
8. ZAKLJUČAK.........................................................................................................18
9. LITERATURA.......................................................................................................19
1.UVOD

1.1. PROBLEM I PREDMET ISTRAŽIVANJA

U ovom seminarskom radu upoznat ćemo se sa SOLID principima, te ćemo objasniti


svih pet solid principa sa primjerima programskog koda.

1.2. SVRHA I CILJEVI ISTRAŽIVANJA

Osnovni cilj seminarskog rada je objasniti šta su to SOLID principi, te kako se


primjenjuju.

1.3. RADNA HIPOTEZA I POMOĆNE HIPOTEZE

Na temelju problema i predmeta istraživanja postavlja se glavna (radna) hipoteza:


„Da li nam SOLID principi u softverskim rješenjima pomažu da projektovanje bude
lakše?”

1.4. ZNANSTVENE METODE

U ovom seminarskom radu koristit ćemo sljedeće znanstvene metode:

-Metoda analize i sinteze


-Metoda klasifikacije
-Metoda modeliranja
-Matematička metoda
-Statistička metoda

1.5. STRUKTURA RADA

1
Struktura seminarskog rada je uskađena sa upustvom za pisanje seminarskog rada na
prvom ciklusu studija kao i temi seminarskog rada. On sadrži pet poglavlja.

Prvo poglavlje, Uvod, sadrži pet potpoglavlja:

-Problem, predmet i objekt istraživanja


-Svrha i ciljevi istraživanja
-Radna hipoteza i pomoćne hipoteze
-Znanstvene metode
-Struktura rada

Drugo poglavlje nam govori o uvodu u SOLID principe.

Sa trećim poglavljem počinje objašnjavanje prvog od pet solid principa, tj. Single
Responsibility princip.

Četvrto poglavlje nam govori o Open – close principu.

Peto pogavlje nam govori o Liskov Substitution principu.

Šesto poglavlje nam govori o Interface segregation principu.

Sedmo poglavlje nam govori o Dependency inversion principu.

Osmo poglavlje nam daje zaključak na cjelokupan rad, te odgovor na radnu hipotezu.

2
2. UVOD U SOLID PRINCIPE

SOLID je akronim za pet principa objektno-orijentisanog dizajna, koje je definisao


Robert C. Martin u svom radu „Design Principles and Design Patterns“, (koju su
napisali čuveni Gang of Four - Richard Helm, Erih Gama, Ralf Džonson, Džon
Vilisids) 2000 godine, s ciljem da projektovanje softverskih rješenja učini
razumljivim, fleksibilnim, i održivim. SOLID principi definišu prakse koje
omogućavaju fleksibilan razvoj odnosno projektovanje softverskih rješenja u odnosu
na kontinuiran rast kompleksnosti i dugoročno održavanje. SOLID principi
doprinose cjelokupnom kvalitetu koda, manjoj potrebi za refaktorisanjem, te agilnom
i prilagodljivom razvoju softvera. Naziv SOLID principi dolazi iz prvih slova svakog
principa: S – Single Princip, O – Open-Close Princip, L- Liskov Substitution
Princip, I – Interface Segregation Princip, D – Dependancy Inversion Princip.1

Izvor: https://codeburst.io/solid-design-principle-using-swift-fa67443672b8 (24.03.2021)

1
https://sipodsoftware.com/index.php/2019/02/07/solid-principi/ (24.03.2021)

3
3. SINGLE RESPONSIBILITY PRINCIP

Princip - Single responsibility govori da svaki objekat treba da ima jedan fokus.
Pridržavanjem ovog principa, izbjegava se problem monolitnih klasa, što predstavlja
softverski ekvivalent za švicarski nož. Ako su objekti koncizni, povećava se čitljivost
i omogućava lakše održavanje sistema.

Kao primjer možemo posmatrati klasu „Book“ koja obuhvata koncept knjige i
pridruženih funkcionalnosti.

class Book

public string getTitle()

return "A Great Book";

public string getAuthor()

return "John Doe";

public string turnPage()

// pointer to next page

public void printCurrentPage()

4
Console.WriteLine("current page content");

}
2

Ova klasa se može učiniti kao sasvim ispravna. Imamo knjigu za koju možemo da
odredimo naslov, autora i možemo da pređemo na sljedeću stranicu. Poslednja
metoda omogućava da se odštampa trenutna stranica, te da se prikaže na ekranu.
Ovdje se može pojaviti i problem. Mješanje logike sa prikazom je loša praksa. Zbog
toga bi kod trebalo izmjeniti:

class Book

public string getTitle()

return "A Great Book";

public string getAuthor()

return "John Doe";

public string turnPage()

41

2
Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin" Zrenjanin univerzitet u
Novom Sadu, Softversko inžinjerstvo 2

5
{

// pointer to next page

}interface Printer

void printPage(string page);

class PlainTextPrinter : Printer

public void printPage(string page)

Console.WriteLine("current page content: " + page);

class HtmlPrinter : Printer

public void printPage(string page)

Console.WriteLine("<div style='single-page'>" + page + "</div>");

}3

3
Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin" Zrenjanin univerzitet u
Novom Sadu, Softversko inžinjerstvo 2

6
Modul treba da ima isključivo jedan razlog za promjenu, odnosno da odgovara
isključivo jednom entitetu.

4. OPEN-CLOSE PRINCIP

Open-close Princip govori da klasa treba da bude otvorena za proširenja a zatvorena


za izmjene. Potrebno je omogućiti dodavanje novih karakteristika i proširenje klase
bez promjene unutrašnjeg ponašanja postojećih metoda. Princip teži da se izbjegne
mijenjanje postojeće klase i drugih klasa koje od nje zavise, jer će to dovesti do
pojavljivanja velikog broja grešaka u samoj aplikaciji.4

U okviru primjera možemo posmatrati klasu Customer koja posjeduje jednu metodu
getDiscount().

4
https://sipodsoftware.com/index.php/2019/02/07/solid-principi/ (25.03.2021)

7
class Customer

public virtual double getDiscount(double TotalSales)

return TotalSales;

}5

Ako se vremenom pored klijenata pojave i klijenti posebnog tipa onda se klasa
Customer može promijeniti:

class Customer

private int _custType;

public int CustType

get { return _custType; }

set { _custType = value; }

42

public double getDiscount(double TotalSales)

if (_custType == 1)

5
Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin" Zrenjanin univerzitet u
Novom Sadu, Softversko inžinjerstvo 2

8
return TotalSales - 100;

else

return TotalSales - 50;

}6

Problem je što, ako budemo imali još tipova klijenata, moraćemo dodavati još IF
uslova u okviru getDiscount metode, što će dovesti do nove promjene u okviru
Customer klase. Kada se god promjeni klasa, mora se osigurati da prethodni kod
radi, jer izmjene mogu dovesti do pojave grešaka u ostatku koda. Umjesto toga, kod
treba proširiti kako bi bili sigurni da postojeći kod i dalje radi.

class Customer

public virtual double getDiscount(double TotalSales)

return TotalSales;

class SilverCustomer : Customer

public override double getDiscount(double TotalSales)

6
Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin" Zrenjanin univerzitet u
Novom Sadu, Softversko inžinjerstvo 2

9
{

return base.getDiscount(TotalSales) - 50;

class GoldCustomer : SilverCustomer

public override double getDiscount(double TotalSales)

return base.getDiscount(TotalSales) - 100;

}7

Ovim kodom smo postigli da je klasa Customer zatvorena za bilo kakve izmjene ali
je otvorena za proširenja.

5. LISKOV SUBSTITUTION PRINCIP

Liskov princip zamjene govori da bi trebalo omogućiti korišćenje bilo koje izvedene
klase na mjstu klase roditelja i da bi ta klasa trebala da se ponaša na isti način bez
izmjena. Ovaj princip je u skladu sa OCP principom jer osigurava da izvedena klasa
ne utiče na ponašanje klase roditelja.

Primjer LSP-a kod koga imamo tri klase: Vehicle, Car i ElectricBus. Klase Car i
ElectricBus su nasljeđene iz klase Vehicle.

7
Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin" Zrenjanin univerzitet u
Novom Sadu, Softversko inžinjerstvo 2

10
class Vehicle

43

public virtual void startEngine()

Console.WriteLine("Start engine");

public virtual void accelerate()

Console.WriteLine("Accelerate");

class Car : Vehicle

public override void startEngine()

engageIgnition();

base.startEngine();

private void engageIgnition()

Console.WriteLine("Ignition procedure");

class ElectricBus : Vehicle

public override void accelerate()

11
{

increaseVoltage();

connectIndividualEngines();

base.accelerate();

private void increaseVoltage()

Console.WriteLine("Electric logic");

private void connectIndividualEngines()

Console.WriteLine("Connection logic");

}8

Da bi demonstrirali upotrebu ovih klasa i da bi pokazali da se ove izvedene klase


mogu upotrijebiti na istom mjestu gdje i klasa roditelj, možemo kreirati klasu
Program sa main metodom:

class Program

static void go(Vehicle v)

v.startEngine();

v.accelerate();

44
8
Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin" Zrenjanin univerzitet u
Novom Sadu, Softversko inžinjerstvo 2

12
static void Main(string[] args)

Vehicle v = new Vehicle();

Vehicle c = new Car();

Vehicle e = new ElectricBus();

go(v);

go(c);

go(e);

}
9

6. INTERFACE SEGREGATION PRINCIP

Cilj ovog principa je dodjeljivanje novog interfejsa grupama metoda koje imaju isti
fokus, kako bi se izbjeglo da klijent implementira jedan veliki interfejs i veliki broj
metoda koje mu nisu potrebne. Prednost ovog principa se ogleda u tome da klase
koje žele da koriste iste interfejse treba da implementiraju samo određen skup
metoda. Da bi se demonstrirao Interface segregation princip, biće kreirana mala
aplikacija čiji je domen katalog proizvoda. Katalog proizvoda čine filmovi u obliku
DVD ili Blu-Ray diskova. Za svaki podtip proizvoda postoji odgovarajuća klasa.
Obe klase implementiraju IProduct interfejs kao što se može videti:

public interface IProduct

decimal Price { get; set; }

int WeightInKg { get; set; }

9
Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin" Zrenjanin univerzitet u
Novom Sadu, Softversko inžinjerstvo 2

13
int RunningTime { get; set; }

public class DVD : IProduct

public decimal Price { get; set; }

public int WeightInKg { get; set; }

public int RunningTime { get; set; }

public class BluRayDisc : IProduct

public decimal Price { get; set; }

public int WeightInKg { get; set; }

public int RunningTime { get; set; }

}10

Sada ćemo u aplikaciju dodati novi tip proizvoda koji nije film. Dodajemo klasu
TShirt. Pošto je i ona proizvod, mora da implementira IProduct interfejs. Problem sa
tim što klasa TShirt implementira IProduct interfejs je u tome što properti
RunningTime nema nikavo značenje za majicu i ne bi trebao tu da se nalazi. Rješenje
je u uočavanju razlika između proizvoda kao što su filmovi i majice i prebacivanje
tih razlika u specifične interfejse. Dodaćemo novi interfejs IMovie. Izmjenjeni kod
aplikacije je prikazan u primjeru:

10
Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin" Zrenjanin univerzitet u
Novom Sadu, Softversko inžinjerstvo 2

14
int RunningTime { get; set; }

public interface IProduct

45

decimal Price { get; set; }

int WeightInKg { get; set; }

public class DVD : IProduct, IMovie

public decimal Price { get; set; }

public int WeightInKg { get; set; }

public int RunningTime { get; set; }

public class BluRayDisc : IProduct, IMovie

public decimal Price { get; set; }

public int WeightInKg { get; set; }

public int RunningTime { get; set; }

public class TShirt : IProduct

public decimal Price { get; set; }

15
public int WeightInKg { get; set; }

}11

Ovo je suština Interface segregation principa. Razdvajanjem interfejsa, povećava se


mogućnost ponovne upotrebe i razumijevanja koda.

Izvor:https://medium.com/@radheshyamsingh_83359/interface-segregation-principle-solid-design-
12ecfd29f906 (26.03.2021)

11
Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin" Zrenjanin univerzitet u
Novom Sadu, Softversko inžinjerstvo 2

16
7. DEPENDENCY INVERSION PRINCIP

Princip DIP se bazira na izolovanju klasa od konkretne implementacije kako bi


zavisile od apstraktnih interfejsa i klasa. On promoviše kodiranje bazirano na
interfejsima, a ne na implementaciji. Ovo pospješuje fleksibilnost u okviru sistema,
osiguravajući da kod nije čvrsto vezan za jednu implementaciju.

Dependency inversion predstavlja dobavljanje klase nižeg nivoa i zavisne klase kroz
konstruktor, metodu ili properti. Zavisne klase se mogu zamijeniti interfejsima ili
apstraktnim klasama koje će voditi ka slabo povezanim sistemima koji su vrlo dobri
za testiranje i lahki za izmjenu. Dependency Inversion princip pomaže u razdvajanju
koda tako što osigurava da unutar koda imamo zavisnosti od apstrakcija, a ne od
konkretnih implementacija. Ovaj princip je najvažniji u cilju razumijevanja dizajn
paterna.

Izvor:https://www.researchgate.net/figure/Dependency-Inversion-Principle-
example_fig10_332590977 (26.03.2021)

17
8. ZAKLJUČAK

SOLID principi koje je definisao Robert C. Martin definišu prakse koje omogućavaju
fleksibilan razvoj odnosno projektovanje softverskih rješenja u odnosu na
kontinuiran rast kompleksnosti i dugoročno održavanje. SOLID principi doprinose
cjelokupnom kvalitetu koda, manjoj potrebi za refaktorisanjem, te agilnom i
prilagodljivom razvoju softvera . Glavna (radna) hipoteza „Da li nam SOLID
principi u softverskim rješenjima pomažu da projektovanje bude lakše?” je
upotpunosti dokazana kroz ovaj rad. SOLID principi nam pomažu da projektovanje
softverskih rješenja bude lakše, odnono da bude razumljivije i fleksibilnije.

9. LITERATURA

1. https://sipodsoftware.com/index.php/2019/02/07/solid-principi/ (24.03.2021)

2. Ivanković Zdravko i Lacmanović Dejan, tehnički fakultet "Mihajlo Pupin"


Zrenjanin univerzitet u Novom Sadu, Softversko inžinjerstvo 2

3. UISBAX

18
19

You might also like