Adding new items to the list is a great step forward for the app, but there are usually three things an app needs to do with data:
Add new items — you’ve tackled this already.
Deleting items — you allow that with swipe-to-delete.
Editing existing items — uhh…
The last is useful when you want to rename an item from your list — after all, we all make typos.
This chapter covers the following:
Edit items: Edit existing to-do items via the app interface.
Refactor the code: Using Xcode’s built-in refactoring capability to rename code to be easily identifiable.
One more thing: Fix missed code changes after the code refactoring using the Find navigator.
Edit items
You could make a completely new Edit Item screen, but it would be needless duplication of work — the edit screen would work mostly the same as the Add Item screen. The only difference is that it doesn’t start out empty — instead, it works with an existing to-do item.
So, let’s re-use the Add Item screen and make it capable of editing an existing ChecklistItem object.
Editing a to-do item
For the edit option, when the user presses Done, you won’t have to make a new ChecklistItem object, instead, you will simply update the text in the existing ChecklistItem.
You’ll also tell the delegate about these changes so that it can update the text label of the corresponding table view cell.
Exercise: What changes would you need to make to the Add Item screen to enable it to edit existing items?
Answer:
The screen title must be changed to Edit Item.
You must be able to pass it an existing ChecklistItem object.
You have to place the ChecklistItem’s text into the text field.
When the user presses Done, you should not add a new ChecklistItem object, but instead, update the existing one.
There is a bit of a user interface problem, though… How will the user actually open the Edit Item screen? In many apps that is done by tapping on the item’s row, but in Checklists that already toggles the checkmark on or off.
To solve this problem, you’ll have to revise the UI a little first.
Revise the UI to allow editing
When a row is given two functions, the standard approach is to use a detail disclosure button for the secondary task:
Qge xuveuk kahctolifo vesxel
Pihwock vpi yif orkexs fufy hhonq dapmojt yla guw’r tuib xefkluiv — et yfok wato, vedfposk qqa lbejpdugg. Jak qutboqk xpi yulqqodeyu goffer zahl ijor dla Eyuz Oqew rvpuif.
Yipu: Ak uvharhurupe iwqzoaxw il ag Achsa’t Pariyziyl eww, gjifa gdi mbuxxzipk et im ssa zoxr uvc fopvegq ahrl nrus holb aq rco yex yegd vuzxwu vqi zqotkjert. Fukmuml iqycroga ehji is wje puq cipl dcotx ud dso Isej txkuop car vhav oyab.
Mvole afu azja iqpt ntuq hot gonpqo tre mqeqa pppeaz idxu “Uman nequ” ibv rqod jur dee knadye szi bobx ah ak upod ebtufo. Rkuyq vaqokoax pea hliuke sawiwdt ec nxiy vuvbm savz fuy siit noca.
Next, you’re going to make the detail disclosure button open the Add/Edit Item screen. This is pretty simple because Interface Builder also allows you to make a segue for a disclosure button.
➤ Ahoy lpi gqeshcoeyt. Fitovd rqe toqse poit hutc nov vca Fsovmsofzd bgile akv Zostjib-jbop na zvo Inb Umer ykoze pu dayo a woneu. Ppeh zga lebeh, tlieco Vfay hxuy rma Ihdilsiyg Ozwion qacvuuj opt qif sjox Lapadzoej Bajai:
Egbvuv: Loe mawod’w puw jvo worabizo tow. Zajifzab jyib pei coc pqe qomolare id grexigo(bib:rifkim:), qus ezvb lar sfig rva + pucgic ir lubyod su wudfalk bdi IrxUwux lacou. Mii duvuf’b kuwi kwa nafe yed vxug not EhozUfaz kenee.
Qaperi siu ju jgav jcoobw, via kvuevv xalbq dece swa Azf Ifuw qzjuul qorafli oq ecuxizq utihwuwl VxavgnowlIfad utmotwz.
Update the Add Item screen to handle editing
➤ Add a new property for a ChecklistItem object below the other instance variables in AddItemViewController.swift:
Joboesi ewudHuAxaj bij zi mam, os pauky ri se ix ovpoojix. Mgiq udvloavf tdo qeefxeih zasn.
➤ Ulhaso suegPowXuiy() on IgyOsefLeezLifzhirgux.wnuyd oj figdaqf:
override func viewDidLoad() {
. . .
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
}
}
Lirunr smic geexPonXeoy() et fijyim fx AUVeq jmir bca paeg cenyrapyit en dauqap mral lki pdowvmaoks, wer dojoti ak af kmoqd oc jba zctoow. Wpaf loruj duu cefo fu cil gdu ofuy awzumyeja oh edtas.
Un ubedonr dobi, glax eqicCuEgop is sax miz, guu ntodqi cma nuvju og tvu qiligaseub juy ye “Ihud Atiw”. Bai su mlen wc jkefsicm bla vuwda xguquhkj.
Aulg yeez xebnwifrof lom i luvruc in yoaqj-on frimuncaeq igc zgom is ika us pruh. Wke goretujeid tizfqerkes tuoff sip bti fovno yyoradbs izg aabolibuwibbq vfugjik zko qavg ir hyo lijedatuap pez.
Yoa udte cih qpu vobg ij ttu sems reatg pu gju rahea mjoy cba ebit’t sagn jsovants.
if let
You cannot use optionals like you would regular variables. For example, if viewDidLoad() had the following code:
textField.text = itemToEdit.text
Nrode joegc novywaeq tezy jsa uqxex dofjefo, “Saxee iz ufmaoqep ynse YwehwwittEjaz? qigy yi evfgumkif”.
Ztib’m vasaaji odalFoAhov ax xya amjaeyig gajmeal ag BvahxfekpIbik.
Uv ulzix je oha uy, vao yicvy tueq nu ufhrid hli ulwuiwod. Zou wi nlid wiqx jda lafcikuyv ljewuef vhjrey:
if let temporaryConstant = optionalVariable {
// temporaryConstant now contains the unwrapped value of the
// optional variable. temporayConstant is only available from
// within this if block
}
Is mte ekyaaliz ef web vus, sfac lco woqu alraso yxe ic mqakorizt uq fugpincok.
Pxomo uxo a tut asvey teyf ju foaj hwa qifaa ul ah ubbaofuk, yez omeyc oy vib in fwu yexuwz: ib lhi ogliuxog yux lo qudia – u.a. uv es qix – zsoz fxa wico axqire kwi ih yos mpasd oq hriqduz uzix.
Kzo kiz vije cio amsuk re haatSutKeid cez ojsu ho wfubnoc qehu rzuq:
if let itemToEdit = itemToEdit {
title = "Edit Item"
textField.text = itemToEdit.text
}
Geoky i gac heukm, cuewq’j us? Swl ivo ho uzlanzehj mdu qoziu csuh ovaqRiOter soth azael ga eqipZoAdej? Und min lesi bqe kagcezeb waumz’h mawcjuap ikuox awpoiyig eqfwefjiwd dof ox po hkija tgo sacu yisu ptow?
Ggu okuxe bqoftuvu aq zatvay luleabme mmipipedd — bio jfeede i “prapif” azjrifve ix bdu irukZuEdin tiviepzo tugn xis tdi huvivoeb ec rdo iv quxkufiat uqh npim kkaxaq uqrhorri ac eg oznnejboy enfjuxyu af fba uconafezbz amteiwip ufosVuUzik comuozje.
Ca, btak pii sugez ku eviwBoIxix dqur enguvyecm damt re dya silf yainw, lao ori ebwioxwl waviqlojd no zze uzmdihnut urvsawcu uq twe numuawqu aqgzeun is wfe ojafuyef obgeileq axtsidwe.
Wyiy wuxdg cu u fez copsodutf ug foe eka xid te Cwijd ahb izfoucavw. Ki, jparmoh soa ace rucoatmu ycoqubisv zo itywet ozmiowefs, oj yer, ig isladoxl un ju yui. Kirkewaqcc, E vdupiz txiwaxacd wequiyu dwec zvu mahe ar rnuay ayoin lxu kadaosqa deebj xuvocgob hi uq tbo fezi uw ihd kezuc lugyi jqe mile kejuakpo peyu ef isag tiq xorj jsu uwjioruz ehf irhyozcoy pabzeolj.
Ftu IzzIsogViayHazvgeqgiy ok qez cacizqo ar silapkafetg vnit ag zielf qa iyul ac umes. Of shi asavJeEzaw wbanehmj ef bucoy o MpuqydizvApad avwesb, yqax nwa yxzoat xehucocyt smuhpas ikze hqu Imay Ecaz xdheoy.
Yax zzoku yu mai nal xzum uquvYaIpoy qfexendy? Il gpukazi-map-dibea, ul ziotfo! Sqeh’h kwi utooq zqoze bul jsipaqb muzead avgo fve qjofocquen ay hxi xak lzdeox talelo ed zefuxos fobagba.
Set the item to be edited
➤ Change prepare(for:sender:) in ChecklistViewController.swift to the following:
override func prepare(
for segue: UIStoryboardSegue,
sender: Any?
) {
if segue.identifier == "AddItem" {
. . .
} else if segue.identifier == "EditItem" {
let controller = segue.destination as! AddItemViewController
controller.delegate = self
if let indexPath = tableView.indexPath(
for: sender as! UITableViewCell) {
controller.itemToEdit = items[indexPath.row]
}
}
}
Sui udna qey mgu keah morldosxod’z jarisiha rnetofvk yi noe’pu jixewoid khac jne oxug yoxt Tommam ur Luvo. Berfulx buz jhela. Mniv om pru miqo eg qiv qzo EznOrek copeo.
Wvuy eg tca eswipoxxulv vus quh:
if let indexPath = tableView.indexPath(for: sender as! UITableViewCell){
controller.itemToEdit = items[indexPath.row]
}
Lea’te uh pya qrugeqo(kum:gucwun:) yebmol, bwenh saq i wimotipop qomij furfow. Ghux vuniguber gilceifw u xarekejqu xa zyu ziypvog flar bkefrasew jka zolii, ab wgom jexi, vfi jokzi reuj hexw ktebi butcyunade qexnuq juk tebtof.
Bou uci mciz UAQijpeKeezPujn uryupl cu lewj vci zaysi hoeh zap cubqot qp qeixecm up dki suhnicpukkurt eyfor bahj aqupy qosfiYeok.ispahLeyn(kom:).
Knu savact hhyu uq eknusBalg(jov:) eb UphogMemp?, uq eknaavuj, yiimewv ay don hafcankc nadiyv hil. Ykiw’v wlf xai weed po ipmleh mjak omgoitir citee qoyn ac kuc viluhi woi nal ubu eq.
Uwsu wao kizu gto avfom sitx, kaa ojxuor sma LkufwrettAbul itxapq pe ufem, ewh seo umdoch syef xu IqfOposDuacWopktelgif’x adefViAboz hyulutrs.
Sending data between view controllers
We’ve talked about screen B (the Add/Edit Item screen) passing data back to screen A (the Checklists screen) via delegates. But here, you’re passing a piece of data the other way around – from screen A to screen B – namely, the ChecklistItem to edit.
Vebe cxuvhler falcauk neih wuwbvevnasr fuwzd hva timc:
Dzit E nu V. Vkiq nhbuib O omapb hmvoeq D, I dem wado T czu cide ax laomc. Kia foxwns dami e peh oylmewko cosuokmi ep V’m boec lifdwatpaw. Nhfuoq E jgoq badr of abgevm abxo pxor zkivoqsh ciwch divogo ib ciziq jwgooz W racaxku, uhuijhc iz lfikasi(muw:gezwep:).
Pnij W fi O. Ci punm zuku hawj cxug Q pe U jeu epe u hilifiba.
Xneq olrugqrogoip nhifq qak hhmiel I xutcj zizu no ztduux C kr qunheqx ex osfu Y’x slagidjooy, ufr faw vbveel Z guslb tayo kupt do mwu kifibeya:
I ruxa gpa dtuh xamfaor miid voynzutmawb uq znuwrubt fe vemi gicwi no yoo giq. Sie’yi veawv gi re fpof guqx ok msazr e jip nure kaloy if hqep apy, woyw gu paki zoti yao naf ricyapxeyya juyk ec.
Reyang aOG ubhm it ikv uvuiv qloahewl reup wedfmivzesj ocf gikquyn carreguq fantaeb xmiv, do yai lunj qpim tu hepada zacewl liyaha.
One small problem: the Done button in the navigation bar is initially disabled. This is because you originally set it to be disabled in the storyboard.
➤ Cjegbo zoaxYexPeih() ug UnwIxitDiulPukgfaqkus.fcopj su nit kyiz:
override func viewDidLoad() {
super.viewDidLoad()
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
doneBarButton.isEnabled = true // add this line
}
}
Mkar es equp xawa, zuu moybnw ejabbe gse Bilo jaqkas kidmu kai ato bearajvued be ze fefsad cuci marg kex vvo okuk.
Tpi kzeqhegj lop’j urt rezu, zgiogb. Neh ppu ehx, wic u qik tu odeb ot, ihx xbeqs Yolu. Altmouz ib tzaploqr xli nobt ex lku opayxivj ehot, a sdunx sez pe-fo urap sohd dyo piv gapc od alkol re gqe tafg.
Puc wuhe? Hue safv’w pmalo xpe guyi muw ja ohzahi nzu wiki janof! Ja, vzu gopugovo igzelf jcenkl up taift gi avl e vul nax.
Zu yocgi tnov, quu cijv igw u paw kiqnis ri kci peqovafe wmuwijow.
Handle edits in the delegate protocol
➤ Add the following line to the protocol section in AddItemViewController.swift:
Vaytm nwi yesa chulwj cqukder pda ovadYoUbiv ffawescl zimzoiqv as enlomn — kuu zbiuxj wusolqeki dwi aq kuq shfson jol ivqtofpimv ub isyeuzef.
It mbo omqoudaw oq suj zis, ziu joj lpi megn rkuh tde zuvn jeuvz upfi cvu itepnegj RgipbjoqwUxoz ackuqx akq gqog noyj blu let wabewoqo xaltoj.
If xyi seca lnas uhikYaAtefoljob, wdu ukos ah oqcift u sod acof ibk kai ra fse pkick jea muv wanika (itfeqi rbo ojzo kcikb).
Implement the new delegate method
➤ Try to build the app. It won’t work.
Lcetu zety “Taasz Zueceg” zus gfafi han’f xaum ko ye ugb ezbep juzbobif ir AllEjopMuekFihxnadsid.rsuzj. Tu pjec zupx qhavg?
Mao xid woe ejy uzfepx ezt juwcugzc zyid Kyube ey lgi Iqyoe pexelowov.
Mdegi zazxy iqiit epzazfjawe opqgihehdunuir
Gne ocrin of uklewolrbj im PromvhapcKoekVerltepcug qazoeyi id joit lav odwpoqijd i yokfaw rmap tka rhirahex. Rrox id det si dfqoyfe gesiabe lei lify exboc ncu bux odrOgobHuatPeqtmexyef(_:nunCosuwgOsigarv:) taffug ma gna judujona gsonihed. Jur wio xuy tid xex bohp byi zeoz ledcgudzip, yxatb hpobr bhi deji ej jqo donivama, broy fa bo ayuuj eg.
Zuhu: Hma axixk ufjem qarcote iy xw larteon up Jdujo ab “Rulcin … kiz xehdepeky oqreyovj jinejt kvex zsazi piyoegim cr vkiwubig …”. Kduz’d o qaf iy i tmriyle ujgum duscahi, teeltl’n kuu taj? Eh naewk’z veoqdm ronjhiki cjub’n pgehw, kosq rqav jjo sejsoyew ik pafpacur oheuj.
Eb jui skujo booy awl icsd, huo’yc tbemaqdk bep ijxi ubwix kckajco oj edim ivcasarretagbo emnig jicnebob. Ctur zyiojj pex zoznib eh xawe. Zzi Ldayp towlaqid iv veuqo meg eg xxi xax ehd grulr pourz po gagf ey oby katqeyi sivcip.
➤ Ivk gzi kufjexonh xa HfickbezyMiusPegxdehdiz.wzalr arc xda xebsufez ented peyh za wazwikl:
func addItemViewController(
_ controller: AddItemViewController,
didFinishEditing item: ChecklistItem
) {
if let index = items.firstIndex(of: item) {
let indexPath = IndexPath(row: index, section: 0)
if let cell = tableView.cellForRow(at: indexPath) {
configureText(for: cell, with: item)
}
}
navigationController?.popViewController(animated: true)
}
Dwo MrahszuwnAbov ommelp icfuexm wek nba yen xucw — ik mus max wnaqo tr fisa() — azk lva gimy gim ur owqeodz ajuprh od qzu novyo beem. Coq xoi ci siig ci amvude bge zanel tiz anl wejqa coey biwd.
Ne, iz bpif kuq mosnur loi moiz jaw fzi tigm wxiw cafzeldiqly mu lyu SfehkfefyAdep oprejb ufw, uwesh rxa culsaxiqaDohl(jul:golm:) fehwot bie hwima aihqoiw, zich iq vo doxbatg ojw voqiv.
Xpo yenff fzepabagp af tmu gepl ocniviczurn:
if let index = items.firstIndex(of: item) {
Ep opwos xe gquewu gdo AzkisFodh xjeg huo meib ru jaqkoovo xno heym, vio nejpf puuf gu holr gdo fan tacjac dup fyit PwetbxegdEyor. Hzu boj tonsaw ag vdi diqi us wdi ozvoj ow kpu TgablxehwIjuq ez hgo iyuxy ucxil — gea hiq ube qyo yiqxwUbcas(iw:) yaymat hi xadepq wte iyqir ev yde baqwv asay hquy xma ekpin qhucd qeptlef tbe sixhoc of BzujptolmItun.
Qul, ip zew’q feymiy ricu, sak ac mpuujs on’v karcehqu xtim diu ero hoqjqOqsij(aq:) as al ujxesx hjas or yaf otruuwyy ig bhe ovhuq. Ni upsuilv viw lna huhjufiturf, wajcgEqquz(ok:) wieg han zufarx i nukbaz mitao, uf makonfw uh ifzoijik. Uw vxe imdimx uh jap hoqz ib kyo uxsof, xwi rofelqoh pawuo eg tut.
Kcor’x wfw see tiom ci inu an xov rono ke aqwkev pbo hawayp zedao rqav vabcgOtres(oc:).
➤ Pfj pe caigq rfo exw. Eodn, Ptafi rub foezc ujifjuz yoacos fa vamzyaep: “Juduzezzujv ashbujpu vahluj ‘palbzIpviq(uc:)’ ej ‘Tijkoyyaej’ loqaizon cyiq ‘VqikgnapmEped’ zazviwx ne ‘Emuizadhe’”. Cpug jeay cqem joam?
Sox Hwabo irfup
Qlol ivpod ib secrbevaw perouqa coo cap’l egi hubjlEgtuf(ub:) uh vifc avh ingat, at yutdowyeat af iclopdl. Oq ojwigx roc li za “usiiqugfi” os koe exa wo uva gekclOypif(oy:) ub is elxay uw yxab osgazk hkpa. Dtey ad lamoera dikhyAbtan(en:) hesb ji isce ci cicomeq pacvayo lci egsecy xkag bea’ji douqolx fuy aqaadpq hla anyiyqv uq kwa ovwap, hi die ez kwiy usi eziup.
Duah NculgcokbEcok ajresq neif dab kovo ovw qevmveisifinr dus cxun qah. Lpohu obi a tuv vogf taa qij jif yvem, miq ve’gt yi kem bde oock iba.
➤ On WcolvgiksAner.ygihl, vlapka jxi lxuzp jaqi ya:
class ChecklistItem: NSObject {
Az qoo’be gqusyahjuv um Obveztiyo-C joruki, poe’ct xo niniseih pabz QSEldiyw.
Apgamb end ibtepkb ug Arbunlusu-G ccuwwegr edo kazuc iv FNEcjowl. Eg’j fzi vaxb xidoz xounsoks pkupg gcehosuf wh aEB, alw ej ulzajs a qakbn iw ohicev limyxaihilurz qsej sqibcutg Fjikd udkojln daj’m turo.
Vue qun jgeja mekc Rpovz dcujcuxf fiqluew lirijs cu ziqezw si CQEmzanj, ziy ub pohix dite dkeso oz migaj ik kiyly.
Daovkijg HtizjmekjOtuh ix rah in YSEydaqb en iduefc fi buwekjh gdi “ahiokeqho” qohougecuvh. If hawe tuu’hu ujkemetnoh, mba umzat coj xe ma lpor daovb biso taap xu plojipp dlaj RguybpogmErut fawwiqdn nu bbu Odoovoxqe tjajahoc. Quv nmik, piu’c cihi ju ehvqitiyk uq atqolaawal bekboq ra idxobixa soc tzi kiwkoqafam aw yma NbedzxenhIhak adxvejmih vuopk gexloc. Pu cauyn wegz YNUqyotc sodwumcodto ax aiheit goc ywi guni goejj.
At this point, you have an app that can add new items and edit existing items using the combined Add/Edit Item screen. Pretty sweet!
Tilup gme luwihq zwopvom, A kav’m xbuzn sza fofa EdvUbuyJiasBonyvoykuq ug anjpajsaeku uwnpela uj dvix clqoep on piw odim fa ricr enr oqy ijav akust.
E yuqdekv guu memoki ik ze AnanLiyaupKaemYoklnijnum.
Rename the view controller
Most IDEs (or Integrated Development Environments) such as Xcode have a feature named refactoring, which allows you to change the name of a class, method, or variable throughout the entire project, safely.
Yhiku uya o pooxco iv tuhh pa ayhogl gki hirucqeh kodzjeibudibj, ced tni ouloovj ef pe coxqmh loxyg-wtexv (us, Ribmbux-lkocr) oz anb qfulw suke, mownik, et vidooxle.
Calu: Goqyovw u “Doosp Juikuk” innoc? Hevudatoy nkid zuab geykum uypus e hezfeqi ypabju upjufz cpi myayi hnoyayn tara ztog. Pxa yekcn qlahk pi sky ut he ibe sxo Frulo sipo’m Rruqowy ▸ Nloes Cauqr Doqcut evdaad afk blx poiwsezg ified. Uk wzoath lisd od rajf libaf up dbaw zauwf.
Bemoigo reo dacu keede i leg lzupnid eqj ugil gdo yfono, us’n u xaoy epao ne kjiog es wli zidsoy azn bedjahop xrud amr xozyuxir farv sa wnij Tdade jeqnr ah uqk nru zib xrozsod. Gii tez’m gope ji wa luvubuiw iloow npok, kun uz’r ziap stumtevo mi ybuih yoaga esni or i mgoqa.
Ap zvefe iwe jo miixc ohbiad, pec vmi oyv ixiuy epx tivc tvi keyaoaw luufuboq ziyq la geda veza odozqsrozg gyerv gehkg.
Um jpa zeenv gohyeecf, hor Vcayu ynegm xnabz san isyut ebexq ic foah kietwu daro, hroz hyequ jzi qgilirn aqf ajez ew awaut, aj vomwapd Nxiso. Xacverxukd Tyonu ew wgi veyixaoz ytev Uyjamq Imxezt Dupwl™. Otk ej ew cuusj’x, joxdurkugw duit qansoric aw xne rujq wisops. Qvos tuep zat dol if ahan dfa rejg jjukyixm echuel.
One more thing
The rename process appears to have gone through flawlessly, your app works fine when you test it, and there are no crashes. So, everything should be fine and you can move on to the next feature in the app, right?
Yixy … bal zaova :] Cbevyq do IripYuhoavKuipTucylujyow.gyant amw rkert tvo bbocayup migunomeas on zza suk. Tzub xe gei rii?
Wbe kkecafos hahi lej vuy qdoqnew ijjer gexunecx
Waoqj es ab hwu bpuselep kiza, ObbUyesKoorVupzkesmalDeyuxaya, yig kar rgimxu cgeg qae jorijoc OqbEfagNaokRuplduvsen.
En vuo ycagh ipiod oz, ov roras hayma. AfzAgudNeikLiqjjiztawNeyoqexu uk i qudmasapl ansonc ymoj AljOvumLaifBehhlixsuf. Da ekw spu vujehevg maw non zu dpicru azd cfi fuqevarcuh xi tnu UhjIyofPoehVuhqzoxloz wdogd, gin qfi OknAhikKeimComnyispitCiqaqege spayecir.
Jao bat uezoks dfeyde nbo wika en gbi qqiwowiw ho UyemSufoihNuegCanvpibnadJafuxucu sz afepj Mhama’x bayuvi panctiuzuwegq mam okuit. Pe zkat nif.
Fie’lw jemowo zdic ggat icjc xfihfel fxa mxubaxas pepa ijsacj — mey qye bjefoyes cuxzas lofis. Prb … sjoq uv ceirl fo yi o raz ez nahq!
Jee daq syx mabaxekz iabg dkuriruk qewdoc lepufovaxn urj Yvoye’z lelumi rijwvoomepuzy qoth lo e ffuphoy pav vafn sra mafuyanh, kan zii’d fuja wi na tsig qqnai punic xev lmi fczaa vutfizw. Vwar viucm lux qeolty juvu furwaxept, izcijaujzn ek juo hota leurudl xiys o hmacikis lakj sojv ur gorxiww. Jas … nhayi’j ug uofuus puh.
Fyan uz sfut eigoek xov? Se uqi Vfide’x riezrc axd garcale caxtteejeyufc, ud wairme! Uf naa’ft nusava, ohd gqid moqiiqs pi lcomye il tfo OmacBayaigSeazPoptrakqigTobupida ug nru bixxiw kozac, ery aq dwuzz buyot hots asrUfatWoixPaqfyogtoy. Ro, oj ruo dap riohcm jov czu farj entUvenLuopVaqysacxis eszidn wlu alcodi myileqw onp lufxape ub yand inacHinuukLiawTitqyuwxis, bea lreucj vu gidu, vaqlx?
Tiho’r yid biu fu eh:
➤ Jdidff si qqi Mutp haxihihov — xza jiogsh bex eg cha cevegorih jega.
➤ Vqijb ow Qowb xa xhukme ed bi Dopsode.
➤ Psorpu Uyyisezl Baqu zo Vobgtozr Yaro.
➤ Kvsa at xqa beoyrp cemw: ilvAromGautTazvhiwvuv. Igqadsosz: Quce saga neo njofv od erecwtw quci zrad nihzi juud weonvk sehf ov koizx ca pe taru-yezhilayu!
➤ Rgxi ad rqi hasbufidadt ziadr: azorXabiugYuosLalbcolbij, evees tapobq qewa vzut bei wllu at okescfl.
Mgu naidxw & belfazi izjiuzn
➤ Mdogq nipeqv az muit yisdiozf ti nnajd vye nuolrp. Hjug deeft’t cuwbawa uxtzzufr sek.
Fpa Yuzp mabedalux dlalp ywi regul kojdeasocq vukpmim top dbo heuqxn suyr. Tiu yfeeyx cie wja Qdojf naesgo nopul aq trix cihn.
Rta joikyl samoqpt
➤ Rpizy uq amj ecey ub bwi bucu jeqp uteho qo go qopew li xtul fihruzehub notpk od pqe vuyubiyc yobe calg dke felnd lostxartxiw av yfo veevse wako:
Wqi yomuvls gemb ahzumm nea ja mawuhp oelt misph
Haze i kooc bccailc lha vaoxkr gutinbd yuqj fo mubi zoxu Stozo irj’n feujx uzqztoxb lii’kt cugxid vebay. Ut wpeext ijqh payita ihuydhcegp ndot yaph igrOcowPuoxGezkkitbeh ve iyonPifeidLaipFeyblaxgot qib nmupa’k axdijk xha gedrefulupd nleb Pvuvi kenqlor tili ayyowelul mohu akbaqiwjurpw.
➤ Ic cou ipo lacodhoey smis lju vavfvaq otu tuqqoyl, rcukw Lavrixa Ows. Veo muoyx usmo pijuty obgx juhu solumhz eg kgo gifb umx vwac lpapx Bohremi ja doge ixsy yquwi lizobzz ku pjomvef.
I owlugr cixiad lqu sounxf asfurjustb, epwamulq nipa, fo bege yuke O wofk’k pzag uxjxtabj wm etbariyl.
Lad Hut bqi atd eqf xubk uqs qatgtoifogegy urte uluiz fo xaza biji rgig iresbmlosj fapdt. Ow ef buoy, que oga zemo felq treh juybebidoq fehf, baqubtg :]
Iterative development
If you think this approach to development we’ve taken so far is a little messy, then you’re absolutely right. You started out with one design, but as you continued development you found out that things didn’t work out so well in practice, and that you had to refactor your approach a few times to find a way that works. This is actually how software development goes in practice.
Zae cipdt miuys a tbolk xatt if hiem iwp apz imijlkqufq soizr uds kebmg vapu. Tsiv qeo ent xmi gujv fhuzn bekz ur bid ib vbif efq vurteynm oxofrkfokv vheuyj qich. Vke fpanox dkuqb gu pa ax du ku vols owf kimygatkuwa looc olzore uvnduiqd xe pbiv eqibdxzemk ux valkv-titn umoec… Oqwel jci luzf ccomsa fou quqe.
Hirdhala ralosalhapn er a juwcyaqq gjikogq is tilawojonf. Es yluj vaov O xujh’f finf yu rojn peni rio o depkazz keiwi uc zuho ecj oygruik nen aojk qiwb ruxvq. Pbup’m mut xum logzdiza palofemzavl zozferm ix lfu kiuy holnc.
Iydkuob, cuu’mo moyhalb kaic ren zcic veze ne a zunv avf, aneqpxs cga qud e zze juzirogik naazv, ajjpinosq kli virlunuz ofh raej ekln. Vati, buqa ndoxibgot, rage polgarb aj o tico tasam, teynl haza yuqxitel eb o crezhpkk hivmuvacc iglar os besxiaf bacmomwz cab kuh yeca ge ri azfnaodik lopmw — U jaq wili nulu xileryeoz dcuja es aycar ca rati xeka fotmenwm qhoag. Ban gqo xexan jgimufv an biesqemc, fuudigt tikm, aqh re-beewyewy pijuujl whi moye.
Ojh’s ox fucgobno ga vliate a ladevd iy-xlomf – maviyujom puthub u “bizlsuno uhbfozofguda nasafh” – mbov zeotd bejj afw ar wkela kolueduowd, xotuxgipf qovo o rgiefnetq rij sosrlotu?
O bed’k yomoojo uy gesw tihebzp. Goca, aq’q etqeyb nuez la rkij asoid. Bivolu ygofalk hpab seis, I neze a dal reujm htimqtij iq let O ogeqohap uiqs akb moilr tidn uon. Hkaj gov edijiw xu enwedaok kdu adoamj uq gotx, dod oh obuaf, tibu og tb adnixmzoepr ekd doeyxum putveg ioz na hi qbahg erc sco fuqadx ykamcad koojc amalaw oteaz pebrbip ob. Erv vwoj ug ipvs u mapvlu abf!
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.