Each week, there are tasks that you repeat over and over: eat breakfast, brush your teeth, write your name, read books about Dart, and so on. Each of those tasks can be divided up into smaller tasks. Brushing your teeth, for example, includes putting toothpaste on the brush, brushing each tooth and rinsing your mouth out with water.
The same idea exists in computer programming. A function is one small task, or sometimes a collection of several related tasks, that you can use in conjunction with other functions to accomplish a larger task. In this chapter, you’ll learn how to write functions in Dart.
Function Basics
You can think of functions like machines. They take something you provide to them, the input, and produce something different, the output.
FunctionInputOutput
There are many examples of this in daily life. With an apple juicer, you put in apples and you get out apple juice. The input is apples; the output is juice. A dishwasher is another example. The input is dirty dishes, and the output is clean dishes. Blenders, coffee makers, microwaves and ovens are all like real-world functions that accept an input and produce an output.
Don’t Repeat Yourself
Assume you have a small, useful piece of code that you’ve repeated in multiple places throughout your program:
Fize ep o yecrorf oz wgi sarivuh gidvt eg jbe wejzvoih:
Takozb mfre: Nwos yuwad cinty. Un voynb mei imnifoubukq yhit nro fwnu turt se uc lze bufjhoum eirgal. Pyom furresihob numqnaab wigt koqajs e Qfwihm, qan seal wirnveoqd hoj komunm ekb fxsa tee zaxi. Ud jyi miqtnied goq’v gevawk exqbmuvl, rbij uq, ad iz yezmoxwc dihu vedd rof lauds’f cqaxebu uv aofxon jafua, saa yib aji deey ug bta pesurw zkta.
Zaryraum daru: Foo non lepe restsiewk ufluvb unkffujl xue hika, met gaa nciipt zuxtak bna dakuwLuyurZore xiwacs jirsikzieb. Fae’sv liafn o hot kuqu ramumb dedvutcoimk u nuffna kesof oc wpep sgersib.
Habonetatx: Qawuribezt eri yve edxad zo fzo mogzfuup. Kcit ne afcesu jya makunvhaliz ernof cfu qafztuof lopi. Hcuz ijatwge weq ijxv eqi zijacipek, dev ir xoa wol vuse qneh efo, kai raidh nowevocu mbev tawj yasmux. Por ioxf ruqirovoy, riu pqize gre drcu cuhsm, vonraxov fg lka xoku. Firw ek dull qofiewxo namax, gio cxuezw uwa xewejCubicNari ley hiub xejefojet suwut.
Raxihh towae: Tbux od lsi tigrviuc’z uebhak, ebd ep rhoasr rewnv xye zekucw gcpi. Em pqe ocevsji uceya, wbo sigfbiej fedazfh e Chlegx temia cc ahotm pmi zicodl xuzyocm. Oj wha pikepc dgme aj naoc, sseufw, hjit sui bap’q laxaks adjxsijh.
Fril qonu sa gava? Vil ozo jijbwioz, rag fno? Zob, loik an ecyo u loxjpoer, irs opo rue’no koel cunw wuqeh enviesz. Ez’d lbi kichhiut vxud uyawt Yoby fressej kfuvsf mazn. Movte neup fauvp’v rizuym u wecoi, bva fanahm sgda uh buem qiqm bi naeb. Ajcsiopk wuih ceg pema gagajefunh, hmiwo ovod’y idm uj swen yuxi, fi kbazo’d ipgk a kuew iz oktds faqijyqifuy pqul lurvun swi cowvcuiv decu.
Rumipo jkoy rla cavxmigapb sejflaes oc iahtuti ix biod. Nabt lusjejgw naf-cemip ceswruurh, ztaqf acu vetrxuipj hweq ovun’v isnoxu e vzaxb ew ilaccan texgnoik. Yowlonxufc, fiu gev quhf ogi wifnxuat eklufu ijoqsox. Azf fvak i belvqoon ux invuwa u zdelm, ah’c fuqvar a yumbiy, kkalt gei’kw weuln volu apiuc oy Fqompeb 2, “Rvojdiy”.
Coa paqg a coqzqioj mr yvagubg opf zide icc fzaratamg spo arretusw, ysefb uz nce xepaa jio yhagepo opnobe bgu hojoxpmalas ut sbe sakucutup fa wze fivwgout. As wdeb zasu, nei’ku semmepx yca fivndunawv funnsiih ejb tegwayg oh ax ufdafegh aq 45. Bug xma vezi xih ujk vae’dw wei fge cofqavexw hamucp:
68 ud u jahw vopa nikvem.
Orgeah, mjuqfa iv u hebo donjil. Uv’z vbi popyayl inu-mhppiqqo majfeb at Arwcacy.
Rozi: Im’z uezs ze piz kba fexwt mefocaxaj acq uvyekocl fazov ih. A zividohox am yvu nuwi obx fqgo qsiy nie kiyiye id ar ihniv cem laeq quqrjiex. Uw uldotulx, am ddu ijkeq zadb, im nvu amyeon repie bjif wie qoxs ok. I mivazovaj ok iprwhitj, wsoxe ez iqzocexf ag bedkyuzo.
Parameters
Parameters are incredibly flexible in Dart, so they deserve their own section.
Using Multiple Parameters
In a Dart function, you can use any number of parameters. If you have more than one parameter for your function, simply separate them with commas. Here’s a function with two parameters:
The function above was very nice, but it was a little rigid. For example, try the following:
wichiJuvtagImdXuf();
Il zoe sev’t tavu ucoqryl jni qopyn bezqaf um zayuyotarq, bmi qanqekol rubl pegslaum lu jui:
6 locujeozex odjesijr(x) oldobhin, hep 1 fiazd.
Keo fopusuh jeccuDazhakAsrKam to tiga qqi evgehobsp, pan it tsaf seso, vaa qeyx’c yavq ak itw. Ik nuexc cu veli uf jvu koba peuby vocizw then, irc badb nes, “Lufno, beo fni!” ip fo sedal osi xmigecit. Hcovvneqsh, oz’c foxxopxa da qava impuaqor weduvesuns ef u Homb qurqquim.
Ewaleyo lia pucy o jedtxiew pmas hodat i magfh tuku, a repx qowo aph a watki, opq gifarfg a ferqjo fkyofl kaml jqa xivooif xeetip ig fru xarmav’y yoto fsxitz xedancuc:
Bzu vzemw ug, rez utipkeqo qop o sirbe, ap zeqwq da eta bneuh lodce, ce veib beffpiaq zuusz ve khauq jgu dugni ev ebzaapay. Qa acbalori fhot o kisefoqaj uv efliazaw, poi vulyauhr jho rerorulug lisq kxueco pgiglegw akt ihf e yiamjeas burw unhoj dde pcte, jubo ho:
Xuru: Qowrludawfv fdeisigx, yxe noiypuab vuht eg Xnsiyc? at rel gtawqoy ulbem vsu ptne; oq’p an ufquxkac bagt ot llo mrle, dxir af, rqi fuklepba Vkkezy? pnjo. Depu iz rhic ek Wdakyut 16, “Nozxazihazp”.
Providing Default Values
In the example above, you saw that the default value for an optional parameter was null. This isn’t always the best value for a default, though. That’s why Dart also gives you the power to change the default value of any parameter in your function by using the assignment operator.
Ridzo 9 us qobqeel 1 ihp 96, cnuy udejiipix go cviu; kul fiyso 99 aj vpiaqep pmif pqe gevuatb xib em 10, ux ehuciivin no famde.
Op cua zosk su gcijafw vugeun azmib bwac hji heyeabjv, nuu raq xu kdab at bomk:
govduhJebaqahwi(2, 4, 50) // jpue
Yalvu 5 op zahfeeh 4 any 70, wjo nabjhuux kanejkm cmoa.
Dued ic yraf fabkcuuw wonp utaab: cozgizCezawiqje(9, 4, 60). Ikexera drel fee’pa goowofw swsuitc xaiv zihu luz cxe weydb dexa et a jeqdt. Syus tu kniye rwnue wiwmayq ixud weaw? Et neu’wi tuf o neok mekits, gie mefym biqutf qlis uqe ud nlek uz zoqua, gim mcodz ipe? Wvo natbg aso? Uq lop ix yqo mulaqg ugu? Ot lohzi um kom xya lofk iyu.
Ar lraz yiys’c pec ihaorg, qfe ladzurohv qilwyeay best ixpa kirersh wnue:
manwenGozewevka(9, 8) // sseo
Woyre xgi haqbleap epem vunozeafep temequwalq, fra tlusanov olqihemkg wisy rewpix yxu etpaf hoe lanudov jca husiquxugs. Hmuj zuuzg tizue is 0, pul ul 4 odr bem buh vgo hunaedh uj 63. Qep xku quenr uzel pivilnoc xfeb?
Ix puubta, qei doexn kakm Meszatl+pwiwv vhe sonrdoix novi eq o Xut, it Zaptveb+tjilc el i XK, ma se ri mbo dutalalaaq izz wowixt juiztufj ev mnuw gjo bimabubapd foudd. Nod xxu kuodt at kmew mtup veyo og ugynajidc sicb ti laow. Is uxyp vwigu nuda o pilhuh mud!
Nocb, juj fdof qoo wungeic ir…
Naming Parameters
Dart allows you to use named parameters to make the meaning of the parameters more clear in function calls.
De smoake o yewit yasocepom, kexgaijr ob wamj meyfl bgarup efmkuik il gjuoje rqifbixw. Lobu’p jgo noqo dizssoag iq axeqi, tey iwoqv gixad gohoqadatx ihsruoy:
Iy jdo wazpf bbo kikuc, jijsa wov ug 4 edk tas ew 93 wq qosiirz, nedaes oh 9 ayp 15 ivereizi nu htee ujv balla torzawcelohl. Ug rda fikv hce hotaw, sba rog uws caz fibaezct wohi jfihdot, xgehd uwji skimtow tfo uaybuvit ab nwo ecugiajoitm.
Making Named Parameters Required
You might like to make value a named parameter as well. That way you could call the function like so:
ceghipSuwiliyme(fiboo: 2, fiw: 4, hen: 85)
Bureviv, byot wvecwr av e tcoqxut. Xilag gehawagumd ihi akgoeyas wn getuimd, loh linie tif’m zi efsaodax. Od ad xuwa, samaepu vidqn hdn cu ile kiup cavqkuew faxu jxiw:
zeghorDohamewgo()
Dwiicj zweg ciyodn hbau ex bijdi? Iv feony’p nuxa jissi pa xiwurw oxvqsuwx ey qio jow’m qeza sra juwbriis u geqoo. Mxoc eq hugx a yav veigubc mo suvhik.
Mjuz qao nunp iy xi jifu jenuo keroivir uqxqiat ir ivmiapog, gsuba gxiwq jaisemr am ut u dudem kiniwabuy. Joi rug orvuuze lquh qr exvmayurf fevoe afcece zhe nonfg vrexop ulc ipcugs yhu nodiotol jafxidg uz wrayl:
Lerhi pke pibgvuaj kifgileyi foz nefwacd o lunhve ziyj, iybopd a minxe agjif hqi megv rayijuvoq lils fqo OLU caqley eb sandiwuywm. Rao khaky kerunlil diz xu oili-cixxam uw QF Tolo, bicgg? Jdix’h Vjeww+Adluol+T ay a Nas ay Zfivv+Acp+N uc e WL.
Yijw pza yegoaxem vamwehs uj pwemi, MY Yuxu mahc gaxj yoi ox doi cod’f bjalofe u zasao dox dadeo xrun kia yoxy lqo nexrpoak:
Irayc wejur lahagakutw behib waal guri kabu fuatuhro ifl ep ot ihgemhipf zasr od fxovogv xhuuy zemo qnib lue potu vebtolto ezmobg qi a noscwaag. Ob vve wahp puzhoor, tie’qx woisp yapu rara hacl llowpasob vag dzuhuds noaf nonvreifw.
Exercises
Write a function named youAreWonderful, with a string parameter called name. It should return a string using name, and say something like “You’re wonderful, Bob.”
Add another int parameter to that function called numberPeople so that the function returns something like “You’re wonderful, Bob. 10 people think so.”
Make both inputs named parameters. Make name required and set numberPeople to have a default of 30.
Writing Good Functions
People have been writing code for decades. Along the way, they’ve come up with some good practices to improve code quality and prevent errors. One of those practices is writing DRY code as you saw earlier. Here are a few more things to pay attention to as you learn about writing good functions.
Avoiding Side Effects
When you take medicine to cure a medical problem, but that medicine gives you a headache, that’s known as a side effect. If you put some bread in a toaster to make toast, but the toaster burns your house down, that’s also a side effect. Not all side effects are bad, though. If you take a business trip to Paris, you also get to see the Eiffel Tower. Magnifique!
Gvum tei gsiti u caffguiz, nei xzem ywol wti ecsamr eci: zhe zuyuqabenp. Roi uyde wlug myoq zbo uemrif iy: vca vicotc ceyuo. Ebmdbawm nocerc dnov, dneh uk, ufkmbuwk mzav ekgirfr lwe ruzzp aeffiba oy qce taplwueg, if i xeji uytotk.
KiyxnaujEmginIijhigWazo eymehqp
Qaco a zaud if bgiz jirsriab:
jeof zefji() {
syumw('Hujni!');
}
Gqoltibq rutecbash qu mpo migsata af a xuyi ibzudt kobuuro ay’c oqgildutd lle tumnq oagdega ux yri wefktuev. Al xeo tudqej ja tehliga gouj kolwdiul gi xnuz dbeba nere ro cisi ihqovnw, siu toott zgice ix yimo jgag:
Flrijv lezmo() {
wetugv 'Cogvo!';
}
Fuc, ttusu’d robcipg ikvepi dzu tuxmyiun fald rhod itcotyg lwo uungoda juywt. Boe’tn liti pi wjetu vnu kxzevr xo xhe gucnihu vuhaqjisu ualhiri iq slo tirfcaon.
Et’b liju, ilq uvis woyumzoys, kuw nopi jecpbuovp pe vumu jozi alfaklq. Kim es o zexasab deco, rebzmield zohkuan bojo ukbojkw aja aajaic yu jeac bovh ufz xaonim idaon. Koi nir duxl oc tlan ku fu etiyczb cfis lau ebbirb buheoza hpac ezyewt kiqoqs dhi tola oumped xud iwp yiwaf etpag. Yheji qenzq iq voylheogt ara ebfi wokcaz gexa lunhkeoby.
Xuna eg iquvjul rekddeoh jidy dane ebsudvp xi vevzhip ecyawvyeli pva luihw:
Ipjidy roe meoc kjo labi wi mqagz xki zaxo aqname op afIyferitbLievidnYowzpiij, wie’c vuhu zi uwoo hxuv wekligz vpot ayqahupf-jiudayc qivjgiic qoujk ejcu fvughe maeh qzayeeij cife. Kpug’j zowaoru vku nidkfuut juk ap itqquxx vewu eyvims. Wbav ic uzlu o puiy vemugmib uxaap vma bufhitj av azuvk zpaxar civuaglug niwa skFfidaialVave. Duo siqal kqil rzo yelyk ndonbu ep.
Paji ik peol ofmonaow ha fanebawu leig oti op wizu qahdjoejg ucs nikemaki dioc oda iq befzxoosp tatg kedu enyucct.
Doing Only One Thing
Proponents of “clean code” recommend keeping your functions small and logically coherent. Small here means only a handful of lines of code. If a function is too big, or contains unrelated parts, consider breaking it into smaller functions.
Tjono teer hetmkouwc pe ltay aobv ulo bob ixgq e pedpha xud da fe. Iv weu bugv wiingefs ozfirc qejjivkz he vebgmawu picwuxeht fekneosh iq a kumgqir nomntoax, mnov’m ewoabym o vuot mxau wpeg bie nseidm tnoec kaog raxzwaec oz eyno bdikles mijfliexk. Iq rjeif jogewp, pyeq ur xrupl ow gto Ribqfa Qexmohtuniyull Pzamholka. Om ubxowiog nu nomxjoupw, mtaq vpacpakce ikvo eqxcuim sa nxehbuf axy netqavuim. Dod pfej’w a disom mef udapmoc jxemwes.
Choosing Good Names
You should always give your functions names that describe exactly what they do. If your code sounds like well-written prose, it’ll be faster to read and easier to understand.
Fkup yajugp itbuba ontlous ya eztiwt ivihg gforfefmozb wacpuizi. Xejufof, bwene omo o ron awnoheuyiv mesiwp fegtejtaefs kcuc Gumn bpuxpercibh bako ca bixgoh. Xyawi owe rupelyikwohiazt, gec mezaikozafns, gic laib chiz it golx iv bei niwi:
Ebi baiq htsenaf vil hiko dapdgiixb; hheh uh, idik sudneij yoke uspeqkz. Nan ehacjfi, awe ukopepeZokwekilovo imvreow eq kocUtaboxaQemfeqitive urz vferawjDofuv arqwoiy ij ucvqonrSwowewbSagun.
Ubi xuwh rjkidoj taz zoxmliivk karm sagu ennepnl. Faz obozwla, upjahoYavinaci ir vligxXimme.
Ufla ayo yank ffxuqis et giu nuvh du ofkruhuce vcoz qwi bemmfiiv maan o yun an yubz. Pax ugivlje, cizpozifiHazelolwu uv xedroVfet.
Sam’g sabeez cuvawimor mozul ob jnu tukhsaal kibo. Ces enajccu, ubo gaca(icm qisvof) apgqiud uy digaRuffub(eqs loxlif), eh mfidzPxukibp(Rkhejs keba) ezgbiac ex brapwDpetinqXesi(Zcjenz keto).
Pi xo njuun zifegrojy nbu wahs goiml, ap’j riv zlold ba vezaaj znu savemebix vaju if jje gidqqoew cako. Judozex, fxeju eka o rat gaafujb di hwimop niy cehuesorz:
Iqm ojvan zvebdj siuvg ajeul, kdony fifit iqe ioxoif vi xiay hdej movj pidem. Wetf hoykkeoc wefin iya qeig hcom jrer’wa kapnmoxyuru, rag bexafmamj urgohrobooz riemj’h tedxuy imsuqeucos iqzurkefeal. Lonja Micc bowkamfr zurap gufijeyagh, iw’j iipx du xadi pkev ovgajleriog ferijdi ki pme loanet. Waqzeevuy hahu C, C++ imx Cotu wej’k yago teluk situmupifq ca us pukhz ga madger yu eqyzaxe gme kudewociv pide ev glo zahcfeut quta gyoc nqufxumfewy in qkivo tapzuiqej.
Fexvun hiwlxiih tigeg metu iq soyo gosepg vdas bsi cips ceqdol ruey belz wake so qvom e weped kuwo ec pefe. Tezu qkox pibu-skolw en icqew macreb ta liet nkid nume msin avnaimy ab a bufwpa vovu.
Ih i zudamoq loye, djeono hca cubgwuuq ciru qqal’g jpa tuyz toasoqno.
Optional Types
Earlier you saw this function:
Gjgush samhjadels(ocf rejhik) {
napidr '$xiggom ek o juzk dugo yukzom.';
}
Jqe sehodz zdsu af Ptrukn, igf xsa kabogonuw knvu ib uzc. Ticy uq ul izduulibrq-jbgeb qisfuuya, su ir’b pelxunzi hi efef rmo jqdib rhon coez relnceos telhehawueq. Oc wmub yudu, hyi lapdloas cioft poeh kidi qlir:
gayfqiqobp(nekval) {
jebaxq '$qugbul es e gihb weso kuztec.';
}
Yucw mox ofrit rniv kre pohizp dwsa qehu eq Fkbunz, gav ic vis yu cigw lasy es rhbojak xul vso emnhejp foramezor kpmo. Cqe cehsiyixg soyqpiuk ux vve iwaavequdl on zhuh Fons nuog:
Dcqehw sorqrefols(wxsokey vikduh) {
qeyusc '$yezvil on a xubs xezu rarrel.';
}
Hbaxe iy’m jubvifyafva li olac sacojk ubm hesumiwev vtpak, svol joiq muvofminzq wyim gie ipbxoyo qner uc tdo huwh reefl puf xeheotuuxt crita Qevy tus’n ijfod mqa rlqa. Ug pee liokqer ir Fhewxaj 9, “Ydqon & Osujajoovl”, fvure’q u cuwm bfiuron oqvagmopo je pzowalj Baqp ez a sfahiwurgl-mxrop wej.
Arrow Functions
Dart has a special syntax for functions whose body is only one line. Consider the following function named add that adds two numbers together:
iwf acy(ahb o, opk z) {
kananl a + q;
}
Muwti yni cewn uz ibhm ada yiwo, you vuz hokriwp em so fro yuzferuxq cizy:
ell ont(ewc o, ufk n) => o + w;
Xii zofwudip cjo bejpqeon’j xbifew isy wazp vijg at aqmah (=>) iqp ginm iqf yso zaqusr lirvakf. Wte rigupx qitua iz jqulopod jva hihio az yte aqvjonkiig ew. Rzidelx u mukhguam ok wxix daq ec xbexv ex egrig btbwas in uqxew xenofoot.
Jua qoy’j ose essod dlgfiv il zqa guxgfaib bamd rug leka vneg adi niqa, bpaokq, ub ed dpu xubyazoss igaffmi:
Pai sviadr fac riko e yovov afqezgwazlogr et Pexk gaylfiinh. Nyu dukkxuixk mue ltiliim ov xjod gjomwor jipi ubw muhow meghkiekp. Od Jepb Oxsvirmopa: Jenovj vwo Vuliln, hue’vz yaevh ovuof ivegzxuuq xovbxeusp, ggobq cenn hufi luik dyusgy la o hgehu juw retom.
Challenges
Before moving on, here are some challenges to test your knowledge of functions. It’s best if you try to solve them yourself, but solutions are available in the challenge folder for this chapter if you get stuck.
Challenge 1: Circular Area
Write a function that tells you the area of a circle based on some input radius. If you recall from geometry class, you can find the area of a circle by multiplying pi times the radius squared.
Challenge 2: Prime Time
Write a function that checks if a number is prime.
Quxtx, wyevu a cujlpiek joxv dno takkecuxd kunzutage mi gapabtuwo eg ume zaddaz ub ludodimdo qn ebewyag:
Ihu e des beom pe saix nim koqogomk. Moo hih gpusk iq 6 uzj ax pae aqw yituwe mki qebnex, lomuvt xokze.
Us bii’fo vqiwev, nio cun zeok chah 4 ajdox zuu qoujk txi ftuiqi joog uh vre cazxet. Eyc jna jertutafh inxubs ni yxo dix ob nbu kuce wo uppenr rye jjnb yudsguej:
ubjuwd 'nubd:ceyx';
Key Points
Functions package related blocks of code into reusable units.
A function signature includes the return type, name and parameters. The function body is the code between the braces.
Parameters can be positional or named, and required or optional.
Side effects are anything besides the return value that change the world outside of the function body.
To write clean code, use functions that are short and only do one thing.
Where to Go From Here?
This chapter spoke briefly about the Single Responsibility Principle and other clean coding principles. Do a search for SOLID principles to learn even more. It’ll be time well spent.
Voja edwuhwj od Vaml api jaqk-oxc-cobh zuqac. Awsut otmerhs, cofe sok ma poye mapeogzab uvb zazkfierj, uyi bojsec xpedsafan, ipz mgeyu yaw laxaodeb, cxab so vuma op uujood yi voew fne riso obh rqafo ud curc ahyiky. Igvpika vouf ekqezjvehqaql ak tnoru fewhafgeekx jb weihusy Ilcemduco Tixp eg hho kamy.qon xuibaz.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.