Yn y rhan fwyaf o god llywio, gwneir y dewis rhwng cyflwyno dalen a gwthio ar y pentwr lle bynnag y mae llywio yn dechrau, felly fe’i gwneir mewn sawl lle, ac mae copïau yn gwyro. Mae Iris yn ei wneud unwaith. Mae llif yn troi bwriad yn rhestr sefydlog o gamau, ac mae’r cydlynydd yn eu cymhwyso. Mae’r un bwriad yn glanio yn yr un ffordd, o unrhyw alwr.
Cyflwyno dalen, gwthio ar y pentwr, dychwelyd i’r gwraidd: mae’r symudiad strwythurol cywir ar gyfer cyrchfan yn aml yn dibynnu ar ble mae’r defnyddiwr eisoes. Penderfyniad go iawn yw hwnnw, ac nid ei wneud yw’r peryg, ond ei wneud mewn mwy nag un lle. Mae pob man mynediad a all gyrraedd cyrchfan yn tueddu i gadw ei gopi ei hun o’r rheol, ac mae copïau yn colli cydgord dros amser.
Mae Iris yn cael gwared ar y copïau. Mae NavigationFlow yn dangos un ffwythiant statig sy’n mapio bwriad i restr wedi’i threfnu o werthoedd Step. Mae pob cam naill ai’n NavTarget strwythurol y mae’r pecyn yn ei anfon (cyflwyno, gwthio, dychwelyd i’r gwraidd, cau) neu’n sgil-effaith defnyddiwr. Am mai dim ond y bwriad y mae’r ffwythiant yn ei ddarllen, mae’r un bwriad yn cynhyrchu’r un camau ym mhobman, ac mae RouteCoordinator yn eu cymhwyso yn yr un ffordd, dan ganslo diweddaraf-yn-ennill, beth bynnag a’u taniodd. Mae’r darn hwn yn esbonio’r mecanwaith ar lefel y pecyn, nid yr ap demo sy’n ei fesur.
Mae a yw cyrchfan yn cyrraedd fel dalen neu wthiad yn wirioneddol ddibynnol ar gyflwr. Mae gosodiadau’n agor fel dalen o wraidd y pentwr ac fel gwthiad o du mewn i edefyn. Mae’n rhaid i rywbeth wneud y dewis hwnnw, ac nid oes dim o’i le ar y dewis ei hun. Ble y’i gwneir yw’r broblem.
Os yw pob man mynediad yn penderfynu drosto’i hun, mae’r ap yn dod i ben â chynifer o gopïau o’r rheol dalen-yn-erbyn-gwthiad ag sydd ganddo o ffyrdd i mewn. Mae triniwr tap yn dal un copi, triniwr URL un arall, cynorthwyydd prawf y trydydd. Maent yn cytuno ar y diwrnod y’u hysgrifennir. Yn ddiweddarach diwygir un ac nid y lleill, ac mae’r un gyrchfan yn cyrraedd yn wahanol yn dibynnu ar sut y cyrhaeddodd y defnyddiwr. Nid dewis dyluniad oedd y gwahaniaeth erioed; mae’n cronni allan o ddyblygu, yn dawel, fel y mae rhesymeg wedi’i dyblygu bob amser.
Mae’r ateb yn strwythurol yn hytrach na mater o ofal. Rhowch un cartref i’r penderfyniad a llwybrwch bob man mynediad drwyddo, ac nid oes ail gopi ar ôl i anghytuno â’r cyntaf. Iris yw’r haen sy’n darparu’r cartref hwnnw ac yn gwneud llwybro drwyddo yn llwybr y gwrthiant lleiaf. Dyma sut y mae’n gwneud hynny: un ffwythiant sy’n enwi’r symudiadau strwythurol, ac un cydlynydd sy’n eu cyflawni.
Yn Iris mae llif defnyddiwr yn cydymffurfio â NavigationFlow, a’i unig rwymedigaeth yw un ffwythiant statig sy’n cymryd bwriad ac yn dychwelyd rhestr wedi’i threfnu o werthoedd Step: yr operasiynau sy’n gwireddu’r bwriad. Nid oes dim arall ar y math yn penderfynu llywio. Os ydych am wybod beth mae bwriad yn ei wneud, un ffwythiant sydd i’w ddarllen.
Un o ddau beth yw Step. Naill ai NavTarget strwythurol y mae’r pecyn yn ei gyflawni ar ran y defnyddiwr, neu sgil-effaith a ddiffinnir gan y defnyddiwr. Mae’r hollti hwnnw yn fwriadol: mae’n cadw symudiadau strwythurol y pecyn ar wahân i newidiadau cyflwr y defnyddiwr ei hun, fel nad oes byth angen triniaeth â llaw ar y cesys strwythurol ym mhob sgrin. Gwaith y pecyn yw rhedeg gwthio a chyflwyno, nid boilerplate y mae’r defnyddiwr yn ei ail-deipio.
Geirfa gaeedig o bedwar symudiad strwythurol yn union yw NavTarget: cyflwyno dalen, gwthio llwybr, dychwelyd i’r gwraidd, a chau dalen. Dyna’r cyrhaeddiadau, ac mae’r rhestr yn fyr yn fwriadol. Y cwestiwn dalen-yn-erbyn-gwthiad y mae’r darn hwn wedi’i enwi ar ei ôl yw pa gês NavTarget y mae cam yn ei gario: dewis dalen dros wthiad yw dewis .present dros .push. Ysgrifennir y dewis hwnnw mewn un lle yn union, ffwythiant cam y llif, ac nid yn unman arall yn y pecyn nac yn yr ap.
Am fod y ffwythiant yn statig ac mai’r bwriad yw ei unig fewnbwn, mae’n ymddwyn fel ffwythiant pur o’r bwriad. Bwydwch iddo’r un bwriad a chewch yr un rhestr o gamau bob tro, heb ddibyniaeth ar ba wrthrych a’i galwodd na beth y mae’r ap yn digwydd bod yn ei wneud ar y foment honno. Mae’r rhan o’r penderfyniad sy’n dibynnu ar gyflwr eisoes wedi’i phlygu i mewn i’r bwriad ymhellach i fyny’r afon, lle dosrannwyd URL yn erbyn ciplun o’r ap, neu lle enwodd tap ei fwriad yn uniongyrchol. O’r bwriad ymlaen mae’r ehangu yn sefydlog.
NavTarget o fewn pob cam .nav yw’r dewis dalen-yn-erbyn-gwthiad, a benderfynir unwaith o fewn ffwythiant y cam; nid yw’r cydlynydd ond yn cymhwyso’r hyn a ddywed y rhestr.Dewis dalen dros wthiad yw dewis un gês NavTarget dros un arall, ac fe’i hysgrifennir mewn un ffwythiant yn union.
Hanner y patrwm yw cynhyrchu’r rhestr; y cymhwyso yw’r hanner arall, ac mae yr un mor ganolog. Mae RouteCoordinator yn berchen ar y cyflwr llywio a’r llywwyr. Mae ei ddull llwybro yn cymryd y bwriad, a gludir ar faton, yn gofyn i’r llif am ei gamau, ac yn eu cerdded yn eu trefn.
Ar gyfer pob cam mae’n gwneud un o ddau beth. Trosglwyddir NavTarget strwythurol i anfonwr y pecyn, sy’n troi .present yn gyflwyniad dalen, .push yn wthiad ar y pentwr, .popToRoot yn ddychweliad i’r gwraidd, a .dismissSheet yn ddiystyriad. Trosglwyddir sgil-effaith i ddull cymhwyso’r defnyddiwr ei hun. Nid yw cymhwyso’r defnyddiwr byth yn gweld y cesys strwythurol o gwbl; nid yw ei switsh ond yn cwmpasu ei effeithiau ei hun, sef yr hyn sy’n cadw’r pedwar symudiad llywio allan o god y defnyddiwr yn llwyr.
Felly mae dau le unigol, nid un. Mae ffwythiant y cam yn penderfynu pa symudiadau strwythurol sy’n gwireddu bwriad, ac mae anfon y cydlynydd yn troi pob symudiad yn alwad llywiwr go iawn. Nid oes yr un o’r ddau wedi’i ddyblygu ar draws mannau mynediad. Mae rheolydd sydd am gyrraedd cyrchfan yn cynhyrchu’r bwriad ac yn stopio; nid yw’n cyflwyno nac yn gwthio dim byd ei hun. Dyna sy’n gadael i reolydd gosodiadau a dapiwyd a dolen gosodiadau sy’n dod i mewn lanio yn union yr un lle: maent yn cynhyrchu’r un bwriad, ac mae popeth ar ôl y bwriad yn cael ei rannu.
Gellir gyrru llywio yn gyflymach nag y mae’r rhyngwyneb yn setlo, mewn pyliau o URLau neu brawf yn tanio’n gyflym, felly mae’r cydlynydd yn rhedeg pob llif y tu mewn i weithredwr diweddaraf-yn-ennill. Pan fydd baton newydd yn cyrraedd mae’n canslo’r llif sydd ar y gweill, ac mae’r cerdded yn gwirio am ganslo rhwng camau, fel nad yw dau fwriad sy’n rasio byth yn cyd-blethu eu camau. Mae rhestr yr enillydd yn cymhwyso’n lân ac nid yw’r collwr yn gadael dim wedi’i hanner-gymhwyso. Mae pob baton hefyd yn cario dynodydd llif fel y gellir olrhain un digwyddiad llywio o’r dechrau i’r diwedd, ond gwaith y gweithredwr yw’r canslo ei hun, nid gwaith y dynodydd.
Nid gobaith yw penderfyniadaeth o unrhyw le; mae’n gorffwys ar dair priodwedd sy’n atgyfnerthu ei gilydd. Ffwythiant pur o’r bwriad yw ffwythiant y cam, felly nid yw’r rhestr byth yn amrywio yn ôl y galwr. Set gaeedig yw NavTarget, felly nid oes ffordd ben-agored o ddyfeisio cyrhaeddiad y mae rhai mannau mynediad yn ei drin ac eraill yn ei fethu. Ac mae cyfresoli diweddaraf-yn-ennill yn golygu na all cydamseriad gynhyrchu cyd-blethiad na fyddai unrhyw un bwriad wedi gofyn amdano. Yr un bwriad i mewn, yr un camau allan, wedi’u cymhwyso yn yr un ffordd, beth bynnag a’i taniodd a pha mor gyflym bynnag.
Rhaid gallu mynegi’r penderfyniad fel data. Gwerth yw cam, nid caead sy’n rhedeg rhyw lywio yn safle’r alwad, ac mae’r cyrhaeddiadau strwythurol wedi’u cyfyngu i’r pedwar cês NavTarget ynghyd ag unrhyw sgil-effeithiau y mae’r llif yn eu diffinio. Nid yw llywio na ellir wir ei ddisgrifio fel rhestr wedi’i threfnu o’r camau hynny yn ffitio’r siâp; byddai angen cês sgil-effaith newydd neu newid i’r eirfa arno. Yn ymarferol mae’r pedwar symudiad strwythurol ynghyd ag effeithiau’r defnyddiwr yn cwmpasu llywio ap, sef yr union reswm dros gadw’r set yn fach.
Mae gan anuniongyrchedd bris pan fyddwch yn darllen y cod. I weld beth mae bwriad yn ei wneud rydych yn darllen ffwythiant cam y llif, nid y rheolydd a’i taniodd. Mae hynny un cam i ffwrdd o’r tap, ac mae’n fwriadol: safle’r alwad yw’n union lle nad oeddech am i’r penderfyniad fyw.
Mae’r fargen yn werth chweil am mai’r dewis arall yw’r gwahaniaeth y mae’r patrwm yn bodoli i’w ddileu. Mae rheol dalen-yn-erbyn-gwthiad a gopïwyd ym mhob man mynediad yn rheol a gaiff, gydag amser, ei golygu mewn un copi ac nid y lleill. Enwi’r symudiad unwaith, fel gwerth, mewn un ffwythiant, a’i anfon o un cydlynydd, yw’r hyn sy’n gwneud tap a dolen yn ddau enw ar yr un cais.
Dyma’r pecyn o dan yr olwg o ochr y defnyddiwr. Lle mae yr astudiaeth datrysydd ymwybodol o gyflwr yn dangos sut mae ap demo yn plygu’r cyflwr presennol i mewn i un bwriad, a lle mae yr astudiaeth cydraddoldeb yn dangos tap ac URL yn cyrraedd un man mynediad, y darn hwn yw’r mecanwaith y mae’r ddau yn sefyll arno. Mae’r map llawn ar yr hwb dolennu dwfn.