Programmering er prosessen med å utvikle løsninger«Live», dynamiske oppgaver i form av rigide kodekonstruksjoner, data, funksjoner og algoritmer. En prosedyre for å danne en streng syntaks fra udefinert semantikk. Reelle problemer er et velkjent stort problem i betydningen algoritmisering: For å oppnå ønsket løsning må problemet plasseres i presise syntaktiske konstruksjoner.
OOP har to ganger forsøkt å bryte dette eldgamle programmeringskonseptet, men lenkene til den klassiske stilen med datakoding og algoritmer er fortsatt sterke.
Nivå og kvalifikasjoner
Databehandling begynte med databehandling, menhastigheten som akselerasjonen av bevegelse inn i informasjonsbehandlingsfeltet vokser med, er ennå ikke høy nok til at klassisk programmering blir umulig og slutter å eksistere.
Det er også objektivt at utvikleren ikke insisterer, og kunden ikke krever en reell løsning på reelle problemer. Begge sider er vant til å være begrenset av tilgjengelige verktøy og kjente evner.
Formene for OOP-polymorfisme, ideene om kodeinnkapsling og nedarving av egenskaper (metoder) er innen programmering, men ikke i feltet for problemet som løses.
Et eksempel - bibliotekPHPOffice / PHPWord. For å bruke det, trenger du kvalifikasjonene til en utvikler, du må lage ditt eget system med objekter, men det nåværende nivået til kunden (kundekrav) er en triviell sammensetning, som programmereren overstyrer med utviklingen sin (ellers kan kravene ikke vær fornøyd). En slik situasjon:
I dette tilfellet er det en oppgave å bruke biblioteketformatering av dokumenter, for eksempel et vitnemål eller avhandling bør formaliseres i henhold til standarden. Kunden presenterte sine krav, og programmereren gikk sin egen vei mye lenger.
Dokumentet ble fullstendig analysert, satt sammen i ønsket format, jobbet med tabeller på alle neste nivåer, slått sammen og separerte celler, skrevet ut i alle retninger, etc.
Polymorfisme og OOP
Det er ingen bedre definisjon for polymorfisme, hvordan referere til historien om utviklingen av ideen om objektorientert programmering, så populær i dag, så ofte brukt, men urealisert i hovedsak så langt.
Hver forfatter har sitt eget konsept for begynnelsen og essensen av OOP. For hver oppmerksomme leser er dette konseptet korrekt og objektivt. Men til i dag aksepterer alle bare tre posisjoner som et ubetinget aksiom:
- innkapsling;
- polymorfisme;
- arv.
Noen legger til mer: abstraksjon, og oftest brukes denne, og faktisk hovedpoenget, som grunnlag for å beskrive essensen av OOP.
Så, meninger om OOP er polymorfe: de beskriver én ting, er konstruert på forskjellige måter, eller omvendt, beskriver forskjellige ting, men er basert på fire identiske posisjoner.
Demokratisk begynnelse er ikke typisk for regioneninformasjonsteknologi, men det bør gis sin grunn: kombinasjonen og sameksistensen av mange meninger om det samme er en ekte polymorfisme i aksjon.
Populære definisjoner av polymorfisme
OOP er neste trinn i utviklingen av informasjonsteknologi. Få argumenterer med dette, men dets grunnleggende aksiomer og bestemmelser er så forskjellige når det gjelder semantikk at de ikke fortjener oppmerksomhet utenfor deres helhet.
- Polymorfisme i programmering er evnen til å gi samme grensesnitt for forskjellige grunnleggende former (datatyper).
- Polymorfisme er objekters evne til å ha forskjellige implementeringer.
- Polymorfisme er evnen til en funksjon ...
- Klassisk (fra skaperen av C / C ++): "ett grensesnitt - mange implementeringer".
- Parametrisk polymorfisme innebærer ...
- Polymorfisme - posisjonen til typeteori ...
- Abstraksjon er umulig uten innkapsling og arv, akkurat som polymorfisme er umulig uten arv ...
Vi kan være enige om at alt dette refererer til det samme: men uttrykksformen for tanke, essens og innhold er ikke like. Men det er fortsatt noe til felles.
Enhet: utvikler - kunde
Klassisk programvareutvikling forutsettertilgjengelighet av en programmerer og oppgaver (klient, kunde). Programmereren undersøker problemet, formaliserer det og lager koden som leder til løsningen. Kunden avviser hele det foreslåtte eller bare deler av det, og påpeker feil, og programmereren gjør jobben sin igjen.
En slik syklus av prosessen med å løse problemet antyder at to helt forskjellige enheter er tydelig kombinert her:
- datamaskinen kan ikke løse problemet selv;
- du trenger et program slik at datamaskinen kan "forstå" og "løse" problemet.
Oppgaven er kompetansesfæren til kunden, programmet erdet er en algoritme for "tilpasning" av en oppgave til egenskapene til en datamaskin - programmererens kompetansesfære. Sistnevntes rolle er å "tilpasse" datamaskinen til oppgavens krav, og dette er overflødig!
Objektorientert programmering tilbyr abstrakt bort... Det er objekter - dette er kundens sfære; det erimplementeringen av objekter er programmererens domene. Det er ingen "teknologisk" sammenheng mellom kunden og utvikleren. Ideen er kardinal, ikke implementert den dag i dag, men noe fungerer allerede jevnt og trutt.
Vinduer, knapper og andre objekter
History of the Air Art Technology, Object Magazine,Turbo Vision, Graph Vision er allerede historie. Få mennesker husker disse OOP-implementeringene, de blir praktisk talt ikke brukt og glemt, men Windows-vindusgrensesnittet er kjent for millioner av brukere, og objekter i PHP, JavaScript og andre språk av Internett-teknologier brukes av hundretusenvis av kodeutviklere , og millioner av besøkende på nettressurser vet om dem.
Dette er nok den eneste riktige måten, ihtsom OOP skulle utvikle: innkapsling, arv, polymorfisme for utvikleren, men ikke for brukeren. Det er karakteristisk at denne stillingen var den viktigste i utviklingen av det visuelle designet (grensesnittet) til Windows-programvare, applikasjonsprogrammer som Turbo Vision og Graph Vision.
Konseptet bak produktene somAir Art Technology og Object Magazine var betydelig forskjellige. Her var det abstrakte objektet den aller første stamfaren til informasjonsstrukturen; det innkapslet informasjonsbehandlingskoden på abstrakt nivå. Objekter av vinduer, knapper, elementer av visuell design var sekundære her.
I den første versjonen (Windows og etc.) OOP-paradigmet: innkapsling, arv, polymorfisme ble utpekt på nivået av en abstrakt stamfar, og implementeringen av koden ble dannet på nivået til hver spesifikke etterkommer langs arvegrenen i henhold til den nødvendige strukturen og innholdet.
I den andre versjonen (Air Art Technology andObject Magazine) nivået på det abstrakte objektet er viktig. Hva en bestemt etterkommer vil ha er ikke poenget, hovedsaken er at dens arvegren tilfredsstiller kravene til alle foreldre ned til rotabstraksjonen.
Objekt og objektsystem: algoritme
Et ideelt objektorientert konsept kan bare manipulere objekter og objektsystemer.
I moderne programmeringsspråk, underet objekt (klasse) er vanligvis forstått som en beskrivelse av et objekt og en forekomst av et objekt, dessuten, for å bruke beskrivelsen av et objekt, lar språk programmereren jobbe med statiske objekter, mens et dynamisk objekt er en forekomst av beskrivelsen, med sitt eget unike innhold og struktur, men med de samme metodene (egenskaps)beskrivelsene.
Dagens praksis klassifiserer begrepet et objekt somet verktøy, det vil si et programmeringsspråk, et grensesnitt, tilgang til en database, en nettverkstilkobling, men det er ingenting som indikerer interessene til kunden, problemet er løst.
Dette er ideelt for enkel OOP:polymorfisme gjør det mulig å gjøre spesielt ulike designelementer, men administrere dem med samme kode. Men her snakker vi ikke om objektene i problemet, som slett ikke anses som et emne for objektorientert analyse.
Programmerere har tatt i bruk OOP som et middel til åforbedre kvaliteten og produktiviteten til arbeidet deres, men ga ikke en eneste dråpe av "deres territorium" til kunden. De grunnleggende konseptene til OOP - innkapsling, arv, polymorfisme - forble i utviklingsfeltet og ble ikke transplantert inn i problemfeltet.
Objekt og system av objekter: problem og løsning
Datamaskin - programmerer - oppgave.Midtleddet er overflødig. Ideelt sett bør det bare være to, relativt avhengige, konturer: (datamaskin - programmerer) - oppgave. Det vil si at en bruker, kunde eller besøkende har et verktøy for å løse problemet sitt. Kunden bryr seg ikke om hvordan verktøyet implementeres.
Ideelt sett er det bare en datamaskin som er i stand tilforstå hva kunden ønsker og gjøre det han vil. Hvordan det vil se ut: et lokalt program eller et nettsted tilgjengelig via en nettleser, et spesialprogram for distribuert informasjonsbehandling, et informasjonssystem for kunden - det spiller ingen rolle.
Det er viktig at mellom oppgaven og datamaskinen er det ingenoverflødig kobling, men den første blir forstått og løst av den andre. For å oppnå dette målet må datamaskinen og kunden være knyttet sammen av ett system av objekter, og meningen, strukturen og innholdet til hvert objekt bestemmes av kunden, og metodene og egenskapene til objektene implementeres av programmereren.
Ideell når kundens jobb er å skapesystemet av objekter den trenger og arbeidet med implementeringen av metodene og egenskapene til disse objektene er skilt i tid. Jo lenger implementeringen av objektsystemet (programmereren) er fra dets semantiske innhold (kunden), jo bedre er prosessen.
Ingenting forstyrrer kunden og programmererensamhandle i prosessen med å løse et problem, men en klar separasjon av semantikk er viktig. Alle bør gjøre sine egne ting, programmereren er ikke forpliktet til å mestre omfanget av oppgaven, og kunden skal ikke forstå koden, og enda mer bør partene ikke gi hverandre råd som ikke angår dem.
Tradisjonell og objektprogrammering
Grunnleggende OOP-postulater:innkapsling, arv, polymorfisme i den formen de har blitt kjent og etterspurt, fører til en merkbar forbedring i kvaliteten og påliteligheten til koden, øker betydelig hastighet på programmererens arbeid og har mange andre positive egenskaper.
Men ting er der fortsatt: klassisk programmering er ikke dårligere enn sine posisjoner, og mange objektorienterte ideer implementeres av klassisk kode.
Imidlertid førte ideene om OOP og rekursjon til en tilstrekkeliginnflytelse på syntaksen til klassiske syntaksoperatorer, på logikken i å bygge vanlig kode som ikke har noe å gjøre med den objektorienterte skrive- og tenkestilen.
Lister og køer har endret seg, konseptet har dukket oppav det første og siste array-elementet dukket det opp løkker "for hver", og referansevarianter av navngivning, bruk og utførelse ble enda mer etterspurt enn før.
Faktisk, det faktum at variablene har taptdens "klare" ansikt (typen av en variabel kan endres etter behov, og det er ikke nødvendig å beskrive en variabel) sier at klassikerne faktisk lenge har blitt objektorienterte og har anerkjent de grunnleggende prinsippene for OOP: innkapsling , arv, polymorfisme som ideer som har essensielle.
Hva er kjernen: et objekt eller et system
Abstraksjon som en grunnleggende konseptuell posisjonOOP, uavhengig av hvor ansvarsområdet (implementering) av et objekt er lokalisert - på nivået til det første abstrakte objektet eller på nivået til en spesifikk etterkommer - lar spørsmålet være åpent: hvor du skal starte alt, fra objektet eller fra systemet?
Hvis vi legger et objekt som grunnlag, vil det aldri gjøre detvil bli et system, siden systemet vil være inne i ham, og han selv vil bli et rigid bilde av en veldig konkret begynnelse. Her oppstår problemer med abstraksjon: det opprinnelige objektet fikser nøyaktig det viktigste i problemet som løses, det vil si at det ikke lenger kan overføres til et annet problem.
Hvis vi legger et system av objekter som grunnlag, daet system av systemer oppnås. Det er vanskelig å forestille seg i forhold til en spesifikk oppgave, og hvor man skal starte utviklingen er også vanskelig å forstå. I det store og hele gir OOP-polymorfisme med dens forskjeller i enheter, implementeringsformer, antall faktiske parametere i funksjoner opptreden om systemet som ligger i begynnelsen, som:
- om alternativer for å løse problemet (for eksempel en meny);
- om startforholdene (anvendelse av problemet under forskjellige forhold, data);
- om driftsmodusene (testing, tuning, arbeid).
Men dette og lignende gir ingen grunn til å legge et system av objekter som grunnlag for å løse problemet. Det er ofte tilstrekkelig å definere et enkelt startobjekt.
Historien om problemløsningsprosessen
De viktigste prinsippene for OOP: polymorfisme og abstraksjon - prioriter det opprinnelige objektet som et system av objekter. I en tvist om hva som skal komme først, kyllingen eller egget, vinner kyllingen.
Det er ingen tvil om at alt burdestart med et abstrakt objekt, ikke et system av objekter. Men hvis vi tar hensyn til tidsfaktoren og bruker den på nivået til hvert objekt, starter med den aller første abstrakte, så er den motstridende ideen om å sette både objektet og systemet i begynnelsen av løsningen bare rimelig.
Hvis det klassiske programmeringskonseptet iI løpet av å løse problemet endrer den data, innholdet i databasen, endrer filer osv., og deretter i konseptet OOP-polymorfisme, endrer innkapsling og tidsfaktoren innholdet, strukturen og egenskapene til systemet med objekter til problemet blir løst.
OOP-programmereren er minst interessert ikonseptet med en fil, en database, en algoritme - dette er detaljer, her tenker programmereren med objekter, men objekter eksisterer i tid og endrer seg i løpet av å oppnå det ønskede.
Dermed er det i begynnelsen et objekt som et systemobjekter og logikken til dette systemet - tidsskalaen: starte en oppgave, danne det første objektet, legge inn eller samle inn data, danne det neste objektet, men ingenting hindrer det første objektet i å fortsette til neste løsning.
Hvert nivå av objekter fungerer somet uavhengig system av objekter, det vil si at det er ett objekt, men i sammenheng med prosessen som har startet og verdien av tid, er det et system av objekter på tidsskalaen. For en fullverdig implementering av OOP, gir polymorfisme, arv og tidsfaktoren sammen dynamikken til den første, det vil si at et objekt ikke bare kan endre seg over tid, men også generere objekter som ikke er levert av utvikleren, generert av utførelsen av oppgaven i løpet av prosessen, designet av kunden.
Ekte OOP polymorfisme eksempel
Kompleksiteten til oppgavene som OOP kan gjøre er det ikkekan sammenlignes med den som er tilgjengelig for den klassiske versjonen av skriveprogrammer. Selvfølgelig er det alltid mulig å løse ethvert problem på vanlig måte, men spørsmålet om hvor mye det vil "koste" tid og krefter gjør ofte resultatet ubrukelig.
Biblioteket ble nylig utvikletPHPOffice / PHPWord, men for å bruke dens evner, må du nesten alltid lage ditt eget objektsystem. For eksempel en enkel *.docx-fil:
er et zip-arkiv med mange filer ogmapper i Office Open XML-format (OpenXML, OOXML). Hver fil er skrevet i XML-tagger, og når man legger til, endrer og fjerner bokstaver, ord, tabeller, lister osv. elementer, begynner innholdet i filene å representere en sekvens av tagger som ikke alltid inneholder komplette elementer, ofte ett element. er skrevet med mange tagger.
Hvis du forestiller deg denne filen som en sekvens av tagger, får du et interessant bilde:
Det er lett å se at det første og eneste avsnittetdokumentet er representert av mange tagger. Når det gjelder tabellen og tabellene som er innebygd i den, er volumet av beskrivelsen av alle elementer umerkelig, men er tilgjengelig for en objektorientert applikasjon.
Faktisk, i figuren, er grønn en testtag output, gul - parametere og tag type, beige - innhold. De opprettede objektene er orientert mot maskinell behandling. For en person blir bare operasjonene med å åpne en dokumentfil, formatere og skrive den tilgjengelig.
Løsningen er enkel og praktisk, men implementeringen er mer fokusert på en datamaskin enn på en person, på grunn av hovedtyngden av funksjonaliteten som utføres og de komplekse relasjonene mellom objekter.
OOP områdetilstand
Utvikling av nettstedsstyringssystemer, teknologiersette opp og administrere servere, erfaring med å utvikle dynamiske nettsteder gjorde objektorientert programmering tilgjengelig for alle. Problemet er hvordan du endrer tenkningen din og blir vant til å tenke på objektnivå, og ikke i sammenheng med sekvensiell eksekvering av kode.
Vanligvis overgang fra klassisk programmeringtil objektorientert tar to til tre måneder, men kostnadene tilbakebetales med renter. Potensialet til moderne programmeringsspråk, først og fremst PHP og JavaScript, vil tilfredsstille den mest sofistikerte utvikleren.
Moderne OOP - polymorfisme, arv ogEvnen til å danne egenskaper til objekter er praktisk og praktisk, syntaksen til språk og hjelpeverktøy gir komfort i arbeidet og effektiviteten til koden.
Objektidéperspektiver
Hvor lenge varer klassisk programmering?og hvordan OOP vil utvikle seg er vanskelig å si. Tilsynelatende planlegger ikke utviklerne av verktøyene å vurdere konteksten til forbrukeren (brukeren, kunden).
OOP-verktøysettet - polymorfisme, arv, innkapsling og abstraksjon - er utviklerorientert.
Moderne informasjonssystemer og nettressurserstreber etter å reflektere virkeligheten, sikre funksjonen til virkelige objekter og skape et miljø for deres funksjon, så enkelt at det vil være tilgjengelig for en forbruker som er langt fra programmering, fullstendig fordypet i sin kompetansesfære.