Slide 1

Slide 1 text

ॳ৺ऀɾॳొஃ8FMDPNFʂ-*/&Λ࢖ͬͨ-5େձBU झຯίʔσΟϯάͬͯ ΍ͬͺָ͍͠Μ͔ͩΒ ͛͠Δɻ!HFSV

Slide 2

Slide 2 text

͛͠Δɻ!HFSV w ॴଐɿϚωʔϑΥϫʔυ w झຯɿϏϦϠʔυ w ڵຯ͋Δٕज़ɿNBLF 4VQBCBTF w ೥ͷτϐοΫɿ w ϋοΧιϯͷ࢘ձɺೖ੶ɺνʔϜҟಈ ࣗݾ঺հ

Slide 3

Slide 3 text

Έͳ͞Μझຯ͸࣋ͬͯ·͔͢ʁ

Slide 4

Slide 4 text

ࣗ෼͸ϏϦϠʔυ͕޷͖Ͱ͢ɻ

Slide 5

Slide 5 text

࡞Ζ͏ͱࢥ͖͔͚ͬͨͬ wରઓཤྺΛڞ༗͍ͨ͠WTΞϓϦΛμ΢ϯϩʔυͨ͘͠ͳ͍ wϏϦϠʔυΞϓϦ͸͋Δ͕ɺ޿ࠂ͕ଟ͍ˠ࢖͍ͮΒ͍ w؆୯ʹ૬खΛট଴Ͱ͖Δ࢓૊Έ͕ཉ͍͠

Slide 6

Slide 6 text

#PUͷ֓ཁ wػೳ wϚονϯάɺήʔϜঢ়گͷొ࿥ɺཤྺӾཡ wήʔϜͷϧʔϧ w+1"ϧʔϧϘʔϧʢ൪఺ɺଞ఺ʣ wϋϯσϚον

Slide 7

Slide 7 text

Ϛονϯά #PUͷ֓ཁ w ট଴ w ൪߸ʹೖྗ w ରઓཤྺ͔Βট଴ w Ϛονޙʹೋਓʹϝοηʔδૹ৴

Slide 8

Slide 8 text

ήʔϜঢ়گͷొ࿥ #PUͷ֓ཁ w ήʔϜͷঢ়گʹԠͯ͡Ϙλϯ͕มԽ w ϓϨΠϠʔަ୅ػೳ͋Γ w ޡೖྗͷ৔߹΋ʮ໭͢ʯ͕Մೳ w ࢼ߹ऴྃޙελϯϓͱϝοηʔδૹ৴

Slide 9

Slide 9 text

ཤྺӾཡ #PUͷ֓ཁ w ઓ͍தͷ৔߹ɿ⚔ɹউഊɿ😊 😭 w ઓ͍தͷ৔߹͸ɺ࠶։͕Մೳ w উഊ͕ܾ·͍ͬͯΔ৔߹͸ɺ݁ՌΛදࣔ

Slide 10

Slide 10 text

͜ͷ-5Ͱ࣋ͪؼͬͯཉ͍͜͠ͱ ͪΐͬͱϓϩάϥϛϯά ͍ͨͬͯ͠ࢥ͑Δ

Slide 11

Slide 11 text

ίΞϩδοΫ͸࿈ٳͰ࣮૷

Slide 12

Slide 12 text

ָ͍͠ϙΠϯτ w ϩδοΫΛ૊Ήͷָ͕͍͠ w ύζϧΛ࡞͍ͬͯΔΈ͍ͨ w 6*ͱܨ͕ͬͯಈ͍ͨͱ͖ͱͬͯ΋خ͍͠

Slide 13

Slide 13 text

ϑΝΠϧߏ੒ game.ts postbackEvent.ts postbackEventType.ts messages ├── ... ├── matchGameMessage │ └── matchGameService.ts ├── matchGameMessage.ts ├── scoreBoardMessage │ ├── gameScoreElement.ts │ └── scoreInputElement.ts └── scoreBoardMessage.ts postBackEvents ├── GameEvent.ts ├── ScoreEvent.ts ├── ... └── base.ts w HBNFUTɿίΞϩδοΫ w QPTUCBDL&WFOUUTɿϙετόοΫͷॲཧ w QPTUCBDL&WFOUTYYɿ֤ϙετόοΫॲཧ w QPTUCBDL&WFOU5ZQFUTɿUZQFΛ؅ཧ w NTTBHFTYYɿ6*ͱϩδοΫΛ෼཭

Slide 14

Slide 14 text

HBNFͷղઆ game.ts postbackEvent.ts postbackEventType.ts messages ├── ... ├── matchGameMessage │ └── matchGameService.ts ├── matchGameMessage.ts ├── scoreBoardMessage │ ├── gameScoreElement.ts │ └── scoreInputElement.ts └── scoreBoardMessage.ts postBackEvents ├── GameEvent.ts ├── ScoreEvent.ts ├── ... └── base.ts w HBNFUTɿίΞϩδοΫ w QPTUCBDL&WFOUUTɿϙετόοΫͷॲཧ w QPTUCBDL&WFOUTYYɿ֤ϙετόοΫॲཧ w QPTUCBDL&WFOU5ZQFUTɿUZQFΛ؅ཧ w NTTBHFTYYɿ6*ͱϩδοΫΛ෼཭

Slide 15

Slide 15 text

HBNFͷղઆ // const gameData = (await supabase.from('games') // .select() // .eq('id', user.current_game_id)).data[0] // const game = new Game(gameData) export class Game { constructor(gameData: any) { /* ... */ } scoreByA() { /* ... */ } scoreByB() { /* ... */ } undo() { /* ... */ } shot(ball) { /* ... */ } dead() { /* ... */ } switch() { /* ... */ } status() { /* ... */ } winner() { /* ... */ } } w 4VQBCBTFͷΦϒδΣΫτΛ 
 ͦͷ··౉͢ w ήʔϜͷ৚݅Λ؅ཧ͢Δ w ݱঢ়ɺ໭͢ɺަ୅ɺউར৚݅ w 6*ͱϩδοΫΛ෼͚ͯɺ 
 ؆୯ʹςετ͠΍͘͢

Slide 16

Slide 16 text

QPTUBCBDLͷղઆ game.ts postbackEvent.ts postbackEventType.ts messages ├── ... ├── matchGameMessage │ └── matchGameService.ts ├── matchGameMessage.ts ├── scoreBoardMessage │ ├── gameScoreElement.ts │ └── scoreInputElement.ts └── scoreBoardMessage.ts postBackEvents !"" GameEvent.ts !"" ScoreEvent.ts !"" ... #"" base.ts w HBNFUTɿίΞϩδοΫ w QPTUCBDL&WFOUUTɿϙετόοΫͷॲཧ w QPTUCBDL&WFOUTYYɿ֤ϙετόοΫॲཧ w QPTUCBDL&WFOU5ZQFUTɿUZQFΛ؅ཧ w NTTBHFTYYɿ6*ͱϩδοΫΛ෼཭

Slide 17

Slide 17 text

QPTUBCBDLͷղઆ /* postbackEvent/base.ts */ export class PostbackEvent { static events: number[] = [] static isTarget(event: number) { return this.events.includes(event); } execute(...) { throw new Error('ະ࣮૷Ͱ͢'); } } w #BTFDMBTTͰ͸ɺ w JT5BSHFUɿର৅͔൱͔ w &YFDVUFɿ࣮ߦ͢Δίʔυ

Slide 18

Slide 18 text

QPTUBCBDLͷղઆ /* postbackEvent/GameEvent.ts */ export class GameEvent extends PostbackEvent { static events = [ postbackEventType.shot, postbackEventType.shoted, postbackEventType.dead, postbackEventType.undo, postbackEventType.switch ] async execute(postback: any, supabase: any, user: any, lineBotClient: any) { let game = new Game(...) if( game.status() === gameStatus.Done && // ήʔϜ͕ऴ͍ྃͯ͠Δ৔߹͸มߋͰ͖ͳ͍ postback.t !== postbackEventType.undo // ͨͩɺ undo ͸Մೳ ) { return [{type: "text", text: "ήʔϜ͕ऴ͍ྃͯ͠·͢"}] } switch(postback.t) { case postbackEventType.shot: game.shot(postback.ball); break; case postbackEventType.dead: game.dead(); break; case postbackEventType.undo: game.undo(); break; case postbackEventType.switch: game.switch(); break; } await supabase.from('games').update({ score: game.scores, status: game.status() }).eq('id', user.current_game_id).select() ... return replyMessages } } w (BNF&WFOUͰঢ়ଶΛߋ৽ w JT5BSHFUͰར༻͢Δ 
 FWFOUTΛఆٛ w &YFDVUFͷதͰɺΠϕϯτ͝ͱʹ 
 ॲཧΛมߋ w ઌ΄Ͳͷ(BNFDMBTTͷॲཧΛ 
 ࣮ߦͯ͠σʔλΛߋ৽͢Δ

Slide 19

Slide 19 text

QPTUBCBDLͷղઆ /* postbackEvent.ts */ export const postbackEvent = async (event: any, ...) => { const postback = JSON.parse(event.postback.data); const targetEvent = [GameEvent, ...] .find( (eventClass) => eventClass.isTarget(postback.t) ) || NotFoundEvent const targetEventInstance = new targetEvent() return await targetEventInstance.execute(...) } /* postbackEventType.ts */ export const postbackEventType = { score: 2, showScore: 12, shot: 3, shoted: 4, dead: 5, undo: 6, switch: 7, start: 8, } w QPTUCBDL&WFOUUT w QPTUCBDL&WFOUͷॲཧΛ͢Δ w JGFMTFͰ͸ͳ͘഑ྻͰ؅ཧ w QPTUCBDL&WFOU5ZQFUT w UZQFΛ؅ཧ͢Δ w QPTUCBDLBDUJPOͰɺ 
 จࣈ਺੍ݶ͕͋ΔͷͰɺ 
 ൪߸Ͱ؅ཧ

Slide 20

Slide 20 text

NFTTBHFT game.ts postbackEvent.ts postbackEventType.ts messages !"" ... !"" matchGameMessage $ #"" matchGameService.ts !"" matchGameMessage.ts !"" scoreBoardMessage $ !"" gameScoreElement.ts $ #"" scoreInputElement.ts #"" scoreBoardMessage.ts postBackEvents ├── GameEvent.ts ├── ScoreEvent.ts ├── ... └── base.ts w TDPSF#PBSE.FTTBHFUT w NFTTBHFͷ+40/Λ؅ཧ͢Δ w TDPSF#PBSE.FTTBHFYYYYUT w NFTTBHFͰར༻͢ΔϩδοΫΛهड़ w &MFNFOUࢠཁૉʹ෼͚Δ w 4FSWJDFඞཁͳϩδοΫΛ࢖͏

Slide 21

Slide 21 text

࡞ͬͯΈͯ w NBLF΋ָ͍͚͠ͲɺίʔσΟϯά΋ָ͍͠ w ΍Γ͍ͨ͜ͱΛখ͘͞෼ղ͢Δ͜ͱ͕େࣄɻ w ࣮ࡍ࢖͏ͱόά΋ؾ͚ͮΔ͠ɺ༑ୡͱ༡΂Δ w $PQJMPUY$IBU(15ͳͲ͕ศར w 4VQBCBTF࠷ߴʂʂ

Slide 22

Slide 22 text

࠷ޙʹ w 4VQBCBTFͷϋϯζΦϯಈըࢿྉ͋ΔͷͰΈ͍ͯͩ͘͞ w ؆୯ʹͰ͖·͢ʂʂ w ͪΐͬͱͰ΋ɺϓϩάϥϛϯά޷͖ͳਓ͕ 
 ૿͑ͨΒ͍͍ͳʙ