Funktion (programmering): Forskelle mellem versioner
Content deleted Content added
m Bot: Kosmetiske ændringer |
Tilføjelser og omformuleringer; flere links |
||
Linje 1:
Inden for [[programmering]] er en '''funktion''' (''
I
En funktion identificeres ud fra dens [[prototype]], eller ''signatur'', som består af tre elementer
Ud over prototypen indeholder funktionen noget [[kode_(programmering)]|programkode]], der definerer den egentlige behandling af [[inddata]]. Koden aktiveres gennem et ''funktionskald'', hvor konkrete værdier - [[aktuelle parametre]], også kaldet [[argumenter]] - bliver bundet til, dvs. brugt til at [[initialisere]], de enkelte formelle parametre; det er disse værdier, funktionskoden under udførelse af et funktionskald arbejder på. M.a.o. fungerer navnene på de formelle parametre i koden som pladsholdere for de aktuelle værdier. Der er flere forskellige mekanismer for denne binding af aktuelle værdier, eller argumenter, til de formelle parametre; bindingsprocessen kaldes også ''parameteroverføring''
En funktion kan oprette sine egne [[variabel|variable]], der kun eksisterer så længe funktionen kører. Dette gør funktionen i stand til at arbejde med midlertidige data, som kun skal bruges i forbindelse med den aktuelle beregning.▼
<ref>
Den mest grundlæggende overføringsmekanisme er [[værdioverføring]] ([http://en.wikipedia.org/wiki/Call_by_name#Call_by_value| call by value]), hvor den formelle parameter bliver initialiseret med en ''kopi'' af den tilsvarende aktuelle værdi. Da de formelle parametre i funktionskoden fungerer på linie med lokale variabler, kan funktionskoden derfor ændre parametrenes værdier uden at det får virkning på de aktuelle parametre og dermed uden for funktionen.
<br /><br />
En anden parameteroverføringsmekanisme er [[referenceoverføring]] ([http://en.wikipedia.org/wiki/Call-by-reference#Call_by_reference| call by reference]), hvor det er en [[reference]] til den aktuelle værdi som parameteren bliver initialiseret med. Hvis funktionskoden modificerer værdien af en referenceoverført formel parameter, indvirker det på den tilsvarende arguments værdi. Den aktuelle parameter skal derfor i dette tilfælde referere til en modificerbar variabel.
<br /><br />
En tredje parameteroverføringsmodel er [[navneoverføring]] ([http://en.wikipedia.org/wiki/Call_by_name#Call_by_name| call by name]), som svarer til at den formelle parameter over alt i funktionskoden bliver erstattet af ordlyden af den aktuelle parameter; derefter bliver den således indsatte værdi gen-evalueret hver gang den bruges.
<br /><br />
Beregningsmæssigt er referenceoverføring den mindst krævende, da der typisk overføres en eller en [[pointer]], dvs. en enkelt [[maskindresse]], el.lign.
<br /><br />
Værdioverføring er betydeligt tungere, når de kopierede værdier er omfangsrige eller komplekse. Desuden kan de aktuelle parametre være udtryk.
<br /><br />
Navneoverføring kan pga. de gentagne gen-evalueringer være særlig omkostningskrævende og ses derfor efterhånden sjældent i [[imperative programmeringssprog]]. Til gengæld er det den potentielt mest slagkraftige af disse 3 overføringsmetoder; når den aktuelle parameter er en variabel, svarer navneoverføring nærmest til værdioverføring, men når parameteren er et udtryk, kan den bruges til særdeles avanceret programmering, jf. [[Jensen's device]] - i øvrigt en dansk opfindelse.
</ref>.
Kaldets resultat, eller [[inddata|uddata]], kan lagres i en [[variabel]], bortkastes, testes på eller indgå som et argument i et andet funktionskald. Funktioner, som ikke returnerer et resultat, har returtypen "void" i mange programmeringssprog, især fra [[C]]-familien.
Funktioner kan kalde andre funktioner, og i de fleste moderne [[programmeringssprog]] kan de også kalde sig selv, hvorved de bliver [[rekursiv]]e. Eksempler på [[rekursiv]]e (funktionsorienterede) programmeringssprog er [[C]] og [[SML]].▼
▲En funktion kan oprette sine egne ''lokale'' [[variabel|
I samtlige programmeringssprog er der visse prædefinerede funktioner som kan bruges. Disse funktioner omfatter blandt andet [[systemkald]] til [[operativsystem]]et samt gængse datakonverterings-, formaterings- og behandlingsalgoritmer.▼
I modsætning til lokale variabler er [[global variabel|globale variabler]] synlige og tilgængelige for alle funktionerne i en [[programmeringsenhed]] ([[modul]]) eller endda i hele programmet. Da enhver funktion kan både læse og overskrive værdierne af globale variabler, er det fristende at bruge disse variabler som en slags postkasser til at overføre værdier mellem funktionskald. ''<u>Denne fremgangsmåde kan ikke frarådes stærkt nok</u>'', da den gør fejl betydelig mere sandsynlige (jf. [[Murphy's lov]]) og kodevedligeholdelse og fejlfinding betydelig mere besværlige.
▲Funktioner kan kalde andre funktioner, og i de fleste moderne [[programmeringssprog]] kan de også kalde sig selv, hvorved de bliver [[rekursiv|rekursive]]
▲I samtlige programmeringssprog er der visse prædefinerede funktioner som kan bruges. Disse funktioner omfatter blandt andet [[systemkald]] til [[operativsystem|operativsystemet]]
Et eksempel på en prædefineret funktion er "easter_date()" funktionen i PHP. I dette tilfælde er året inddata, og uddata er den dato hvor [[påskedag]] ligger for det pågældende år. F.eks. vil "easter_date(2005)" returnere noget i retning af "0411", dvs. 11. April. Typisk vil mange matematiske funktioner også være prædefinerede, f.eks. [[Sinus (matematisk funktion)|sinus]] og [[cosinus]], [[kvadratrod]] osv.
<u>Noter</u>:
<references />
[[Kategori:Datalogi]]
[[Kategori:Programmering]]
|