Elmda bolalar va ota-onalar o'rtasidagi aloqa: OutMsg vs Translator va NoMap Patterns

Sizning Elm ilovangiz o'sishni boshlaganda, uni kattalashtirish uchun uni kichikroq bo'laklarga bo'lishingiz kerak bo'ladi. Men buni boshqa blogpostda yoritdim: Elm bilan tuzilgan TodoMVC misol.

Agar ushbu miqyoslash oxir-oqibat, moduldan ota-onasiga Ms yuborish kerak bo'lsa, masalan, ma'lum bir ko'rinishda navigatsiya tugmachalari yuqori darajadagi Routerga xabar yuborish kerak bo'lganda.

Bir muncha vaqt o'tgach, men ushbu ishlov berishning 3 xil namunasini ko'rishni boshladim va Elm TodoMVC-ni ushbu omborda mavjud bo'lgan har xil yondashuvga qarab, ularni yonma-yon taqqoslashingiz mumkin.

OutMsg namunasi

Menimcha, Folkertdeev Elmda bolalar va ota-onalar o'rtasidagi muloqot haqida birinchi marta ko'rganman, uning blogposti bu usulni juda yaxshi tushuntiradi.

Ammo, xulosa qilish uchun, asosan, yangilash funktsiyangizga qo'shimcha qiymat berasiz. Shunday qilib, buni qaytarish o'rniga:

(Model, Md Md)

Siz buni qaytarasiz:

(Model, Cmd Ms, OutMsg)

Keyin, ota-onalarning yangilanishi funktsiyasi ularni boshqarish uchun javobgardir. Shunday qilib, bola o'z ota-onasi haqida hech narsa bilishi shart emas, lekin ota-ona o'z farzandining OutMsgs haqida bilishi kerak.

Men TodoMVC-ni ushbu yondashuvdan foydalangan holda amalga oshirdim. Ammo agar siz haqiqatan ham bu dunyoning miqyosini tekshirmoqchi bo'lsangiz, Richard Feldman "El-spa" misolini shu tarzda amalga oshirdi.

Ushbu yondashuvdan foydalanadigan yana bir misol - xurmozor.

Tarjimon namunasi

Translator namunasi OutMsg-ga juda o'xshash, lekin ota-ona bolaning Mss turlari haqida bilishi o'rniga, tarjimon orqali Mss yaratiladigan ota-ona. Aleks Lyu bu erda o'z uslubini ancha yaxshi tushuntiradi.

Asosan sizning tarjimoningiz bor, bu shunday yozuv:

type alias TranslationDordam msg =
  {onInternalMessage: InternalMsg -> msgstr
  , onPlayerWin: Int -> msg
  , onPlayerLose: msg
  }

Men ham ushbu yondashuvdan foydalanib TodoMVC-ni amalga oshirganman va men ishonamanki, avtokompyuter ham yaxshi namunadir.

El-ota-bola-yangilanishi - bu sizga ushbu ota-onani yangilashda yordam beradigan kutubxona.

NoMap namunasi

Bu men qilayotgan ishimni payqadim. Asosiy g'oya Cmd.map va Html.map-larni bajarmaslikdir, shuning uchun hamma bir xil tilda gaplashishi kerak, boshqacha qilib aytganda, sizning yangilanish va ko'rish funktsiyalaringiz yuqori darajadagi Ms tipini qaytarishi kerak.

Buning yordamida siz MsgForLogin, MsgForRouter va hokazolar kabi Ms-larga ega bo'lishingiz mumkin, shuning uchun Ko'rishingizda siz quyidagini bajarasiz:

tugmasi [onClick (MsgForLogin SignUp)]] []

Men TodoMVC-ni birinchi marta qayta ko'rib chiqdim, aslida men OutMsg-ni birinchi marta ko'rganimda, men buning sababini tushunmadim, chunki mening Ms qaydlarimni xaritaga kiritmaganligim.

Ushbu yondashuv bilan yanada kattaroq misol uchun chaqmoq-talk-ilovasini ko'rib chiqing. Bundan tashqari, ushbu ilova Kris Jenkinsning Elm ilovalarini tuzish usuliga amal qilganga o'xshaydi, bu esa ushbu yondashuvni qo'llab-quvvatlaydi, chunki u Type.elm faylida Mss tiplarini ajratib turadi.

Elm-tako kutubxonasi kinosi siz OutMsg va NoMap naqshlaridan foydalanib, sizga xabar yuborishingiz mumkin bo'lgan yuqori darajadagi "tako" dan foydalanadi.

Kuzatuvlar va taqqoslash

Ushbu naqshlarni tadqiq qilish va qayta tiklash jarayonida men sizning ehtiyojlaringizga qarab afzalliklar va kamchiliklar bo'lishi mumkin bo'lgan narsalarni ta'kidladim:

  • NoMap-da, ota-onaning yangilanish funktsiyasi sizning ilovangiz o'sishi bilan bir xil bo'lib qoladi, OutMsg va Translate-da esa yangilash funktsiyasi juda katta bo'lishi mumkin, chunki har bir bolaning OutMsg-ni boshqarish kerak (masalan)
  • OutMsg va Translate-ga o'rnatilgan ichki modullar yuqori ota-onalardan biron bir narsani olib kirishga hojat yo'q, chunki ularni qo'shimcha kapsüllü qilish, ba'zi kichik modullarni ajratib olish va nashr etish uchun osonroq bo'ladi.
  • NoMap-ning ishlashi uchun sizning Ms-ni yangilashdan alohida faylda yashash kerak, aks holda sizda qaramlik davri bo'ladi. Bu har xil modullar uchun bitta faylga ega bo'lishni xohlasangiz (Home.elm, Login.elm, Router.elm) bir vaqtning o'zida narsalarni ajratishga majbur qiladi.
  • NoMap-da, Mss-ni boshqa har qanday joyga yuborish osonroq, lekin u tufayli yuzaga kelgan barcha o'zgarishlarni kuzatish qiyin bo'lishi mumkin.
  • Ushbu yozuvni hisoblash paytida, TodoMVC reaktorlari uchun NoMap yondashuvi 546 LOC, OutMsg 561 va Translator 612 ga ega, agar bu sizga ahamiyatli bo'lsa.
  • NoMap-da siz oxir-oqibatda _ catch-all case-dan Ms-ni boshqa joylardan e'tiborsiz qoldirish uchun ishlatishingiz kerak bo'ladi, shuning uchun kompilyatorning yordami kam, u nima etishmayotganingizni aytib berolmaydi (ko'rsatganingiz uchun @mordrax uchun rahmat) qarag'ay bo'shlig'ida)
  • OutMsg va Translator-da siz bola yoki ota-ona uchun qanday aloqa zarurligini aniqlash uchun faqat turlarga yoki tarjimonlarga qarashingiz mumkin, shuning uchun kompilyator ularni amalga oshirishga yo'naltirishi mumkin, NoMap-da esa bu aloqa yanada aniqroq.
  • O'zingizning Ms-ni tashqi komponentga, masalan, El-autocomplete-ga berish uchun, tarjimonning yondashi yaxshi ko'rinadi
  • Men Elm kompilyatoridan tuzilgan xato xabarlarini tushunish qiyin bo'lganida, tarjimonning naqshiga amal qilmay qo'ydim
  • Agar siz (Model, Cmd Msg) standartni o'zgartirmasangiz, siz ingichka qaytish kutubxonasidan foydalanishingiz mumkin
  • Ba'zi odamlar "komponentlar" ni yaratmaslik uchun Html.map-ni yaxshi amaliyot deb bilishadi.
  • Ushbu yondashuvlarni aralashtirish sizga juda ko'p foyda keltirishi mumkin, masalan, ko'rinishlar uchun Html.map-dan qochishingiz mumkin, ammo yangilanishlar uchun OutMsg-ni ishlatishingiz yoki NoMap-ni faqat yuqori darajali Ms uchun ishlatishingiz mumkin, va pastda OutMsgs, tashqi tarjima qilingan komponentni ko'rsatishda

Resurslar

O'ylaymanki, SPA-larni kattalashtirish va amalga oshirishda bolalar va ota-onalar o'rtasidagi aloqa ko'pincha muhimroq bo'ladi, shuning uchun men topdim ko'plab narsalar bu Scalm Elm Apps-ga oid ushbu reddit mavzusini o'qigan:

Xursand bo'ling!