ການສື່ສານກັບພໍ່ແມ່ໃນ Elm: OutMsg vs Translator vs NoMap P លំនាំ

ເມື່ອແອັບ app Elm ຂອງທ່ານເລີ່ມເຕີບໃຫຍ່ຂຶ້ນ, ທ່ານຈະຕ້ອງການແຍກມັນອອກເປັນສ່ວນນ້ອຍໆເພື່ອຈະສາມາດຂະຫຍາຍໄດ້. ຂ້າພະເຈົ້າໄດ້ກວມເອົານີ້ໃນ blogpost ອື່ນ: ຕົວຢ່າງ TodoMVC ທີ່ມີໂຄງສ້າງກັບ Elm.

ສ່ວນ ໜຶ່ງ ຖ້າການປັບຂະ ໜາດ ນີ້ໃນທີ່ສຸດກ່ຽວຂ້ອງກັບຄວາມຕ້ອງການທີ່ຈະສົ່ງ Msg ຈາກໂມດູນໄປຫາຜູ້ປົກຄອງຂອງມັນ, ຄືກັບເມື່ອປຸ່ມຄົ້ນຫາເທິງມຸມເບິ່ງສະເພາະ ຈຳ ເປັນຕ້ອງສົ່ງຂໍ້ຄວາມໄປຫາ Router ລະດັບຊັ້ນຕົ້ນ.

ຫຼັງຈາກບາງເວລາຂ້ອຍເລີ່ມສັງເກດ 3 ຮູບແບບທີ່ແຕກຕ່າງກັນ ສຳ ລັບການຈັດການກັບສິ່ງນີ້, ແລະຂ້ອຍໄດ້ປະຕິເສດ Elm TodoMVC ກັບທຸກໆວິທີການທີ່ແຕກຕ່າງກັນໃນຫໍສະມຸດແຫ່ງນີ້ເພື່ອໃຫ້ເຈົ້າສາມາດປຽບທຽບພວກມັນໄປຂ້າງ.

ຮູບແບບຂອງ OutMsg

ຂ້ອຍເຊື່ອວ່າ Folkertdev ແມ່ນຜູ້ ທຳ ອິດທີ່ຂ້ອຍໄດ້ຂຽນກ່ຽວກັບການສື່ສານກັບພໍ່ແມ່ເດັກໃນເມືອງ Elm, blogpost ຂອງລາວອະທິບາຍວິທີການນີ້ດີ.

ແຕ່, ເພື່ອສະຫຼຸບ, ທ່ານໂດຍພື້ນຖານແລ້ວຈະສົ່ງຄືນມູນຄ່າເພີ່ມໃນ ໜ້າ ທີ່ການປັບປຸງຂອງທ່ານ. ສະນັ້ນແທນທີ່ຈະກັບຄືນສິ່ງນີ້:

(ແບບ ຈຳ ລອງ, Cmd Msg)

ທ່ານສົ່ງສິ່ງນີ້:

(ແບບ ຈຳ ລອງ, Cmd Msg, OutMsg)

ຈາກນັ້ນ, ໜ້າ ທີ່ການປັບປຸງຜູ້ປົກຄອງແມ່ນຮັບຜິດຊອບໃນການຈັດການກັບຜູ້ທີ່. ວິທີນີ້ເດັກບໍ່ ຈຳ ເປັນຕ້ອງຮູ້ຫຍັງກ່ຽວກັບພໍ່ແມ່, ແຕ່ພໍ່ແມ່ຕ້ອງຮູ້ກ່ຽວກັບ OutMsgs ຂອງເດັກ.

ຂ້ອຍໄດ້ປະຕິບັດ TodoMVC ໂດຍໃຊ້ວິທີການນີ້. ແຕ່ຖ້າທ່ານຕ້ອງການກວດສອບຂະ ໜາດ ຕົວຈິງຂອງໂລກນີ້, Richard Feldman ໄດ້ປະຕິບັດຕົວຢ່າງ elm-spa ໂດຍວິທີນີ້.

ຕົວຢ່າງອີກອັນ ໜຶ່ງ ທີ່ໃຊ້ວິທີນີ້ແມ່ນ elm-datepicker.

ຮູບແບບ Translator

ຕົວແປ Translator ແມ່ນຄ້າຍຄືກັບ OutMsg ໜຶ່ງ, ແຕ່ແທນທີ່ພໍ່ແມ່ຈະຮູ້ກ່ຽວກັບປະເພດ Msgs ຂອງເດັກ, ມັນແມ່ນພໍ່ແມ່ທີ່ຈະຜ່ານເຊິ່ງ Msgs ຈະຖືກສ້າງຂື້ນ, ໂດຍຜ່ານນັກແປ. Alex Lew ອະທິບາຍເຖິງວິທີການຂອງລາວທີ່ດີກວ່ານີ້.

ໂດຍພື້ນຖານແລ້ວທ່ານມີນັກແປທີ່ເປັນບັນທຶກຄ້າຍໆນີ້:

ປະເພດນາມແຝງ TranslationDictionary msg =
  {onInternalMessage: InternalMsg -> msg
  , onPlayerWin: Int -> msg
  , onPlayerLose: msg
  }

ຂ້ອຍຍັງໄດ້ປະຕິບັດ TodoMVC ໂດຍໃຊ້ວິທີການນີ້, ແລະຂ້ອຍເຊື່ອວ່າ elm-autocomplete ກໍ່ເປັນຕົວຢ່າງທີ່ດີ.

ການປັບປຸງ elm-parent-child ແມ່ນຫ້ອງສະມຸດທີ່ຊ່ວຍໃຫ້ທ່ານມີການປັບປຸງພໍ່ແມ່ເດັກເຊິ່ງເບິ່ງຄືວ່າຈະເຮັດຕາມແບບແຜນນີ້.

ແບບ NoMap

ນີ້ແມ່ນສິ່ງທີ່ຂ້ອຍສັງເກດເຫັນວ່າຂ້ອຍ ກຳ ລັງເຮັດຢູ່. ແນວຄວາມຄິດພື້ນຖານແມ່ນເພື່ອຫລີກລ້ຽງການເຮັດ Cmd.map ແລະ Html.map, ສະນັ້ນແທນທີ່ທຸກຄົນຕ້ອງເວົ້າພາສາດຽວກັນ, ເວົ້າອີກຢ່າງ ໜຶ່ງ, ໜ້າ ທີ່ການປັບປຸງແລະການເບິ່ງຂອງທ່ານຈະຕ້ອງກັບຄືນປະເພດ Msg ລະດັບສູງສຸດ.

ດ້ວຍສິ່ງນີ້, ທ່ານອາດຈະມີ Msgs ເຊັ່ນ MsgForLogin, MsgForRouter, ແລະອື່ນໆ, ດັ່ງນັ້ນໃນມຸມມອງຂອງທ່ານທ່ານຕ້ອງເຮັດບາງຢ່າງເຊັ່ນ:

ປຸ່ມ [onClick (MsgForLogin SignUp)] []

ນີ້ແມ່ນວິທີທີ່ຂ້ອຍປັບປຸງ ໃໝ່ TodoMVC, ໃນຄວາມເປັນຈິງ, ຄັ້ງ ທຳ ອິດທີ່ຂ້ອຍໄດ້ເຫັນ OutMsg ຂ້ອຍບໍ່ເຂົ້າໃຈເຫດຜົນຂອງມັນ, ເຮັດໃຫ້ຂ້ອຍບໍ່ໄດ້ແຕ້ມແຜນທີ່ຂອງຂ້ອຍ.

ກວດເບິ່ງຟ້າຜ່າ-talk-app ສຳ ລັບຕົວຢ່າງທີ່ໃຫຍ່ກວ່າກັບວິທີການນີ້. ອີກຢ່າງ ໜຶ່ງ, ແອັບ this ນີ້ເບິ່ງຄືວ່າຈະປະຕິບັດຕາມ Kris Jenkins ’ວິທີການສ້າງໂຄງການ Elm ທີ່ ເໝາະ ສົມກັບວິທີການນີ້ໃນຂະນະທີ່ລາວແຍກປະເພດ Msgs ໃນແຟ້ມ Types.elm.

ຫ້ອງສະຫມຸດ elm-taco ແມ່ນໃຊ້ແບບ OutMsg ແລະ NoMap ແບບປະສົມໂດຍມີລະດັບສູງສຸດ "taco" ທີ່ທ່ານສາມາດສົ່ງຂໍ້ຄວາມຫາ.

ການສັງເກດແລະການປຽບທຽບ

ໃນຂະນະທີ່ຄົ້ນຄ້ວາແລະປັບປຸງຄືນ ໃໝ່ ສຳ ລັບຮູບແບບເຫຼົ່ານັ້ນ, ຂ້າພະເຈົ້າໄດ້ສັງເກດບາງຢ່າງ, ເຊິ່ງສາມາດເປັນຂໍ້ດີຫຼືຂໍ້ເສຍໂດຍອີງຕາມຄວາມຕ້ອງການຂອງທ່ານ:

  • ໃນ NoMap, ຟັງຊັນອັບເດດຂອງຜູ້ປົກຄອງຮັກສາຄືກັນກັບແອັບ app ຂອງທ່ານເຕີບໃຫຍ່, ໃນຂະນະທີ່ຢູ່ OutMsg ແລະແປພາສາຟັງຊັນອັບເດດຂອງຜູ້ປົກຄອງອາດຈະໃຫຍ່ຫຼາຍ, ດັ່ງທີ່ທ່ານຕ້ອງການຈັດການກັບ OutMsg ຂອງເດັກແຕ່ລະຄົນ (ຕົວຢ່າງ)
  • ກ່ຽວກັບ OutMsg ແລະແປແບບໂມດູນທີ່ຮັງບໍ່ ຈຳ ເປັນຕ້ອງ ນຳ ເຂົ້າຫຍັງຈາກຜູ້ປົກຄອງຊັ້ນສູງ, ເຮັດໃຫ້ພວກມັນຖືກຂັງຂື້ນ, ມັນຈະງ່າຍກວ່າທີ່ຈະສະກັດແລະເຜີຍແຜ່ບາງໂມດູນຍ່ອຍເປັນຫ້ອງສະ ໝຸດ ຕົວຢ່າງ
  • ສຳ ລັບ NoMap ທີ່ຈະເຮັດວຽກ Msgs ຂອງທ່ານຄວນຈະຢູ່ໃນເອກະສານແຍກຕ່າງຫາກຈາກ Update, ຖ້າບໍ່ດັ່ງນັ້ນທ່ານກໍ່ຈະມີຊ່ອງຫວ່າງເພິ່ງພາອາໄສ. ນີ້ແມ່ນສາເຫດທີ່ດີທີ່ເຮັດໃຫ້ທ່ານແບ່ງປັນສິ່ງຕ່າງໆ, ແຕ່ບໍ່ດີໃນເວລາດຽວກັນຖ້າທ່ານຕ້ອງການມີເອກະສານດຽວ ສຳ ລັບແຕ່ລະໂມດູນ (Home.elm, Login.elm, Router.elm)
  • ໃນ NoMap, ມັນງ່າຍຕໍ່ການສົ່ງ Msgs ຢູ່ບ່ອນອື່ນ, ແຕ່ວ່າມັນອາດຈະຍາກກວ່າທີ່ຈະປະຕິບັດຕາມການປ່ຽນແປງທັງ ໝົດ ຂອງລັດທີ່ເກີດຈາກມັນ.
  • ຕາມການວັດແທກໃນປັດຈຸບັນຂອງການຂຽນນີ້, ສຳ ລັບເຕົາປະຕິກອນ TodoMVC, ວິທີການ NoMap ມີ 546 LOC, OutMsg 561 ແລະ Translator 612 ຖ້າສິ່ງນີ້ ສຳ ຄັນກັບທ່ານ
  • ໃນ NoMap ໃນທີ່ສຸດທ່ານຕ້ອງການໃຊ້ກໍລະນີ _ ຈັບເພື່ອບໍ່ສົນໃຈ Msgs ຈາກສະຖານທີ່ອື່ນໆທີ່ທ່ານບໍ່ຕ້ອງການຈັດການ, ດັ່ງນັ້ນມີການຊ່ວຍເຫຼືອ ໜ້ອຍ ຈາກຜູ້ປະກອບຂໍ້ມູນ, ມັນບໍ່ສາມາດບອກສິ່ງທີ່ທ່ານຫາຍໄປໄດ້ (ຂໍຂອບໃຈ @mordrax ສຳ ລັບການຊີ້ ວ່າອອກສຸດ slack elm)
  • ໃນ OutMsg ແລະ Translator ທ່ານພຽງແຕ່ສາມາດເບິ່ງປະເພດຫລືນັກແປພາສາເພື່ອຄົ້ນພົບວ່າການສື່ສານກັບພໍ່ແມ່ແມ່ນມີຄວາມ ຈຳ ເປັນແນວໃດ, ດັ່ງນັ້ນນັກລວບລວມຂໍ້ມູນສາມາດ ນຳ ພາທ່ານຈັດຕັ້ງປະຕິບັດເຫຼົ່ານັ້ນ, ໃນຂະນະທີ່ NoMap ການສື່ສານນີ້ແມ່ນມີຄວາມ ໝາຍ ຊັດເຈນກວ່າ.
  • ວິທີການແປພາສາເບິ່ງຄືວ່າເປັນຄວາມຄິດທີ່ດີ ສຳ ລັບການໃຫ້ Msgs ຂອງທ່ານເອງກັບສ່ວນປະກອບພາຍນອກເຊັ່ນ elm-autocomplete
  • ຂ້ອຍໄດ້ພົບເຫັນຮູບແບບການແປພາສາຍາກທີ່ຈະຕິດຕາມດ້ວຍການເຂົ້າໃຈຂໍ້ຄວາມຜິດພາດຈາກຜູ້ຂຽນ Elm ໃນຂະນະທີ່ສ້າງມັນ
  • ຖ້າທ່ານບໍ່ດັດແປງມາດຕະຖານ (Model, Cmd Msg) ທ່ານສາມາດໃຊ້ຫ້ອງສະ ໝຸດ ທີ່ກັບຄືນມາໄດ້ດີ
  • ບາງຄົນຖືວ່າບໍ່ມີ Html.map ເປັນການປະຕິບັດທີ່ດີເພື່ອຫລີກລ້ຽງການສ້າງ "ສ່ວນປະກອບ"
  • ທ່ານສາມາດໄດ້ຮັບຜົນປະໂຫຍດຫຼາຍຈາກການປະສົມແນວທາງເຫຼົ່ານັ້ນ, ຍົກຕົວຢ່າງ, ທ່ານພຽງແຕ່ສາມາດຫລີກລ້ຽງ Html.map ສຳ ລັບການເບິ່ງ, ໃນຂະນະທີ່ຍັງໃຊ້ OutMsg ສຳ ລັບການອັບເດດ, ຫຼືທ່ານສາມາດໃຊ້ NoMap ສຳ ລັບ Msgs ລະດັບສູງສຸດເທົ່ານັ້ນ, ໂດຍ OutMsgs ຢູ່ທາງລຸ່ມ, ໃນຂະນະທີ່ສະແດງສ່ວນປະກອບ Translated ພາຍນອກ

ຊັບ​ພະ​ຍາ​ກອນ

ຂ້ອຍເຊື່ອວ່າການສື່ສານກັບພໍ່ແມ່ເດັກມັກຈະມີຄວາມ ສຳ ຄັນຫຼາຍກວ່າເກົ່າໃນເວລາທີ່ການຂະຫຍາຍແລະເຮັດ SPAs, ນັ້ນແມ່ນເຫດຜົນທີ່ຂ້ອຍໄດ້ພົບກັບການອ່ານຫຼາຍໆຫົວຂໍ້ນີ້ກ່ຽວກັບ Scaling Elm Apps:

ສຽງຮ້ອງ!