Save 37% off PRO during our Black Friday Sale! »

メタプログラミングと生産性 / meta-programming

A6a5e01b331d18dbd9c5de1f2cc2879f?s=47 erukiti
February 21, 2018

メタプログラミングと生産性 / meta-programming

メタプログラミングを生産性向上手段の一つとして知っておくと、プログラマ人生が捗るかもしれません!

A6a5e01b331d18dbd9c5de1f2cc2879f?s=128

erukiti

February 21, 2018
Tweet

Transcript

  1. ϝλϓϩάϥϛϯάͱ ੜ࢈ੑͷ࿩ NFUBQSP@FT !FSVLJUJ

  2. ࣗݾ঺հ w FSVLJUJ 5XJUUFS (JUIVC 2JJUB .FEJVNͳͲ  w Ҿ͖͜΋ΓؾຯϑϦʔϥϯεΤϯδχϟʔ

    ڭࡐ࡞੒ͱ͔ ϥΠλʔͬΆ͍ײ͡ͷ͜ͱ΋ʜ  w όοΫΤϯυϝΠϯ ϑϩϯτΤϯυɾΠϯϑϥͳͲ  w ޷͖ͳݴޠ͸5ZQF4DSJQU ͱ͍͏͔ܕͷ͋Δ&$."4DSJQU  w ಉਓࢽಉਓࢽ঎ۀԽಉਓࢽಉਓࢽ ߹ಉࢽ ঎ ۀԽਐߦத߹ಉࢽࣥචதˍಉਓࢽࣥචத
  3. +4FSͱͯ͠͸৽ࢀऀ w &MFDUSPOͷҝʹ+BWB4DSJQUΛ࢝ΊΔ w $P⒎FF4DSJQU&45ZQF4DSJQU &4&4 'MPX5ZQF4DSJQU w %0.΍$44ͳͲͷ஌ݟ͕গͳ͍

  4. ๞͖ͬΆ͍޷ح৺Ԣ੝ w ڈ೥ޙ൒͔ΒͷྲྀΕ ϑϨʔϜϫʔΫ࡞੒ϝ λϓϩάϥϛϯά҉߸௨՟ɾϒϩοΫνΣʔ ϯɾίϯϐϡʔλϏδϣϯ w ࠷ۙͪΐͬͱϝλϓϩάϥϛϯά͔Β཭Ε͍ͯ ͨʜɻʢ"45ຊͷ঎ۀԽ͕ετοϓதʜʜ 

    w కΊ੾Γۦಈ։ൃɺకΊ੾Γۦಈࣥචɺษڧձۦ ಈษڧ
  5. NFUBQSP@FT w ڈ೥ळࠒͷ+BWB4DSJQUࡇΓͷ࣌ʹQPUBUPE͞Μͱ ॳΊͯ͋ͬͯɺͦͷ͋ͱʮͳΜ͔ษڧձ։࠵͠· ͤΜ͔ʁʯͱ͓੠͕͚ͯ͠΋Βͬͨ w ͪΐͬͱ͹ͨ͹͍ͨͯͯ͠ɺ݁ہ݄ʹೖͬͯϝλ ϓϩͷษڧձ΍Γ͍ͨͰ͢ʂͱݴͬͨΒ։࠵͕ܾ ఆ͠·ͨ͠ɻ w

    ৭ʑ΍͍͚ͬͯͨͩͯ΄Μͱ͋Γ͕͍ͨݶΓͰ͢ʂ
  6. ͘͞ΒΠϯλʔωοτ͞Μ ձ৔ͷ͝ఏڙ ͋Γ͕ͱ͏͍͟͝·͢ʂʂ

  7. ΞδΣϯμ w ϝλϓϩάϥϛϯάͱ͸Կ͔ w ੜ࢈ੑ w ద੾ͳબ୒ࢶͷҰͭͱͯ͠ͷϝλϓϩάϥϛ ϯά

  8. None
  9. ྫ  w %#εΩʔϚఆ͔ٛΒɺσʔλϞσϧ΍Ϧϙδ τϦύλʔϯΛࣗಈੜ੒ w σʔλϞσϧ͔Β42-จΛࣗಈੜ੒ w %4-Λݩʹύʔαʔ ߏจղੳث

    Λੜ੒ w ؔ਺Λड͚औͬͯ߹੒͢Δؔ਺
  10. ྫ  w -JTQΈ͍ͨʹߏจΛࣗ෼ͰఆٛͰ͖Δݴޠ w 4DBMBͷϚΫϩ w ςϯϓϨʔτݴޠ ಛʹνϡʔϦϯά׬શͳ΍ ͭ

     w ϦϑϨΫγϣϯ ಈతʹ৘ใΛऔಘͨ͠Γॻ͖ ׵͑ͨΓ
  11. ˞ͨͩ͠ɺ஫ҙ͠ͳ͍ͱ ؆୯ʹࠇຐज़΍ ෛͷҨ࢈ʹͳΓ·͢

  12. ͦ΋ͦ΋ϝλͱ͸ʁ

  13. None
  14. ༷ʑͳϝλ w ࡞඼தͷΩϟϥ͕࡞඼ͷ֎ʹݴٴ͢Δʮϝλ ൃݴʯ w σʔλຊମʹରͯ͠σʔλΛ؅ཧ͢ΔͨΊͷ৘ ใΛ෇༩͢Δʮϝλσʔλʯ w ྲྀߦΓͷσοΩΛલఏͱͨ͠ಛघͳઓུΛલ ఏͱ͢ΔσοΩߏஙʮ˓˓ϝλσοΩʯ

  15. None
  16. ந৅ͱ۩৅ w ϓϩάϥϛϯά ཁ݅ఆ͔ٛΒίʔσΟϯά· Ͱશ෦ؚΊΔ ͸ɺେମந৅ͱ۩৅ͷߦ͖དྷ ਓؒ૚ χʔζ΍ϏδωεϩδοΫɺཁ݅ ઃܭ ΞʔΩςΫνϟͳͲେ͖ͳઃܭ

    ৄࡉઃܭ ΋ͬͱৄࡉʹ;Έ͜Μͩઃܭ ൚༻࣮૷ ൚༻౓ͷߴ͍ίʔυ ݸผ࣮૷ ৄࡉͳࣄ৘ʹ౿ΈࠐΜͩίʔυ
  17. ந৅౓ͱϝλϓϩάϥϛϯά w ந৅౓͕ߴ͍ɺߴϨϕϧϓϩάϥϛϯάͬͯ ੑೳ͕མͪͦ͏͚ͩͲɺϝλϓϩάϥϛϯά Ͱίʔυੜ੒͢Ε͹ʜ w ϝλϓϩάϥϛϯάͬͯ೉ͦ͠͏ʹࢥ͑Δ͚ Ͳɺ೔ৗతʹந৅Խͱ͔΍ͬͯΔϓϩάϥϚ ʹͱͬͯ͸͞΄Ͳ೉қ౓ͷߴ͍΋ͷͰ͸ͳ͍ ͷͰ͸ʁʁ

  18. None
  19. None
  20. ϓϩάϥϚͷੜ࢈ੑ w ͔͔ͬͨ࣌ؒ ίετ ʹର͢Δɺ੒Ռ෺ͩͱࢥ ͏͕ɺࢦඪ͕೉͍͠ ίʔυͷߦ਺ʁ͍͡Γ΍ ͢͞ʁ඼࣭ʁṶֹ͔ͬͨۚʁ  w

    Ͱ΋૬ରతʹ͸ࢉग़͸Ͱ͖Δ ಉ͜͡ͱΛୡ੒ ͢Δͷʹཁ͢Δ࣌ؒͷࠩ  w ഒʙഒͷࠩΛ࣋ͭਓ͕͍Δͱ͍ΘΕΔ
  21. ͦ΋ͦ΋ ͳͥੜ࢈ੑʹେ͖ͳ͕ࠩ͋Δʁ w ݸʑਓͷೳྗࣗମ͕ഒ΋ͷࠩΛ௚઀ੜΈग़ ͢ͷ͔ʁ w ಉ͡ࢥߟํ๏ͳΒ ࢥߟ଎౓͕ഒͷਓ͕ؒ ͍Δͱ͸ߟ͑ʹ͍͘ w

    εϖοΫͷҧ͍ΑΓ΋ɺ΍Γํͷҧ͍ͷํ͕ ܾఆతͳࠩʹͳΔͷͰ͸ʁ
  22. ໨తୡ੒ʹͱͬͯ࠷௿ݶͳ ޻ఔ͚ͩΛಥ͖٧ΊΕ͹ ͦΕ͕࠷଎ͳͷͰ͸ʁ

  23. Α͋͘Δແବ w ͦͷ࣌఺Ͱ΍Βͳ͍͍ͯ͘͜ͱΛ΍͍ͬͯΔ w ͦͷ࣌఺Ͱ΍ͬͯͳ͍ͱ͍͚ͳ͍͜ͱΛ΍͍ͬͯͳ ͍ w ࣺͯͨํ͕ૣ͍࣌ʹɺແཧʹ࠶ར༻ w ෆඞཁʹ

    ৑௕ͳઃܭɺίʔυ w ΑΓΑ͍ख๏ɾಓ۩͕͋Δͷʹ஌Βͳ͍ɺ࢖͑ͳ͍
  24. ແବΛ๷͙ w ਖ਼͍͠޻ఔ؅ཧ ಛʹઓུͷޡΓΛઓज़ͰऔΓ ໭͞ͳ͍͜ͱ͕ॏཁ  w ΑΓޮ཰తͳखஈΛબ΂ΔΑ͏ʹखࡳΛ૿ ΍͢ w

    ͦͷத͔Βద੾ͳબ୒Λ͢Δ
  25. ແବΛ๷͙ w ਖ਼͍͠޻ఔ؅ཧ ಛʹઓུͷޡΓΛઓज़ͰऔΓ ໭͞ͳ͍͜ͱ͕ॏཁ  w ΑΓޮ཰తͳखஈΛબ΂ΔΑ͏ʹखࡳΛ૿ ΍͢ w

    ͦͷத͔Βద੾ͳબ୒Λ͢Δ ༩͑ΒΕͨࡋྔ͕গͳ͗͢Δ৔߹͸ స৬Λߟ͑ͨํ͕͍͍͔΋͠Ε·ͤΜ ἤΓ
  26. None
  27. ϝλϓϩάϥϛϯάʹ΋ ͍͔ͭ͘छྨ͕͋Δ

  28. ϦϑϨΫγϣϯػೳ w ϝιουݺͼग़͠΍ϓϩύςΟΞΫηεΛIBDL ͢Δ w ຊདྷ஌Βͳͯ͘΋͍͍৘ใΛऔಘͨ͠Γॻ͖ ׵͑ͨΓ

  29. None
  30. $ cat test.js class Hoge {} const hoge = new

    Hoge() const fuga = new Proxy(hoge, { get(target, name) { console.log(`${target}の${name}をgetしにきやがりました`) return 'みせねーよ!' }, set(target, name, value) { console.log(`${target}の${name}に${value}をsetしにきやがりました。ふてえ やろうだ!`) } }) console.log(fuga.x) fuga.y = 10 $ node test.js [object Object]のxをgetしにきやがりました みせねーよ! [object Object]のyに10をsetしにきやがりました。ふてえやろうだ!
  31. ੩తͳ΋ͷ΍߹Θٕͤ w #BCFMͱ͔ w 8FCQBDLͱ͔ w QFHKTͱ͔ w CBCFMSFHJTUFS SFRVJSFIBDL

  32. ϦϑϨΫγϣϯΛ࢖Θͳͯ͘΋ w ؔ਺ܕݴޠͷઃܭ͸ࢀߟʹͳΔ w ݴޠ಺%4- +4ͩͱදݱͮ͠Β͍͔ͳʜ  w 03Ϛούʔͱ͔΋ʁ

  33. ϝλϓϩάϥϛϯάΛؚΊͯ ݸʑͷख๏͸બ୒ࢶͷҰͭ

  34. ݸਓతײ૝ w ۩৅తͳίʔυΛ͍͍ײ͡ʹݮΒͭͭ͠ɺແବͳந৅ԽΛ ͠ͳ͍ͱ͍͏όϥϯεײ͕֮؊ w ߴϨϕϧϓϩάϥϜʹ͸ੑೳతແବ͕͋Δͱ͍ΘΕΔ͚Ͳ ϝλϓϩάϥϛϯάʹΑΔίʔυੜ੒Ͱ͋Δఔ౓͸๷͛Δ w ۩৅తͳίʔυΛݮΒ͢खஈͱͯ͠ϝλϓϩ͕΋ͬͱධՁ ͞Εͯ΋͍͍ͱࢥ͏Μͩʜʜ

    w %3: ,*44 :"(/*͋ͨΓͷݪଇେ޷͖Ͱ͢
  35. ·ͱΊ w ϝλϓϩάϥϛϯά͸ϓϩάϥϜΛѻ͏ϓϩάϥϜ w ೉ͦ͠͏͚ͩͲͦ͏Ͱ΋ͳ͍ ৔߹ʹΑͬͯ໘౗ͩͬͨΓ ࠇຐज़ʹͳΓ͕ͪͰ͸͋Δ͚Ͳ  w ந৅ͱ۩৅Λߦ͖དྷ͢Δͷ͕ϓϩάϥϚ

    w ੜ࢈ੑ͸ͦͷόϥϯεͷऔΓํʹେ͖͘ࠨӈ͞ΕΔ ࣋࿦  w ϝλϓϩάϥϛϯά͸όϥϯεͷྑ͍ந৅ԽΛ΍Δखஈͷ ͻͱͭ
  36. ͝ΊΜͳ͍͞ DPOOQBTTϖʔδʹॻ͍ͯͨ ਅͷ%3:͸࣍ͷωλʹ͠·͢ʂʂ ࣍ɺ͋Ε͹ʂ

  37. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠