Objektorientētā programmēšana (OOP): kas tas ir, principi un piemēri

Objektorientētā programmēšana (OOP): skaidri principi, praktiski piemēri un padomi koda atkārtotai izmantošanai ar Java, Python, C++ u.c. — uzzini, kā veidot modulāru, uzturamu kodu.

Autors: Leandro Alegsa

Objektorientētā programmēšana (OOP) ir programmēšanas paradigmas veids, kurā datu un metožu kopas tiek organizētas kā objekti. Salīdzinājumā ar tradicionālo procedurālo pieeju — kur programma ir instrukciju secība — OOP sadala programmas loģiku pa neatkarīgiem vienībām (objektiem), kas satur savus datus (atribūtus) un uz tiem darbojošās funkcijas (metodes). Objekti «sarunājas» viens ar otru, mainot savu stāvokli un izsaucot citu objektu metodes, tā modelējot reālas pasaules entītijas un atvieglojot sarežģītu sistēmu izstrādi, uzturēšanu un atkārtotu izmantošanu.

Lielākā daļa programmēšanas valodu atbalsta vairākas paradigmas — piemēram, Python ļauj rakstīt gan objektorientētu, gan procedurālu kodu. Ir daudz valodu, kuras bieži izmanto OOP stilā. Dažas no tām ir, piemēram: C++, Java, Ruby, Perl, Emarald, Sapphire, PHP, Python u. c.

OOP pamatprincipi

  • Abstrakcija — izšķir būtisko no nesvarīgā. Kods strādā ar augsta līmeņa modeļiem (klasēm), slēpjot sarežģītību no lietotāja.
  • Encapsulācija (iepakošana) — dati un metodes, kas ar tiem strādā, tiek apvienoti vienā vienībā (klasē); iekšējais stāvoklis tiek aizsargāts, piekļuve tam notiek caur publiskām metodēm.
  • Mantošana — viena klase var pārmantot īpašības un uzvedību no citas klases, ļaujot kodu atkārtoti izmantot un paplašināt.
  • Polimorfisms — objekti ar atšķirīgām iekšējām uzvedībām var tikt izmantoti vienādi interfeisa līmenī; tas ļauj mainīt uzvedību, nemainot kodu, kas ar objektiem strādā.

Praktiskas priekšrocības

  • Labāka moduļu organizācija un skaidrāka koda struktūra.
  • Atkārtota koda izmantošana (piemēram, ar mantošanu vai kompozīciju).
  • Vienkāršāka uzturēšana un testēšana — kļūdu lokalizācija konkrētā klasē vai objektā.
  • Vieglāk paplašināma sistēma, jo jaunus tipus un funkcionalitāti var pievienot, nemainot esošo kodu.

Trūkumi un ierobežojumi

  • Var rasties pārāk liela abstrakcija vai sarežģītas klasu hierarhijas, kas apgrūtina saprašanu.
  • Dažos gadījumos OOP risinājumi var būt lēnāki vai prasīt vairāk atmiņas nekā vienkāršie procedurālie risinājumi.
  • Ne visām problēmām OOP ir piemērotākais risinājums — reizēm labāk izmantot funkcionālo vai procedurālo pieeju.

Vienkārši piemēri

Ilustrācija ar klasi un objektu (Python):

class Auto:     def __init__(self, marka, gads):         self.marka = marka         self.gads = gads      def braukt(self, attalums):         print(f"{self.marka} brauc {attalums} km.")  # Izveido objektus mans_auto = Auto("Toyota", 2018) mans_auto.braukt(15)

Piemērs ar mantošanu (Java):

class Dzivnieks {     void skaņa() {         System.out.println("Dzīvnieka skaņa");     } }  class Suns extends Dzivnieks {     @Override     void skaņa() {         System.out.println("Au au");     } }  public class Test {     public static void main(String[] args) {         Dzivnieks d = new Suns();         d.skaņa(); // izvadīs "Au au" — polimorfisma piemērs     } }

Kad izmantot OOP

  • Ja projekts ir liels un sarežģīts — OOP palīdz sadalīt problēmu loģiskās vienībās.
  • Ja ir vajadzība pēc atkārtotas izmantošanas — bibliotēkas, rāmji un komponentes bieži izmanto OOP.
  • Ja risināma problēma labi modelējas kā objektu kopums ar skaidriem atbildības jomām (piem., lietotāja konti, preces, pasūtījumi).

Papildu jēdzieni

  • Interfeiss — nosaka metožu kopu, ko klasei jāīsteno, nodrošinot saskaņotu sadarbību starp dažādiem tipiem.
  • Kompozīcija — objektu sasaistīšana ar citiem objektiem («ir daļa no»), bieži ir labāka izvēle nekā dziļa mantošana.
  • Dizaina paraugi — pārbaudītas arhitektūras pieejas (piem., Singletons, Factory, Observer), kas risina atkārtotas dizaina problēmas OOP kontekstā.

Objektorientētā programmēšana nav universāla «burvju nūjiņa», taču pareizi pielietota tā ievērojami atvieglo sarežģītu sistēmu veidošanu un uzturēšanu. Sākot strādāt ar OOP, ir lietderīgi apgūt tā pamatprincipus, labas prakses principus (piemēram, SOLID) un bieži lietotos dizaina paraugus.

Funkcijas

Objektorientētās programmēšanas galvenā ideja ir tāda, ka viss ir objekts. Tomēr objektiem var būt dažādi tipi:

  • Mainīgie var saturēt dažādu tipu informāciju (vai datus), ko atbalsta programmēšanas valoda. Piemēram, veselu skaitļu datu tips un sarakstu datu struktūra. Mainīgie ir ideja, kas jau ir pieejama procedurālajās programmēšanas valodās. Objektorientētajā programmēšanā mainīgos lielākoties sauc par atribūtiem.
  • Procedūras (pazīstamas arī kā funkcijas, metodes vai rutīnas) ir instrukciju saraksts, kas datoram uzdod pieņemt ievaddatus, veikt aprēķinus vai mainīt datus un atdot rezultātus lietotājam. Procedūras ir arī ideja, kas jau ir pieejama procedurālajās programmēšanas valodās. Objektorientētajā programmēšanā procedūras galvenokārt sauc par metodēm.
  • Klases ir dažādu mainīgo un procedūru kopums. Klases parasti sarunājas cita ar citu, lai veiktu izmaiņas datos un darbotos tā, kā lietotājs vēlas.

Objekti ir termins, ko lieto, lai apzīmētu klašu gadījumus.

Piemēri

Turpmākajos piemēros mēs izveidosim klasi ar nosaukumu Human. Šajā klasē ir atribūti name (cilvēka vārdam) un friend (drauga vārdam). Katra no klases Human metodēm satur instrukciju sarakstu, kurā izmantoti gan vārda, gan drauga atribūti.

Python

Šis kods ir rakstīts Python valodā.

klase Human(object): def __init__(self, name, friend=None): self. name = name self. friend = friend def say_name(self): print("Mans vārds ir "+self. name) def say_goodnight(self): if self. friend is None: print("Labas nakts nevienam.") else: print("Good night "+self. friend. vārds) # Izveido jaunu cilvēka objektu vārdā stephen ar vārdu "Stephen" stephen = Human("Stephen") # Izveido jaunu cilvēka objektu vārdā joe ar vārdu "Joe" un stephen kā draugu joe = Human("Joe", stephen) stephen. say_name() # Rāda "Mans vārds ir Stephen" stephen. say_goodnight() # Rāda "Labas nakts nevienam." joe. say_name() # Rāda "Mans vārds ir Joe" joe. say_goodnight() # Rāda "Labas nakts Stephen".

Java

Šis kods ir Java valodā.

Cilvēku klase

klase Human { private String name = "bez nosaukuma"; // šī Cilvēka vārds private Human friend = null; // Cilvēka draugs // Šī metode izveido jaunu Cilvēka objektu, ja tiek dots vārds un draugs public Human(String name, Human friend) { this. name = name; this. friend = friend; }      // Šī metode izveido jaunu Cilvēka objektu arī tad, ja tiek dots tikai vārds public Human(String name) { this. name = name; this. friend = null; }      // Šī metode izveido jaunu Cilvēka objektu, ja nav dots ne vārds, ne draugs public Human() { this. name = "bezvārda"; this. friend = null; } public void sayName() { System. out. println("Mans vārds ir " + this. name); } public void sayGoodnight() { if (friend == null) { System. out. println("Labas nakts nevienam."); } else { System. out. println("Labas nakts " + friend. name); }     } }

Metode sarunai ar iepriekšminēto Cilvēka klasi

klase Main { public static void main(String[] args) { // Izveido jaunu Cilvēka objektu stephen ar vārdu "Stephen" Cilvēks stephen = new Human("Stephen"); // Izveido jaunu Cilvēka objektu joe ar vārdu "Joe" un stephen kā draugu Cilvēks joe = new Human("Joe", stephen); stephen. sayName(); // Rāda "Mani sauc Stephen" stephen. sayGoodnight(); // Rāda "Labas nakts, neviens." joe. sayName(); // Rāda "Mani sauc Joe" joe. sayGoodnight(); // Rāda "Labas nakts, Stephen" } }

Kritika

Lai gan objektorientētā programmēšana ir populāra, ir daudz cilvēku, kas uzskata, ka tā ir slikta, un kritizē to.

  • Luka Kardelli (Luca Cardelli) uzrakstīja darbu ar nosaukumu "Objektorientēto valodu sliktās inženiertehniskās īpašības" (Bad Engineering Properties of Object-Oriented Languages).
  • Ričards Stallmans 1995. gadā rakstīja: "OOP pievienošana Emacs nav nepārprotams uzlabojums; es izmantoju OOP, strādājot pie Lisp Machine logu sistēmām, un es nepiekrītu ierastajam uzskatam, ka tas ir labāks programmēšanas veids."
  • Potok et al. pētījumā teikts, ka produktivitāte starp OOP un procedurālo pieeju atšķiras ļoti maz.
  • Kristofers J. Datums (Christopher J. Date) teica, ka OOP salīdzināšana ar citām lietām, jo īpaši tas, kā OOP un otra lieta ir saistītas, ir sarežģīta, jo cilvēki nav vienisprātis par OOP nozīmi.
  • Aleksandrs Stepanovs ierosināja, ka OOP sniedz viedokli, kas ir ierobežots, ciktāl matemātika, un nosauca to par "gandrīz tikpat daudz krāpšanu kā mākslīgais intelekts".
  • Pols Greiems (Paul Graham), veiksmīgs interneta pārdevējs un programmētājs, ir ierosinājis, ka OOP mērķis ir darboties kā ganāmpulka mehānismam, kas vidējiem programmētājiem vidējās organizācijās neļauj "nodarīt pārāk lielu kaitējumu". Tas arī palēnina ātrākus, labākus programmētājus, kuri zina, kā darīt lietas jaudīgāk un kompaktāk.. [1]

Jautājumi un atbildes

J: Kas ir objektorientēta programmēšana?


A: Objektorientētā programmēšana ir veids, kā rakstīt datorprogrammas, izmantojot "objektus", kas apzīmē datus un metodes.

Q: Ar ko objektorientētā programmēšana atšķiras no procedurālās programmēšanas?


A: Procedurālās programmēšanas gadījumā datorprogrammas ir instrukciju saraksts datoram, kas liek tam veikt noteiktas darbības noteiktā veidā. Objektorientētajā programmēšanā datorprogrammās tiek izmantoti objekti, kas savā starpā sarunājas, lai mainītu šajos objektos esošos datus un darbotos tā, kā lietotājs vēlas.

J: Kādu labumu objektorientētā programmēšana dod izstrādātājiem?


A: Objektorientētā programmēšana ļauj kodu viegli atkārtoti izmantot citās programmas daļās vai pat citos cilvēkos.

J: Ar ko ir pazīstama Python programmēšanas valoda?


A: Python ļauj datorprogrammas rakstīt gan objektorientētas, gan procedurālas programmēšanas režīmā.

J: Vai varat minēt piemērus par programmēšanas valodām, kas ļauj rakstīt datorprogrammas objektorientētā programmēšanā?


A: Programmēšanas valodas, kas ļauj rakstīt datorprogrammas objektorientētā programmēšanā, ir C++, Java, Ruby, Perl, Emarald, Sapphire, PHP, Python, C# utt.

J: Kas ir objekti objektorientētajā programmēšanā?


A: Objekti ir objektorientētās programmēšanas vienības, kas satur datus un metodes.

J: Kā objekti darbojas objektorientētajā programmēšanā?


A: Objekti mijiedarbojas viens ar otru, lai mainītu šajos objektos esošos datus un darbotos tā, kā lietotājs vēlas.


Meklēt
AlegsaOnline.com - 2020 / 2025 - License CC3