Arvutid ja kaasaegsed vidinad

Objektorienteeritud programmeerimine (OOP) on praegu kõige populaarsem programmeerimistehnoloogia. Objektorienteeritud programmeerimine on struktureeritud programmeerimistehnoloogia edasiarendus, kuid sellel on oma iseloomulikud tunnused.

Levinumad objektorienteeritud visuaalse programmeerimise süsteemid on Microsoft Visual Basic ja Borland Delphi.

Objektorienteeritud programmeerimise keskmes on objektidest rakenduste loomine, nagu maju ehitatakse plokkidest ja erinevatest osadest. Mõned objektid tuleb luua täiesti iseseisvalt, teised saab aga valmis laenutada erinevatest raamatukogudest.

Objektorienteeritud programmeerimistehnoloogias on olulisel kohal sündmus. Sündmusteks võivad olla hiireklõps objektil, teatud klahvi vajutamine, dokumendi avamine jne. Reaktsioonina sündmustele kutsutakse välja teatud protseduur, mis võib muuta objekti omadusi, kutsuda välja selle meetodeid jne.

Objektorienteeritud programmeerimissüsteemid kasutavad programmeerimisprotsessi visualiseerimiseks tavaliselt graafilist liidest. Hiire abil on võimalik luua objekte, määrata nende omadusi ja käitumist.

Objektil on ühelt poolt teatud omadused, mis iseloomustavad tema olekut antud ajahetkel, teisalt on võimalikud toimingud, mis toovad kaasa omaduste muutumise.

Objektorienteeritud programmeerimise põhiüksus on objekt, mis kapseldab nii seda kirjeldavaid andmeid (omadused) kui ka vahendeid nende andmete töötlemiseks (meetodid).

Kapseldamine on objekti omaduste ja sellega seotud võimalike operatsioonide (meetodite) liit.

Teine OOP-i aluseks olev põhimõte on võimalus luua uus objektide klass mõne juba olemasoleva klassi omaduste ja meetodite pärandusega.

Pärand on võime tuletada üks klass teisest, säilitades samal ajal kõik esivanemate klassi (eellase, mõnikord nimetatakse ka superklassiks) omadused ja meetodid ning lisades vajadusel uusi omadusi ja meetodeid.

Pärimise teel seotud klasside kogumit nimetatakse hierarhiaks. Pärand on mõeldud peegeldama sellist reaalse maailma omadust nagu hierarhia.

Teine OOP põhimõte on polümorfismi põhimõte.

Polümorfism on nähtus, mille puhul sama nimega funktsioon (meetod) vastab erinevale programmikoodile (polümorfsele koodile) sõltuvalt sellest, millise klassi objekti selle meetodi välja kutsumisel kasutatakse.

Polümorfism tagatakse esivanemaklassi meetodi realiseerimise muutmisega järglasklassis koos meetodi signatuuri kohustusliku säilitamisega. See tagab, et esivanema klassi liides jääb muutumatuks ja võimaldab koodis oleva meetodi nime seostada erinevate klassidega - millise klassi objektilt kutsutakse, sellest klassist võetakse etteantud nimega meetod. Seda mehhanismi nimetatakse dünaamiliseks (või hiliseks) linkimiseks – erinevalt staatilisest (varajasest) linkimisest, mis viiakse läbi kompileerimise ajal

Objektorienteeritud lähenemine võimaldab kombineerida staatilist mudelit, mis kirjeldab objekti omadusi ja dünaamilist mudelit, mis kirjeldab nende muutusi.

Selle lähenemise korral on ligipääs objekti omaduste muutmisele võimalik ainult sellele objektile kuuluvate meetodite kaudu. Meetodid "ümbritsevad" objekti omadusi; omadused on väidetavalt "kapseldatud" objektis.

Seega on objektorienteeritud programmeerimisel kesksel kohal objektid, mis ühendavad üheks tervikuks (kapseldavad) objekti omadused ja sellel võimalikud toimingud (meetodid).

Objektid, mis sisaldavad sama omaduste ja toimingute loendit, ühendatakse klassid. Iga üksik objekt on klassi näide. Klassi eksemplaridel võivad olla erinevad atribuutide väärtused.

Näiteks võib arvuti failisüsteem sisaldada sadu või tuhandeid faile. Kõigil failidel on sama atribuutide (nimi, asukoht failisüsteemis jne) ja toimingute (ümbernimetamine, teisaldamine või kopeerimine jne) komplekt ning need moodustavad objektide klassi Failid.

Iga üksik fail on selle klassi eksemplar ja sellel on spetsiifilised atribuutide väärtused (nimi, asukoht jne).

Tihti tuleb ette olukord, kus samu operatsioone saab teha erinevate klasside objektidega. Enamikku Windowsi keskkonna objektide klasse (kaustad, dokumendid, sümbolid jne) iseloomustab ka samade toimingute kogum (ümbernimetamine, teisaldamine, kopeerimine, kustutamine jne). See ühtlus on väga kasutajasõbralik.

Siiski on ilmne, et nende toimingute rakendamise mehhanismid ei ole erinevate klasside jaoks samad. Näiteks kausta kopeerimiseks peate tegema toimingute jada failisüsteemi muutmiseks ja sümboli kopeerimiseks dokumendis muudatusi tegema. Neid toiminguid teostavad erinevad programmid, mis on saadaval vastavalt Windowsi operatsioonisüsteemis ja Wordi tekstiredaktoris.

Sel viisil realiseeritakse polümorfism, need. võimalus teha samu toiminguid erinevatesse klassidesse kuuluvate objektidega, säilitades samas iga klassi jaoks individuaalsed meetodid nende rakendamiseks.

Moodustuvad objektid, millel on samad omaduste ja meetodite komplektid objektiklass. Niisiis, Wordi rakenduses on objektiklass dokument(Dokumendid), millel on järgmised omadused: Nimi(nimi), asukohtmine(FileNaine) jne. Selle klassi objektidel on ka teatud meetodite komplekt, näiteks: dokumendi avaminepolitseinik(Avatud) dokumentide printimine(Prindi välja), säilitaminedokument(Salvesta) jne.

Rakendustes olevad objektid moodustavad mingisuguse hierarhia. Objekti hierarhia ülaosas on rakendus(Rakendus). Seega sisaldab Wordi rakenduse objektide hierarhia järgmisi objekte: rakendus(rakendus), dokument(Dokumendid), dokumendi fragment(Valik), sümbol(Tegelane) jne.

Exceli rakenduse objektide hierarhia sisaldab järgmisi objekte. rakendus(rakendus), raamat(tööraamat), leht(Tööleht) rakuvahemik(vahemik), rakudka(Cell) jne.

Täielik viide objektile koosneb järjestikuste üksteise sees pesastatud objektide nimede seeriast. Selle seeria objektinimede eraldajad on punktid; seeria algab kõrgeima taseme rakenduse objektiga ja lõpeb meid huvitava objekti nimega. Näiteks Wordi dokumendi Пpo6a.doc link näeb välja selline:

Rakendus. Dokumendid("Ppo6a.doc")

Selleks, et objekt saaks sooritada mis tahes toimingut, tuleb määrata meetod. Paljudel meetoditel on argumendid, mis võimaldavad määrata tehtavate toimingute parameetreid. Argumentidele konkreetsete väärtuste määramiseks kasutatakse koolonit ja võrdusmärki ning argumendid eraldatakse komaga.

Visual Basicus iseloomustavad objekte mitte ainult omadused ja meetodid, vaid ka sündmused. Sündmus on tegevus, mille objekt tunneb ära. Sündmuse võib genereerida kasutaja (näiteks hiirenupu või klaviatuuri klahvi vajutamine) või see võib olla muude rakendusobjektide töö tulemus.

Iga sündmuse jaoks saate programmeerida vastuse, st objekti reaktsiooni toimunud sündmusele. Seda programmi nimetatakse sündmuse protseduur. Sündmusprotseduuri nimi koosneb tavaliselt objekti nimest ja sündmuse nimest. Näiteks nupuobjekti nimega Käsk1 ja sündmused Klõpsake("klõps", mis tekib, kui liigutame hiirekursori nupu pildi kohale ja vajutame hiire vasakut nuppu) sündmuse protseduur saab nime Käsk1_ Klõpsake.

Ürituse protseduuris võivad osaleda mitmed objektid. Näiteks ülalmainitud protseduuris Käsk1_ Klõpsake meeskond võib kohal olla

Tekst1. Tekst= "Tere!",

mille täitmise tulemusena "tekstiväljal" objekt nimega Tekst1 Ilmub rida sõnaga "Tere!".

Visuaalne programmeerimine, mille meetodeid kasutab arenduskeskkond Visual Basic, võimaldab luua graafilise liidese arendatud rakendustele, mis põhinevad juhtelementide kasutamisel, mille hulka kuuluvad nupud(CommandButton), märkeruudud(Märkeruut) , tekstiväljad(Tekstikast) liitkastid(ListBox) ja teised. Neid objekte, nende omadusi ja meetodeid käsitletakse järgmises jaotises. Praegu pange tähele, et kõige sagedamini kasutatakse juhtelemente kasutajalt andmete vastuvõtmiseks ja rakenduse tulemuste kuvamiseks. Seega on juhtnupud rakenduse kasutajaliidese ehitamise aluseks.

Peamised visuaalses programmeerimises kasutatavad objektid on vormid(Vorm). Vorm on aken, millele asetatakse juhtelemendid. Vorm on ka objekt, mida iseloomustab omaduste ja meetodite kogum. Nagu iga teise objekti puhul, saate vormile kirjutada näiteks sündmuse protseduuri Vorm_ Laadige, mis käivitatakse Laadi sündmuse toimumisel ja mille tulemusena täidetakse käivitatud rakenduse tööks vajalikud juhised.

kasutas sisuliselt ettekirjutava programmeerimise paradigmat – eesmärk oli luua kood, mis toimiks vastavalt andmetele. Selline lähenemine sobib hästi väikeste probleemide lahendamiseks, kuid tekitab loomisel palju lahendamatuid probleeme suured tarkvarasüsteemid.

Üks alternatiividest direktiivne programmeerimine on objektorienteeritud programmeerimine, mis tõesti aitab toime tulla programmide mittelineaarselt kasvava keerukusega, kui nende maht suureneb. Siiski ei tohiks järeldada, et objektorienteeritud programmeerimise paradigma kasutamine tagab kõigi probleemide eduka lahenduse.

Programmeerimise professionaaliks saamiseks on vaja annet, loovust, intelligentsust, teadmisi, loogikat, oskust ehitada ja kasutada abstraktsioone ning mis kõige tähtsam – kogemusi.

Selles osas jätkame raamatu esimeses peatükis alustatud objektorienteeritud programmeerimise põhimõistete tutvustamist. Esiteks arutatakse erinevatele programmeerimiskeeltele ühiseid OOP-kontseptsioone ja seejärel nende rakendamist Java keeles.

Peaksite teadma, et objektorienteeritud programmeerimise kursust õpetatakse bakalaureuseõppe üliõpilastele terve semestri jooksul ja seetõttu on allpool esitatud materjal vaid väga lihtne sissejuhatus OOP maailma. Raamatus on palju täielikum käsitlus paljudest objektorienteeritud projekteerimise, projekteerimise ja programmeerimisega seotud probleemidest ning raamatu kolmandast peatükist leiate väga selge kirjelduse kõigist objektorienteeritud aspektidest. Java keel.

OOP-i põhikontseptsioonid

Objektorienteeritud programmeerimine või OOP (objektorienteeritud programmeerimine) - programmeerimismetoodika põhineb programmi kujutamisel objektide kogumina, millest igaüks on teatud tüüpi teostus, kasutades mehhanismi sõnumite edastamine aastal korraldatud klassid pärimishierarhia.

OOP keskne element on abstraktsioon. Andmed teisendatakse abstraktsiooni abil objektideks ja nende andmete töötlemise jada muutub nende objektide vahel edastatavateks sõnumiteks. Igal objektil on oma ainulaadne käitumine. Objekte võib käsitleda kui konkreetseid üksusi, mis vastavad sõnumitele, mis käsivad neil mõnda toimingut sooritada.

OOP-i iseloomustavad järgmised põhimõtted (vastavalt Alan Kayle):

  • kõik on objekt;
  • arvutused viiakse läbi objektidevahelise interaktsiooni (andmevahetuse) kaudu, mille puhul üks objekt nõuab mõne toimingu sooritamiseks teist objekti; objektid suhtlevad sõnumeid saates ja vastu võttes; sõnum on toimingu sooritamise taotlus, mida täiendab argumentide kogum, mida võib toimingu sooritamisel vaja minna;
  • igal objektil on iseseisev mälu, mis koosneb muudest objektidest;
  • iga objekt on klassi esindaja, mis väljendab antud tüüpi objektide üldisi omadusi;
  • klassis seatud funktsionaalsust(objekti käitumine); seega saavad kõik objektid, mis on sama klassi eksemplarid, sooritada samu toiminguid;
  • klassid on organiseeritud ühtseks puustruktuuriks, millel on ühine juur, nn pärimishierarhia; konkreetse klassi eksemplaridega seotud mälu ja käitumine on automaatselt kättesaadavad hierarhilises puus madalamal tasemel olevatele klassidele.

Definitsioon 10.1. Abstraktsioon- probleemi lahendamise meetod, milles erinevat tüüpi objekte ühendab ühine mõiste (kontseptsioon) ja seejärel käsitletakse rühmitatud üksusi ühe kategooria elementidena.

Abstraktsioon võimaldab eraldada programmifragmendi loogilise tähenduse selle rakendamise probleemist, jagamisest väline kirjeldus objekti (liides) ja selle sisemine korraldus(rakendamine).

Definitsioon 10.2. Kapseldamine- tehnika, mille sisse peidetakse objekti liidese seisukohalt ebaoluline teave.

Definitsioon 10.3. Pärand- objektide omadus, mille kaudu klassi eksemplarid saavad juurdepääsu esivanemate klasside andmetele ja meetoditele neid uuesti määratlemata.

Pärimine võimaldab erinevatel andmetüüpidel jagada sama koodi, mille tulemuseks on väiksem kood ja suurem funktsionaalsus.

Definitsioon 10.4.

Üldine informatsioon

OOP on programmeerimisstiil, mis ilmus 20. sajandi 80ndatel. Erinevalt protseduurikeeltest, kus andmed ja nende töötlemise juhised eksisteerivad eraldi, on objektorienteeritud programmeerimisel see teave ühendatud üheks tervikuks.

OOP põhiprintsiibid

Pärand

Teine OOP-i põhimõte, pärimine, on ühe klassi võime kasutada teise klassi meetodeid, kordamata nende tegelikku rakendamist. Pärand võimaldab vabaneda lähtekoodi liiasusest.

Polümorfism

Teine OOP põhimõte on polümorfism. Selle kasutamine tähendab, et erineva keerukusastmega objektidega manipuleerimiseks saate luua ühe liidese, mis reageerib sündmustele erinevalt ja rakendab samal ajal õigesti määratud ülesandeid.

OOP keeled

OOP põhimõtteid kasutatakse kõige populaarsemates programmeerimiskeeltes nagu C++ ja Java, milles töötatakse välja märkimisväärne osa programmidest ja rakendustest. Samuti on vähem kasutatud OOP keeli - Delphi, Object Pascal, Ruby ja paljud teised.

OOP kriitika

Vaatamata valdavalt positiivsetele väidetele selle metoodika suhtes, kritiseeritakse OOP põhimõtteid sageli. Nagu OOP-il, on sellel omad puudused.

Esiteks ülemineku raskus. OOP-i põhimõtete mõistmine võtab üsna palju aega, eriti inimestel, kes töötavad tihedalt ainult protseduuriliste programmeerimiskeeltega.

Teiseks on puuduseks keerulisem dokumentatsioon, kuna on vaja kirjeldada mitte ainult klasse ja objekte, vaid ka nende rakendamise konkreetseid juhtumeid.

Kolmandaks võib meetodite liigne universaalsus viia selleni, et lähtekood ja arendatud programmid on ülekoormatud funktsioonide ja võimalustega, mille järele antud juhul pole nõudlust. Lisaks märgivad nad ebaefektiivsust mälu eraldamise osas. Kuid hoolimata teiste arvamustest kasvab OOP programmeerijate arv pidevalt ja keeled ise arenevad kiiresti.

Tere! Kas olete kunagi mõelnud, miks Java on kujundatud nii, nagu see on? Selles mõttes, et lood klassid, nende põhjal - objektid, klassidel on meetodid jne. Aga miks on keele struktuur selline, et programmid koosnevad klassidest ja objektidest, mitte millestki muust? Miks oli kontseptsioon " objekt” ja asetada esiplaanile? Kas kõik keeled töötavad sel viisil ja kui ei, siis millist kasu see Javale annab? Nagu näha, siis küsimusi on palju :) Proovime tänases loengus vastata igaühele neist.

Mis on objektorienteeritud programmeerimine (OOP)

Muidugi koosneb Java mingil põhjusel objektidest ja klassidest. See pole selle loojate kapriis ega isegi nende leiutis. On palju teisi keeli, mis põhinevad objektidel. Esimest sellist keelt nimetati Simul, ja see leiutati 1960. aastatel Norras. Muuhulgas tutvustas Simula mõisteid “ Klass "Ja" meetod ». Kristen Nygaard ja Ole Johan Dahl - Simula loojad

Näib, et Simul- programmeerimisstandardite järgi iidne keel, kuid nende "perekondlik" seos Javaga on palja silmaga nähtav. Tõenäoliselt saate hõlpsasti lugeda sellele kirjutatud koodi ja selgitada üldiselt, mida see teeb :) Begin Class Ristkülik (laius, kõrgus) ; tegelik laius, kõrgus; Alusta tegelikku ala, perimeetrit; protseduuri uuendamine; Algusala: = Laius * Kõrgus; OutText( "Ristkülikut värskendatakse, ala = ") ; OutFix(ala, 2, 8); OutImage; Ümbermõõt : = 2 * (laius + kõrgus) ; OutText( "Ristkülikut värskendatakse, perimeeter = ") ; OutFix(perimeeter, 2, 8); OutImage; Värskenduse lõpp; Värskenda; OutText("Loodud ristkülik: "); OutFix(laius, 2, 6); OutFix(kõrgus, 2, 6); OutImage; Ristküliku lõpp; Ristkülikuklass VärvilineRistkülik(värv); Teksti värv; Alusta OutText ( "Loodud värviline ristkülik, värv = ") ; Väljundtekst(värv); OutImage; Värvilise ristküliku lõpp; Ref(Ristkülik)Cr; Cr: - uus värviline ristkülik (10, 20, "roheline"); Lõpp; Koodinäide on võetud artiklist Simula - 50 aastat OOP-i. Nagu näha, ei erine Java ja selle esivanem üksteisest nii palju :) Seda põhjusel, et Simula ilmumine tähistas uue kontseptsiooni sündi - objektorienteeritud programmeerimine. Wikipedia annab OOP järgmise definitsiooni: Objektorienteeritud programmeerimine (OOP) - programmeerimismetoodika, mis põhineb programmi esitamisel objektide kogumina, millest igaüks on konkreetse klassi eksemplar ja klassid moodustavad pärimishierarhia. Minu arvates on see väga edukas. Hiljuti alustasite Java õppimist, kuid selles pole peaaegu ühtegi teile võõrast sõna :) Täna OOP- levinuim programmeerimismetoodika. Lisaks Javale kasutatakse neid paljudes populaarsetes keeltes, millest olete ehk kuulnud. Need on C++ (seda kasutavad aktiivselt arvutimängude arendajad), Objective-C ja Swift (nad kirjutavad programme Apple'i seadmetele), Python (kõige nõutum masinõppes), PHP (üks populaarsemaid veebiarenduskeeli), JavaScript (lihtsamalt öeldes, mida nad sellega ei tee) ja paljud teised. Mis on tegelikult need OOP-i "põhimõtted"? Räägime teile üksikasjalikumalt.

OOP põhimõtted

See on põhitõed. 4 peamist omadust, mis koos moodustavad objektorienteeritud programmeerimise paradigma. Nende mõistmine on edukaks programmeerijaks saamise võti.

Põhimõte 1. Pärand.

Hea uudis on see, et olete mõne OOP-i põhimõttega juba tuttav! :) Pärimisega oleme juba paar korda loengutes kokku puutunud ja sellega on olnud aega tegeleda. Pärand - mehhanism, mis võimaldab kirjeldada uut klassi olemasoleva (vanema) klassi põhjal. Sel juhul laenab uus klass ülemklassi omadused ja funktsionaalsused. Miks on pärimine vajalik ja millist kasu see annab? Esiteks – koodi taaskasutus. Ülemklassides kirjeldatud välju ja meetodeid saab kasutada järeltulijate klassides. Kui kõigil autotüüpidel on 10 ühist välja ja 5 identset meetodit, peate need lihtsalt lisama põhiklassi Automaatne. Saate neid ilma probleemideta kasutada järeltulijate klassides. Kindlad eelised: nii kvantitatiivselt (vähem koodi) kui ka sellest tulenevalt kvalitatiivselt (klassid muutuvad palju lihtsamaks). Samas on pärimismehhanism väga paindlik ning järeltulijates saab puuduoleva funktsionaalsuse eraldi lisada (mõned väljad või konkreetsele klassile omane käitumine). Üldiselt nagu tavaelus: me kõik oleme mõnes mõttes sarnased oma vanematega, aga mõnes mõttes erinevad neist :)

Põhimõte 2. Abstraktsioon

See on väga lihtne põhimõte. Abstraktsioon tähendab objekti peamiste, kõige olulisemate omaduste esiletõstmist ja vastupidi – sekundaarsete, ebaoluliste omaduste kõrvale jätmist. Ärgem leiutagem jalgratast ja meenutagem näidet vanast loengust tundidest. Oletame, et loome ettevõtte töötajate failikappi. Töötajaobjektide loomiseks kirjutasime klassi Töötaja. Millised omadused on nende kirjeldamisel ettevõtte toimikus olulised? Täisnimi, Sünnikuupäev, isikukood, TIN. Kuid on ebatõenäoline, et seda tüüpi kaardil vajame tema pikkust, silmade ja juuste värvi. Ettevõte ei vaja neid andmeid töötaja kohta. Seetõttu määrame klassi Töötaja jaoks muutujad String name , int vanus , int socialInsuranceNumber ja int taxNumber ning meie jaoks ebavajaliku abstraktse teabe, nagu silmade värv. Kui aga koostame agentuurile fotomodellide kataloogi, muutub olukord kardinaalselt. Fotomudeli kirjeldamiseks on see meie jaoks väga oluline kõrgus, silmade värv Ja juuksevärv ja TIN-numbrit pole vaja. Seetõttu loome Model klassis muutujad String height, String hair, String eyes.

3. põhimõte: kapseldamine

Oleme sellega juba kokku puutunud. Java-s kapseldamine tähendab andmetele juurdepääsu ja nende muutmise võimaluse piiramist. Nagu näete, põhineb see sõnal "kapsel". Sellesse "kapslisse" peidame mõned meie jaoks olulised andmed, mida me ei soovi, et keegi muudaks. Lihtne näide elust. Teil on ees- ja perekonnanimi. Kõik, keda sa tead, teavad neid. Kuid neil pole juurdepääsu teie ees- ja perekonnanime muutmiseks. Võib öelda, et see protsess on passipunktis "kapseldatud": seal saate muuta ainult oma ees- ja perekonnanime ning seda saate teha ainult teie. Teistel "kasutajatel" on kirjutuskaitstud juurdepääs teie ees- ja perekonnanimele :) Teine näide on teie korteris olev raha. Nende jätmine keset tuba nähtavale kohale ei ole hea mõte. Iga "kasutaja" (inimene, kes tuleb teile koju) saab muuta teie raha numbrit, st. võta nad kaasa. Parem on need kapseldada seifi. Ainult teil on juurdepääs ja ainult spetsiaalse koodiga. Ilmsed näited kapseldamisest, millega olete juba töötanud, on juurdepääsu modifikaatorid ( privaatne, avalik jne), samuti getterite seadjad. Kui Kasside klassi vanuseväli ei ole kapseldatud, võib igaüks kirjutada: Kass. vanus = - 1000 ; Ja kapseldamise mehhanism võimaldab kaitsta vanusevälja settermeetodiga, mille puhul saame kontrollida, et vanus ei saa olla negatiivne arv.

Põhimõte 4. Polümorfism

Polümorfism - see on võime töötada mitme tüübiga, nagu oleksid nad sama tüüpi. Sel juhul erineb objektide käitumine sõltuvalt tüübist, millesse need kuuluvad. Kõlab natuke keeruliselt? Mõtleme selle nüüd välja. Võtame kõige lihtsama näite – loomad. Loome ühe meetodiga - voice() - klassi Loom ja selle kaks järglast - Kass ja Koer. public class Animal ( public void voice () ( System. out. println ("Hääl!" ) ; ) ) public class Koer pikendab Loomade ( @Override public void voice () () ( System. out. println ( "Auh-woo!") ) ; ) ) avalik klass Kass pikendab Looma ( @Override public void voice () ( System. out. println ( "Mjäu!" ) ; ) ) Nüüd proovime luua Animal viite ja määrata sellele Dog objekti. public class Main ( public static void main (String args) ( Animal dog = new Dog () ; dog. voice () ; ) ) Mis meetodit teie arvates kutsutakse? Animal.voice() või Dog.voice() ? Kutsutakse välja klassi meetod Koer : Kumm-vau! Lõime looma viite, kuid objekt käitub nagu koer. Vajadusel oskab ta käituda nagu kass, hobune või muu loom. Peaasi, et konkreetse järeltulija klassi objektile määratakse üldist tüüpi Animal viide. See on loogiline, sest kõik koerad on loomad. Seda me mõtlesime, kui ütlesime, et "objektid käituvad erinevalt sõltuvalt nende tüübist". Kui peaksime looma kassiobjekti - avalik staatiline tühimik (String args) ( Loomakass = uus Kass () ; kassi hääl () ; ) hääle() meetod väljastaks " Mjäu!». Mida tähendab "oskus töötada mitme tüübiga, nagu oleksid nad sama tüüpi"? See on ka üsna lihtne. Kujutagem ette, et loome loomade juuksurisalongi. Meie juuksuritöökoda peab saama lõigata kõikide loomade karvu, seega loome meetodi shear() parameetriga Animal – see loom, keda me lõikame. avalik klass AnimalBarbershop ( public void shear (Animal animal) ( System. out. println ( "Soeng on valmis!") ; )) Ja nüüd saame nii kassi kui ka koera esemed pügamismeetodile üle anda! public static void main (String args) ( Cat cat = new Cat () ; Dog dog = new Dog () ; AnimalBarbershop barbershop = new AnimalBarbershop () ; barbershop. shear (cat) ; barbershop. shear (koer) ; ) Siin me go Näide: AnimalBarbershopi klass kohtleb kassi ja koera tüüpe nii, nagu oleksid nad sama tüüpi. Samal ajal on kassil ja koeral erinev käitumine: nende hääl on erinev.

OOP tekkimise põhjused

Miks see uus programmeerimise kontseptsioon tekkis? OOP ? Programmeerijatel olid tööriistad, mis töötasid: näiteks protseduurikeeled. Mis ajendas neid midagi täiesti uut leiutama? Esiteks nende ees seisvate ülesannete keerukus. Kui 60 aastat tagasi nägi programmeerija ülesanne välja selline: “arvuta matemaatiline võrrand nii ja naa”, siis nüüd võib see kõlada nii, et “rakendada 7 erinevat lõppu mängule S.T.A.L.K.E.R. sõltuvalt sellest, milliseid otsuseid kasutaja mänguhetkedel A, B, C, D, E, F ja nende otsuste kombinatsioonides tegi. Nagu näete, on ülesanded viimastel aastakümnetel selgelt keerulisemaks muutunud. See tähendab, et andmetüübid on muutunud keerukamaks. See on veel üks põhjus OOP tekkeks. Võrrandiga näidet saab hõlpsasti lahendada tavaliste primitiivide abil, siin pole objekte vaja. Kuid mängu lõpuga seotud probleemi on raske isegi kirjeldada, kui kasutate mõnda teie väljamõeldud klassi. Kuid samas on seda üsna lihtne klasside ja objektide kaupa kirjeldada: ilmselgelt läheb meil klassi vaja Mäng, Klass Stalker, Klass Lõpetamine, Klass Mängija otsus, Klass Mänguhetk ja nii edasi. See tähendab, et isegi probleemi lahendama asumata suudame oma peas hõlpsalt ette kujutada selle lahenduse "visandeid". Probleemide suurenev keerukus on sundinud programmeerijaid probleemi osadeks jagama. Kuid protseduurilises programmeerimises polnud see nii lihtne. Ja väga sageli oli programm hunniku okstest koosnev "puu", millel oli kõik selle toimimise võimalused. Olenevalt teatud tingimustest käivitati programm mööda ühte või teist haru. Väikeste programmide jaoks oli see valik mugav, kuid suure ülesande osadeks jagamine oli väga keeruline. Sellest vajadusest sai veel üks OOP tekkimise põhjus. See kontseptsioon andis programmeerijatele võimaluse jagada programm klasside "mooduliteks", millest igaüks täitis oma osa tööst. Kõik üksteisega suhtlevad objektid moodustavad meie programmi töö. Lisaks saab meie kirjutatud koodi mujal programmis uuesti kasutada, mis säästab samuti palju aega. Selle postituse ingliskeelne versioon:

Tõenäoliselt on pooled vabadest töökohtadest (kui mitte rohkem) eeldavad teadmisi ja arusaamist OOP-st. Jah, see metoodika on kindlasti köitnud paljusid programmeerijaid! Tavaliselt tuleb OOP-i mõistmine kogemusega, kuna sellel teemal pole praktiliselt ühtegi sobivat ja juurdepääsetavat materjali. Ja isegi kui neid on, pole kaugeltki kindel, et lugejad nende otsa komistavad. Loodan, et suudan selle imelise metoodika põhimõtteid, nagu öeldakse, oma näppudel lahti seletada.

Niisiis, juba artikli alguses mainisin juba terminit "metoodika". Programmeerimisel kasutamisel tähendab see termin koodi korraldamise viiside komplekti olemasolu, selle kirjutamise meetodeid, millest kinni pidades saab programmeerija kirjutada täiesti kasutatavaid programme.

OOP (ehk objektorienteeritud programmeerimine) on programmikoodi korraldamise viis, kus programmi peamisteks ehitusplokkideks on objektid ja klassid ning programmi loogika on üles ehitatud nende koostoimele.


Objektide ja klasside kohta

Klass- see on andmestruktuur, mille saab koostada programmeerija ise. OOP terminites koosneb klass väljad(lihtsamalt öeldes - muutujad) ja meetodid(lihtsamalt öeldes - funktsioonid). Ja nagu selgus, annab andmete ja funktsioonide kombinatsioon sellega töötamiseks ühes struktuuris kujuteldamatu jõu. Objekt on klassi konkreetne eksemplar. Järgides klassi analoogiat andmestruktuuriga, on objekt spetsiifiline andmestruktuur, mille väljadele on määratud teatud väärtused. Lubage mul selgitada näitega:

Oletame, et peame kirjutama programmi, mis arvutab kolmnurga ümbermõõdu ja pindala, mille annavad kaks külge ja nendevaheline nurk. Sellise programmi kirjutamiseks OOP-i abil peame looma klassi (st struktuuri) kolmnurga. Klass Triangle salvestab kolm välja (kolm muutujat): külg A, külg B, nendevaheline nurk; ja kaks meetodit (kaks funktsiooni): arvutage ümbermõõt, arvutage pindala. Selle klassi abil saame kirjeldada mis tahes kolmnurka ning arvutada ümbermõõt ja pindala. Seega nimetatakse kindlat kolmnurka, millel on kindlad küljed ja nendevaheline nurk, klassi Triangle eksemplariks. Seega on klass mall ja eksemplar malli konkreetne teostus. Kuid eksemplarid on objektid, st konkreetsed elemendid, mis salvestavad konkreetseid väärtusi.

Üks levinumaid objektorienteeritud programmeerimiskeeli on java. Seal lihtsalt ei saa ilma esemeid kasutamata hakkama. Selline näeks välja selles keeles kolmnurka kirjeldava klassi kood:

/** * Kolmnurga klass. */ klass Kolmnurk ( /** * Spetsiaalne meetod, mida nimetatakse klassi konstruktoriks. * Võtab sisendiks kolm parameetrit: * külje A pikkus, külje B pikkus, * nurk nende külgede vahel (kraadides) */ Kolmnurk(kahekülgA, double poolB , topeltnurkAB) ( this.sideA = sideA; this.sideB = sideB; this.angleAB = nurkAB; ) double sideA; //Klassi väli, salvestab külje A väärtuse kirjeldatud kolmnurga topeltküljeleB; //Klassi väli , salvestab kirjeldatud kolmnurga topeltnurga AB külje B väärtuse; //Klassi väli salvestab kirjeldatud kolmnurga kahe külje vahelise nurga (kraadides) /** * Klassimeetod, mis arvutab kolmnurga pindala */ double getSquare() ( double ruut = see.külgA * see .külgB * Math.sin(this.angleAB * Math.PI / 180); return ruut; ) /** * Klassimeetod, mis arvutab kolmnurga ümbermõõdu */ double getPerimeter() ( double sideC = Math.sqrt(Math.pow (this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math.cos(this. nurkAB * Math.PI / 180)); topeltperimeeter = see.külgA + see.külgB + külgC; tagasi perimeeter; ) )

Kui lisame klassi sisse järgmise koodi:

/** * Siin töötab programm */ public static void main(String args) ( //Väärtused 5, 17, 35 lähevad Triangle klassi konstruktorisse Triangle triangle1 = new Triangle(5, 17, 35 ); System.out .println("Kolmnurga 1 pindala: "+kolmnurk1.getRuut()); System.out.println("Kolmnurga 1 ümbermõõt: "+triangle1.getPerimeter()); //Väärtused 6 , 8, 60 minge Triangle klassi konstruktorisse Triangle triangle2 = new Triangle(6, 8, 60); System.out.println("Kolmnurga1 pindala: "+triangle2.getSquare()); System.out.println ("Kolmnurga 1 ümbermõõt: "+kolmnurk2.getPerimeter()); )

siis saab programmi juba käivitada. See on Java keele funktsioon. Kui klassis on selline meetod

Avalik staatiline tühimik (String args)

siis saab selle klassi käivitada. Vaatame koodi üksikasjalikumalt. Alustame joonest

Kolmnurk kolmnurk1 = uus kolmnurk(5, 17, 35);

Siin loome Triangle klassi triangle1 eksemplari ja anname sellele kohe külgede parameetrid ja nendevahelise nurga. Samal ajal kutsutakse välja spetsiaalne meetod, mida nimetatakse konstruktoriks ja mis täidab objekti väljad konstruktorile edastatud väärtustega. Kuidas on lood joontega?

System.out.println("Kolmnurga1 pindala: "+kolmnurk1.getRuut()); System.out.println("Kolmnurga 1 ümbermõõt: "+kolmnurk1.getPerimeter());

väljastage konsooli kolmnurga arvutatud pindala ja selle ümbermõõt.

Sama juhtub klassi kolmnurga teise eksemplariga.

Klasside olemuse ja betoonobjektide ehituse mõistmine on enesekindel esimene samm OOP metoodika mõistmiseks.

Taaskord kõige tähtsam:

OOP- see on viis programmikoodi korraldamiseks;

Klass- see on kohandatud andmestruktuur, mis koondab andmed ja funktsioonid nendega töötamiseks (klassiväljad ja klassimeetodid);

Objekt on klassi konkreetne eksemplar, mille väljadele on antud kindlad väärtused.


Kolm võlusõna

OOP sisaldab kolme peamist lähenemisviisi: pärimine, kapseldamine ja polümorfism. Alustuseks annan vikipeediast definitsioonid:

Kapseldamine on süsteemi atribuut, mis võimaldab teil klassis kombineerida andmeid ja nendega töötavaid meetodeid. Mõned keeled (nt C++) võrdsustavad kapseldamise peitmisega, kuid enamik (Smalltalk, Eiffel, OCaml) eristavad neid mõisteid.

Pärand on süsteemi atribuut, mis võimaldab kirjeldada uut klassi olemasoleva klassi põhjal, millel on osaliselt või täielikult laenatud funktsionaalsus. Klassi, millest pärand tuletatakse, nimetatakse baas-, vanem- või ülemklassiks. Uus klass on järeltulija, pärija, laps või tuletatud klass.

Polümorfism on süsteemi omadus, mis võimaldab kasutada sama liidesega objekte ilma teabeta objekti tüübi ja sisemise struktuuri kohta.

Mõista, mida kõik need määratlused tegelikult tähendavad, on üsna raske. Seda teemat käsitlevates erialaraamatutes pühendab iga määratlus sageli terve peatüki, kuid vähemalt lõigu. Kuigi selle olemust, mida programmeerija peab mõistma ja igaveseks oma ajju jäädvustama, on väga vähe.
Ja analüüsi näitena kasutame jooniseid tasapinnal. Kooligeomeetriast teame, et kõigi tasapinnal kirjeldatud kujundite puhul on võimalik arvutada ümbermõõt ja pindala. Näiteks punkti puhul on mõlemad parameetrid võrdsed nulliga. Segmendi jaoks saame arvutada ainult perimeetri. Ja ruudu, ristküliku või kolmnurga jaoks - mõlemad. Nüüd kirjeldame seda ülesannet OOP terminites. Samuti on kasulik hoomata arutlusahelat, mille tulemuseks on klassihierarhia, mis omakorda kehastub töökoodi. Mine:


Niisiis, punkt on väikseim geomeetriline kujund, mis on kõigi teiste konstruktsioonide (figuuride) aluseks. Seetõttu valiti punkt baasvanemaklassiks. Kirjutame Java keeles punktiklassi:

/** * Punktiklass. Põhiklass */ klass Point ( /** * Tühi konstruktor */ Point() () /** * Klassimeetod, mis arvutab kujundi pindala */ double getSquare() ( tagastab 0; ) /** * Klassimeetod, mis arvutab kujundi perimeetri */ double getPerimeter() ( return 0; ) /** * Klassi meetod, mis tagastab joonise kirjelduse */ String getDescription() ( tagastab "Punkt"; ) )

Saadud klassis Point on tühi konstruktor, kuna antud näites töötame ilma kindlate koordinaatideta ning töötame ainult parameetrite ja kõrvalväärtustega. Kuna punktil pole külgi, pole vaja sellele parameetreid edastada. Pange tähele ka seda, et klassis on pindala ja perimeetri arvutamiseks meetodid Point::getSquare() ja Point::getPerimeter(), mõlemad tagastavad 0. Punkti puhul on see loogiline.


Kuna meie punkt on kõigi teiste kujundite aluseks, siis pärime nende teiste kujundite klassid klassist Point. Kirjeldame punkti klassist päritud segmendi klassi:

/** * Class Line Segment */ class LineSegment pikendab punkti ( LineSegment(double segmentLength) ( this.segmentLength = segmentLength; ) double segmentLength; // Joone pikkus /** * Alistatud klassi meetod, mis arvutab rida */ double getSquare( ) ( return 0; ) /** * Alistatud klassimeetod, mis arvutab segmendi perimeetri */ double getPerimeter() ( tagastab this.segmentLength; ) String getDescription() ( tagastab "Segmendi pikkus: " + see.segmendi pikkus; ) )

Klassi joonsegment laiendab punkti

tähendab, et klass LineSegment pärib klassist Point. Meetodid LineSegment::getSquare() ja LineSegment::getPerimeter() alistavad vastavad baasklassi meetodid. Segmendi pindala on alati null ja perimeetri pindala on võrdne selle segmendi pikkusega.

Nüüd kirjeldame sarnaselt segmendiklassiga kolmnurga klassi (mis pärib samuti punktiklassist):

/** * Kolmnurga klass. */ klass Kolmnurk pikendab punkti ( /** * Klassi konstruktor. Võtab sisendiks kolm parameetrit: * külje A pikkus, külje B pikkus, * nende külgede vaheline nurk (kraadides) */ Kolmnurk(kahekülg A, kahekülg B, topeltnurkAB ) ( this.sideA = sideA; this.sideB = sideB; this.angleAB = nurkAB; ) double sideA; //Klassi väli, salvestab külje A väärtuse kirjeldatud kolmnurga topeltküljeleB; //Klassi väli, salvestab külje B väärtus kirjeldatud kolmnurga kolmnurga topeltnurkAB; //Klassi väli, mis salvestab kirjeldatud kolmnurga kahe külje vahelise nurga (kraadides) /** * Klassimeetod, mis arvutab kolmnurga pindala */ double getSquare() ( topeltruut = (this.sideA * this.sideB * Math.sin(this.angleAB * Math.PI / 180))/2; return ruut; ) /** * Klassimeetod, mis arvutab a perimeetri kolmnurk */ double getPerimeter() ( double sideC = Math.sqrt(Math. pow(this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math.cos (this.angleAB * Math.PI / 180)); topeltperimeeter = see.külgA + see.külgB + külgC; tagasi perimeeter; ) String getDescription() ( tagastab "Kolmnurk külgedega: " + see.külgA + ", " + see.külgB + " ja nendevaheline nurk: " + see.nurkAB; ) )

Siin pole midagi uut. Samuti alistavad meetodid Triangle::getSquare() ja Triangle::getPerimeter() põhiklassi vastavad meetodid.
Noh, tegelikult on see kood, mis näitab polümorfismi maagiat ja paljastab OOP-i võimsuse:

Class Main ( /** * Siin töötab programm */ public static void main(String args) ( //ArrayList – see on spetsiaalne java andmestruktuur // mis võimaldab salvestada teatud tüüpi objekte array. ArrayList figures = new ArrayList (); //lisada joonistele kolm erinevat objekti array figures.add(new Point()); figures.add(new LineSegment(133)); figures.add(new Triangle(10, 17, 55)); jaoks ( int i = 0;i

Oleme loonud massiivi punkti klassi objektidest ja kuna klassid LineSegment ja Triangle pärivad klassist Point, saame need sellesse massiivi paigutada. Selgub, et igat joonist, mis on jooniste massiivis, võime käsitleda klassi Point objektina. See on polümorfism: pole teada, millisesse klassi jooniste massiivi objektid kuuluvad, kuid kuna kõik selle massiivi objektid kuuluvad samasse baasklassi Point, siis on rakendatavad ka kõik meetodid, mis on rakendatavad klassis Point oma järeltulijate klassidele.


Nüüd kapseldamisest. See, et panime joonise parameetrid ning pindala ja perimeetri arvutamise meetodid ühte klassi, on kapseldamine, me kapseldasime arvud eraldi klassidesse. See, et me kasutame klassis perimeetri arvutamiseks spetsiaalset meetodit, on kapseldamine, perimeetri arvutamise kapseldasime getPerimiter() meetodisse. Teisisõnu, kapseldamine varjab teostust (võib-olla kapseldamise lühim ja samal ajal mahukas definitsioon).


Täielik näidiskood:

Impordi java.util.ArrayList; class Main ( /** * Siin töötab programm */ public static void main(String args) ( //ArrayList on spetsiaalne andmestruktuur Javas // mis võimaldab salvestada kindlat tüüpi objekte massiivi. ArrayList figures = new ArrayList (); //lisada joonistele kolm erinevat objekti array figures.add(new Point()); figures.add(new LineSegment(133)); figures.add(new Triangle(10, 17, 55)); jaoks ( int i = 0;i

Kui märkate viga, valige tekstiosa ja vajutage Ctrl+Enter
JAGA:
Arvutid ja kaasaegsed vidinad