Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Këshilla
  • Polimorfizmi - çfarë është? Polimorfizmi gjenetik. Enkapsulimi, trashëgimia, polimorfizmi (Bazat e PHP-së - Mësimi nga kursi) Konceptet bazë të polimorfizmit të trashëgimisë së enkapsulimit OOP

Polimorfizmi - çfarë është? Polimorfizmi gjenetik. Enkapsulimi, trashëgimia, polimorfizmi (Bazat e PHP-së - Mësimi nga kursi) Konceptet bazë të polimorfizmit të trashëgimisë së enkapsulimit OOP

Polimorfizmi gjenetik është një gjendje në të cilën ekziston një diversitet afatgjatë i gjeneve, por frekuenca e gjenit më të rrallë në popullatë është më shumë se një përqind. Ruajtja e tij ndodh për shkak të mutacionit të vazhdueshëm të gjeneve, si dhe rikombinimit të tyre të vazhdueshëm. Sipas hulumtimeve të kryera nga shkencëtarët, polimorfizmi gjenetik është bërë i përhapur, sepse mund të ketë disa milionë kombinime gjenesh.

Stoku i madh

Përshtatja më e mirë e një popullate në një mjedis të ri varet nga një furnizim i madh i polimorfizmit, dhe në këtë rast evolucioni ndodh shumë më shpejt. Nuk është praktike të vlerësohet i gjithë numri i aleleve polimorfike duke përdorur metoda gjenetike tradicionale. Kjo për faktin se prania e një gjeni të caktuar në gjenotip arrihet duke kryqëzuar individë që kanë karakteristika të ndryshme fenotipike të përcaktuara nga gjeni. Nëse e dini se cila pjesë e një popullate të caktuar përbëhet nga individë me fenotipe të ndryshme, atëherë bëhet e mundur të përcaktohet numri i aleleve nga i cili varet formimi i një tipari të veçantë.

Si filloi gjithçka?

Gjenetika filloi të zhvillohet me shpejtësi në vitet '60 të shekullit të kaluar, ishte atëherë që filluan të përdoren enzimat në xhel, gjë që bëri të mundur përcaktimin e polimorfizmit gjenetik. Çfarë është kjo metodë? Është me ndihmën e saj që proteinat lëvizin në një fushë elektrike, e cila varet nga madhësia e proteinës që lëviz, konfigurimi i saj, si dhe ngarkesa totale në pjesë të ndryshme të xhelit. Pas kësaj, në varësi të vendndodhjes dhe numrit të njollave që shfaqen, identifikohet substanca e identifikuar. Për të vlerësuar polimorfizmin e proteinave në një popullatë, ia vlen të ekzaminohen afërsisht 20 ose më shumë lokuse. Pastaj, duke përdorur një metodë matematikore, përcaktohet numri dhe raporti i homo- dhe heterozigoteve. Sipas hulumtimit, disa gjene mund të jenë monomorfikë, ndërsa të tjerët mund të jenë jashtëzakonisht polimorfikë.

Llojet e polimorfizmit

Koncepti i polimorfizmit është jashtëzakonisht i gjerë; ai përfshin një variant kalimtar dhe të balancuar. Kjo varet nga vlera selektive e gjenit dhe seleksionimi natyror, i cili ushtron presion mbi popullatën. Përveç kësaj, ajo mund të jetë gjenetike dhe kromozomale.

Polimorfizmi i gjenit dhe kromozomit

Polimorfizmi i gjenit përfaqësohet në trup nga më shumë se një alele; një shembull i mrekullueshëm i kësaj është gjaku. Kromozomi përfaqëson dallimet brenda kromozomeve që ndodhin për shkak të devijimeve. Megjithatë, ka dallime në rajonet heterokromatike. Në mungesë të patologjisë që do të çojë në dëmtim ose vdekje, mutacione të tilla janë neutrale.

Polimorfizmi kalimtar

Polimorfizmi kalimtar ndodh kur një alele që dikur ishte e zakonshme zëvendësohet në një popullatë nga një tjetër që i siguron bartësit të tij përshtatshmëri më të madhe (i quajtur edhe alelizem i shumëfishtë). Me një varietet të caktuar, ka një zhvendosje të drejtimit në përqindjen e gjenotipeve, për shkak të së cilës ndodh evolucioni dhe kryhet dinamika e tij. Fenomeni i mekanizmit industrial mund të jetë një shembull i mirë që karakterizon polimorfizmin kalimtar. Se çfarë tregon një flutur e thjeshtë, e cila, me zhvillimin e industrisë, ndryshoi ngjyrën e bardhë të krahëve në të errët. Ky fenomen filloi të vërehej në Angli, ku më shumë se 80 lloje fluturash u kthyen nga lule të zbehta krem ​​në ato të errëta, gjë që u vu re për herë të parë pas vitit 1848 në Mançester për shkak të zhvillimit të shpejtë të industrisë. Tashmë në 1895, më shumë se 95% e molave ​​fituan një ngjyrë të errët të krahëve të tyre. Ndryshime të tilla lidhen me faktin se trungjet e pemëve janë bërë më të tymosur, dhe fluturat me ngjyra të çelura janë bërë pre e lehtë për mëllenjët dhe robinat. Ndryshimet ndodhën për shkak të aleleve melaniste mutante.

Polimorfizëm i balancuar

Përkufizimi i "polimorfizmit të ekuilibruar" karakterizon mungesën e një ndryshimi në çdo raport numerik të formave të ndryshme të gjenotipeve në një popullatë që është në kushte të qëndrueshme mjedisore. Kjo do të thotë se nga brezi në brez raporti mbetet i njëjtë, por mund të luhatet pak brenda një vlere të caktuar, e cila është konstante. Në krahasim me polimorfizmin kalimtar, të ekuilibruar - çfarë është? Ky është kryesisht një proces statik evolucionar. I. I. Shmalhausen në vitin 1940 i dha edhe emrin heteromorfizëm ekuilibër.

Shembull i polimorfizmit të balancuar

Një shembull i qartë i polimorfizmit të ekuilibruar është prania e dy gjinive në shumë kafshë monogame. Kjo për faktin se ato kanë avantazhe të barabarta selektive. Raporti i tyre brenda një popullsie është gjithmonë i barabartë. Nëse ka poligami në një popullatë, raporti selektiv i përfaqësuesve të të dy gjinive mund të prishet, në këtë rast përfaqësuesit e një seksi ose mund të shkatërrohen plotësisht ose të eliminohen nga riprodhimi në një masë më të madhe sesa përfaqësuesit e seksit të kundërt.

Një shembull tjetër do të ishte grupi i gjakut sipas sistemit ABO. Në këtë rast, frekuenca e gjenotipeve të ndryshme në popullata të ndryshme mund të jetë e ndryshme, por në të njëjtën kohë nuk e ndryshon qëndrueshmërinë e saj nga brezi në brez. E thënë thjesht, asnjë gjenotip nuk ka një avantazh selektiv ndaj një tjetri. Sipas statistikave, meshkujt me grupin e parë të gjakut kanë jetëgjatësi më të gjatë se anëtarët e tjerë të seksit më të fortë me grupe të tjera gjaku. Së bashku me këtë, rreziku i zhvillimit të ulçerës duodenale në prani të grupit të parë është më i lartë, por mund të shpohet dhe kjo do të shkaktojë vdekjen nëse ndihma vonohet.

Bilanci gjenetik

Kjo gjendje e brishtë mund të prishet në një popullsi si pasojë e shfaqjes dhe ato duhet të ndodhin me një frekuencë të caktuar dhe në çdo gjeneratë. Studimet kanë treguar se polimorfizmat e gjeneve të sistemit hemostatik, dekodimi i të cilave e bën të qartë nëse procesi evolucionar i nxit këto ndryshime ose, anasjelltas, i kundërshton ato, janë jashtëzakonisht të rëndësishme. Nëse gjurmoni rrjedhën e procesit mutant në një popullatë të caktuar, mund të gjykoni gjithashtu vlerën e tij për përshtatje. Mund të jetë e barabartë me një nëse mutacioni nuk përjashtohet gjatë procesit të përzgjedhjes dhe nuk ka pengesa për përhapjen e tij.

Shumica e rasteve tregojnë se vlera e gjeneve të tilla është më pak se një, dhe në rastin e paaftësisë së mutantëve të tillë për t'u riprodhuar, gjithçka zbret në 0. Mutacionet e këtij lloji hiqen mënjanë në procesin e seleksionimit natyror, por kjo ndodh. nuk përjashtohen ndryshimet e përsëritura në të njëjtin gjen, i cili kompenson eliminimin që kryhet me përzgjedhje. Pastaj arrihet ekuilibri, gjenet e mutuara mund të shfaqen ose, anasjelltas, të zhduken. Kjo çon në një proces të ekuilibruar.

Një shembull që mund të karakterizojë qartë atë që po ndodh është anemia drapërocitare. Në këtë rast, një gjen mbizotërues i mutuar në një gjendje homozigote kontribuon në vdekjen e hershme të organizmit. Organizmat heterozigotë mbijetojnë, por janë më të ndjeshëm ndaj sëmundjes së malaries. Polimorfizmi i balancuar i gjenit të anemisë drapërocitare mund të gjurmohet në zonat e shpërndarjes së kësaj sëmundjeje tropikale. Në një popullatë të tillë eliminohen homozigotët (individët me të njëjtat gjene) dhe seleksionimi vepron në favor të heterozigotëve (individë me gjene të ndryshme). Për shkak të përzgjedhjes me shumë vektorë që ndodh në grupin e gjeneve të popullatës, gjenotipet mbahen në çdo gjeneratë, të cilat sigurojnë përshtatshmëri më të mirë të organizmit ndaj kushteve mjedisore. Së bashku me praninë e gjenit të anemisë drapërocitare, ekzistojnë lloje të tjera gjenesh që karakterizojnë polimorfizmin. Çfarë jep kjo? Përgjigja për këtë pyetje do të jetë një fenomen i quajtur heterozë.

Mutacione heterozigote dhe polimorfizëm

Polimorfizmi heterozigot parashikon mungesën e ndryshimeve fenotipike në prani të mutacioneve recesive, edhe nëse ato janë të dëmshme. Por në të njëjtën kohë, ato mund të grumbullohen në një popullatë në një nivel të lartë, i cili mund të tejkalojë mutacionet e dëmshme dominuese.

procesi evolucionar

Procesi evolucionar është i vazhdueshëm dhe parakusht i tij është polimorfizmi. Çfarë do të thotë kjo është përshtatshmëria e vazhdueshme e një popullsie të caktuar me habitatin e saj. Organizmat e sekseve të ndryshme që jetojnë brenda të njëjtit grup mund të jenë në një gjendje heterozigote dhe të transmetohen nga brezi në brez për shumë vite. Së bashku me këtë, manifestimi i tyre fenotipik mund të mos ekzistojë - për shkak të rezervës së madhe të ndryshueshmërisë gjenetike.

Gjeni i fibrinogjenit

Në shumicën e rasteve, studiuesit e konsiderojnë polimorfizmin e gjenit të fibrinogjenit si një pararendës për zhvillimin e goditjes ishemike. Por për momentin po del në pah problemi në të cilin faktorët gjenetikë dhe të fituar mund të ndikojnë në zhvillimin e kësaj sëmundjeje. Ky lloj goditjeje zhvillohet për shkak të trombozës së arterieve cerebrale dhe duke studiuar polimorfizmin e gjenit të fibrinogjenit mund të kuptohen shumë procese, duke ndikuar në të cilat mund të parandalohet sëmundja. Aktualisht, shkencëtarët nuk kanë studiuar mjaftueshëm lidhjet midis ndryshimeve gjenetike dhe parametrave biokimikë të gjakut. Hulumtimet e mëtejshme do të bëjnë të mundur ndikimin në rrjedhën e sëmundjes, ndryshimin e rrjedhës së saj ose thjesht parandalimin e saj në një fazë të hershme të zhvillimit.

Programim i orientuar nga objekti(OOP) është një qasje për krijimin e programeve të bazuara në përdorimin e klasave dhe objekteve që ndërveprojnë me njëri-tjetrin.

Një klasë (klasa Java) përshkruan strukturën dhe sjelljen e objekteve. Një pajisje përshkruhet përmes një grupi karakteristikash (vetish), dhe sjellja përshkruhet përmes një grupi operacionesh (metodash) të disponueshme për objektet. Klasat mund të krijohen bazuar në ato ekzistuese duke shtuar ose duke anashkaluar vetitë dhe metodat.

Klasat përfaqësojnë shabllonet me të cilat ndërtohen objektet. Objektet janë elementë programi që kanë një grup karakteristikash dhe sjelljesh të ngjashme (d.m.th. janë elementë të ndërtuar mbi bazën e së njëjtës klasë). Çdo objekt ka një gjendje të caktuar, përcaktohet nga vlera e të gjitha vetive të tij. Disa klasa mund të ekzistojnë në një program, dhe objektet e klasave të ndryshme mund të ndërveprojnë me njëri-tjetrin (përmes metodave).

Trashëgimia, shtrihet

Trashëgimia është një pjesë integrale e Java. Gjatë përdorimit të trashëgimisë, merret parasysh që një klasë e re që trashëgon vetitë e klasës bazë (prind) i ka të gjitha vetitë që ka prindi. Kodi përdor operandin shtrihet, e ndjekur nga emri i klasës bazë. Kjo hap qasje në të gjitha fushat dhe metodat e klasës bazë.

Duke përdorur trashëgiminë, është e mundur të krijohet një "klasë java" e përgjithshme që përcakton karakteristikat e përbashkëta për një grup elementësh të lidhur. Pastaj ju mund të trashëgoni prej tij dhe të krijoni klasa shtesë për të cilat mund të përcaktoni karakteristika shtesë që janë unike për ta.

Klasa kryesore e trashëguar në Java quhet superklasë super. Klasa trashëguese quhet nënklasa. Kështu, një nënklasë është një version i specializuar i një superklase që trashëgon të gjitha vetitë e superklasës dhe shton elementet e veta unike.

Le të shqyrtojmë një shembull të një përshkrimi të klasës java "një student Studenti, i cili ka një emër, mbiemër, moshë dhe numër grupi. Ne do të krijojmë një klasë studentore bazuar në super klasën e përdoruesit Përdoruesi, i cili tashmë ka një emër, mbiemër dhe moshë të përcaktuar:

Përdoruesi i klasës publike ( mosha int; emri i vargut; mbiemri i vargut; // Përdoruesi publik i konstruktorit (mosha int, emri i vargut, mbiemri i vargut) ( this.age = mosha; this.firstName = emri; this.mbiemri = mbiemri; ) )

Tani krijojmë një klasë të veçantë Student, e cila trashëgon vetitë e klasës super. Kur trashëgoni një klasë, duhet gjithashtu të anashkaloni konstruktorët e klasës mëmë:

Klasa publike Studenti zgjeron Përdoruesin ( grupi int; // Konstruktori publik Studenti (mosha int, vargu i pariName, string mbiemri) ( super(mosha, emri, mbiemri); ) boolean isMyGroup(int g) (kthim g == grup; )

Fjalë kyçe shtrihet tregon se po trashëgojmë nga klasa User.

Fjalë kyçe super

Në konstruktorin e klasës Student thërrasim konstruktorin e klasës prind nëpërmjet operatorit super, duke i kaluar të gjithë grupin e nevojshëm të parametrave. Në Java fjala kyçe super tregon një superklasë, d.m.th. Klasa nga e cila rrjedh klasa aktuale. Fjala kyçe super mund të përdoret për të thirrur një konstruktor të superklasës dhe për të aksesuar një anëtar të superklasës të fshehur nga një anëtar i nënklasës.

Le të shohim se si ndodh trashëgimisë për sa i përket krijimit të objektit:

Student student = student i ri(18, "Kisa", "Vorobyaninov", 221);

Fillimisht hapet konstruktori i klasës Student, më pas thirret konstruktori i superklasës User dhe më pas kryhen veprimet e mbetura në konstruktorin Student. Kjo sekuencë veprimesh është mjaft logjike dhe ju lejon të krijoni objekte më komplekse bazuar në ato më të thjeshta.

Një superklasë mund të ketë versione të shumta të mbingarkuara të konstruktorëve të saj, kështu që metoda super() mund të thirret me parametra të ndryshëm. Programi do të ekzekutojë konstruktorin që përputhet me argumentet e specifikuara.

Forma e dytë e fjalës kyçe super vepron si një fjalë kyçe kjo, vetëm në këtë rast i referohemi gjithmonë superklasës së nënklasës në të cilën përdoret. Forma e përgjithshme është si më poshtë:

Këtu anëtari mund të jetë një metodë ose një variabël shembulli. Kjo formë është e përshtatshme në rastet kur emrat e anëtarëve të një nënklase fshehin anëtarët e një superklase me emra të njëjtë.

Klasa A ( int i; ) // trashëguar nga klasa A klasa B shtrihet A ( int i; // emri i ndryshores përputhet dhe fsheh variablin i në klasën A B(int a, int b) ( super.i = a; // akses në variablin i nga klasa A i = b; // hyr në ndryshoren i nga klasa B ) void show() ( System.out.println ("i nga superklasa është " + super.i); System.out.println (" i në nënklasë është " + i); ) ) klasa MainActivity (nënklasa B = e re B(1, 2); nënklasa.shfaq ();

Si rezultat, ne duhet të shohim në tastierë:

I nga superklasa është 1 i në nënklasa është 2

Mbështetja e metodës, Mbështetja

Nëse në një hierarki klase, emri dhe nënshkrimi i llojit të një metode të nënklasës përputhen me atributet e një metode superklase, atëherë metoda e nënklasës anulon metodën e superklasës. Kur një metodë e tejkaluar thirret nga nënklasa e saj, ajo gjithmonë do t'i referohet versionit të asaj metode të përcaktuar nga nënklasa. Dhe versioni superklasë i metodës do të fshihet.

Nëse keni nevojë të përdorni një version të një metode të anashkaluar të përcaktuar në një superklasë, duhet të përdorni fjalën kyçe super.

Mos e ngatërroni tejkalimin me mbingarkimin. Mbështetja e metodës ndodh vetëm nëse emrat dhe nënshkrimet e tipit të dy metodave janë identike. Përndryshe, të dy metodat thjesht mbingarkohen.

Shënimi u shfaq në Java SE5 @Override;. Nëse duhet të anashkaloni një metodë, përdorni @Override dhe përpiluesi do të hedhë një gabim nëse e mbingarkoni aksidentalisht atë në vend që ta anashkaloni.

Në Java, ju mund të trashëgoni vetëm nga një klasë.

Kapsulimi

Në shkencat kompjuterike, kapsulimi (latinisht: en capsula) është paketimi i të dhënave dhe/ose funksioneve në një objekt të vetëm.

Baza e kapsulimit në Java është klasa. Enkapsulimi do të thotë që fushat e një objekti nuk janë drejtpërdrejt të aksesueshme për klientët e tij - ato janë të fshehura nga aksesi i drejtpërdrejtë nga jashtë. Enkapsulimi mbron të dhënat e një objekti nga aksesi i padëshiruar duke e lejuar objektin të kontrollojë aksesin në të dhënat e tij.

Modifikuesit e aksesit

Kur përshkruhet një klasë, përdoren modifikuesit e aksesit. Modifikuesit e aksesit mund të shikohet nga këndvështrimi kapsulimi kështu dhe trashëgimisë. Kur shikohen nga perspektiva e kapsulimit, modifikuesit e aksesit ju lejojnë të kufizoni aksesin e padëshiruar për anëtarët e klasës nga jashtë.

Anëtarët publikë të një klase përbëjnë funksionalitet të jashtëm që është i disponueshëm për klasat e tjera. Anëtarët që janë të pavarur nga funksionet e jashtme zakonisht deklarohen private, si dhe metodat ndihmëse që janë vetëm detaje të zbatimit dhe nuk janë universale në natyrë. Duke fshehur zbatimin e një klase, ju mund të ndryshoni logjikën e brendshme të një klase të veçantë pa ndryshuar kodin e komponentëve të tjerë të sistemit.

Këshillohet që të përdorni akses në vetitë e klasës vetëm përmes metodave të tij (parimi fasule klasa, "POJO"), e cila ju lejon të vërtetoni vlerat e fushës, pasi qasja e drejtpërdrejtë në pronat është jashtëzakonisht e vështirë për t'u gjurmuar, që do të thotë se atyre mund t'u caktohen vlera të pasakta në fazën e ekzekutimit të programit. Ky parim i referohet menaxhimit të të dhënave të kapsuluara dhe ju lejon të ndryshoni shpejt mënyrën e ruajtjes së të dhënave. Nëse të dhënat nuk ruhen në memorie, por në skedarë ose në një bazë të dhënash, atëherë do të duhet të ndryshohen vetëm disa metoda të një klase, në vend që të futet ky funksionalitet në të gjitha pjesët e sistemit.

Kodi i programit i shkruar duke përdorur parimin e kapsulimit është më i lehtë për tu korrigjuar. Për të zbuluar se në cilën pikë kohore dhe kush e ka ndryshuar vetinë e objektit që na intereson, mjafton të shtojmë daljen e informacionit të korrigjimit në metodën e objektit përmes të cilit aksesohet vetia e këtij objekti. Kur përdorni akses të drejtpërdrejtë në vetitë e objektit, programuesi duhet të shtojë daljen e informacionit të korrigjimit në të gjitha seksionet e kodit ku përdoret objekti me interes.

Shembull i një përshkrimi të thjeshtë roboti

Robot i klasës publike ( dyfishi privat x = 0; // Koordinata aktuale X private dyfish y = 0; // Koordinata aktuale Y kursi privat i dyfishtë = 0; // Kursi aktual (në shkallë) dyfishi publik getX() (kthimi x; ) publik void setX(double x) ( this.x = x; ) public double getY() (kthim y; ) publik void setY(double y) ( this.y = y; ) public double getCourse() ( kurs kthimi; ) // Përcaktimi i kursit publik void setCourse(double course) ( this.curse = course; ) // Lëvizja në një distancë publike void përpara(int distance) ( // Qasja në fushën e objektit X x = x + distancë * Math.cos ( kurs / 180 * Math.PI); // Qasja në fushën e objektit Y y = y + distancë * Math.sin(kursi / 180 * Math.PI); ) // Koordinatat e printimit të robotit publik void printCoordinates() ( System .out .println(x + "," + y); ) )

Shembulli i robotit i paraqitur përdor grupe metodash duke filluar me vendosur Dhe marr. Ky çift metodash shpesh quhet vendosës/marrës. Këto metoda përdoren për të hyrë në fushat e një objekti. Emrat e metodave përfundojnë me emrin e fushës që fillon me një shkronjë KAPITALE.

Në metodat vendosur ne e kalojmë vlerën përmes një parametri formal në procedurë. Në kodin e procedurës, ne i caktojmë një vlerë një ndryshoreje objekti/klase duke përdorur fjalën kyçe kjo.

Ky.kurs = kurs ...

Përdorimi i fjalëve kyçe kjo e nevojshme, sepse emri i parametrit formal përkon me emrin e ndryshores së objektit. Nëse emrat do të ishin të ndryshëm, do të ishte e mundur kjo mos e përdor.

Polimorfizmi

Polimorfizmi është një nga konceptet themelore në programimin e orientuar nga objekti, së bashku me trashëgiminë dhe kapsulimin. Fjala polimorfizëm është me origjinë greke dhe do të thotë "ka shumë forma". Për të kuptuar se çfarë do të thotë polimorfizmi në lidhje me programimin e orientuar nga objekti, merrni parasysh një shembull të krijimit të një redaktuesi grafik vektorial në të cilin është e nevojshme të përdorni një numër klasash në formën e një grupi primitivësh grafikë - Sheshi, Linjë, Rretho, Trekëndëshi, etj. Secila nga këto klasa duhet të ketë një metodë të përcaktuar vizatoni për të shfaqur në ekran primitivin përkatës.

Natyrisht, do t'ju duhet të shkruani një kod që, për të shfaqur figurën, do të përsëritet në mënyrë sekuenciale nëpër të gjithë primitivët që duhet të shfaqen në ekran dhe do të thërrasë metodën e tërheqjes në secilën prej tyre.

Një person i panjohur me polimorfizmin ka shumë të ngjarë të krijojë disa vargje: një grup të veçantë për secilin lloj primitiv dhe të shkruajë kodin që përsërit nëpër elementët nga çdo grup në mënyrë sekuenciale dhe thërret metodën e tërheqjes në secilin element. Rezultati do të jetë afërsisht kodi i mëposhtëm:

// Përcaktimi i vargjeve të primitivëve grafikë Square s = new Square ; Linja l = Linja e re; Rrethi c = Rrethi i ri; Trekëndësh t = trekëndësh i ri; // Plotësoni të gjitha vargjet me objektet e duhura. . . // Përsëritja e ciklit nëpër të gjitha qelizat e grupit. për (int i = 0; i< s.length; i++){ // вызов метода draw() в случае, если ячейка не пустая. if (s[i] != null) s.draw(); } for(int i = 0; i < l.length; i++){ if (l[i] != null) l.draw(); } for(int i = 0; i < c.length; i++){ if (c[i] != null) c.draw(); } for(int i = 0; i < t.length; i++){ if (t[i] != null) t.draw(); }

Disavantazhi i kodit të shkruar më sipër është dyfishimi i kodit pothuajse identik për të shfaqur çdo lloj primitiv. Është gjithashtu e papërshtatshme që me modernizimin e mëtejshëm të redaktorit tonë grafik dhe duke shtuar aftësinë për të vizatuar lloje të reja të primitivëve grafikë, për shembull Text, Star, etj., me këtë qasje do të duhet të ndryshojmë kodin ekzistues dhe të shtojmë përkufizime të grupeve të reja për të, si dhe përpunimin e elementeve të përfshira në to.

Duke përdorur polimorfizmin, ju mund të thjeshtoni shumë zbatimin e një funksionaliteti të tillë. Para së gjithash, le të krijojmë një klasë të përbashkët prind Shape për të gjitha klasat tona.

Klasa publike Shape ( public void draw() ( System.out.println ("Stub"); ) )

Pas kësaj, ne krijojmë klasa të ndryshme pasardhëse: Sheshi, Linja, Rrethi dhe Trekëndëshi:

Klasa publike Point zgjeron Shape ( public void draw() ( System.out.println ("Square"); ) ) klasa publike Line extensions Shape ( public void draw() ( System.out.println ("Line"); ) ) klasën publike Rrethi zgjeron Shape ( public void draw() ( System.out.println ("Rrethi"); ) ) klasa publike Triangle zgjeron Shape ( public void draw() ( System.out.println ("Trekëndësh"); ) )

Në pasardhësit ne kemi anashkaluar metodën e tërheqjes. Si rezultat, ne morëm një hierarki të klasës, e cila tregohet në figurë.

Tani le të shohim tiparin e mahnitshëm të polimorfizmit:

// Përcaktimi dhe inicializimi i grupit Shape a = New Shape (new Shape(), new Triangle(), new Square(), new Circle()); // Kërkimi i elementeve të grupit për (int i = 0; i< a.length; i++) { a[i].draw(); }

Rreshtat e mëposhtëm do të printohen në tastierë:

Rrethi katror i trekëndëshit bosh

Në këtë mënyrë, çdo klasë pasardhëse thirri metodën e saj të tërheqjes, në vend që të thërriste metodën e tërheqjes nga klasa mëmë Shape.

Polimorfizmi është një dispozitë e teorisë së tipit, sipas së cilës emrat (për shembull, ndryshoret) mund të tregojnë objekte të klasave të ndryshme, por që kanë një prind të përbashkët. Rrjedhimisht, çdo objekt i shënuar me një emër polimorfik mund t'i përgjigjet në mënyrën e vet një grupi të caktuar të përgjithshëm operacionesh.

Metoda e mbingarkesës, mbingarkesës

Në programimin procedural ekziston edhe koncepti i polimorfizmit, i cili ndryshon nga mekanizmi i konsideruar në OOP. Polimorfizmi procedural nënkupton mundësinë e krijimit të disa procedurave ose funksioneve me të njëjtin emër, por numra ose lloje të ndryshme parametrash të kaluar. Funksionet e tilla me të njëjtin emër quhen të mbingarkuara, dhe vetë fenomeni quhet mbingarkesë. Mbingarkimi i funksionit ekziston edhe në OOP dhe quhet mbingarkesa e metodës. Një shembull i përdorimit të mbingarkesës së metodës në gjuhën Java është klasa PrintWriter, e cila përdoret veçanërisht për printimin e mesazheve në tastierë. Kjo klasë ka shumë metoda println që ndryshojnë në llojet dhe/ose numrin e parametrave të hyrjes. Këtu janë vetëm disa prej tyre:

Void println() // shkoni në një rresht të ri void println(boolean x) // printon vlerën e një variabli Boolean (true ose false) void println(String x) // printon një varg - vlerën e një parametri teksti

Polimorfizmi është një parim OOP që ju lejon të përdorni një ndërfaqe dhe algoritme të ndryshme. Qëllimi i polimorfizmit, siç zbatohet për OOP, është të përdorë një emër për të specifikuar veprime të ndryshme. Ekzekutimi i veprimit do të përcaktohet nga lloji i të dhënave.

Llojet e polimorfizmit:

Statike (e përcaktuar në kohën e përpilimit). Mbingarkimi i funksioneve, metodave, operatorëve etj.

Dinamik (i përcaktuar në kohën e ekzekutimit). Përmban funksione dhe metoda virtuale.

22. Trashëgimia si mekanizëm për zbatimin e polimorfizmit dhe krijimin e hierarkive të klasave. Llojet e trashëgimisë.

Trashëgimia është një mekanizëm OOP përmes të cilit krijohen klasa të reja bazuar në ato ekzistuese. Këto klasa trashëgojnë vetitë dhe sjelljen e klasave bazë dhe mund të fitojnë të reja. Kjo ju lejon të zvogëloni madhësinë e programit dhe kohën për zhvillimin e tij. Polimorfizmi na lejon të shkruajmë programe për të trajtuar një shumëllojshmëri të gjerë klasash të lidhura logjikisht. Trashëgimia dhe polimorfizmi janë teknika efektive për zhvillimin e programeve komplekse.

Llojet e trashëgimisë: e drejtpërdrejtë dhe e tërthortë, e thjeshtë dhe e shumëfishtë.

23. Klasat. Themelore, e prejardhur, polimorfike, abstrakte, virtuale. Shembuj.

Një klasë është një lloj i veçantë i të dhënave që përshkruan si atributet e të dhënave ashtu edhe veprimet e kryera mbi atributet.

Një klasë bazë është një klasë anëtarët e së cilës trashëgohen.

Një klasë e prejardhur është një klasë që trashëgon anëtarë të tjerë.

Një klasë polimorfike është një klasë që përmban metoda virtuale.

Një klasë abstrakte është një klasë që përmban metoda thjesht virtuale.

Një klasë virtuale është një klasë që, gjatë trashëgimisë së shumëfishtë, nuk përfshihet në klasat pasardhëse, por zëvendësohet me një referencë në to, për të shmangur dyfishimin.

24. Parimet e lidhjes së hershme dhe të vonë.

Lidhja është procedura për vendosjen e një lidhjeje midis një identifikuesi të përdorur në një kod programi dhe objektit të tij fizik (në përgjithësi, çdo komponent softuerësh: ndryshore, procedurë, modul, aplikacion, etj.)

Lidhja e hershme është vendosja e lidhjeve të tilla përpara se programi të fillojë ekzekutimin. Kjo zakonisht nënkupton lidhjen e moduleve burimore dhe lidhjen e modulit të ekzekutueshëm nga modulet e objektit gjatë procesit të përpilimit.

Lidhja e vonshme është vendosja e lidhjeve gjatë ekzekutimit të programit. Zakonisht flasim ose për lidhje dinamike (kur vetëm gjatë funksionimit të aplikacionit përcaktohet se cilat objekte do të nevojiten) ose për formimin e objekteve të tilla gjatë funksionimit.

25. Përdorimi i UML për specifikim

26. Përshkrimi i hierarkive të klasave me diagrame uml.

Marrëdhëniet klasore nëpërmjet . Dhe tregoni marrëdhënie të ndryshme: të drejtpërdrejta, të tërthorta, të shumëfishta.

27. Klasat model. Përshkrimi në uml.

Modeli i klasës është një mjet gjuhësor C++ i krijuar për kodimin e algoritmeve të përgjithësuara të klasës, pa iu referuar parametrave të caktuar (për shembull, llojet e të dhënave, madhësitë e tamponit, vlerat e paracaktuara).

Sintaksë:

shabllon

klasa NAME_CLASS

NAME_CLASS B; //Telefononi

s_a_p 20 gusht 2008 në orën 19:09

Polimorfizmi për fillestarët

  • PHP

Polimorfizmi është një nga tre paradigmat kryesore të OOP. Me pak fjalë, polimorfizmi është aftësia e një objekti për të përdorur metoda të një klase të prejardhur që nuk ekziston në kohën kur krijohet ajo bazë. Për ata që nuk janë veçanërisht të ditur në OOP, kjo ndoshta tingëllon e ndërlikuar. Prandaj, le të shohim përdorimin e polimorfizmit duke përdorur një shembull.

Formulimi i problemit

Le të supozojmë se siti ka nevojë për tre lloje botimesh - lajme, njoftime dhe artikuj. Ata janë të ngjashëm në disa mënyra - të gjitha kanë një titull dhe tekst, lajmet dhe njoftimet kanë një datë. Në një farë mënyre ato janë të ndryshme - artikujt kanë autorë, lajmet kanë burime dhe njoftimet kanë një datë pas së cilës ato bëhen të parëndësishme.

Opsionet më të thjeshta që ju vijnë në mendje janë të shkruani tre klasa të veçanta dhe të punoni me to. Ose shkruani një klasë që do të përmbajë të gjitha vetitë e natyrshme në të tre llojet e botimeve dhe do të përdoren vetëm ato të nevojshme. Por për lloje të ndryshme, metodat që janë të ngjashme në logjikë duhet të funksionojnë ndryshe. Bërja e disa metodave të të njëjtit lloj për lloje të ndryshme (get_news, get_announcements, get_articles) është krejtësisht injorante. Kjo është ajo ku polimorfizmi vjen në ndihmë.

Klasa abstrakte

Përafërsisht, kjo është një klasë shabllone. Ai zbaton funksionalitetin vetëm në nivelin në të cilin njihet aktualisht. Klasat e prejardhura e plotësojnë atë. Por, është koha për të kaluar nga teoria në praktikë. Më lejoni të bëj një rezervë menjëherë: ne po shqyrtojmë një shembull primitiv me funksionalitet minimal. Të gjitha shpjegimet janë në komentet në kod.

Publikimi i klasës abstrakte
{
// tabelë që ruan të dhënat në element
i mbrojtur $tabela ;

// vetitë e elementit janë të panjohura për ne
të mbrojtura $properties = array();

// konstruktor

{
// vini re se ne nuk e dimë se nga cila tabelë duhet të marrim të dhënat
$result = mysql_query ("SELECT * FROM `" . $this -> tabela . "` WHERE `id`="" . $id . "" LIMIT 1" );
// as ne nuk e dimë se çfarë të dhënash kemi marrë
$this -> vetitë = mysql_fetch_assoc ($result);
}

Metoda //, e njëjtë për çdo lloj publikimi, kthen vlerën e pronës
funksioni publik get_property ($name)
{
if (isset($this -> vetitë [ $name ]))
ktheni $this -> pronat [ $name ];

Kthehu false;
}

Metoda //, e njëjtë për çdo lloj publikimi, përcakton vlerën e vetive
funksioni publik set_property ($name, $value)
{
nëse (!isset($this -> vetitë [ $name ]))
kthej false;

$this -> vetitë [ $name ] = $value ;

Ktheni $value ;
}

// dhe kjo metodë duhet të printojë botimin, por ne nuk e dimë saktësisht se si ta bëjmë këtë, dhe për këtë arsye e deklarojmë atë abstrakt
funksion abstrakt publik do_print();
}

Klasat e prejardhura

Tani mund të vazhdoni në krijimin e klasave të prejardhura që zbatojnë funksionalitetin që mungon.

class News zgjeron Publikimin
{
// konstruktor i klasës së lajmeve, që rrjedh nga klasa e publikimeve
funksioni publik __construct ($id)
{
// vendosni vlerën e tabelës në të cilën ruhen të dhënat e lajmeve
$this -> tabelë = "tabela_lajme" ;
prind :: __konstrukt ($id );
}

Funksioni publik do_print()
{
echo $this -> vetitë ["title"];
jehonë"

" ;
echo $this -> vetitë ["tekst"];
jehonë"
Burimi: " . $this -> pronat [ "burimi" ];
}
}

Njoftimi i klasës zgjat Publikimin
{
// konstruktori i klasës ad që rrjedh nga klasa e publikimit
funksioni publik __construct ($id)
{
// vendosni vlerën e tabelës në të cilën ruhen të dhënat e reklamave
$this -> table = "njoftimet_tabela" ;
// thirrni konstruktorin e klasës mëmë
prind :: __konstrukt ($id );
}

// anashkaloni metodën e printimit abstrakt
funksioni publik do_print()
{
echo $this -> vetitë ["title"];
jehonë "
Kujdes! Njoftimi është i vlefshëm deri në "
. $this -> vetitë ["data_fundit" ];
jehonë"

" . $this -> vetitë [ "tekst" ];
}
}

Artikulli i klasës zgjatet Publikimi
{
// konstruktori i klasës së artikullit, që rrjedh nga klasa e publikimit
funksioni publik __construct ($id)
{
// vendosni vlerën e tabelës në të cilën ruhen të dhënat për artikujt
$this -> table = "articles_tabela" ;
// thirrni konstruktorin e klasës mëmë
prind :: __konstrukt ($id );
}

// anashkaloni metodën e printimit abstrakt
funksioni publik do_print()
{
echo $this -> vetitë ["title"];
jehonë"

" ;
echo $this -> vetitë ["tekst"];
jehonë"
" . $this -> pronat [ "autor" ];
}
}

Tani në lidhje me përdorimin

Çështja është se i njëjti kod përdoret për objekte të klasave të ndryshme.

// plotësoni grupin e publikimit me objekte që rrjedhin nga Publikimi
$publikime = Lajme të reja ($news_id);
$publikime = Njoftim i ri ($announcement_id);
$publikime = artikull i ri($article_id);

Foreach ($publications si $publication) (
// nëse punojmë me trashëgimtarët e Botimit
nëse ($publication instanceof Publication) (
// pastaj printoni të dhënat
$publikim -> do_print();
) tjeter (
// përjashtimi ose trajtimi i gabimeve
}
}

Kjo eshte e gjitha. Me një lëvizje të lehtë të dorës, pantallonat kthehen në pantallona të shkurtra elegante :-).

Përfitimi kryesor i polimorfizmit është lehtësia me të cilën mund të krijohen klasa të reja që sillen në mënyrë të ngjashme me ato të lidhura, gjë që nga ana tjetër lejon zgjerimin dhe modifikimin. Artikulli tregon vetëm një shembull primitiv, por edhe ai tregon se si përdorimi i abstraksioneve mund ta bëjë më të lehtë zhvillimin. Ne mund të punojmë me lajmet njësoj si me reklamat ose artikujt, dhe as nuk duhet të dimë se me çfarë po punojmë! Në aplikacionet reale, shumë më komplekse, ky përfitim është edhe më i madh.

Pak teori

  • Metodat që kërkojnë mbivendosje quhen abstrakte. Është logjike që nëse një klasë përmban të paktën një metodë abstrakte, atëherë ajo është gjithashtu abstrakte.
  • Natyrisht, një objekt i një klase abstrakte nuk mund të krijohet, përndryshe nuk do të ishte abstrakt.
  • Një klasë e prejardhur ka veti dhe metoda që i përkasin klasës bazë, dhe gjithashtu mund të ketë metodat dhe vetitë e veta.
  • Një metodë që anashkalohet në një klasë të derivuar quhet metodë virtuale. Nuk ka asnjë informacion për këtë metodë në klasën abstrakte bazë.
  • Qëllimi i abstraksionit është të përcaktojë një metodë në vendin ku ka informacionin më të plotë se si duhet të funksionojë.
UPD: Në lidhje me shkeljet sql-inj dhe MVC - zotërinj, ky është vetëm një shembull, dhe një shembull i polimorfizmit, në të cilin nuk e konsideroj të nevojshme t'u kushtoj vëmendje këtyre gjërave. Kjo është një temë për artikuj krejtësisht të ndryshëm.

Programimi është procesi i zhvillimit të zgjidhjeve për problemet "të gjalla", dinamike në formën e strukturave të ngurta të kodit, të dhënave, funksioneve dhe algoritmeve. Procedura për formimin e sintaksës strikte nga semantika e paqartë. Problemet e botës reale janë një problem i madh i njohur në algoritmizim: për të arritur zgjidhjen e dëshiruar, problemi duhet të vendoset në struktura të sakta sintaksore.

OOP është përpjekur dy herë të "thyejë" këtë koncept të lashtë programimi, por "prangët" e stilit klasik të kodimit të të dhënave dhe algoritmeve janë ende të forta.

Niveli dhe kualifikimet

Shkenca kompjuterike filloi me llogaritjet, por shpejtësia me të cilën po rritet përshpejtimi i lëvizjes në fushën e përpunimit të informacionit nuk është ende aq e shpejtë që programimi klasik të bëhet i pamundur dhe të pushojë së ekzistuari.

Është gjithashtu objektive që zhvilluesi të mos këmbëngulë dhe klienti të mos kërkojë një zgjidhje reale për problemet reale. Të dyja palët janë mësuar të kufizohen nga mjetet e disponueshme dhe aftësitë e njohura.

Format e polimorfizmit OOP, idetë e enkapsulimit të kodit dhe trashëgimisë së vetive (metodave) qëndrojnë në sferën e programimit, por jo në sferën e problemit që zgjidhet.

Një rast i tillë është biblioteka PHPOffice/PHPWord. Për ta përdorur atë, ju nevojiten kualifikimet e një zhvilluesi, ju duhet të krijoni sistemin tuaj të objekteve, por niveli aktual i klientit (kërkesat e klientit) është një përbërje e parëndësishme që programuesi e mbulon me zhvillimin e tij (përndryshe kërkesat nuk mund të plotësohen ). Situata është diçka si kjo:

Në këtë rast, përdorimi i një biblioteke është detyrë e formatimit të dokumenteve, për shembull, një diplomë ose disertacion duhet të formatohet sipas standardit. Klienti paraqiti kërkesat e tij, dhe programuesi shkoi shumë më tej në rrugën e tij.

U krye një analizë e plotë e dokumentit, montimi i tij në formatin e kërkuar, punë me tabela të çdo niveli foleje, bashkim dhe ndarje qelizash, printim në çdo drejtim etj.

Polimorfizmi dhe OOP

Nuk mund të mendoj për një përkufizim më të mirë për polimorfizmin sesa t'i referohem historisë së zhvillimit të idesë së programimit të orientuar nga objekti, kaq popullor sot, aq shpesh i përdorur, por të parealizuara në thelb është ende.

  • kapsulim;
  • polimorfizëm;
  • trashëgimisë.

Disa shtojnë gjithashtu: abstraksioni, dhe më shpesh kjo, dhe me të vërtetë pika kryesore, përdoret si bazë për të përshkruar thelbin e OOP.

Pra, opinionet rreth OOP janë polimorfike: ato përshkruajnë një gjë, janë të dizajnuara ndryshe, ose, anasjelltas, ato përshkruajnë gjëra të ndryshme, por bazohen në katër pozicione identike.

Parimi demokratik nuk është karakteristik për fushën e teknologjisë së informacionit, por duhet t'i jepet e drejta e tij: kombinimi dhe bashkëjetesa e shumë mendimeve për të njëjtën gjë është polimorfizëm i vërtetë në veprim.

Përkufizimet popullore të polimorfizmit

OOP është faza tjetër në zhvillimin e teknologjisë së informacionit. Pak njerëz e argumentojnë këtë, por aksiomat dhe dispozitat e saj kryesore ndryshojnë aq shumë në aspektin semantik sa nuk meritojnë vëmendje jashtë tërësisë së tyre.

  1. Polimorfizmi në programim është aftësia për të ofruar të njëjtën ndërfaqe për forma të ndryshme themelore (llojet e të dhënave).
  2. Polimorfizmi është aftësia e objekteve për të pasur zbatime të ndryshme.
  3. Polimorfizmi është aftësia e një funksioni...
  4. Klasik (nga krijuesi i C/C++): "një ndërfaqe - shumë zbatime".
  5. Polimorfizmi parametrik do të thotë...
  6. Polimorfizmi është një dispozitë e teorisë së tipit...
  7. Abstraksioni është i pamundur pa enkapsulim dhe trashëgimi, ashtu si polimorfizmi është i pamundur pa trashëgimi...

Mund të pajtohemi se e gjithë kjo i referohet të njëjtës gjë: por forma e shprehjes së mendimit, thelbi dhe përmbajtja nuk janë të ngjashme. Por ka ende diçka të përbashkët.

Subjekti: zhvillues - klient

Zhvillimi klasik i programit presupozon praninë e një programuesi dhe një detyre (klient, klient). Një programues ekzaminon një problem, e zyrtarizon atë dhe krijon kodin që çon në një zgjidhje. Klienti mohon çdo gjë të propozuar ose vetëm një pjesë të saj, duke vënë në dukje mangësitë dhe programuesi bën sërish punën e tij.

Ky cikël i procesit të zgjidhjes së problemeve sugjeron që dy entitete krejtësisht të ndryshme janë të kombinuara qartë këtu:

  • kompjuteri nuk mund ta zgjidhë vetë problemin;
  • nevojitet një program që kompjuteri ta “kuptojë” dhe ta “zgjidhë” problemin.

Detyra është sfera e kompetencës së klientit, programi është një algoritëm për "përshtatjen" e detyrës me aftësitë e kompjuterit - sferën e kompetencës së programuesit. Roli i këtij të fundit është të "përshtatë" kompjuterin me kërkesat e detyrës, dhe kjo është e panevojshme!

Ofertat abstrakte. Ka objekte - kjo është sfera e klientit; ekziston zbatimi i objekteve - kjo është sfera e programuesit. Nuk ka asnjë lidhje "teknologjike" midis klientit dhe zhvilluesit. Ideja është radikale, nuk zbatohet deri më sot, por diçka tashmë po funksionon në mënyrë të qëndrueshme.

Dritare, butona dhe objekte të tjera

Historia e Air Art Technology, Object Magazine, Turbo Vision, Graph Vision është tashmë histori. Pak njerëz i mbajnë mend këto zbatime të OOP, ato janë praktikisht të papërdorura dhe të harruara, por ndërfaqja e dritares së Windows është e njohur për miliona përdorues, dhe objektet në PHP, JavaScript dhe gjuhë të tjera të teknologjisë së Internetit përdoren nga qindra mijëra zhvillues kodesh. dhe miliona vizitorë të burimeve të internetit dinë rreth tyre.

Kjo është ndoshta mënyra e vetme e saktë në të cilën OOP duhet të ishte zhvilluar: kapsulimi, trashëgimia, polimorfizmi për zhvilluesin, por jo për përdoruesin. Është karakteristikë se ky pozicion ishte kryesori në zhvillimin e dizajnit vizual (ndërfaqes) të softuerit Windows dhe programeve aplikative si Turbo Vision dhe Graph Vision.

Koncepti pas produkteve si Air Art Technology dhe Object Magazine ishte dukshëm i ndryshëm. Këtu, objekti abstrakt ishte paraardhësi i parë i strukturës së informacionit, duke përmbledhur kodin e përpunimit të informacionit në nivelin abstrakt. Objektet e dritareve, butonave dhe elementeve të dizajnit vizual ishin dytësore këtu.

Në versionin e parë (Windows etj.), Paradigma OOP: kapsulimi, trashëgimia, polimorfizmi u caktua në nivelin e një paraardhësi abstrakt, dhe zbatimi i kodit u formua në nivelin e secilit pasardhës specifik përgjatë degës së trashëgimisë sipas në strukturën dhe përmbajtjen e kërkuar.

Në opsionin e dytë (Air Art Technology and Object Magazine), niveli i objektit abstrakt është i rëndësishëm. Ajo që do të ketë një pasardhës i veçantë nuk është çështja, gjëja kryesore është që dega e saj trashëgimore të plotësojë kërkesat e të gjithë prindërve deri në abstraksionin rrënjë.

Objekti dhe sistemi i objekteve: algoritmi

Një koncept ideal i orientuar nga objekti mund të manipulojë vetëm objektet dhe sistemet e objekteve.

Në gjuhët moderne të programimit, një objekt (klasë) zakonisht kuptohet si një përshkrim i një objekti dhe një shembull i një objekti, dhe për të përdorur përshkrimin e një objekti, gjuhët lejojnë programuesin të punojë me objekte statike, ndërsa një objekt dinamik - përshkrime, me përmbajtjen dhe strukturën e tij unike, por duke përdorur të njëjtat metoda (veti) përshkrimi.

Praktika aktuale lidh konceptin e një objekti me një mjet, domethënë me një gjuhë programimi, ndërfaqe, akses në bazën e të dhënave, lidhje në rrjet, por nuk ka asgjë që tregon interesat e klientit, problemi që zgjidhet.

Kjo është ideale për OOP të thjeshtë: polimorfizmi bën të mundur krijimin, në veçanti, një shumëllojshmëri elementësh të projektimit, por menaxhimin e tyre me të njëjtin kod. Por këtu nuk bëhet fjalë për objektet e problemit, i cili nuk konsiderohet aspak si subjekt për analizë të orientuar drejt objektit.

Programuesit miratuan OOP si një mjet për të përmirësuar cilësinë dhe produktivitetin e punës së tyre, por nuk i dhanë klientit asnjë pjesë të "territorit të tyre". Konceptet themelore të OOP - kapsulimi, trashëgimia, polimorfizmi - mbetën në zonën e zhvillimit dhe nuk u transplantuan në zonën e detyrës.

Objekti dhe sistemi i objekteve: problema dhe zgjidhja

Kompjuter - programues - detyrë. Lidhja e mesme është e tepërt. Në mënyrë ideale, duhet të ketë vetëm dy qarqe relativisht të varura: (kompjuter - programues) - detyrë. Kjo do të thotë, përdoruesi, klienti ose vizitori ka një mjet për të zgjidhur problemin e tyre. Klientit nuk i intereson se si zbatohet mjeti.

Në mënyrë ideale, ky është vetëm një kompjuter që është në gjendje të kuptojë se çfarë dëshiron klienti dhe të bëjë atë që dëshiron. Si do të duket: një program lokal ose një faqe interneti e aksesueshme përmes një shfletuesi, një program special për përpunimin e informacionit të shpërndarë, një sistem informacioni për klientin - nuk ka rëndësi.

Është e rëndësishme që të mos ketë lidhje të panevojshme midis detyrës dhe kompjuterit, por e para të kuptohet dhe zgjidhet nga e dyta. Për të arritur këtë qëllim, kompjuteri dhe klienti duhet të lidhen me një sistem objektesh, dhe kuptimi, struktura dhe përmbajtja e secilit objekt përcaktohen nga klienti, dhe metodat dhe vetitë e objekteve zbatohen nga programuesi.

Është ideale kur puna e klientit për krijimin e sistemit të objekteve që i nevojiten dhe puna për zbatimin e metodave dhe vetive të këtyre objekteve ndahen në kohë. Sa më tej zbatimi i një sistemi objektesh (programuesi) të jetë nga përmbajtja e tij semantike (klienti), aq më i mirë është cilësia e procesit.

Asgjë nuk e pengon klientin dhe programuesin të ndërveprojnë në procesin e zgjidhjes së një problemi, por një ndarje e qartë e semantikës është e rëndësishme. Secili duhet të kujdeset për biznesin e tij, programuesi nuk është i detyruar të zotërojë qëllimin e detyrës, dhe klienti nuk duhet të kuptojë kodin dhe, për më tepër, palët nuk duhet t'i japin njëra-tjetrës këshilla për atë që nuk i shqetëson.

Programim tradicional dhe objekt

Postulatet themelore të OOP: kapsulimi, trashëgimia, polimorfizmi në formën në të cilën ato janë bërë të njohura dhe të kërkuara, çojnë në një përmirësim të dukshëm të cilësisë dhe besueshmërisë së kodit, shpejtojnë ndjeshëm punën e programuesit dhe kanë shumë të cilësive të tjera pozitive.

Por gjërat janë ende atje: programimi klasik nuk është inferior ndaj pozicioneve të tij, dhe shumë ide të orientuara nga objekti zbatohen në kodin klasik.

Sidoqoftë, idetë e OOP dhe rekursionit çuan në një ndikim adekuat në sintaksën e operatorëve klasikë të sintaksës, në logjikën e ndërtimit të kodit të zakonshëm që nuk ka asnjë lidhje me stilin e të shkruarit dhe të të menduarit të orientuar drejt objektit.

Listat dhe radhët u transformuan, u shfaq koncepti i elementit të parë dhe të fundit të një grupi, u shfaqën sythe "për secilin" dhe opsionet e referencës për emërtimin, përdorimin dhe ekzekutimin u bënë edhe më të njohura se më parë.

Në fakt, vetë fakti që variablat kanë humbur fytyrën e tyre "të qartë" (lloji i një variabli mund të ndryshojë sipas nevojës dhe nuk ka nevojë të përshkruhet fare një variabël) thotë se klasikët, në fakt, shumë kohë më parë u bënë objekt- orientoi dhe njohu parimet bazë të OOP: kapsulimi, trashëgimia, polimorfizmi si ide me rëndësi të konsiderueshme.

Në çfarë bazohet: një objekt apo një sistem?

Abstraksioni, si pozicioni kryesor konceptual i OOP, pavarësisht se ku ndodhet zona e përgjegjësisë (zbatimit) të objektit - në nivelin e objektit të parë abstrakt ose në nivelin e një pasardhësi specifik - lë të hapur pyetjen: ku të fillojë gjithçka, nga objekti apo nga sistemi?

Nëse vendosni një objekt si bazë, atëherë ai nuk do të bëhet kurrë një sistem, pasi sistemi do të jetë brenda tij, dhe ai vetë do të bëhet një imazh i ngurtë i një fillimi shumë specifik. Këtu lindin probleme me abstraksionin: objekti fillestar kap saktësisht gjënë kryesore në problemin që zgjidhet, domethënë nuk është më i transferueshëm në një problem tjetër.

Nëse e bazojmë në një sistem objektesh, marrim një sistem sistemesh. Kjo është e vështirë të imagjinohet në lidhje me një detyrë specifike, dhe ku të fillohet zhvillimi është gjithashtu e vështirë të kuptohet. Në përgjithësi, polimorfizmi i OOP me ndryshimet e tij në entitete, format e zbatimit dhe numrin e parametrave aktualë në funksione jep një ide të sistemit që shtrihet në fillim si:

  • në lidhje me opsionet për zgjidhjen e një problemi (për shembull, një menu);
  • rreth kushteve fillestare (zbatimi i problemit në kushte të ndryshme, të dhëna);
  • rreth mënyrave të funksionimit (testimi, vendosja, funksionimi).

Por kjo dhe të ngjashme nuk japin asnjë bazë për ta bazuar zgjidhjen e problemit në një sistem objektesh. Shpesh është e mjaftueshme për të përcaktuar një objekt të vetëm fillestar.

Historia e procesit të zgjidhjes së problemit

Parimet më të rëndësishme të OOP: polimorfizmi dhe abstraksioni - jepni përparësi objektit fillestar si një sistem objektesh. Në një debat se cila duhet të jetë e para, pula apo veza, këtu fiton pula.

Nuk ka dyshim se gjithçka duhet të fillojë me një objekt abstrakt, dhe jo me një sistem objektesh. Por nëse marrim parasysh faktorin e kohës dhe e zbatojmë atë në nivel të çdo objekti, duke filluar që nga ai i pari abstrakt, atëherë ideja kontradiktore e vendosjes së objektit dhe sistemit në fillim të vendimit është vetëm një e arsyeshme.

Nëse koncepti klasik i programimit, gjatë zgjidhjes së një problemi, ndryshon të dhënat, përmbajtjen e bazës së të dhënave, ndryshon skedarët etj., atëherë në konceptin e OOP, polimorfizmi, enkapsulimi dhe faktori kohë ndryshojnë përmbajtjen, strukturën dhe vetitë e sistemit të objekteve të problemit që zgjidhet.

Një programues në OOP është më pak i interesuar për konceptin e një skedari, një bazë të dhënash, një algoritmi - këto janë të veçanta; këtu programuesi mendon në objekte, por objektet ekzistojnë në kohë dhe ndryshojnë në rrjedhën e arritjes së dëshiruar.

Kështu, në fillim qëndron objekti si sistem objektesh dhe logjika e këtij sistemi - shkalla kohore: nisja e një detyre, formimi i objektit të parë, futja ose mbledhja e të dhënave, formimi i objektit tjetër, por asgjë nuk e pengon objektin e parë që të duke vazhduar në zgjidhjen tjetër.

Çdo nivel i objekteve vepron si një sistem i pavarur objektesh, domethënë është një objekt, por në kontekstin e procesit që ka filluar dhe kuptimit të kohës, ai është një sistem objektesh në shkallën kohore. Për një implementim të plotë të OOP, polimorfizmi, trashëgimia dhe faktori kohë së bashku sigurojnë dinamikën e të parit, domethënë, një objekt jo vetëm që mund të ndryshojë me kalimin e kohës, por edhe të gjenerojë objekte që nuk synohen nga zhvilluesi, të krijuara nga ekzekutimi i një detyrë gjatë procesit, e projektuar nga klienti.

Polimorfizmi real OOP, shembull

Kompleksiteti i problemeve që OOP mund të bëjë nuk është i krahasueshëm me atë që është e mundur me versionin klasik të shkrimit të programeve. Sigurisht, është gjithmonë e mundur të zgjidhet çdo problem në mënyrën e zakonshme, por pyetja se sa do të "kushtojë" kohë dhe përpjekje shpesh e bën rezultatin të padobishëm.

Biblioteka PHPOffice/PHPWord u zhvillua jo shumë kohë më parë, por për të përdorur aftësitë e saj, pothuajse gjithmonë duhet të krijoni sistemin tuaj të objekteve. Për shembull, një skedar i thjeshtë *.docx:

është një arkiv zip i shumë skedarëve dhe dosjeve në formatin Office Open XML (OpenXML, OOXML). Çdo skedar shkruhet në etiketat XML, dhe kur shtohen, ndryshojnë dhe fshihen shkronja, fjalë, tabela, lista dhe elementë të tjerë, përmbajtja e skedarëve fillon të përfaqësojë një sekuencë etiketash që jo gjithmonë përmbajnë elemente të plota; shpesh një element është shkruar me shumë etiketa.

Nëse e imagjinoni këtë skedar si një sekuencë etiketash, ju merrni një pamje interesante:

Është e lehtë të vërehet se paragrafi i parë dhe i vetëm i dokumentit përfaqësohet nga shumë etiketa. Sa i përket tabelës dhe tabelave të ndërtuara në të, vëllimi i përshkrimit të të gjithë elementëve nuk mund të perceptohet, por është i arritshëm për një aplikacion të orientuar nga objekti.

Në fakt, në figurë, jeshile është prodhimi testues i etiketave, e verdha është parametrat dhe lloji i etiketës dhe bezha është përmbajtja. Objektet e krijuara janë të orientuara drejt përpunimit me makinë. Vetëm operacionet e hapjes së një skedari dokumenti, formatimi dhe shkrimi i tij bëhen të disponueshme për një person.

Zgjidhja është e thjeshtë dhe praktike, por zbatimi është më shumë i orientuar nga kompjuteri sesa nga njeriu për shkak të vëllimit të funksionalitetit të kryer dhe marrëdhënieve komplekse midis objekteve.

Shteti i zonës OOP

Zhvillimi i sistemeve të menaxhimit të faqeve të internetit, teknologjitë për vendosjen dhe menaxhimin e serverëve, dhe përvoja në zhvillimin e faqeve dinamike të faqeve të internetit e kanë bërë programimin e orientuar nga objekti të aksesueshëm për të gjithë. Problemi është se si të ndryshoni të menduarit tuaj dhe të mësoheni me të menduarit në nivelin e objekteve, dhe jo në kontekstin e kodit të ekzekutuar në mënyrë sekuenciale.

Në mënyrë tipike, kalimi nga programimi klasik në programimin e orientuar nga objekti zgjat dy deri në tre muaj, por kostot ia vlen më shumë. Potenciali i gjuhëve moderne të programimit, kryesisht PHP dhe JavaScript, do të kënaqë zhvilluesin më të sofistikuar.

OOP moderne - polimorfizmi, trashëgimia dhe aftësia për të formuar vetitë e objektit - janë të përshtatshme dhe praktike, sintaksa e gjuhës dhe mjetet ndihmëse sigurojnë lehtësinë e përdorimit dhe efikasitetin e kodit.

Perspektiva mbi idenë e objektit

Është mjaft e vështirë të thuhet se sa do të zgjasë programimi klasik dhe si do të zhvillohet OOP. Me sa duket, zhvilluesit e mjeteve nuk planifikojnë të marrin në konsideratë kontekstin e konsumatorit (përdorues, klient).

Mjetet OOP - polimorfizmi, trashëgimia, kapsulimi dhe abstraksioni - janë të orientuara nga zhvilluesi.

Sistemet moderne të informacionit dhe burimet e internetit përpiqen të pasqyrojnë realitetin, të sigurojnë funksionimin e objekteve reale dhe të krijojnë një mjedis për funksionimin e tyre që është aq i thjeshtë sa do të jetë i arritshëm për një konsumator që është larg programimit dhe i zhytur plotësisht në zonën e tyre të kompetencë.

Artikujt më të mirë mbi këtë temë