Objektno usmerjeno programiranje (OOP): definicija, načela in primeri

Objektno usmerjeno programiranje (OOP) je način oblikovanja in pisanja računalniških programov, ki za predstavitev podatkov in metod uporablja koncept "objektov". Tradicionalno so bili programi zaporedje ukazov (proceduralno programiranje), medtem ko OOP razdeli program na neodvisne entitete — objekte — ki vsebujejo stanje (podatke) in obnašanje (metode). Objekti med seboj sodelujejo z izmenjavo sporočil (klicanjem metod) in tako omogočajo ustvarjanje bolj modularne, razumljive in ponovno uporabne kode. Z uporabo OOP lahko lažje vzdržujemo velike kode baze, zmanjšujemo podvajanje in gradimo abstrakcije, ki poenostavijo reševanje kompleksnih problemov.

Osnovni pojmi

  • Razred (class) — predloga ali načrt, ki opredeljuje lastnosti (atribute) in vedenje (metode) objekta.
  • Objekt (instance) — konkreten primerek razreda z lastnimi vrednostmi atributov.
  • Atributi (fields) — spremenljivke, ki opisujejo stanje objekta.
  • Metode — funkcije znotraj razreda, ki določajo, kaj objekt lahko stori.
  • Konstruktor — posebna metoda za ustvarjanje in inicializacijo novih objektov.
  • Dostopni modifikatorji (npr. public, private, protected) — nadzorujejo vidnost atributov in metod zunaj razreda.

Glavna načela OOP

  • Inkapsulacija — skrivanje notranjih podrobnosti implementacije znotraj razreda in izpostavljanje le potrebnega vmesnika. To zmanjša odvisnosti med deli programa in poveča varnost podatkov.
  • Dedovanje — možnost, da en razred (potomec) podeduje lastnosti in vedenje drugega razreda (starša), kar omogoča ponovno uporabo kode in oblikovanje hierarhij.
  • Polimorfizem — sposobnost, da različni objekti odgovorijo na isti klic metode na svoj način (npr. metoda draw() za različne oblike). Polimorfizem omogoča pisanje generične kode, ki deluje z različnimi tipi objektov.
  • Abstrakcija — izločanje bistvenih značilnosti objekta in ignoriranje nepomembnih podrobnosti; poenostavi delo z kompleksnimi sistemi z zgradbo jasnih vmesnikov.

Prednosti in slabosti

  • Prednosti: izboljšana modularnost, lažje vzdrževanje in nadgradnje, ponovna uporaba kode, boljša berljivost in strukturiranost velikih projektov, lažje sodelovanje v ekipah.
  • Slabosti: lahko večja začetna kompleksnost in več porabe virov (odvisno od jezika in izvedbe), prekomerno uporablja dedovanje (slab dizajn, t.i. "spagetti dedovanje"), zamuda pri enostavnejših nalogah, če se OOP zlorabi namesto preprostih rešitev.

Koncepti oblikovanja

  • Sestava (composition) — razredi vsebujejo druge razrede kot lastnosti; pogosto bolj varen način za ponovno uporabo kot dedovanje.
  • Vmesniki (interfaces) in abstraktni razredi — definirajo pogodbe, ki jih morajo implementirati konkretni razredi; spodbujajo polimorfizem in ločijo vmesnik od implementacije.
  • Kohezija in povezljivost (coupling) — dober OOP dizajn stremi k visoki koheziji (komponente delajo eno stvar) in nizki povezljivosti (manj odvisnosti med komponentami).

Primeri kode

Preprost primer v Pythonu (ustvarjanje razreda in objekta):

class Avto:     def __init__(self, znamka, leto):         self.znamka = znamka         self.leto = leto      def vozi(self):         print(f"{self.znamka} iz {self.leto} vozi naprej.")  a = Avto("Toyota", 2020) a.vozi()

Podoben primer v Javi z zasebnimi polji in javnimi metodami:

public class Avto {     private String znamka;     private int leto;      public Avto(String znamka, int leto) {         this.znamka = znamka;         this.leto = leto;     }      public void vozi() {         System.out.println(znamka + " iz " + leto + " vozi naprej.");     } }

Kateri jeziki podpirajo OOP

Večina programskih jezikov omogoča ali vsaj omogoča kombinacijo paradigme. Python na primer omogoča pisanje računalniških programov tako v objektno usmerjenem kot v proceduralnem programiranju. Obstaja veliko programskih jezikov, ki omogočajo pisanje računalniških programov v OOP. Nekateri od teh programskih jezikov so npr: C++, Java, Ruby, Perl, Emarald, Sapphire, PHP, Python itd.

Kdaj uporabiti OOP

OOP je še posebej primeren za:

  • velike in kompleksne aplikacije, kjer je potrebna jasna struktura in ločevanje odgovornosti;
  • projekte, ki zahtevajo ponovno uporabo in razširljivost (npr. knjižnice, frameworks, sistemi z več komponentami);
  • timskega dela, kjer jasne meje razredov in vmesnikov pomagajo pri razdelitvi dela;
  • primerih, kjer so modeli sveta (npr. domenska logika) naravno predstavljeni kot objekti.

Za manjše skripte ali zelo računsko intenzivne naloge je včasih bolj smiselna proceduralna ali funkcionalna paradigma. Pri izbiri paradigme upoštevajte velikost projekta, potrebe po vzdrževanju in performančne zahteve.

OOP ni čarobna rešitev, vendar ob pravilni uporabi in dobrim oblikovanju (design) omogoča enostavno razširljivost, ponovno uporabo in bolj razumljivo programsko kodo.

Značilnosti

Glavna ideja objektno usmerjenega programiranja je, da je vse objekt. Vendar so lahko objekti različnih vrst:

  • Spremenljivke lahko vsebujejo informacije (ali podatke) različnih vrst, ki jih podpira programski jezik. Primera sta celoštevilska podatkovna vrsta in podatkovna struktura seznamov. Spremenljivke so zamisel, ki je na voljo že v proceduralnih programskih jezikih. V objektno usmerjenem programiranju so spremenljivke znane predvsem kot atributi.
  • Postopki (znani tudi kot funkcije, metode ali rutine) so seznam navodil, ki računalniku narekujejo, da sprejme vhodne podatke, opravi nekaj izračunov ali spremeni podatke ter uporabniku vrne izhodne podatke. Postopki so tudi zamisel, ki je že na voljo v proceduralnih programskih jezikih. V objektno usmerjenem programiranju so postopki večinoma znani kot metode.
  • Razredi so zbirka različnih spremenljivk in postopkov. Razredi se običajno pogovarjajo med seboj in spreminjajo podatke, da bi delovali na način, ki ga želi uporabnik.

Objekti je izraz, ki se uporablja za primere razredov.

Primeri

V spodnjih primerih ustvarimo razred z imenom Človek. Ta razred vsebuje atributa name (za ime osebe) in friend (za ime prijatelja). Vsaka od metod v razredu Človek vsebuje seznam navodil, ki uporablja atributa ime in prijatelj.

Python

Ta koda je v jeziku Python.

razred Human(object): def __init__(self, name, friend=None): self. name = name self. friend = friend def say_name(self): print("Moje ime je "+self. name) def say_goodnight(self): if self. friend is None: print("Good night nihče.") else: print("Good night "+self. friend. ime) # Ustvari nov človeški objekt z imenom Stephen in imenom "Stephen" stephen = Human("Stephen") # Ustvari nov človeški objekt z imenom joe in imenom "Joe", ki ima za prijatelja stephena joe = Human("Joe", stephen) stephen. say_name() # Pokaže "Moje ime je Stephen" stephen. say_goodnight() # Pokaže "Lahko noč nikomur." joe. say_name() # Pokaže "Moje ime je Joe" joe. say_goodnight() # Pokaže "Lahko noč Stephen

Java

Ta koda je v jeziku Java.

Razred Človek

class Human { private String name = "unnamed"; // ime tega človeka private Human friend = null; // človekov prijatelj // Ta metoda ustvari nov objekt Human, ko mu podamo ime in prijatelja public Human(String name, Human friend) { this. name = name; this. friend = friend; }      // Ta metoda ustvari tudi nov objekt Človeka, če je podano samo ime public Human(String name) { this. name = name; this. friend = null; }      // Ta metoda ustvari nov objekt Človek, če mu nista podana ime in prijatelj. public Human() { this. name = "brez imena"; this. friend = null; } public void sayName() { System. out. println("Moje ime je " + this. name); } public void sayGoodnight() { if (friend == null) { System. out. println("Lahko noč nikomur."); } else { System. out. println("Lahko noč " + friend. name); }     } }

Metoda za pogovor z zgornjim razredom Človek

class Main { public static void main(String[] args) { // Ustvari nov človeški objekt stephen z imenom "Stephen" Human stephen = new Human("Stephen"); // Ustvari nov človeški objekt joe z imenom "Joe" in stephenom kot prijateljem Human joe = new Human("Joe", stephen); stephen. sayName(); // Pokaže "Moje ime je Stephen" stephen. sayGoodnight(); // Pokaže "Lahko noč, nihče." joe. sayName(); // Pokaže "Moje ime je Joe" joe. sayGoodnight(); // Pokaže "Lahko noč, Stephen" } }

Kritika

Čeprav je objektno usmerjeno programiranje priljubljeno, je veliko ljudi, ki menijo, da je slabo, in ga kritizirajo.

  • Luca Cardelli je napisal članek z naslovom "Bad Engineering Properties of Object-Oriented Languages".
  • Richard Stallman je leta 1995 zapisal: "Dodajanje OOP v Emacs očitno ni izboljšava; OOP sem uporabljal pri delu z okenskimi sistemi Lisp Machine in se ne strinjam z običajnim mnenjem, da je to boljši način programiranja."
  • Študija, ki so jo opravili Potok in drugi, pravi, da je razlika v produktivnosti med OOP in proceduralnimi pristopi zelo majhna.
  • Christopher J. Date je dejal, da je primerjava OOP z drugimi stvarmi, zlasti kako sta OOP in druga stvar povezana, težka, ker se ljudje ne strinjajo o pomenu OOP.
  • Alexander Stepanov je predlagal, da OOP daje stališče, ki je omejeno na matematiko, in ga označil za "skoraj tako veliko prevaro kot umetno inteligenco".
  • Paul Graham, uspešen internetni prodajalec in programer, je menil, da je namen OOP delovati kot mehanizem, ki povprečnim programerjem v povprečnih organizacijah preprečuje, da bi "naredili preveč škode". To tudi upočasnjuje hitrejše in boljše programerje, ki vedo, kako narediti stvari na zmogljivejši in kompaktnejši način. [1]

Vprašanja in odgovori

V: Kaj je objektno usmerjeno programiranje?


O: Objektno usmerjeno programiranje je način pisanja računalniških programov, ki uporablja "objekte" za označevanje podatkov in metod.

V: Kako se objektno usmerjeno programiranje razlikuje od proceduralnega?


O: Pri proceduralnem programiranju so računalniški programi seznam navodil za računalnik, ki mu narekujejo, naj naredi določene stvari na določen način. Pri objektno usmerjenem programiranju računalniški programi uporabljajo predmete, ki se med seboj pogovarjajo, da spremenijo podatke v teh predmetih in delujejo na način, ki ga želi uporabnik.

V: Kako objektno usmerjeno programiranje koristi razvijalcem?


O: Objektno usmerjeno programiranje omogoča, da se koda zlahka ponovno uporabi v drugih delih programa ali celo pri drugih ljudeh.

V: Po čem je znan programski jezik Python?


O: Jezik Python omogoča pisanje računalniških programov tako v objektno usmerjenem kot v proceduralnem programiranju.

V: Ali lahko navedete primere programskih jezikov, ki omogočajo pisanje računalniških programov v objektno usmerjenem programiranju?


O: Programski jeziki, ki omogočajo pisanje računalniških programov v objektno usmerjenem programiranju, so C++, Java, Ruby, Perl, Emarald, Sapphire, PHP, Python, C# itd.

V: Kaj so objekti v objektno usmerjenem programiranju?


O: Objekti so entitete v objektno usmerjenem programiranju, ki vsebujejo podatke in metode.

V: Kako delujejo objekti v objektno usmerjenem programiranju?


O: Objekti medsebojno sodelujejo, da spremenijo podatke v teh objektih in delujejo na način, ki ga želi uporabnik.

AlegsaOnline.com - 2020 / 2025 - License CC3