Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Lajme
  • Karakteristikat e programimit të orientuar nga objekti. Parimet e programimit të orientuar drejt objekteve

Karakteristikat e programimit të orientuar nga objekti. Parimet e programimit të orientuar drejt objekteve

Paradigmat e programimit

Programimi i orientuar nga objekti (OOP)- një metodologji programimi e bazuar në paraqitjen e një programi si një koleksion objektesh, secila prej të cilave është një shembull i një klase të caktuar, dhe klasat formojnë një hierarki trashëgimore.

Vëmendje duhet t'i kushtohet pjesëve të rëndësishme të këtij përkufizimi: 1) Programimi i orientuar drejt objekteve përdor objekte dhe jo algoritme si blloqet kryesore të ndërtimit logjik; 2) çdo objekt është një shembull i një klase të caktuar; 3) klasat formojnë hierarki. Një program konsiderohet i orientuar nga objekti vetëm nëse plotësohen të tre këto kërkesa. Në veçanti, programimi që nuk përdor trashëgimi quhet programim duke përdorur lloje abstrakte të të dhënave dhe jo të orientuar nga objekti.

YouTube kolegjial

    1 / 5

    ✪ Programimi i orientuar nga objekti në 2019

    ✪ Dizajni i orientuar nga objekti Pjesa 1 - Si dizajnohen klasat

    ✪ Parimet bazë të programimit të orientuar nga objekti. Çfarë është OOP dhe pse është e nevojshme?

    ✪ Bazat e OOP në C ++

    ✪ Programim i orientuar nga objekti. Klasat dhe objektet. Mësimi 3

    Titra

Konceptet bazë

Abstragimi i të dhënave Abstragimi nënkupton nxjerrjen në pah të informacionit kuptimplotë dhe përjashtimin e informacionit të parëndësishëm nga shqyrtimi. OOP merr në konsideratë vetëm abstraksionin e të dhënave (shpesh e quan thjesht "abstraksion"), duke nënkuptuar një grup karakteristikash kuptimplote të një objekti, të disponueshme për pjesën tjetër të programit. Encapsulation Encapsulation është një veti e sistemit që ju lejon të kombinoni të dhënat dhe metodat që punojnë me to në një klasë. Disa gjuhë (për shembull, C ++, Java ose Ruby) e barazojnë kapsulimin me fshehjen, por të tjera (Smalltalk, Eiffel, OCaml) bëjnë dallimin midis të dyjave. Trashëgimia e trashëguar është një veçori e sistemit që ju lejon të përshkruani një klasë të re bazuar në një ekzistuese me funksione të huazuar pjesërisht ose plotësisht. Klasa nga e cila trashëgon quhet baza, prindi ose superklasa. Klasa e re është një klasë pasardhëse, trashëguese, fëmijë ose e prejardhur. Nëntipi i polimorfizmit Nëntipi i polimorfizmit (në OOP i quajtur thjesht "polimorfizëm") është një veti e sistemit që ju lejon të përdorni objekte me të njëjtën ndërfaqe pa informacion për llojin dhe strukturën e brendshme të objektit. Një lloj tjetër polimorfizmi - parametrik - quhet programim gjenerik në OOP. Klasa A është një lloj i të dhënave universale, komplekse, i përbërë nga një grup i unifikuar tematikisht i "fusave" (ndryshore të llojeve më elementare) dhe "metodave" (funksionet për të punuar me këto fusha), domethënë është një model entiteti informacioni me ndërfaqet e brendshme dhe të jashtme për funksionimin e përmbajtjes së tij (vlerat e fushës). Në veçanti, në klasa, përdoren gjerësisht blloqe speciale të një ose më shpesh dy metodave të çiftuara, të cilat janë përgjegjëse për operacionet elementare me një fushë specifike (ndërfaqja e caktimit dhe leximit të një vlere), të cilat simulojnë hyrjen e drejtpërdrejtë në fushë. Këto blloqe quhen "properties" dhe janë pothuajse identike në emër të veçantë me fushën e tyre (për shembull, emri i fushës mund të fillojë me një shkronjë të vogël dhe një emër prone me një shkronjë të madhe). Një tjetër manifestim i natyrës së ndërfaqes së një klase është se kur kopjoni variablin përkatës përmes caktimit, kopjohet vetëm ndërfaqja, por jo vetë të dhënat, domethënë klasa është një lloj i të dhënave referuese. Një variabël objekt i një lloji të specifikuar nga një klasë quhet një shembull i asaj klase. Për më tepër, në disa sisteme kohëzgjatjeje, një klasë mund të përfaqësohet gjithashtu nga një objekt gjatë ekzekutimit të programit duke identifikuar në mënyrë dinamike llojin e të dhënave. Në mënyrë tipike, klasat janë krijuar në atë mënyrë që të sigurojnë që integriteti i të dhënave të objektit të jetë në përputhje me natyrën e objektit dhe problemin që zgjidhet, si dhe një ndërfaqe të përshtatshme dhe të thjeshtë. Nga ana tjetër, integriteti i domenit të objekteve dhe ndërfaqeve të tyre, si dhe komoditeti i dizajnit të tyre, sigurohet nga trashëgimia. Objekti Një entitet në hapësirën e adresave të sistemit kompjuterik që shfaqet kur krijohet një shembull i një klase (për shembull, pas ekzekutimit të rezultateve të përpilimit dhe lidhjes së kodit burimor për ekzekutim).

Klasifikimi i nëngrupeve OOP

Luca Cardelli dhe Martin Abadi kanë ndërtuar një arsyetim teorik për OOP dhe një klasifikim të bazuar në këtë arsyetim. Ata vërejnë se konceptet dhe kategoritë që ata kanë identifikuar nuk gjenden së bashku në të gjitha gjuhët OO; shumica e gjuhëve mbështesin vetëm nëngrupe të teorisë, dhe ndonjëherë disa lloj devijimesh nga ajo.

Dallimet më të dukshme në manifestimin e treguesve të cilësisë midis gjuhëve të llojeve të ndryshme:

  • Në gjuhët kryesore, parimet e deklaruara synojnë rritjen e faktorit të ripërdorimit të kodit, i cili fillimisht është i ulët për programimin imperativ. Në shtypjen polimorfike, përdorimi i koncepteve OOP, përkundrazi, nënkupton një rënie të dukshme të tij për shkak të kalimit nga polimorfizmi parametrik në polimorfizmin ad hoc. Gjuhët e shtypura në mënyrë dinamike (Smalltalk, Python, Ruby) përdorin këto parime për të organizuar logjikisht një program, dhe ndikimi i tyre në shkallën e ripërdorimit është i vështirë të parashikohet - varet shumë nga disiplina e programuesit. Për shembull, në CLOS, multimetodat janë njëkohësisht funksione të klasës së parë, gjë që lejon që ato të konsiderohen njëkohësisht dhe si lidhur me sasinë, dhe si e përgjithësuar (vërtet polimorfike).
  • Përdorimi i gjuhëve tradicionale OO shtypja nominative, pra pranueshmëria e bashkëpërdorimit të objekteve të klasave të ndryshme vetëm me kushtin e një treguesi të qartë të marrëdhënies midis klasave. Gjuhët e shtypura në mënyrë polimorfike karakterizohen nga tipizimi strukturor, pra, bashkërendimi i klasave ndërmjet tyre është i njëjti mekanizëm si koordinimi i numrit 5 me llojin int. Gjuhët e shtypura në mënyrë dinamike gjithashtu zënë një pozicion të ndërmjetëm këtu.

Arsyetimi i përgjithësuar dërgimi dinamik(përfshirë shumësin) e ndërtuar nga Giuseppe Castagna në mesin e viteve 1990.

Histori

OOP u ngrit si rezultat i zhvillimit të ideologjisë së programimit procedural, ku të dhënat dhe nënprogramet (procedurat, funksionet) e përpunimit të tyre nuk janë formalisht të lidhura. Për zhvillimin e mëtejshëm të programimit të orientuar nga objekti, konceptet e një ngjarje (i ashtuquajturi programim i orientuar nga ngjarjet) dhe një komponenti (programimi i komponentëve, COP) shpesh kanë një rëndësi të madhe.

Ndërveprimi i objekteve ndodh përmes. Rezultati i zhvillimit të mëtejshëm të OOP, me sa duket, do të jetë programimi i orientuar drejt agjentëve, ku agjentët- pjesë të pavarura të kodit në nivelin e ekzekutimit. Ndërveprimi i agjentëve ndodh përmes ndryshimit e mërkurë në të cilën ndodhen.

Konstruktet gjuhësore që strukturisht nuk janë të lidhura drejtpërdrejt me objektet, por që i shoqërojnë për funksionimin e tyre të sigurt (përjashtimet, kontrollet) dhe efikasitetin e tyre, përmblidhen prej tyre në aspekte (në programimin e orientuar nga aspekti). Programimi i orientuar nga subjekti zgjeron konceptin e një objekti duke ofruar një ndërveprim më të unifikuar dhe të pavarur midis objekteve. Mund të jetë një fazë kalimtare midis OOP dhe programimit të bazuar në agjentë për sa i përket ndërveprimit të tyre të pavarur.

Gjuha e parë e programimit në të cilën u propozuan konceptet bazë, të cilat më vonë u zhvilluan në një paradigmë, ishte Simula, por termi "orientim në objekt" nuk u përdor në kontekstin e përdorimit të kësaj gjuhe. Në kohën e shfaqjes së tij në 1967, në të u propozuan ide revolucionare: objekte, klasa, metoda virtuale, etj., Por e gjithë kjo nuk u perceptua nga bashkëkohësit si diçka madhështore. Në fakt, Simula ishte një Algol me klasa, duke e bërë të lehtë shprehjen e shumë koncepteve komplekse në programimin procedural. Koncepti i një klase në Simul mund të përkufizohet plotësisht përmes përbërjes së konstrukteve Algol (d.m.th., një klasë në Simul është diçka komplekse, e përshkruar me anë të primitivëve).

Alan Kaye dhe Dan Ingalls kanë prezantuar Smalltalk me Alan Kaye dhe Dan Ingalls, duke e parë programimin nga një "perspektivë e re" (përveç procedurave). Këtu koncepti i një klase u bë ideja bazë për të gjitha ndërtimet e tjera të gjuhës (d.m.th., një klasë në Smalltalk është një primitiv përmes të cilit përshkruhen ndërtime më komplekse). Ishte ai që u bë gjuha e parë e përhapur e programimit e orientuar nga objekti.

Aktualisht, numri i gjuhëve të programimit të aplikuara (lista e gjuhëve) që zbatojnë paradigmën e orientuar nga objekti është më i madhi në raport me paradigmat e tjera. Gjuhët më të zakonshme në industri (C ++, Delphi, C #, Java, etj.) mishërojnë modelin e objektit Simula. Shembuj të gjuhëve të bazuara në modelin Smalltak janë Objective-C, Python, Ruby.

Përkufizimi i OOP dhe konceptet themelore

Në zemër të OOP është koncepti Objekt. Një objekt është një entitet të cilit mund t'i dërgohen mesazhe dhe i cili mund t'u përgjigjet atyre duke përdorur të dhënat e tij. Një objekt është një shembull i një klase. Të dhënat e objektit janë të fshehura nga pjesa tjetër e programit. Fshehja e të dhënave quhet enkapsulim.

Mjafton kapsulimi që një gjuhë programuese të jetë e orientuar drejt objektit, por kjo nuk do të thotë se është e orientuar nga objekti - kërkon trashëgimi.

Por edhe prania e kapsulimit dhe trashëgimisë nuk e bën gjuhën e programimit plotësisht objekt nga pikëpamja e OOP. Përparësitë kryesore të OOP shfaqen vetëm kur gjuha e programimit zbaton polimorfizmin e nëntipit - aftësia për të trajtuar në mënyrë uniforme objekte me zbatime të ndryshme, me kusht që të ketë një ndërfaqe të përbashkët.

Vështirësitë në përcaktimin

OOP ka më shumë se dyzet vjet histori, por pavarësisht kësaj, ende nuk ka një përkufizim të qartë të pranuar përgjithësisht të kësaj teknologjie. Parimet bazë të përcaktuara në gjuhët dhe sistemet e objekteve të para kanë pësuar ndryshime (ose shtrembërime) dhe shtesa të rëndësishme me zbatime të shumta të kohës së mëvonshme. Përveç kësaj, që nga mesi i viteve 1980, termi "i orientuar nga objekti" është bërë modë, si rrjedhojë i ka ndodhur e njëjta gjë që pak më parë me termin "strukturuar" (i cili u bë modë pas përhapjes së strukturuar. teknologjia e programimit) - ajo u bë artificialisht ""i bashkëngjit çdo zhvillimi të ri për t'i bërë ato tërheqëse. Björn Stroustrup shkroi në 1988 se arsyetimi për "orientimin në objekt" të diçkaje, në shumicën e rasteve, zbret në një silogizëm të rremë: "X është i mirë. Orientimi i objektit është i mirë. Prandaj, X është i orientuar drejt objektit."

Roger King argumentoi se macja e tij ishte e orientuar nga objekti. Ndër virtytet e tjera të saj, macja demonstron sjellje karakteristike, reagon ndaj mesazheve, është e pajisur me reagime të trashëguara dhe kontrollon gjendjen e saj, plotësisht të pavarur, të brendshme.

Sidoqoftë, përgjithësimi i mekanizmit të mesazheve ka një anë tjetër - mesazhet "e plota" kërkojnë shpenzime shtesë, gjë që nuk është gjithmonë e pranueshme. Prandaj, shumë gjuhë programimi moderne të orientuara nga objekti përdorin konceptin "Dërgimi i një mesazhi si një thirrje metodë"- objektet kanë metoda të aksesueshme nga jashtë, thirrjet e të cilave sigurojnë ndërveprimin e objekteve. Kjo qasje zbatohet në një numër të madh të gjuhëve programuese, duke përfshirë C ++, Object Pascal, Java, Oberon-2. Megjithatë, kjo çon në faktin se mesazhet nuk janë më objekte të pavarura dhe, si rezultat, nuk kanë atribute, gjë që ngushton mundësitë e programimit. Disa gjuhë përdorin përfaqësim hibrid, duke demonstruar përfitimet e të dy qasjeve në të njëjtën kohë - për shembull, CLOS, Python.

Koncepti metoda virtuale, i mbështetur nga këto dhe gjuhë të tjera moderne, u shfaq si një mjet për të siguruar ekzekutimin e metodave të nevojshme gjatë përdorimit të variablave polimorfikë, domethënë, në fakt, si një përpjekje për të zgjeruar mundësitë e metodave të thirrjes për të zbatuar një pjesë të funksionalitetit të ofruar nga mekanizmi i përpunimit të mesazhit.

Karakteristikat e zbatimit

Siç u përmend më lart, në gjuhët moderne të programimit të orientuara nga objekti, çdo objekt është një vlerë e lidhur me një klasë të caktuar. Një klasë është një lloj i përbërë i të dhënave i deklaruar nga programuesi, i cili përfshin:

Fushat e të dhënave Parametrat e objektit (natyrisht, jo të gjitha, por vetëm të nevojshme në program) që specifikojnë gjendjen e tij (vetitë e objektit të domenit). Fushat e të dhënave të objektit nganjëherë referohen si vetitë e objektit, të cilat mund të jenë konfuze. Fizikisht, fushat janë vlera (variabla, konstante) të deklaruara që i përkasin klasës. Metodat Procedurat dhe funksionet që lidhen me një klasë. Ato përcaktojnë veprime që mund të kryhen në një objekt të këtij lloji, dhe të cilat vetë objekti mund të kryejë.

Klasat mund të trashëgojnë nga njëra-tjetra. Klasa pasardhëse merr të gjitha fushat dhe metodat e klasës mëmë, por mund t'i plotësojë ato me të sajat ose të anashkalojë ato ekzistuese. Shumica e gjuhëve të programimit mbështesin vetëm një trashëgimi të vetme (një klasë mund të ketë vetëm një klasë prind), vetëm në disa gjuhë programimi lejohet trashëgimia e shumëfishtë - gjenerimi i një klase nga dy ose më shumë klasa prindërore. Trashëgimia e shumëfishtë krijon një sërë problemesh, logjike dhe thjesht zbatimi, prandaj mbështetja e saj e plotë nuk është e përhapur. Në vend të kësaj, në vitet 1990, koncepti i një ndërfaqe u shfaq dhe filloi të futet në mënyrë aktive në gjuhët e orientuara nga objekti. Një ndërfaqe është një klasë pa kufij, pa zbatim që përfshin vetëm titujt e metodës. Nëse një klasë trashëgon (ose, siç thonë ata, zbaton) një ndërfaqe, ajo duhet të zbatojë të gjitha metodat e përfshira në të. Përdorimi i ndërfaqeve ofron një alternativë relativisht të lirë për trashëgiminë e shumëfishtë.

Ndërveprimi i objekteve në shumicën absolute të rasteve sigurohet duke thirrur metodat e njëri-tjetrit.

Kapsulimi sigurohet me mjetet e mëposhtme:

Kontrolli i aksesit Meqenëse metodat e një klase mund të jenë thjesht të brendshme, duke siguruar logjikën e funksionimit të objektit, dhe të jashtme, me ndihmën e të cilave objektet ndërveprojnë, është e nevojshme të sigurohet fshehtësia e të parave kur këto të fundit janë të aksesueshme nga jashtë. Për këtë, në gjuhë futen ndërtime të veçanta sintaksore që përcaktojnë në mënyrë të qartë qëllimin e secilit anëtar të klasës. Tradicionalisht, këta janë modifikues publikë, të mbrojtur dhe privatë, që tregojnë, përkatësisht, anëtarët publikë të një klase, anëtarët e klasës të disponueshëm brenda klasës dhe nga klasat pasardhëse, dhe të fshehur, të disponueshëm vetëm brenda klasës. Nomenklatura specifike e modifikuesve dhe kuptimet e tyre të sakta ndryshojnë nga një gjuhë në tjetrën. Metodat e aksesit Fushat e klasës në rastin e përgjithshëm nuk duhet të jenë të aksesueshme nga jashtë, pasi një akses i tillë do të lejonte ndryshimin arbitrar të gjendjes së brendshme të objekteve. Prandaj, fushat zakonisht deklarohen të fshehura (ose gjuha, në parim, nuk lejon hyrjen në fushat e klasës nga jashtë), dhe metoda të veçanta të quajtura metoda aksesore përdoren për të hyrë në të dhënat në fusha. Metoda të tilla ose kthejnë vlerën e kësaj apo asaj fushe, ose shkruajnë një vlerë të re në këtë fushë. Gjatë shkrimit, aksesori mund të kontrollojë vlefshmërinë e vlerës që shkruhet dhe, nëse është e nevojshme, të kryejë manipulime të tjera me të dhënat e objektit në mënyrë që ato të mbeten të sakta (përputhja e brendshme). Metodat e aksesit quhen gjithashtu aksesorë (nga anglishtja qasja - akses), dhe veçmas - marrës (anglisht merrni - lexim) dhe vendosës (anglisht grup - shkrim). Karakteristikat e objektit Pseudo-Fields, të disponueshme për lexim dhe/ose shkrim. Vetitë duken si fusha nga jashtë dhe përdoren në të njëjtën mënyrë si fushat e disponueshme (me disa përjashtime), megjithatë, në fakt, kur qaseni në to, thirren metodat e aksesorit. Kështu, vetitë mund të konsiderohen si fusha të dhënash "të zgjuara" që shoqërojnë aksesin në të dhënat e brendshme të një objekti me ndonjë veprim shtesë (për shembull, kur një ndryshim në koordinatat e një objekti shoqërohet me rivizatimin e tij në një vend të ri). Pronat nuk janë, në fakt, asgjë më shumë se sheqer sintaksor, pasi ato nuk shtojnë ndonjë veçori të re, por vetëm fshehin thirrjen e metodave të aksesorit. Zbatimi specifik gjuhësor i vetive mund të jetë i ndryshëm. Për shembull, një deklaratë pronësie përmban drejtpërdrejt kod aksesor që thirret vetëm kur punon me pronat, domethënë nuk kërkon metoda të veçanta aksesor që janë të disponueshme për thirrje të drejtpërdrejtë. Në Delphi, një deklaratë pronësie përmban vetëm emrat e metodave të aksesorit që duhet të thirren kur hyni në fushë. Vetë aksesorët janë metoda normale me disa kërkesa shtesë për nënshkrim.

Polimorfizmi zbatohet duke futur rregulla në gjuhë, sipas të cilave një ndryshoreje të tipit "class" mund t'i caktohet një objekt i çdo klase që është pasardhës i klasës së saj.

Dizajni i programit në përgjithësi

OOP është i fokusuar në zhvillimin e sistemeve të mëdha softuerike të zhvilluara nga një ekip programuesish (ndoshta mjaft i madh). Dizajni i sistemit në tërësi, krijimi i komponentëve individualë dhe integrimi i tyre në produktin përfundimtar shpesh kryhen nga njerëz të ndryshëm, dhe nuk ka asnjë specialist të vetëm që do të dinte gjithçka për projektin.

Dizajni i orientuar nga objekti përqendrohet në përshkrimin e strukturës së sistemit të projektuar (përparësia në lidhje me përshkrimin e sjelljes së tij, në krahasim me programimin funksional), që është, në fakt, në përgjigje të dy pyetjeve kryesore:

  • Nga cilat pjesë përbëhet sistemi?;
  • Cila është përgjegjësia e secilës pjesë të saj.

Shpërndarja e pjesëve bëhet në atë mënyrë që secila të ketë një minimum në vëllim dhe një grup funksionesh (detyrash) të përcaktuara saktësisht të kryera, dhe në të njëjtën kohë të ndërveprojë me pjesët e tjera sa më pak të jetë e mundur.

Përsosja e mëtejshme çon në përzgjedhjen e fragmenteve më të vogla të përshkrimit. Ndërsa përshkrimi është i detajuar dhe përcaktohet përgjegjësia, identifikohen të dhënat që duhen ruajtur, prania e agjentëve të afërt në sjellje, të cilët bëhen kandidatë për zbatim në formën e klasave me paraardhës të përbashkët. Pas zgjedhjes së komponentëve dhe përcaktimit të ndërfaqeve ndërmjet tyre, zbatimi i secilit komponent mund të kryhet pothuajse në mënyrë të pavarur nga të tjerët (natyrisht, duke iu nënshtruar disiplinës së duhur teknologjike).

Ndërtimi i saktë i hierarkisë së klasës ka një rëndësi të madhe. Një nga problemet e njohura të sistemeve të mëdha të ndërtuara duke përdorur teknologjinë OOP është i ashtuquajturi problemi i brishtësisë së klasës bazë... Ai konsiston në faktin se në fazat e mëvonshme të zhvillimit, kur ndërtohet një hierarki klase dhe në bazë të saj është zhvilluar një sasi e madhe kodi, rezulton të jetë e vështirë apo edhe e pamundur të bësh ndonjë ndryshim në kodin e klasat bazë të hierarkisë (nga të cilat gjenerohen të gjitha ose shumë nga klasat që punojnë në sistem). Edhe nëse ndryshimet që bëni nuk ndikojnë në ndërfaqen e klasës bazë, ndryshimi i sjelljes së saj mund të ndikojë në klasat pasardhëse në mënyra të paparashikueshme. Në rastin e një sistemi të madh, zhvilluesi i klasës bazë thjesht nuk është në gjendje të parashikojë pasojat e ndryshimeve, ai as nuk e di se si përdoret saktësisht klasa bazë dhe mbi cilat veçori të sjelljes së tij funksionimi i saktë i pasardhësve klasa varet.

Metodologji të ndryshme OOP

Programimi i komponentëve është faza tjetër në zhvillimin e OOP; Prototipi dhe programimi i orientuar nga klasa janë qasje të ndryshme për krijimin e një programi që mund të kombinohet, duke pasur avantazhet dhe disavantazhet e veta.

Programimi i komponentëve

Programimi i orientuar nga komponentët është një lloj "superstrukture" mbi OOP, një grup rregullash dhe kufizimesh që synojnë ndërtimin e sistemeve të mëdha softuerike në zhvillim me jetëgjatësi të gjatë. Një sistem softuerësh në këtë metodologji është një koleksion komponentësh me ndërfaqe të mirëpërcaktuara. Ndryshimet në një sistem ekzistues bëhen duke krijuar komponentë të rinj për të plotësuar ose zëvendësuar ato ekzistuese. Kur krijoni komponentë të rinj bazuar në ato të krijuara më parë, përdorimi i trashëgimisë së zbatimit është i ndaluar - komponenti i ri mund të trashëgojë vetëm ndërfaqet e bazës. Në këtë mënyrë, programimi i komponentëve anashkalon problemin e brishtësisë së klasës bazë.

Programimi i prototipit

Programimi prototip, duke ruajtur disa nga tiparet e OOP, braktisi konceptet bazë të klasës dhe trashëgimisë.

  • Një prototip është një objekt mostër, në imazhin dhe ngjashmërinë e të cilit krijohen objekte të tjera. Objektet e kopjuara mund të mbajnë një marrëdhënie me objektin prind, duke trashëguar automatikisht ndryshimet në prototip; kjo veçori përcaktohet brenda një gjuhe të caktuar.
  • Në vend të një mekanizmi për përshkrimin e klasave dhe gjenerimin e shembujve, gjuha ofron një mekanizëm për krijimin e një objekti (duke specifikuar një grup fushash dhe metodash që një objekt duhet të ketë) dhe një mekanizëm për klonimin e objekteve.
  • Çdo objekt i krijuar rishtazi është një "instancë pa klasë". Çdo objekt mund të bëhet prototip- të përdoret për të krijuar një objekt të ri duke përdorur një operacion klonimi... Pas klonimit, objekti i ri mund të ndryshohet, në veçanti, ai mund të plotësohet me fusha dhe metoda të reja.
  • Objekti i klonuar ose bëhet një kopje e plotë e prototipit, duke ruajtur të gjitha vlerat e fushave të tij dhe duke dublikuar metodat e tij, ose ruan një referencë për prototipin, duke përjashtuar fushat dhe metodat e klonuara derisa ato të ndryshohen. Në rastin e fundit, koha e ekzekutimit ofron një mekanizëm delegacionet- nëse, kur qaseni në një objekt, ai vetë nuk përmban metodën ose fushën e të dhënave të kërkuara, thirrja i kalohet prototipit, prej tij, nëse është e nevojshme, më tej përgjatë zinxhirit.

Programim i orientuar nga klasa

Programimi i orientuar nga klasa është programim i përqendruar te të dhënat ku të dhënat dhe sjellja janë të lidhura pazgjidhshmërisht. Së bashku, të dhënat dhe sjellja janë një klasë. Prandaj, në gjuhët bazuar në konceptin e "klasës", të gjitha objektet ndahen në dy lloje kryesore - klasa dhe instanca. Një klasë përcakton një strukturë dhe funksionalitet (sjellje) që është e njëjtë për të gjitha rastet e një klase të caktuar. Një shembull është një bartës i të dhënave - domethënë, ai ka gjendje që ndryshon sipas sjelljes së specifikuar nga klasa. Në gjuhët e orientuara nga klasa, krijohet një shembull i ri duke thirrur konstruktorin e klasës (mundësisht me një grup parametrash). Shembulli që rezulton ka një strukturë dhe sjellje që është e koduar nga klasa e tij.

Performanca e programit të objektit

Grady Booch tregon arsyet e mëposhtme për degradimin e performancës së programit për shkak të përdorimit të mjeteve të orientuara nga objekti:

Metodat e lidhjes dinamike Sigurimi i sjelljes polimorfike të objekteve çon në nevojën për të lidhur metodat e thirrura nga programi (d.m.th., për të përcaktuar se cila metodë e caktuar do të thirret) jo në kohën e kompilimit, por gjatë ekzekutimit të programit, gjë që kërkon kohë shtesë. Në të njëjtën kohë, lidhja reale dinamike kërkohet për jo më shumë se 20% të thirrjeve, por disa gjuhë OOP e përdorin atë vazhdimisht. Thellësia e konsiderueshme e abstraksionit të zhvillimit të OOP shpesh çon në krijimin e aplikacioneve "shtresore", ku ekzekutimi i veprimit të kërkuar nga një objekt reduktohet në shumë thirrje për objekte të një niveli më të ulët. Në një aplikacion të tillë, ka shumë thirrje metodash dhe kthime të metodave, gjë që natyrisht ndikon në performancën. Trashëgimia "turbullon" kodin Kodi që lidhet me klasat "përfundimtare" të hierarkisë së trashëgimisë, të cilat zakonisht përdoren nga programi drejtpërdrejt, ndodhet jo vetëm në vetë këto klasa, por edhe në klasat e paraardhësve të tyre. Metodat që i përkasin të njëjtës klasë në fakt përshkruhen në klasa të ndryshme. Kjo çon në dy pika frustruese:

  • Shpejtësia e përkthimit zvogëlohet, pasi lidhësi duhet të ngarkojë përshkrimet e të gjitha klasave në hierarki.
  • Performanca e programit në një sistem me memorie faqesh zvogëlohet - pasi metodat e së njëjtës klasë janë të vendosura fizikisht në vende të ndryshme në kod, larg njëri-tjetrit, kur fragmentet e programit hyjnë në mënyrë aktive në metodat e trashëguara, sistemi detyrohet të bëjë të shpeshta ndërruesit e faqeve.
Enkapsulimi zvogëlon shpejtësinë e aksesit të të dhënave Refuzimi i aksesit të drejtpërdrejtë në fushat e klasës nga jashtë çon në nevojën për të krijuar dhe përdorur metoda aksesore. Shkrimi, përpilimi dhe ekzekutimi i metodave aksesore përfshijnë shpenzime shtesë. Krijimi dhe shkatërrimi dinamik i objekteve Objektet e krijuara në mënyrë dinamike, si rregull, ndahen në grumbull, gjë që është më pak efikase sesa vendosja e tyre në pirg dhe, për më tepër, shpërndarja e memories statike për ta në fazën e përpilimit.

Pavarësisht nga të metat e vërejtura, Booch argumenton se përfitimet e përdorimit të OOP janë më domethënëse. Gjithashtu, rritja e produktivitetit për shkak të një organizimi më të mirë të kodit OOP, sipas tij, në disa raste kompenson kostot e përgjithshme shtesë të organizimit të funksionimit të programit. Ju gjithashtu mund të vini re se shumë efekte të degradimit të performancës mund të zbuten ose madje të eliminohen plotësisht nga optimizimi i kodit me cilësi të lartë nga përpiluesi. Për shembull, ulja e lartpërmendur e shpejtësisë së aksesit në fushat e klasës për shkak të përdorimit të metodave aksesore eliminohet nëse përpiluesi përdor zëvendësimin inline në vend që të thërrasë metodën e aksesorit (përpiluesit modernë e bëjnë këtë me mjaft besim).

OOP kritika

Pavarësisht nga disa vërejtje kritike për OOP, kjo paradigmë përdoret aktualisht në shumicën dërrmuese të projekteve industriale. Megjithatë, OOP nuk mund të konsiderohet teknika më e mirë e programimit në të gjitha rastet.

Vërejtje kritike në lidhje me OOP:

  • Është treguar se nuk ka ndonjë ndryshim domethënës në produktivitetin e zhvillimit të softuerit midis OOP dhe qasjes procedurale.
  • Christopher Date thekson pamundësinë e krahasimit të OOP dhe teknologjive të tjera kryesisht për shkak të mungesës së një përkufizimi të rreptë dhe të pranuar përgjithësisht të OOP.
  • Alexander Stepanov në një nga intervistat e tij theksoi se OOP është "metodologjikisht i gabuar" dhe se "... OOP është praktikisht i njëjti mashtrim si inteligjenca artificiale ...".
  • Frederick Brooks thekson se pjesa më sfiduese e zhvillimit të softuerit është "... specifikimi, projektimi dhe testimi i konstrukteve konceptuale, jo puna e shprehjes së atyre konstrukteve konceptuale ...". OOP (së bashku me teknologji të tilla si inteligjenca artificiale, verifikimi i programit, programimi automatik, programimi grafik, sistemet e ekspertëve, etj.), sipas tij, nuk është një "plumb argjendi" që mund të zvogëlojë kompleksitetin e zhvillimit të sistemeve softuerike me një urdhër prej magnitudë. Sipas Brooks, “... OOP vetëm zvogëlon kompleksitetin që futet në shprehjen e dizajnit. Dizajni mbetet kompleks në natyrë…”.
  • Edsger Dijkstra theksoi: “... ajo që kërkon shoqëria në shumicën e rasteve është një eliksir për të gjitha sëmundjet. Natyrisht, "Elixir" ka emra shumë mbresëlënës, përndryshe do të jetë shumë e vështirë të shesësh diçka: "Analiza dhe dizajni strukturor", "Inxhinieri softuerësh", "Modelet e maturimit", "Sistemet e informacionit të menaxhimit" (Sistemet e informacionit të menaxhimit), "Integruara". Mbështetja e projektit të mjediseve "," Orientimi i objektit "," Riinxhinierimi i procesit të biznesit "...".
  • Niklaus Wirth beson se OOP nuk është gjë tjetër veçse një superstrukturë e parëndësishme mbi programimin e strukturuar dhe ekzagjerimi i rëndësisë së tij, i shprehur, ndër të tjera, në përfshirjen e mjeteve gjithnjë e më të modës "të orientuara nga objekti" në gjuhët e programimit, dëmton cilësinë. të softuerit që po zhvillohet.
  • Patrick Killelia shkroi në librin e tij "Tuning a Web Server": "... OOP ju ofron shumë mënyra për të ngadalësuar programet tuaja ...".
  • Një artikull i njohur përmbledhës mbi problemet e programimit modern OOP liston disa probleme tipike OOP [ ] .
  • Në programimin e folklorit, kritika e qasjes së orientuar nga objekti kundrejt qasjes funksionale duke përdorur metaforën " Mbretëritë e emrave"Nga një ese nga Steve Yeggie.

Nëse përpiqemi të klasifikojmë kritikat ndaj OOP, mund të dallojmë disa aspekte të kritikës ndaj kësaj qasjeje ndaj programimit.

Kritika e reklamave OOP Kritikon në mënyrë eksplicite ose të nënkuptuar në shkrimet e disa propagandistëve të OOP, si dhe në materialet reklamuese për mjetet e zhvillimit "të orientuar nga objekti", idenë e programimit të objekteve si një lloj qasjeje të gjithëfuqishme që eliminon në mënyrë magjike kompleksitetin e programimit. Siç është vërejtur nga shumë njerëz, duke përfshirë Brooks dhe Dijkstra të lartpërmendur, "nuk ka asnjë plumb argjendi" - pavarësisht se cilës paradigmë programimi i përmbahet zhvilluesi, krijimi i një sistemi softuerësh kompleks jo të parëndësishëm përfshin gjithmonë një investim të konsiderueshëm të burimeve intelektuale dhe kohës. Nga specialistët më të kualifikuar të OOP, askush, si rregull, nuk e mohon vlefshmërinë e këtij lloji të kritikës. Sfidimi i efektivitetit të zhvillimit të OOP Kritikët kundërshtojnë tezën se zhvillimi i programeve të orientuara nga objekti kërkon më pak burime ose çon në krijimin e softuerit më të mirë. Është bërë një krahasim i kostove të zhvillimit me metoda të ndryshme, në bazë të të cilave arrihet në përfundimin se OOP nuk ka përparësi në këtë drejtim. Duke pasur parasysh vështirësinë ekstreme të krahasimit objektivisht të modeleve të ndryshme, krahasime të tilla janë të paktën të diskutueshme. Nga ana tjetër, rezulton se deklaratat për efektivitetin e OOP janë po aq të diskutueshme. Performanca e programeve të orientuara nga objekti Vihet në dukje se një sërë "karakteristikash të lindura" të teknologjisë OOP i bëjnë programet e bazuara në të teknikisht më pak efikase se programet e ngjashme jo-objekte. Pa mohuar kostot aktuale të përgjithshme shtesë të organizimit të funksionimit të programeve OOP (shih seksionin "Performanca" më lart), duhet theksuar, megjithatë, se rëndësia e degradimit të performancës shpesh ekzagjerohet nga kritikët. Në kushtet moderne, kur aftësitë teknike të kompjuterëve janë jashtëzakonisht të mëdha dhe vazhdimisht në rritje, për shumicën e programeve aplikative, efikasiteti teknik është më pak i rëndësishëm sesa funksionaliteti, shpejtësia e zhvillimit dhe mirëmbajtja. Vetëm për një klasë shumë të kufizuar softuerësh (softuer të sistemeve të integruara, drejtues pajisjesh, softuer të sistemit të nivelit të ulët, softuer shkencor) performanca mbetet një faktor kritik. Kritika e zgjidhjeve individuale teknologjike në gjuhët dhe bibliotekat e OOP Kjo kritikë është e shumtë, por nuk prek OOP si e tillë, por pranueshmërinë dhe zbatueshmërinë në raste specifike të zbatimeve të caktuara të mekanizmave të saj. Një nga objektet e preferuara të kritikës është gjuha C ++, e cila është një nga gjuhët OOP industriale më të zakonshme.

Gjuhët e orientuara nga objektet

Shumë gjuhë moderne janë krijuar posaçërisht për të lehtësuar programimin e orientuar nga objekti. Megjithatë, duhet theksuar se është e mundur të aplikohen teknikat OOP për një gjuhë jo të orientuar nga objekti dhe anasjelltas, përdorimi i një gjuhe të orientuar nga objekti nuk do të thotë që kodi bëhet automatikisht i orientuar nga objekti.

Në mënyrë tipike, një gjuhë e orientuar nga objekti (OOL) përmban grupin e mëposhtëm të elementeve:

  • Deklarimi i klasave me fusha (të dhënat - anëtarët e klasës) dhe metodat (funksionet - anëtarët e klasës).
  • Mekanizmi për zgjerimin e një klase (trashëgimi) është gjenerimi i një klase të re nga një ekzistuese me përfshirje automatike të të gjitha tipareve të zbatimit të klasës paraardhëse në përbërjen e klasës pasardhëse. Shumica e OOE-ve mbështesin vetëm trashëgiminë e vetme.
  • Variablat polimorfikë dhe parametrat e funksioneve (metodave) që ju lejojnë të caktoni instanca të klasave të ndryshme në të njëjtën ndryshore.
  • Sjellja polimorfike e instancave të klasës nëpërmjet përdorimit të metodave virtuale. Në disa OOL, të gjitha metodat e klasës janë virtuale.

Disa gjuhë shtojnë disa mjete shtesë në grupin minimal të specifikuar. Midis tyre:

  • Konstruktorë, destruktorë, finalizues;
  • Vetitë (aksesorët);
  • Indeksuesit;
  • Kontrollet për dukshmërinë e komponentëve të klasës (ndërfaqet ose modifikuesit e aksesit si publiku, privat, i mbrojtur, veçori, etj.).

Disa gjuhë përputhen plotësisht me parimet e OOP - në to të gjithë elementët kryesorë janë objekte me gjendje dhe metoda të lidhura. Shembuj të gjuhëve të tilla janë Smalltalk, Eiffel. Ka gjuhë hibride që kombinojnë nënsistemin e objektit në një formë integrale me nënsistemet e paradigmave të tjera si "dy ose më shumë gjuhë në një", të cilat lejojnë kombinimin e modeleve të objekteve me të tjerët në një program dhe mjegullimin e vijës midis objektit. -paradigma të orientuara dhe të tjera për shkak të aftësive jo standarde që balancojnë midis OOP dhe paradigmave të tjera (siç janë dërgimi i shumëfishtë, klasa parametrike, aftësia për të manipuluar metodat e klasës si objekte të pavarura, etj.). Shembuj të gjuhëve të tilla:

Klasa (klasat) është një lloj i të dhënave i përcaktuar nga përdoruesi. Klasa përcakton vetitë dhe sjelljen e një objekti ose procesi në formën e fushave të të dhënave dhe funksioneve për të punuar me to.

Një veti thelbësore e një klase është se detajet e zbatimit të saj fshihen nga përdoruesit e klasës pas ndërfaqes. Kështu, një klasë si model i një objekti në botën reale është një kuti e zezë, e mbyllur në raport me botën e jashtme.

Ideja prapa klasave është thelbi i Programimit të Orientuar në Objekt (OOP). Parimet bazë të OOP u zhvilluan në gjuhët Simula-67 dhe SmallTalk, por në atë kohë ato nuk u përhapën për shkak të vështirësive të zotërimit dhe efikasitetit të ulët të zbatimit.

Quhen vlera specifike të llojit të të dhënave "klasë". rastet e klasës ose objekte (objektet) .

Nënprogramet që përcaktojnë operacionet në objektet e klasës thirren metoda (metodat). Thirrjet e metodës thirren mesazhe (mesazhe). I gjithë grupi i metodave në një objekt quhet mesazhprotokolli, ose ndërfaqja e mesazhit (mesazhndërfaqe) Objekt. Mesazhi duhet të ketë të paktën dy pjesë: objektin specifik të cilit duhet t'i dërgohet dhe emrin e metodës që përcakton veprimin e kërkuar në objekt. Kështu, llogaritja në një program të orientuar nga objekti përcaktohet nga mesazhet e transmetuara nga një objekt në tjetrin.

Objektet ndërveprojnë me njëri-tjetrin duke dërguar dhe marrë mesazhe. Një mesazh është një kërkesë veprimi që përmban një grup parametrash të kërkuar. Mekanizmi i mesazheve zbatohet duke thirrur funksionet e duhura. Me ndihmën e OOP, i ashtuquajturi model i drejtuar nga ngjarjet zbatohet lehtësisht, kur të dhënat janë aktive dhe kontrollojnë thirrjen e një pjese të caktuar të kodit të programit.

OOP është një teknikë programimi që zhvillon parimet e programimit të strukturuar dhe bazohet në abstraksionet e mëposhtme të të dhënave:

Unë. Kapsulimi : kombinimi i të dhënave me procedurat dhe funksionet në një bllok të vetëm të kodit të programit (të dhënat dhe metodat e punës me to konsiderohen si fusha të një objekti).

II. Trashëgimia - transferimi i metodave dhe vetive nga paraardhësi në pasardhës, pa qenë nevoja të shkruhet kodi programor shtesë (prania e instancave të klasës; pasardhësit, gjyshërit, hierarkia).

III. Polimorfizmi - aftësia për të ndryshuar vetitë dhe sjelljen e objekteve që janë identike në kuptim, në varësi të llojit të tyre (një emër i vetëm për një veprim të caktuar, i cili kryhet në mënyra të ndryshme për objektet e hierarkisë).

Kapsulimi

Për herë të parë, koncepti i kapsulimit u përdor në gjuhët që mbështesin të ashtuquajturën qasje abstrakte ndaj programimit (për shembull, Modula-2). Ideja kryesore e qasjes abstrakte është të fshehë nga përdoruesi strukturën e informacionit rreth objektit, për t'i mundësuar atij të marrë të dhënat e nevojshme për të punuar me objektin vetëm përmes procedurave që lidhen me këtë objekt. Kjo teknikë mund të përmirësojë ndjeshëm besueshmërinë dhe transportueshmërinë e softuerit të zhvilluar. Besueshmëria është rritur për faktin se të gjitha procedurat për të punuar me të dhënat e objektit janë relativisht të thjeshta dhe transparente, që do të thotë se ato mund të zhvillohen në mënyrë më efikase. Kur ndryshoni strukturën e të dhënave, mjafton të ripunoni vetëm programet që lidhen drejtpërdrejt me objektin, dhe programet më komplekse që përdorin këtë objekt nuk kanë nevojë të ndryshohen. Kjo rrethanë rrit si besueshmërinë ashtu edhe lëvizshmërinë e programeve të krijuara.

Trashëgimia

Në gjysmën e dytë të viteve 1980, u bë e qartë për shumë zhvillues softuerësh se një nga mundësitë më të mira për rritjen e produktivitetit të tyre ishte ripërdorimi i programeve. Është mjaft e qartë se llojet abstrakte të të dhënave, me kapsulimin e tyre dhe kontrollin e aksesit, duhet të ripërdoren vazhdimisht. Problemi me ripërdorimin e llojeve abstrakte të të dhënave në pothuajse të gjitha rastet është se vetitë dhe aftësitë e llojeve ekzistuese nuk janë të përshtatshme për përdorime të reja. Llojet e vjetra duhet të modifikohen të paktën minimalisht. Modifikime të tilla mund të jenë të vështira për t'u zbatuar dhe kërkojnë që një person të kuptojë një pjesë, nëse jo të gjithë, të kodit ekzistues. Përveç kësaj, në shumë raste, modifikimet sjellin ndryshime në të gjitha programet e klientit.

Problemi i dytë me programimin e orientuar nga të dhënat është se të gjitha përkufizimet e llojeve abstrakte të të dhënave janë të pavarura dhe në të njëjtin nivel të hierarkisë. Kjo shpesh pengon që programi të strukturohet për t'iu përshtatur zonës së problemit. Në shumë raste, problemi origjinal përmban kategori objektesh të ndërlidhura që janë të dy trashëgimtarë të të njëjtëve paraardhës (d.m.th., të vendosur në të njëjtin nivel të hierarkisë), dhe paraardhës dhe trashëgimtarë (d.m.th., që konsistojnë në lidhje me disa vartësi së bashku).

Trashëgimia zgjidh të dyja problemet e modifikimit që dalin nga ripërdorimi i një lloji abstrakt të të dhënave dhe problemet e organizimit të programit. Nëse një lloj i ri i të dhënave abstrakte mund të trashëgojë të dhënat dhe vetitë funksionale të një lloji ekzistues, si dhe të modifikojë disa nga këto entitete dhe të shtojë entitete të reja, atëherë ripërdorimi lehtësohet shumë pa pasur nevojë të bëhen ndryshime në llojin e të dhënave abstrakte të ripërdorshme. Programuesit mund të marrin një lloj të dhënash abstrakte ekzistuese dhe të modelojnë një lloj të ri bazuar në të për të përmbushur kërkesat e reja të detyrës. Supozoni se programi juaj ka një lloj të dhënash abstrakte për vargje të numrave të plotë që përfshin një operacion renditjeje. Pas një periudhe të caktuar përdorimi, programi modifikohet dhe kërkon jo vetëm një lloj të dhënash abstrakte për vargjet e numrave të plotë me një operacion renditjeje, por edhe një operacion për llogaritjen e mesatares aritmetike për elementet e objekteve që janë vargje. Meqenëse struktura e grupit është e fshehur në një lloj të dhënash abstrakte, pa trashëgim, ky lloj duhet të modifikohet duke shtuar një operacion të ri në këtë strukturë. Me trashëgimi, nuk ka nevojë të modifikohet një lloj ekzistues; ju mund të përshkruani një nënklasë të një lloji ekzistues që mbështet jo vetëm operacionin e renditjes, por edhe operacionin për llogaritjen e mesatares aritmetike.

Një klasë që përcaktohet duke trashëguar nga një klasë tjetër quhet klasa e prejardhur (të përftuaraklasës) , ose nënklasa (nënklasa) ... Klasa nga e cila rrjedh klasa e re quhet klasa prind (prindklasës) , ose superklasë (superklasa) .

Në rastin më të thjeshtë, klasa trashëgon të gjitha entitetet (ndryshoret dhe metodat) e klasës mëmë. Kjo trashëgimi mund të komplikohet duke futur kontrollin e aksesit te entitetet e klasës mëmë.

Ky kontroll aksesi i lejon programuesit të fshehë pjesë të një lloji abstrakt të të dhënave nga klientët. Ky kontroll aksesi gjendet zakonisht në klasat e gjuhës OO. Klasat e derivuara janë një lloj tjetër klienti që mund t'i jepet ose t'i mohohet qasja. Për të përshtatur këtë, disa gjuhë të orientuara nga objekti përfshijnë një kategori të tretë të kontrollit të aksesit, shpesh i referuar si i mbrojtur, i cili përdoret për të dhënë akses në klasat e prejardhura dhe për të mohuar aksesin në klasa të tjera.

Përveç entiteteve të trashëguara, një klasë e prejardhur mund të shtojë entitete të reja dhe të modifikojë metoda. Një metodë e modifikuar ka të njëjtin emër dhe shpesh të njëjtin protokoll si metoda që po modifikon. Metoda e re thuhet se anashkalon versionin e trashëguar të metodës, e cila për këtë arsye quhet metoda e mbivendosur. Qëllimi më i zakonshëm i një metode të tejkaluar është të kryejë një operacion që është specifik për objektet e një klase të prejardhur dhe jo i zakonshëm për objektet e klasës mëmë.

Zhvillimi i një programi për një sistem të orientuar nga objekti fillon me përcaktimin e një hierarkie klase që përshkruan marrëdhëniet midis objekteve që do të përfshihen në programin që zgjidh problemin. Sa më mirë të përputhet kjo hierarki e klasës me pjesën problematike, aq më e natyrshme do të jetë zgjidhja e plotë.

Disavantazhi i trashëgimisë si një mjet për ta bërë kodin më të lehtë për t'u ripërdorur është se ai krijon varësi midis klasave në hierarkinë e trashëgimisë. Kjo zvogëlon një nga avantazhet e llojeve abstrakte të të dhënave, që është se ato janë të pavarura reciprokisht. Natyrisht, jo të gjitha llojet e të dhënave abstrakte duhet të jenë plotësisht të pavarura, por në përgjithësi pavarësia e llojeve abstrakte të të dhënave është një nga vetitë e tyre pozitive më të forta. Megjithatë, rritja e ripërdorimit të llojeve abstrakte të të dhënave pa krijuar varësi midis disa prej tyre mund të jetë e vështirë, nëse jo plotësisht e pashpresë.

Polimorfizmi

Vetia e tretë e gjuhëve të programimit të orientuara nga objekti është lloji i polimorfizmit të ofruar nga mesazhet dinamike të lidhjes me përkufizimet e metodave. Kjo veti ruhet duke lejuar përcaktimin e variablave polimorfikë të tipit të klasës mëmë, të cilat gjithashtu mund t'i referohen objekteve të çdo nënklase të klasës së caktuar. Një klasë mëmë mund të përcaktojë një metodë që do të anashkalohet në nënklasat e saj. Operacionet e përcaktuara nga këto metoda janë të ngjashme, por duhet të rafinohen për secilën klasë në hierarki. Kur një metodë e tillë thirret përmes një ndryshoreje polimorfike, ajo thirrje lidhet në mënyrë dinamike me metodën në klasën përkatëse. Një nga qëllimet e lidhjes dinamike është që sistemet softuerike të zgjerohen më lehtë ndërsa ato zhvillohen dhe mirëmbahen. Programe të tilla mund të shkruhen për të funksionuar në objekte të klasave të personalizuara. Këto operacione janë të personalizueshme në kuptimin që ato mund të aplikohen në objekte të çdo klase që rrjedh nga e njëjta klasë bazë.

Informatikë në gjuhët e orientuara nga objekti

Të gjitha llogaritjet në një gjuhë plotësisht të orientuar nga objekti bëhen duke i kaluar një mesazh një objekti për të thirrur një nga metodat e tij. Përgjigja ndaj mesazhit është një objekt që kthen rezultatin e llogaritjeve të kryera me këtë metodë. Ekzekutimi i një programi në një gjuhë të orientuar nga objekti mund të përshkruhet si simulimi i një grupi kompjuterësh (objektesh) që ndërveprojnë me njëri-tjetrin përmes shkëmbimit të mesazheve. Çdo objekt është një abstraksion i një kompjuteri në kuptimin që ruan të dhëna dhe siguron ekzekutimin e proceseve për të manipuluar ato të dhëna. Përveç kësaj, objektet mund të dërgojnë dhe marrin mesazhe. Në thelb, këto janë vetitë themelore të një kompjuteri - për të ruajtur dhe përpunuar të dhëna, si dhe për të dërguar dhe marrë mesazhe.

Thelbi i programimit të orientuar nga objekti është zgjidhja e problemeve duke identifikuar objektet reale përkatëse dhe përpunimin e kërkuar për këto objekte; dhe modelimi i mëpasshëm i këtyre objekteve, proceset e tyre dhe lidhjet e nevojshme ndërmjet tyre.

Biblioteka e komponentëve vizualë (VCL)

Delfi përmban një numër të madh klasash të destinuara për zhvillim të shpejtë të aplikacioneve. Biblioteka është shkruar në Object Pascal dhe ka një lidhje të drejtpërdrejtë me Delphi IDE.

Të gjitha klasat VCL janë të vendosura në një nivel të caktuar të hierarkisë dhe formës pema (hierarkia) e klasave.

Njohja e origjinës së një objekti është një ndihmë e madhe për të mësuar rreth tij, pasi fëmija trashëgon të gjitha elementet e objektit prind. Pra, nëse vetia Caption i përket klasës TControl, atëherë këtë veti do ta kenë edhe pasardhësit e saj, për shembull, klasat TButton dhe TCheckBox dhe komponentët - Button dhe CheckBox, përkatësisht. Një fragment i hierarkisë së klasës me klasat më të rëndësishme është paraqitur në Fig.

Përveç hierarkisë së klasave, në mësimin e sistemit të programimit ndihmojnë shumë kodet burimore të moduleve, të cilat ndodhen në direktorinë SOURCE të direktoriumit kryesor Delphi.

Me vullnetin e fatit, më duhet të lexoj një kurs të veçantë për modelet e dizajnit në universitet. Kursi special është i detyrueshëm, prandaj studentët vijnë tek unë shumë ndryshe. Sigurisht, mes tyre ka edhe programues praktikantë. Por, për fat të keq, shumica e njerëzve kanë vështirësi edhe të kuptojnë termat bazë të OOP.

Për ta bërë këtë, u përpoqa të shpjegoj konceptet bazë të OOP (klasa, objekti, ndërfaqja, abstraksioni, kapsulimi, trashëgimia dhe polimorfizmi) duke përdorur pak a shumë shembuj të gjallë.

Pjesa e parë më poshtë ka të bëjë me klasat, objektet dhe ndërfaqet.
Pjesa e dytë ilustron kapsulimin, polimorfizmin dhe trashëgiminë

Konceptet bazë të OOP

Klasa
Imagjinoni se jeni duke projektuar një makinë. Ju e dini që një makinë duhet të përmbajë një motor, pezullim, dy fenerë, 4 rrota, etj. Ju gjithashtu e dini se makina juaj duhet të jetë në gjendje të marrë dhe të ngadalësojë, të kthehet dhe të kthehet prapa. Dhe, më e rëndësishmja, ju e dini saktësisht se si ndërveprojnë motori dhe rrotat, sipas çfarë ligjesh lëvizin boshti me gunga dhe boshti me gunga, si dhe se si janë rregulluar diferencialet. Ju jeni të sigurt në njohuritë tuaja dhe filloni të dizajnoni.

Ju përshkruani të gjitha pjesët që përbëjnë automjetin tuaj dhe se si këto pjesë ndërveprojnë me njëra-tjetrën. Përveç kësaj, ju përshkruani se çfarë duhet të bëjë përdoruesi për ta bërë makinën të frenojë ose të ndezë fenerët e rrezeve të gjata. Rezultati i punës suaj do të jetë një skicë. Ju sapo keni zhvilluar atë që quan OOP Klasa.

KlasaËshtë një mënyrë e përshkrimit të një entiteti, përcaktimit të gjendjes dhe sjelljes në varësi të kësaj gjendjeje, si dhe rregullave për ndërveprimin me këtë subjekt (kontratë).

Nga pikëpamja e programimit, një klasë mund të shihet si një grup të dhënash (fusha, atribute, anëtarë të klasës) dhe funksione për të punuar me to (metoda).

Nga pikëpamja e strukturës së programit, një klasë është një lloj kompleks i të dhënave.

Në rastin tonë, klasa do të përfaqësojë entitetin - makinën. Atributet e klasës do të jenë motori, pezullimi, trupi, katër rrotat, etj. Metodat e klasës do të jenë "hapni derën", "shtypni pedalin e gazit", dhe gjithashtu "pomponi një pjesë të benzinës nga rezervuari i gazit në motor". Dy metodat e para janë të disponueshme për ekzekutim nga klasa të tjera (në veçanti, klasa "Driver"). Ky i fundit përshkruan ndërveprimet brenda klasës dhe nuk është i disponueshëm për përdoruesit.

Në të ardhmen, pavarësisht se fjala "përdorues" lidhet me Klondike Solitaire dhe Microsoft Word, ne do t'i referohemi si përdorues atyre programuesve që përdorin klasën tuaj, përfshirë edhe veten tuaj. Personi që është autori i klasës, ne do ta quajmë zhvilluesin.

Nje objekt
Ju keni bërë një punë të shkëlqyer dhe makinat e projektuara sipas vizatimeve tuaja po rrokullisen nga linja e montimit. Këtu janë ata, duke qëndruar në rreshta të barabartë në oborrin e fabrikës. Secila prej tyre përsërit saktësisht vizatimet tuaja. Të gjitha sistemet ndërveprojnë pikërisht ashtu siç keni projektuar. Por çdo makinë është unike. Të gjithë kanë një numër trupi dhe motori, por të gjithë këta numra janë të ndryshëm, makinat ndryshojnë në ngjyra dhe disa madje kanë kallëpe në vend të disqeve të stampuara. Këto makina janë në thelb objekte të klasës suaj.

Objekti (shembull)Është një anëtar i veçantë i një klase me një gjendje dhe sjellje specifike që përcaktohet plotësisht nga klasa.

Me fjalë të thjeshta, një objekt ka vlera specifike të atributeve dhe metoda që funksionojnë në këto vlera bazuar në rregullat e përcaktuara në klasë. Në këtë shembull, nëse një klasë është një makinë abstrakte nga "bota e ideve", atëherë objekti është një makinë specifike që qëndron nën dritaret tuaja.

Ndërfaqja
Kur shkojmë në një aparat kafeje ose hipim pas timonit, ne fillojmë të ndërveprojmë me ta. Zakonisht, ndërveprimi zhvillohet me ndihmën e një grupi të caktuar elementësh: një vend për pranimin e monedhave, një buton për zgjedhjen e një pije dhe një ndarje për shpërndarjen e një gote në një aparat kafeje; timoni, pedalet, leva e marsheve ne veture. Ekziston gjithmonë një grup i kufizuar kontrollesh me të cilat ne mund të ndërveprojmë.

NdërfaqjaËshtë një koleksion i metodave të klasës në dispozicion për përdorim nga klasa të tjera.

Natyrisht, ndërfaqja e një klase do të jetë një grup i të gjitha metodave të saj publike së bashku me një grup atributesh publike. Në thelb, një ndërfaqe specifikon një klasë, duke përcaktuar qartë të gjitha veprimet e mundshme në të.
Një shembull i mirë i një ndërfaqeje do të ishte pulti i makinës, i cili ju lejon të përdorni metoda të tilla si rritja e shpejtësisë, frenimi, rrotullimi, ndryshimi i marsheve, ndezja e fenerëve, etj. Kjo është, të gjitha veprimet që një klasë tjetër (në rastin tonë, shoferi) mund të kryejë kur ndërvepron me makinën.

Kur përshkruani një ndërfaqe klase, është shumë e rëndësishme të vendosni një ekuilibër midis fleksibilitetit dhe thjeshtësisë. Një klasë me një ndërfaqe të thjeshtë do të jetë e lehtë për t'u përdorur, por do të ketë probleme që nuk do të jetë në gjendje t'i zgjidhë me ndihmën e saj. Në të njëjtën kohë, nëse ndërfaqja është fleksibël, atëherë, ka shumë të ngjarë, ajo do të përbëhet nga metoda mjaft komplekse me një numër të madh parametrash që do t'ju lejojnë të bëni shumë, por përdorimi i tij do të jetë i mbushur me vështirësi të mëdha dhe rrezik të bërë një gabim, diçka konfuze.

Një shembull i një ndërfaqe të thjeshtë është një makinë me një transmetim automatik. Çdo bjonde që ka përfunduar një kurs dy-javor të vozitjes do të jetë në gjendje të zotërojë shumë shpejt menaxhimin e tij. Nga ana tjetër, duhen disa muaj apo edhe vite trajnim të vështirë për të zotëruar kontrollin e një avioni modern pasagjerësh. Nuk do të doja të isha në bordin e një Boeing të drejtuar nga një burrë me dy javë përvojë fluturimi. Nga ana tjetër, ju kurrë nuk do ta detyroni një makinë të ngrihet dhe të fluturojë nga Moska në Uashington.

Java është një gjuhë e orientuar drejt objektit. Kjo do të thotë që ju duhet të shkruani programe Java duke përdorur një stil të orientuar nga objekti. Dhe ky stil bazohet në përdorimin e objekteve dhe klasave në program. Le të përpiqemi me ndihmën e shembujve të kuptojmë se cilat janë klasa dhe objekte, si dhe si të zbatojmë në praktikë parimet themelore të OOP: abstraksioni, trashëgimia, polimorfizmi dhe kapsulimi.

Çfarë është një objekt?

Bota në të cilën jetojmë është e përbërë nga objekte. Nëse shikojmë përreth, do të shohim se jemi të rrethuar nga shtëpi, pemë, makina, mobilje, pjata, kompjuterë. Të gjitha këto sende janë objekte dhe secila prej tyre ka një sërë karakteristikash, sjelljesh dhe qëllimesh specifike. Jemi mësuar me objektet dhe i përdorim gjithmonë për qëllime shumë specifike. Për shembull, nëse duhet të shkojmë në punë, përdorim makinën, nëse duam të hamë, përdorim enët dhe nëse pushojmë, na duhet një divan i rehatshëm. Një person është mësuar të mendojë objektivisht për të zgjidhur problemet në jetën e përditshme. Kjo ishte një nga arsyet e përdorimit të objekteve në programim, dhe kjo qasje për krijimin e programeve u quajt e orientuar drejt objekteve. Le të japim një shembull. Imagjinoni që keni zhvilluar një model të ri telefoni dhe dëshironi të filloni prodhimin masiv të tij. Si zhvillues i një telefoni, ju e dini se për çfarë shërben, si do të funksionojë dhe nga cilat pjesë do të përbëhet (trupi, mikrofoni, altoparlanti, telat, butonat, etj.). Për më tepër, vetëm ju dini se si t'i lidhni këto pjesë. Sidoqoftë, nuk planifikoni të prodhoni telefona personalisht, për këtë keni një staf të tërë punëtorësh. Në mënyrë që të mos keni nevojë të shpjegoni çdo herë se si të lidhni pjesët e telefonit dhe që të gjithë telefonat të jenë të njëjtë gjatë prodhimit, para se të filloni t'i prodhoni, duhet të bëni një vizatim në formën e një përshkrimi të pajisje telefonike. Në OOP, një përshkrim, vizatim, diagram ose shabllon i tillë quhet një klasë nga e cila krijohet një objekt kur programi ekzekutohet. Një klasë është një përshkrim i një objekti që nuk është krijuar ende, si një shabllon i përgjithshëm, i përbërë nga fusha, metoda dhe një konstruktor, dhe një objekt është një shembull i një klase të krijuar në bazë të këtij përshkrimi.

Abstraksioni

Le të mendojmë tani se si mund të kalojmë nga një objekt nga bota reale në një objekt në program duke përdorur shembullin e një telefoni. Historia e këtij mjeti komunikimi i kalon 100 vjet dhe telefoni modern, ndryshe nga paraardhësi i tij i shekullit të 19-të, është një pajisje shumë më komplekse. Kur përdorim një telefon, ne nuk mendojmë për strukturën e tij dhe proceset që ndodhin brenda tij. Ne thjesht përdorim funksionet e ofruara nga projektuesit e telefonit - butonat ose ekrani me prekje për të zgjedhur një numër dhe për të bërë thirrje. Një nga ndërfaqet më të hershme të telefonit ishte një çelës që duhej të rrotullohej për të kryer një telefonatë. Sigurisht, kjo nuk ishte shumë e përshtatshme. Sidoqoftë, doreza kryente rregullisht funksionin e saj. Nëse shikoni telefonin më modern dhe të parën, mund të vini në pah menjëherë detajet më të rëndësishme që janë të rëndësishme si për një pajisje të fundit të shekullit të 19-të, ashtu edhe për një smartphone ultramodern. Kjo është kryerja e një telefonate (formimi i një numri) dhe marrja e një telefonate. Kjo është në thelb ajo që e bën një telefon një telefon dhe jo diçka tjetër. Tani ne kemi aplikuar parimin në OOP - duke theksuar karakteristikat dhe informacionin më të rëndësishëm për një objekt. Ky parim quhet abstraksion. Abstraksioni në OOP mund të përkufizohet gjithashtu si një mënyrë e përfaqësimit të elementeve të detyrës nga bota reale si objekte në një program. Abstraksioni shoqërohet gjithmonë me përgjithësimin e disa informacioneve për vetitë e objekteve ose objekteve, kështu që gjëja kryesore është të ndash informacionin kuptimplotë nga i parëndësishëm në kontekstin e problemit që zgjidhet. Për më tepër, mund të ketë disa nivele të abstraksionit. Le të përpiqemi të zbatojmë parimin e abstraksionit në telefonat tanë. Për të filluar, le të theksojmë llojet më të zakonshme të telefonave që nga fillimi deri në ditët e sotme. Për shembull, ato mund të paraqiten në formën e një diagrami të paraqitur në figurën 1. Tani, me ndihmën e abstraksionit, ne mund të dallojmë informacionin e përgjithshëm në këtë hierarki të objekteve: një lloj i përgjithshëm abstrakt i objekteve - një telefon, një karakteristikë e përgjithshme i një telefoni - viti i krijimit të tij, dhe një ndërfaqe e përbashkët - të gjithë telefonat janë në gjendje të bëjnë dhe të marrin telefonata. Kështu duket në Java: klasa abstrakte publike AbstractPhone (vit int privat; publik AbstractPhone (int vit) (këtë. Viti = vit;) thirrje publike abstrakte të pavlefshme (int outputNumber); unazë abstrakte publike e zbrazët (int inputNumber);) Bazuar në këtë klasë abstrakte, ne do të jemi në gjendje të krijojmë lloje të reja telefonash në program duke përdorur parime të tjera bazë Java OOP, të cilat do t'i shqyrtojmë më poshtë.

Kapsulimi

Nëpërmjet abstraksione theksojmë të përgjithshme për të gjitha objektet. Sidoqoftë, çdo model telefoni është individual dhe disi i ndryshëm nga të tjerët. Si mund të vizatojmë kufijtë në program dhe ta përcaktojmë këtë individualitet? Si të sigurohemi që asnjë nga përdoruesit të mos mund ta thyejë telefonin tonë aksidentalisht ose qëllimisht, ose të përpiqet të ribëjë një model në një tjetër? Për botën e objekteve reale, përgjigja është e qartë: duhet të vendosni të gjitha detajet në kutinë e telefonit. Në fund të fundit, nëse nuk e bëni këtë dhe i lini të gjitha pjesët e brendshme të telefonit dhe telat që i lidhin jashtë, sigurisht që do të ketë një eksperimentues kureshtar që dëshiron të "përmirësojë" funksionimin e telefonit tonë. Për të përjashtuar një ndërhyrje të tillë në projektimin dhe funksionimin e një objekti në OOP, përdoret parimi i kapsulimit - një tjetër parim bazë i OOP, në të cilin atributet dhe sjellja e një objekti kombinohen në një klasë, zbatimi i brendshëm i objektit është fshihet nga përdoruesi dhe ofrohet një ndërfaqe e hapur për të punuar me objektin. Detyra e programuesit është të përcaktojë se cilat atribute dhe metoda do të jenë të disponueshme për akses publik, dhe cilat janë zbatimi i brendshëm i objektit dhe duhet të jenë të paarritshëm për ndryshime.

Kapsulimi dhe kontrolli i aksesit

Për shembull, gjatë prodhimit, informacioni rreth tij është i gdhendur në anën e pasme të telefonit: viti i lëshimit të tij ose logoja e kompanisë së prodhuesit. Ky informacion karakterizon në mënyrë specifike këtë model - gjendjen e tij. Mund të themi se zhvilluesi i telefonit u kujdes për pandryshueshmërinë e këtij informacioni - vështirë se dikush do të mendonte të hiqte gdhendjen. Në botën Java, gjendja e objekteve të ardhshme përshkruhet në një klasë duke përdorur fusha, dhe sjellja e tyre përshkruhet duke përdorur metoda. Mundësia e ndryshimit të gjendjes dhe sjelljes kryhet duke përdorur modifikues të aksesit në fusha dhe metoda - private, e mbrojtur, publike , si dhe default (qasja e parazgjedhur). Për shembull, vendosëm që viti i krijimit, emri i prodhuesit të telefonit dhe një nga metodat i përkasin zbatimit të brendshëm të klasës dhe nuk mund të ndryshohen nga objekte të tjera në program. Duke përdorur kodin, klasa mund të përshkruhet si më poshtë: klasa publike SomePhone (viti int privat; kompania private String; publike SomePhone (viti int, kompania String) (këtë. Viti = vit; kjo. Kompania = kompania;) private void openConnection ( ) (/ / findComutator // openNewConnection ...) thirrje publike void () (openConnection (); System.out.println ("Po telefonoj numrin");) unazë publike void () (System.out.println ("Tink-tink") ;)) Modifikues private i bën fushat dhe metodat e një klase të disponueshme vetëm brenda klasës së caktuar. Kjo do të thotë që ju mund të hyni private fusha nga jashtë është e pamundur, ashtu siç nuk ka asnjë mënyrë për të thirrur private metodat. Fshehja e aksesit në metodën openConnection na lë gjithashtu të lirë të ndryshojmë zbatimin e brendshëm të kësaj metode, pasi kjo metodë garantohet të mos përdoret nga objekte të tjera dhe nuk do të prishë punën e tyre. Për të punuar me objektin tonë, ne i lëmë të hapura metodat e thirrjes dhe ziles duke përdorur modifikuesin publike . Sigurimi i metodave publike për të punuar me një objekt është gjithashtu pjesë e mekanizmit të kapsulimit, sikur të mbyllni plotësisht aksesin në objekt - ai do të bëhet i padobishëm.

Trashëgimia

Le të hedhim një vështrim tjetër në diagramin e telefonit. Mund të vini re se është një hierarki, në të cilën modeli i vendosur më poshtë ka të gjitha tiparet e modeleve të vendosura më lart në degë, plus të tijat. Për shembull, një telefon inteligjent përdor një rrjet celular për komunikim (ka vetitë e një telefoni celular), është me valë dhe i lëvizshëm (ka vetitë e një telefoni pa tela) dhe mund të marrë dhe të bëjë thirrje (ka vetitë e një telefoni). Në këtë rast, mund të flasim për trashëgiminë e vetive të objektit. Në programim, trashëgimia ka të bëjë me përdorimin e klasave ekzistuese për të përshkruar ato të reja. Le të shqyrtojmë një shembull të krijimit të një klase smartphone duke përdorur trashëgiminë. Të gjithë telefonat pa tela funksionojnë me bateri të rikarikueshme, të cilat kanë një jetëgjatësi të caktuar në orë. Pra, le ta shtojmë këtë veçori në klasën e telefonit me valë: klasa abstrakte publike WirelessPhone zgjeron AbstractPhone (int orë private; publike WirelessPhone (int vit, int orë) (super (vit); kjo. Ora = orë;)) Celularët trashëgojnë vetitë të një telefoni me valë, ne shtuam gjithashtu metodat e thirrjes dhe ziles në këtë klasë: klasën publike CellPhone zgjeron WirelessPhone (CellPhone publik (viti int, ora int) (super (viti, ora);) @Override thirrjen publike të pavlefshme (int outputNumber) ( System. out. println ("Numri telefonues" + outputNumber);) @Override unazën publike të pavlefshme (int inputNumber) (Sistemi. jashtë. println ( "Një pajtimtar po ju thërret"+ Numri i hyrjes); )) Dhe së fundi, klasa e smartfonëve, e cila, ndryshe nga telefonat celularë klasikë, ka një sistem operativ të plotë. Mund të shtoni programe të reja të mbështetura nga ky sistem operativ në smartphone tuaj, duke zgjeruar kështu funksionalitetin e tij. Duke përdorur kodin, klasa mund të përshkruhet si më poshtë: Klasa publike Smartphone zgjeron celularin (Sistemi operacional i vargut privat; telefoni inteligjent publik (viti int, ora int, sistemi i funksionimit të vargut) (super (viti, ora); kjo. OperationSystem = OperationSystem;) boshllëk publik instaloj (programin e vargut) (Sistemi. jashtë. println ("Unë instaloj" + program + "për" + operacionSistemi);)) Siç mund ta shihni, ne krijuam mjaft kod të ri për të përshkruar klasën e Smartphone, por morëm një klasë e re me funksionalitet të ri. Përdorimi i këtij parimi të OOP java ju lejon të zvogëloni ndjeshëm sasinë e kodit, dhe për këtë arsye, të lehtësoni punën e programuesit.

Polimorfizmi

Nëse shikojmë të gjitha modelet e telefonave, atëherë, pavarësisht nga ndryshimet në pamjen dhe strukturën e modeleve, mund të dallojmë disa sjellje të zakonshme midis tyre - të gjithë mund të marrin dhe të bëjnë thirrje dhe të kenë një grup butonash kontrolli mjaft të qartë dhe të thjeshtë. Duke zbatuar një nga parimet bazë të OOP, të cilin tashmë e dimë, abstraksionin në aspektin programor, mund të themi se objekti i telefonit ka një ndërfaqe të përbashkët. Prandaj, përdoruesit e telefonit mund të përdorin mjaft të qetë modele të ndryshme, duke përdorur të njëjtat butona kontrolli (mekanikë ose me prekje), pa hyrë në ndërlikimet teknike të pajisjes. Pra, ju përdorni vazhdimisht një celular dhe mund të bëni lehtësisht një telefonatë nga homologu i tij fiks. Parimi në OOP, kur një program mund të përdorë objekte me të njëjtën ndërfaqe pa informacion për strukturën e brendshme të objektit, quhet polimorfizëm ... Le të imagjinojmë që në programin tonë duhet të përshkruajmë një përdorues që mund të përdorë çdo model telefoni për të thirrur një përdorues tjetër. Ja se si mund ta bëni këtë: Përdoruesi i klasës publike (emri i vargut privat; përdoruesi publik (emri i vargut) (ky. Emri = emri;) callAnotherUser publik i pavlefshëm (numri int, telefoni AbstractPhone) ( // këtu është polimorfizëm - duke përdorur llojin abstrakt AbstractPhone phone në kod! telefonit. thirrje (numër); ))) Tani le të përshkruajmë modelet e ndryshme të telefonit. Një nga modelet e para të telefonit: klasa publike ThomasEdisonPhone zgjeron AbstractPhone (publik ThomasEdisonPhone (int viti) (super (vit);) @Override thirrjen publike të pavlefshme (int outputNumber) (System. Out.println ("Rrotulloni dorezën"); Sistemi . Jashtë . println ( "Jepni numrin e pajtimtarit, zotëri"); ) @Override ziles publike të zbrazët (int inputNumber) (Sistemi. Jashtë. Println ("Telefoni po bie");)) Telefoni i zakonshëm i linjës fikse: telefoni i klasës publike shtrihet AbstractPhone (Telefon publik (int viti) (super (vit);) @Override public void call (int outputNumber) (System. out.println ("Thirrja e numrit" + outputNumber);) @Override public void ring (int inputNumber) (System. out.println ("Telefoni po bie zile"); )) Dhe së fundi , videofon i lezetshëm: videoPhone i klasës publike zgjeron AbstractPhone (VideoPhone publik (viti int) (super (vit);) @Override thirrjen publike të pavlefshme (int outputNumber) (System.out.println ( "Unë lidh kanalin e videos për pajtimtarin"+ Numri i daljes); ) @Override unazën publike të zbrazët (int inputNumber) (System.out.println ( "Ke një videotelefonatë hyrëse..."+ Numri i hyrjes); )) Le të krijojmë objekte në metodën kryesore () dhe të testojmë metodën callAnotherUser: AbstractPhone firstPhone = new ThomasEdisonPhone (1879); Abstrakt Telefoni i telefonit = Telefon i ri (1984); AbstractPhone videoPhone = i ri VideoPhone (2018); Përdoruesi = Përdoruesi i ri ("Andrey"); përdorues. callAnotherUser (224466, First Phone); // Rrotulloni dorezën // Jepni numrin e pajtimtarit, zotëri përdorues. callAnotherUser (224466, telefon); // Telefononi në numrin 224466 përdorues. callAnotherUser (224466, videoPhone); // Unë lidh kanalin e videos për pajtimtarin 224466 Duke thirrur të njëjtën metodë në objektin e përdoruesit, ne morëm rezultate të ndryshme. Zgjedhja e një zbatimi specifik të metodës së thirrjes brenda metodës callAnotherUser është bërë në mënyrë dinamike bazuar në llojin specifik të objektit thirrës gjatë ekzekutimit të programit. Ky është avantazhi kryesor i polimorfizmit - zgjedhja e zbatimit gjatë ekzekutimit të programit. Në shembujt e mësipërm të klasës së telefonit, ne përdorëm metodën mbivendosje, një teknikë që ndryshon zbatimin e metodës të përcaktuar në klasën bazë pa ndryshuar nënshkrimin e metodës. Ky është në thelb një zëvendësim i metodës dhe është metoda e re e përcaktuar në nënklasë që thirret kur programi ekzekutohet. Zakonisht, kur anashkaloni një metodë, përdoret shënimi @Override, i cili i thotë përpiluesit të kontrollojë nënshkrimet e metodave të anashkaluara dhe të anashkaluara. Përfundimisht Për të stiluar programin tuaj në përputhje me konceptin OOP dhe parimet OOP të Java, ndiqni këto këshilla:
  • të nxjerrë në pah karakteristikat kryesore të objektit;
  • nxjerr në pah vetitë dhe sjelljen e përbashkët dhe përdor trashëgiminë kur krijon objekte;
  • të përdorë lloje abstrakte për të përshkruar objektet;
  • përpiquni të fshehni gjithmonë metodat dhe fushat që lidhen me zbatimin e brendshëm të klasës.

(siç nënkupton OOP) është, para së gjithash, një paradigmë programimi.
Paradigma e programimit përcakton se si programuesi e sheh ekzekutimin e programit.
Pra, për paradigmën OOP, është karakteristikë që programuesi e konsideron programin si një grup objektesh ndërvepruese, ndërsa, për shembull, në programimin funksional, programi përfaqësohet si një sekuencë llogaritje funksionesh. Programimi procedural, ose, siç quhet edhe saktë, operacional klasik, nënkupton shkrimin e një algoritmi për zgjidhjen e një problemi; megjithatë, vetitë e pritshme të rezultatit përfundimtar nuk përshkruhen ose tregohen. Programimi i strukturuar në thelb i përmbahet të njëjtave parime si programimi procedural, duke i plotësuar ato vetëm pak me truke të dobishme.
Paradigmat e programimit joprocedural, të cilat përfshijnë paradigmën e orientuar nga objekti, kanë ide krejtësisht të ndryshme.
Përkufizimi i Gradi Buch është: Programim i orientuar nga objektiËshtë një metodologji programimi që bazohet në paraqitjen e një programi si një grup objektesh, secila prej të cilave është një zbatim i një klase të caktuar (lloj i një lloji të veçantë), dhe klasat formojnë një hierarki bazuar në parimet e trashëgimisë ".
Programimi strukturor dhe i orientuar nga objekti bazohet në një metodë të tillë shkencore si dekompozimi- një metodë që përdor strukturën e problemit dhe ju lejon të ndani zgjidhjen e një problemi të përbashkët të madh në zgjidhjen e një sekuence problemesh më të vogla. Zbërthimi i OOP ndodh jo sipas algoritmeve, por sipas objekteve të përdorura për të zgjidhur problemin. Ky zbërthim zvogëlon madhësinë e sistemeve softuerike duke ripërdorur mekanizma të zakonshëm. Dihet se sistemet e programimit vizual ose sistemet e bazuara në parimet e programimit të orientuar nga objekti janë më fleksibël dhe më të lehtë për t'u zhvilluar me kalimin e kohës.

Historia e zhvillimit të OOP daton në fund të viteve '60. Gjuha e parë e orientuar nga objekti ishte gjuha e programimit Simula, e krijuar në një qendër kompjuterike në Norvegji. Gjuha kishte për qëllim të simulonte situata të botës reale. Një tipar i Simula ishte se një program i shkruar në një gjuhë organizohej nga objekte programuese. Objektet kishin udhëzime të quajtura metoda dhe të dhëna të quajtura variabla; metodat dhe të dhënat përcaktuan sjelljen e objektit. Gjatë procesit të modelimit, objekti u soll sipas sjelljes së tij standarde dhe, nëse ishte e nevojshme, ndryshoi të dhënat për të pasqyruar ndikimin e veprimit të caktuar.

Ka mjaftueshëm gjuhë programimi të orientuara nga objekti, më të njohurat prej të cilave janë aktualisht C ++, Delphi, Java, Visual Basic, Flash. Por, përveç kësaj, shumë gjuhë që zakonisht konsiderohen si një paradigmë procedurale kanë gjithashtu veti OOP, duke qenë në gjendje të punojnë me objekte. Pra, programimi i orientuar nga objekti në C është një pjesë e madhe e programimit në këtë gjuhë, e njëjta gjë vlen edhe për OOP në python dhe shumë gjuhë të tjera të strukturuara.

Kur flasim për OOP, shpesh del një përkufizim tjetër - programimi vizual... Ai gjithashtu siguron përdorim të gjerë të prototipave të objekteve, të cilat përcaktohen si klasa objektesh.
Ngjarjet. Në shumë mjedise programimi vizual, zbatohet një karakteristikë (përveç kapsulimit, polimorfizmit dhe trashëgimisë) e një objekti - një ngjarje. Ngjarjet në programimin e orientuar nga objekti është aftësia për të përpunuar të ashtuquajturat mesazhe (ose ngjarje) të marra nga sistemi operativ Windows ose vetë programi. Ky parim është tipik për të gjithë komponentët e mjedisit që përpunojnë ngjarje të ndryshme që ndodhin gjatë ekzekutimit të programit. Në fakt, një ngjarje është një lloj veprimi që aktivizon reagimin standard të një objekti. Një ngjarje mund të konsiderohet, për shembull, klikimi në butonin e miut, vendosja e kursorit të miut mbi një artikull të menysë, hapja e një skede, etj. Rendi i ekzekutimit të veprimeve të caktuara përcaktohet pikërisht nga ngjarjet që ndodhin në sistem dhe reagimi i objekteve ndaj tyre.
Klasat dhe objektet në OOP- koncepte të ndryshme. Koncepti i një klase në OOP është një lloj i të dhënave (i njëjtë si, për shembull, Real ose String), dhe një objekt është një shembull specifik i një klase (kopja e tij), i ruajtur në memorien e kompjuterit si një ndryshore e llojit përkatës. .
Klasaështë një lloj i strukturuar i të dhënave. Klasa përfshin një përshkrim të fushave të të dhënave, si dhe procedurat dhe funksionet që punojnë me këto fusha të dhënash. Metoda OOP- këto janë procedura dhe funksione të tilla në lidhje me klasat.
Klasat kanë fusha (si tipi i të dhënave të regjistrimit), veti që janë të ngjashme me fushat, por kanë përshkrues shtesë që përcaktojnë mekanizmat për shkrimin dhe leximin e të dhënave dhe metodave - nënprograme që synojnë ndryshimin e fushave dhe vetive të një klase.

Parimet themelore të OOP

Përveç trajtimit të ngjarjeve, parimet e programimit të orientuar nga objekti janë kapsulimi, trashëgimia, nënklasifikimi dhe polimorfizmi. Ato janë veçanërisht të dobishme dhe thelbësore kur zhvillohen aplikacione të riprodhueshme dhe të lehta për t'u mirëmbajtur.
Një objekt kombinon metoda dhe veti që nuk mund të ekzistojnë veçmas prej tij. Prandaj, nëse objekti fshihet, atëherë vetitë e tij dhe metodat e lidhura fshihen. Kur kopjoni, ndodh e njëjta gjë: objekti kopjohet në tërësi. kapsulimi OOP- kjo është karakteristika e përshkruar.

Parimi i trashëgimisë OOP dhe nënklasat

Absolutisht të gjitha objektet krijohen në bazë të klasave, ndërsa trashëgojnë vetitë dhe metodat e këtyre klasave. Nga ana tjetër, klasat mund të krijohen bazuar në klasa të tjera (prindër), atëherë klasa të tilla quhen nënklasa (pasardhës). Nënklasat trashëgojnë të gjitha vetitë dhe metodat e klasës mëmë. Përveç kësaj, për një nënklasë ose një klasë pasardhëse, ju mund të përcaktoni vetitë dhe metodat tuaja të reja, si dhe të ndryshoni metodat e klasës mëmë. Ndryshimet në vetitë dhe metodat e një klase mëmë gjurmohen në nënklasat e bazuara në këtë klasë, si dhe në objektet e krijuara nga nënklasat. Kjo është trashëgimi OOP.

Polimorfizmi OOP

Në programimin e orientuar nga objekti, polimorfizmi karakterizohet si ndërkëmbueshmëria e objekteve me të njëjtën ndërfaqe. Kjo mund të shpjegohet si më poshtë: klasa pasardhëse trashëgon instancat e metodave të klasës mëmë, por ekzekutimi i këtyre metodave mund të ndodhë në një mënyrë tjetër, që korrespondon me specifikat e klasës pasardhëse, domethënë të modifikuar.
Kjo do të thotë, nëse në programimin procedural emri i një procedure ose funksioni identifikon në mënyrë unike kodin e ekzekutueshëm të lidhur me një procedurë ose funksion të caktuar, atëherë në programimin e orientuar nga objekti mund të përdorni të njëjtat emra metodash për të kryer veprime të ndryshme. Domethënë, rezultati i ekzekutimit të së njëjtës metodë varet nga lloji i objektit në të cilin aplikohet kjo metodë.

Faqja paraqet një teori të pjesshme të programimit të orientuar nga objekti për fillestarët dhe shembuj OOP të zgjidhjes së problemeve. Mësimet e faqes OOP janë algoritme të detajuara për detyrën. Në bazë të kryerjes së këtyre punëve laboratorike, studenti do të jetë në gjendje të zgjidhë në mënyrë të pavarur probleme të tjera të ngjashme në të ardhmen.
Ne ju dëshirojmë një mësim të lehtë dhe argëtues rreth programimit të orientuar nga objekti!

Artikujt kryesorë të lidhur