Objektorientert programmering

Objektorientert programmering ( POO , på spansk ; OOP , ifølge forkortelsen på engelsk ) er et programmeringsparadigme basert på konseptet " objekter " som grunnlag, som inneholder informasjon i form av felt (noen ganger også referert til som attributter ) eller egenskaper ) og kode i form av metoder .

Objekter er i stand til å samhandle og endre verdiene i deres felt eller attributter (tilstand) gjennom deres metoder (atferd). [ 1 ]

Mange av de forhåndsbygde objektene i dagens programmeringsspråk tillater gruppering i biblioteker, men mange av disse språkene lar brukeren lage sine egne biblioteker.

Noen nøkkeltrekk ved objektorientert programmering er arv , kohesjon , abstraksjon , polymorfisme , kobling og innkapsling .

Bruken ble populær på begynnelsen av 1990-tallet . For tiden er det et bredt utvalg av programmeringsspråk som støtter objektorientering, de fleste av dem er basert på konseptet klasser og forekomster .

Introduksjon

Objekter er enheter som har en viss tilstand, atferd og identitet:

Objektorientert programmering skiller seg fra tradisjonell strukturert programmering , der data og prosedyrer er separate og ikke-relaterte, siden det eneste som etterstrebes er behandlingen av noen inputdata for å få andre utdata. Strukturert programmering prioriterer konseptet med prosedyrer eller funksjoner fremfor strukturer (funksjoner som behandler data hovedsakelig brukes). Objektorientert programmering, derimot, definerer først objektene eller strukturene for senere å be om utførelse av metodene deres.

Opprinnelse

OOP-konsepter stammer fra Simula 67 , et språk designet for simuleringer, laget av Ole-Johan Dahl og Kristen Nygaard ved Norsk Regnesentral i Oslo . I dette senteret jobbet de med skipssimuleringer, som ble forvirret av den kombinatoriske eksplosjonen av hvordan de ulike kvalitetene til forskjellige skip kunne påvirke hverandre. Ideen ble til ved å gruppere de ulike skipstypene i ulike objektklasser, hvor hver objektklasse var ansvarlig for å definere sine "egne" data og atferd. De ble senere foredlet i Smalltalk , utviklet i Simula ved Xerox PARC (den første versjonen av dem ble skrevet på toppen av Basic ), men designet for å være et fullstendig dynamisk system der objekter kunne opprettes og modifiseres "on the fly" (ved kjøretid). ). ) i stedet for å ha et system basert på statiske programmer.

OOP ble den dominerende programmeringsstilen på midten av 1980- tallet , hovedsakelig på grunn av påvirkningen fra C++ , en utvidelse av C-programmeringsspråket . Dens dominans ble sementert av fremveksten av grafiske brukergrensesnitt , som OOP er spesielt godt egnet for. I dette tilfellet snakker vi også om hendelsesdrevet programmering .

Objektorienterte funksjoner ble lagt til mange eksisterende språk i løpet av denne tiden, inkludert Ada , BASIC , Lisp pluss Pascal , blant andre. Å legge til disse funksjonene til språk som i utgangspunktet ikke var designet for dem, førte ofte til problemer med kompatibilitet og kodevedlikehold. "Rene" objektorienterte språk manglet i mellomtiden funksjonene mange programmerere hadde kommet til å stole på. For å komme rundt dette hinderet ble det gjort mange forsøk på å lage nye språk basert på objektorienterte metoder, men som tillot noen viktige funksjoner på "sikre" måter. Bertrand Meyers Eiffel - programmeringsspråk var et tidlig og moderat vellykket språk for disse formålene, men har nå i hovedsak blitt erstattet av Java , hovedsakelig på grunn av fremkomsten av Internett og implementeringen av den virtuelle Java-maskinen i de fleste nettlesere . nettsted . PHP versjon 5 har blitt endret; støtter en fullstendig orientering til objekter, og oppfyller alle egenskapene til objektorientering.

Historikk

Terminologien "objekter" og "orientert" i moderne betydning av objektorientert programmering dukket opp for første gang ved MIT på slutten av 1950-tallet og begynnelsen av 1960-tallet. Allerede i 1960 i miljøet til gruppen med kunstig intelligens ble begrepet "objekt" brukt for å referere til elementer ( LISP- atomer) med egenskaper (attributter); [ 2 ]​ [ 3 ]

Et annet tidlig eksempel på orientert programmering ved MIT var Sketchpad laget av Ivan Sutherland i 1960–1961; i ordlisten til den tekniske rapporten fra 1963, definerer Sutherland begrepet "objekt" og "instans".

Simula introduserte viktige konsepter som er en viktig del av objektorientert programmering i dag, for eksempel klasser , objekter , arv og dynamisk binding . [ 4 ]

Nylig har det dukket opp en rekke språk som primært er objektorienterte, men som også støtter prosedyreprogrammering. To eksempler på disse språkene er Python og Ruby . Sannsynligvis de mest kommersielt viktige nyere objektorienterte språkene er Java , utviklet av Sun Microsystems , og C# sammen med Visual Basic.NET (VB.NET), designet av Microsofts.

Grunnleggende konsepter

OOP er en form for programmering som prøver å finne en løsning på disse problemene. Den introduserer nye konsepter, som overvinner og utvider gamle konsepter som allerede er kjent. Blant dem skiller følgende seg ut:

Klasse En klasse er en slags "mal" der standardattributtene og metodene for en objekttype er definert. Denne malen er laget for å enkelt kunne lage objekter. Metoden for å lage nye objekter ved å lese og hente attributtene og metodene til en klasse er kjent som instansiering. Arv For eksempel er arv fra klasse C til klasse D funksjonen som klasse D arver i den hver av attributtene og operasjonene til C, som om disse attributtene og operasjonene hadde blitt definert av D selv. Derfor kan du bruke de samme metodene og variabler registrert som "offentlig" i C. Komponenter registrert som "private" er også arvet, men holdes skjult for programmereren og kan bare nås via andre metoder. For å kunne få tilgang til et attributt eller operasjon av en klasse i noen av dens underklasser, men holde den skjult fra andre klasser, er det nødvendig å registrere komponentene som "beskyttet" ( beskyttet ), på denne måten vil de være synlige i C og D men ikke i andre klasser. . Gjenstand Forekomst av en klasse. Entitet forsynt med et sett med egenskaper eller attributter (data) og atferd eller funksjonalitet (metoder), som følgelig reagerer på hendelser. De tilsvarer virkelige objekter i verden rundt oss, eller til interne objekter i systemet (av programmet). Metode Algoritme knyttet til et objekt (eller en klasse av objekter), hvis utførelse utløses etter å ha mottatt en "melding". Atferdsmessig er det hva objektet kan gjøre. En metode kan forårsake en endring i egenskapene til objektet, eller generering av en "hendelse" med en ny melding for et annet objekt i systemet. Begivenhet Det er en hendelse i systemet (som en brukerinteraksjon med maskinen, eller en melding sendt av et objekt). Systemet håndterer hendelsen ved å sende riktig melding til det aktuelle objektet. Reaksjonen som et objekt kan utløse kan også defineres som en hendelse; det vil si handlingen den genererer. egenskaper Kjennetegn som klassen har. Beskjed En kommunikasjon adressert til et objekt, som beordrer det til å utføre en av metodene med visse parametere knyttet til hendelsen som genererte det. egenskap eller attributt Beholder av en datatype assosiert med et objekt (eller en klasse av objekter), som gjør dataene synlige fra utsiden av objektet, og dette er definert som standardegenskaper, og hvis verdi kan endres ved å utføre en metode. indre tilstand Det er en variabel som er erklært privat, som kun kan åpnes og endres av en objektmetode, og som brukes til å indikere forskjellige mulige situasjoner for objektet (eller klassen av objekter). Det er ikke synlig for programmereren som håndterer en forekomst av klassen. Medlemmer av et objekt Attributter, identitet, relasjoner og metoder. Identifikasjon av et objekt Et objekt er representert av en tabell eller enhet som er sammensatt av dens tilsvarende attributter og funksjoner.

Sammenlignet med et imperativt språk, er en "variabel" ikke noe mer enn en intern beholder av objektets attributt eller en intern tilstand, akkurat som "funksjonen" er en intern prosedyre for objektets metode.

Kjennetegn ved OOP

Det er enighet om hvilke trekk "objektorientering" tenker på. Følgende egenskaper er de viktigste: [ 5 ]

Abstraksjon Det angir de essensielle egenskapene til et objekt, der dets oppførsel fanges opp. Hvert objekt i systemet fungerer som en modell for en abstrakt "agent" som kan utføre arbeid, rapportere og endre tilstanden, og "kommunisere" med andre objekter i systemet uten å avsløre "hvordan" disse funksjonene er implementert. Prosesser, funksjoner eller metoder kan også abstraheres, og når de er det, kreves det en rekke teknikker for å utvide en abstraksjon. Abstraksjonsprosessen gjør det mulig å velge de relevante funksjonene i et sett og identifisere vanlig atferd for å definere nye typer enheter i den virkelige verden. Abstraksjon er nøkkelen i prosessen med objektorientert analyse og design, siden vi gjennom den kan sette sammen et sett med klasser som lar oss modellere virkeligheten eller problemet vi ønsker å angripe. innkapsling Det betyr å samle alle elementene som kan anses å tilhøre samme enhet, på samme abstraksjonsnivå. Dette gjør det mulig å øke sammenhengen ( strukturert design ) av komponentene i systemet. Noen forfattere forveksler dette konseptet med fortielsesprinsippet, hovedsakelig fordi de ofte brukes sammen. Polymorfisme Ulike atferd, assosiert med forskjellige objekter, kan dele samme navn; å kalle dem med det navnet vil bruke atferden som tilsvarer objektet som brukes. Eller sagt på en annen måte, referanser og samlinger av objekter kan inneholde objekter av forskjellige typer, og å påkalle en atferd på en referanse vil produsere riktig oppførsel for den faktiske typen av det refererte objektet. Når dette skjer ved "kjøretid", kalles denne sistnevnte funksjonen sen allokering eller dynamisk allokering . Noen språk gir mer statiske ("kompileringstids") metoder for polymorfisme, for eksempel C++-maler og operatøroverbelastning . Arv Klassene er ikke isolerte, men er relatert til hverandre, og danner et klassifiseringshierarki. Objekter arver egenskapene og oppførselen til alle klasser de tilhører. Arv organiserer og letter polymorfisme og innkapsling, slik at objekter kan defineres og lages som spesialiserte typer eksisterende objekter. Disse kan dele (og utvide) dens oppførsel uten å måtte implementere den på nytt. Dette gjøres vanligvis ved å gruppere objekter i klasser, og klasser i trær eller gitter som gjenspeiler vanlig atferd. Når et objekt arver fra mer enn én klasse, sies det å ha multippel arv ; Siden den er av høy teknisk kompleksitet, brukes derfor vanligvis virtuell arv for å unngå duplisering av data. Modularitet "Modularitet" er egenskapen som gjør at en applikasjon kan deles inn i mindre deler (kalt moduler), som hver må være så uavhengig som mulig fra selve applikasjonen og fra de andre delene. Disse modulene kan settes sammen separat, men har koblinger til andre moduler. Som innkapsling støtter språk modularitet på forskjellige måter. skjule prinsippet Hvert objekt er isolert fra utsiden, det er en naturlig modul, og hver type objekt eksponerer et "grensesnitt" til andre objekter som beskriver hvordan de kan samhandle med objekter i klassen. Isolering beskytter egenskapene til et objekt fra å bli endret av noen som ikke har rett til å få tilgang til dem; bare objektets egne interne metoder kan få tilgang til tilstanden. Dette sikrer at andre objekter ikke kan endre et objekts interne tilstand uventet, og eliminerer bivirkninger og uventede interaksjoner. Noen språk slapper av dette, og gir direkte tilgang til objektets interne data på en kontrollert måte og begrenser graden av abstraksjon. Hele applikasjonen er redusert til et aggregat eller puslespill av objekter. Søppelsamling Søppelinnsamling er teknikken der objektmiljøet er ansvarlig for automatisk å ødelegge, og derfor frigjøre det tilknyttede minnet, objektene som har blitt stående uten noen referanse til dem. Dette betyr at programmereren ikke trenger å bekymre seg for å tildele eller frigjøre minne, siden miljøet vil tildele det når du oppretter et nytt objekt og frigjøre det når ingen bruker det. I de fleste hybridspråk som har blitt utvidet til å støtte det objektorienterte programmeringsparadigmet som C++ eller Object Pascal , eksisterer ikke denne funksjonen og minne må eksplisitt deallokeres.

Kritikk

OOP-paradigmet har blitt kritisert av ulike grunner, inkludert å ikke oppfylle målene om gjenbrukbarhet og modularitet, [ 6 ] [ 7 ] og for å ha overvekt ett aspekt ved programvaredesign og modellering (data/objekter) på bekostning av andre aspekter viktig (databehandling/algoritmer). [ 8 ]​ [ 9 ]

Sammendrag

OOP er et paradigme som dukket opp på 1970 -tallet , som bruker objekter som grunnleggende elementer i konstruksjonen av løsningen. Et objekt er en abstraksjon av et faktum eller entitet i den virkelige verden, med attributter som representerer dets egenskaper eller egenskaper, og metoder som etterligner dets oppførsel eller aktivitet. Alle egenskaper og metoder som er felles for objekter, er innkapslet eller gruppert i klasser. En klasse er en mal, en prototype for å lage objekter; Generelt sies hvert objekt å være en forekomst av en klasse.

Typer

For å utføre objektorientert programmering er det 3 hovedstrømmer: [ 10 ] ​[ 11 ]

Noen objektorienterte språk

Simula (1967) er akseptert som det første språket som har hovedtrekkene til et objektorientert språk. Den ble laget for å lage simuleringsprogrammer, hvor "objektene" er representasjonen av den viktigste informasjonen.

Smalltalk (1972 til 1980) er muligens det kanoniske eksempelet, og som mye av teorien om objektorientert programmering er utviklet med.

Objektorienterte språk inkluderer følgende:


Mange av disse programmeringsspråkene er ikke rent objektorienterte, men er hybrider som kombinerer OOP med andre paradigmer.

I likhet med C++ har andre språk, som OOCOBOL, OOLisp, OOProlog og Object REXX , blitt opprettet ved å legge til objektorienterte utvidelser til et klassisk programmeringsspråk.

Et nytt trinn i abstraksjonen av programmeringsparadigmer er Aspect Oriented Programming (AOP). Selv om det fortsatt er en modningsmetodikk, tiltrekker den seg stadig flere forskere og til og med kommersielle prosjekter rundt om i verden.

Se også

Notater og referanser

  1. ^ Lewis, John; Loftus, William (2009). Java Software Solutions Foundations of Programming Design 6. utg . del 1.6 "Objektorientert programmering": Pearson Education Inc. ISBN  9780321532053 . 
  2. ^ McCarthy, J.; Brayton, R .; Edwards, D .; Fox, P .; Hodes, L .; Luckham, D .; Maling, K .; Park, D. et al. (mars 1960). LISP I programmeringshåndbok . Boston , Massachusetts : Artificial Intelligence Group, MIT Computation Center og Research Laboratory. s. 88f. Arkivert fra originalen 2010-07-17 I den lokale MIT patois blir assosiasjonslister [over atomsymboler] også referert til som "eiendomslister", og atomsymboler kalles noen ganger "objekter". » 
  3. ^ McCarthy, John ; Abrahams, Paul W.; Edwards, Daniel J .; Hart, Swapnil D.; Levin, Michael I. (1962). LISP 1.5 programmeringshåndbok . MIPress . s. 105 . ISBN  978-0-262-13011-0 . "Objekt - et synonym for atomsymbol". 
  4. Holmevik, Jan Rune (1994). Compiling Simula: En historisk studie av teknologisk genese . IEEE Annals of the History of Computing 16 (4): 25-37. S2CID  18148999 . doi : 10.1109/85.329756 . Arkivert fra originalen 30. august 2017 . Hentet 3. mars 2018 . 
  5. Coad, P; Yourdon, E. (1991). Prentice-Hall internasjonale utgaver, red. Objektorientert design . ISBN  9780136300700 . 
  6. ^ Cardelli, Luca (1996). "Dårlige tekniske egenskaper for objektorienterte språk" . ACM Comput. Surv. 28 (4es): 150-es. ISSN  0360-0300 . doi : 10.1145/242224.242415 . Hentet 2010-04-21 . 
  7. Armstrong, Joe. I Coders at Work: Reflections on the Craft of Programming. Peter Seibel, red. Codersatwork.com , åpnet 13. november 2009.
  8. ^ Stepanov, Alexander . "STLport: Et intervju med A. Stepanov" . Hentet 2010-04-21 . 
  9. Rich Hickey, JVM Languages ​​Summit 2009 keynote, Are We There Yet? november 2009.
  10. Klasser, forekomster, prototyper og arv i OOP . edu4java.com
  11. Detaljer om objektmodell . JavaScript-veiledning . Besøkt 19. august 2017
  12. SAP Business Suite (fra SAP AG -selskapet ), hendelsesorientert språk.
  13. OpenEdge Programming Language by Progress Software.
  14. Versjon 5.x med Class(y) objektbibliotek.
  15. Arv gjøres via prototypebasert programmering .
  16. På spansk.
  17. Støtter multippel arv. Løsning gjøres i trestruktur (forhåndsbestilling), men kan modifiseres til C3-lineariseringsalgoritmen via Class::C3- modulen i CPAN ).
  18. Klasse::C3 .
  19. PHP: fra versjon 5.
  20. Behandler offisielt nettsted (på engelsk)
  21. Rent objektmiljø.
  22. Visual FoxPro: i sin versjon 6.
  23. Programmeringsspråk brukt av Twitter .
  24. http://www.scala-lang.org/page.jsp

Eksterne lenker