Slide 1

Slide 1 text

؝٦س׾㢌刿ׇ׆ח رغحًؚصُ٦ד "OESPJE،فٔך⹛⡲׾㢌刿ׅ׷ UBLBIJSPN

Slide 2

Slide 2 text

˖ "OESPJEָ㥨ֹ ˖ UBLBIJSPNהְֲせ⵸ד
 2JJUBהַ׮剅ְגְ׷ךד
 ״׹׃ֶֻ격ְ׃תׅ 荈䊹稱➜

Slide 3

Slide 3 text

˖ "#ذأزך"#׾ⴖ׶剏ִ׋ְ ˖ ׭׏׋ח⳿זְت؎،ؚٗ׾رغحؚ⚥כ嫣㔐⳿׃׋ְ ˖ رغحؚ⚥ח؟٦غ٦橆㞮׾ⴖ׶剏ִ׋ְ ˖ זוזו ،فٔךرغحؚװ2"ח״׷
 ذأز⚥կկ

Slide 4

Slide 4 text

˖ رغحؚ⚥חرغحؚ׃װְׅ堣腉׾ًصُ٦ח׃׋׮ ךկ ˖ رغحؚ⚥ח׌ֽ鸐濼זו׾⳿׃גְֶגծ
 ׉׸׾ةحفׅ׷הرغحًؚصُ٦ָ⳿׷״ֲח׃גծ
 ׉׸׊׸׾㢌刿דֹ׷״ֲח׃גرغحؚ⡲噟׾⸬桦涸ח ׅ׷ رغحًؚصُ٦

Slide 5

Slide 5 text

if (isShowTutorialTiming()) { showTutorial() } fun isShowTutorialTiming(): Boolean { // ࣍ͷλΠϛϯά·Ͱදࣔ͠ͳ͍ if (System.currentTimeMillis() < pref.getNextTutorialtiming()) { return false; } // 3ճ͔͠දࣔ͠ͳ͍ if (3 <= pref.getTutorialCount()) { return false; } return true; } ثُ٦زٔ،ٕ׾䌢ח邌爙׃׋ְ 儗וֲ׃תַׅ JT4IPX5VUPSJBM5JNJOHדUSVF׾鵤׃׋ְ

Slide 6

Slide 6 text

pref.setNextTutorialtiming(currentMills + 100000) pref.setTutorialCount(0) رغحًؚصُ٦ⰻ ❌㔐׃ַ邌爙דֹזְ

Slide 7

Slide 7 text

if (isShowTutorialTiming()) { showTutorial() } fun isShowTutorialTiming(): Boolean { // ࣍ͷλΠϛϯά·Ͱදࣔ͠ͳ͍ if (System.currentTimeMillis() < pref.getNextTutorialtiming()) { return false; } // 3ճ͔͠දࣔ͠ͳ͍ if (3 <= pref.getTutorialCount()) { return false; } return true; } ؝٦س׾湫ׅ

Slide 8

Slide 8 text

if (isShowTutorialTiming()) { showTutorial() } fun isShowTutorialTiming(): Boolean { if (pref.isAlwaysShowTutorialTiming()) { return true; } // ࣍ͷλΠϛϯά·Ͱදࣔ͠ͳ͍ if (System.currentTimeMillis() < pref.getNextTutorialtiming()) { return false; } // 3ճ͔͠දࣔ͠ͳ͍ if (3 <= pref.getTutorialCount()) { return false; } return true; } ؝٦س׾湫ׅ ❌ٔٔ٦أתד ؝٦سָⰅ׏ג׃תֲ

Slide 9

Slide 9 text

if (isShowTutorialTiming()) { showTutorial() } } fun isShowTutorialTiming(): Boolean { if (BuildConfig.DEBUG) { if (pref.isAlwaysShowTutorialTiming()) { return true; } } // ࣍ͷλΠϛϯά·Ͱදࣔ͠ͳ͍ if (System.currentTimeMillis() < pref.getNextTutorialtiming()) { return false; } // 3ճ͔͠දࣔ͠ͳ͍ if (3 <= pref.getTutorialCount()) { return false; } return true; } ؝٦س׾湫ׅ ❌醱꧟ז؝٦سָ فٗتؙءّٝח

Slide 10

Slide 10 text

ΦϒδΣΫτࢦ޲Ͱ͸͏·͘෼཭Ͱ͖ͳ͍ಛ௃ʢΫϥεؒ Λԣஅ (cross-cutting) ͢ΔΑ͏ͳػೳʣΛʮΞεϖΫτʯ ͱΈͳ͠ɺΞεϖΫτهड़ݴޠΛ΋͍ͪͯ෼཭ͯ͠هड़͢ Δ͜ͱ (WikipediaΑΓ) ،ألؙز䭷ぢفؚٗٓىؚٝ

Slide 11

Slide 11 text

@Aspect public class AspectExample { @Before("execution(* on*(..))") public void before() { System.out.println("before !!"); } } "TQFDU+ ֿ׸׌ֽדPOד㨣ת׷ًاحسָㄎל׸׋儗ח ؚٗ׾⳿ֿׅהָ⳿勻׷

Slide 12

Slide 12 text

@Around("execution(boolean com...MainActivity.isShowTutorialTiming(..))") public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return true; } "TQFDU+׾⢪׏ג׫׷ ⭕ֿ׸׌ֽדثُ٦زٔ،ٕ⳿ׇ׷ ⭕EFCVHؿٕؓتח縧ֽלرغحؚ儗ך׫黝䘔דֹ׷

Slide 13

Slide 13 text

"TQFDU+׾⢪׏ג׫׷ @Around("execution(boolean com...MainActivity.isShowTutorialTiming(..))") public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return true; } !"SPVOEדJT4IPX5VUPSJBM5JNJOHך⵸䖓חⳢ椚׾㙵׭鴥׬ ֿֿדכ׋׌ًاحسך鵤׶⦼חUSVF׾鵤׃גְ׷

Slide 14

Slide 14 text

@Around("execution(boolean com...MainActivity.isShowTutorialTiming(..))") public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return true; } "TQFDU+׾⢪׏ג׫׷ ❌ًاحسせך㢌刿ד堣腉׃זֻז׷ ❌رغحؚך׋ןחֿ׸׾剅ֻ

Slide 15

Slide 15 text

@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return true; } @DebugReturn fun isShowTutorialTiming(): Boolean { ... } "TQFDU+׾⢪׏ג׫׷ 暴㹀ך،ظذ٦ءّٝאְגְ׷ًاحسד USVF׾鵤ׅ״ֲח

Slide 16

Slide 16 text

@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public boolean isShowTutorialDebug(ProceedingJoinPoint jp) { return true; } @DebugReturn fun isShowTutorialTiming(): Boolean { ... } "TQFDU+׾⢪׏ג׫׷ ❌ֿ׸׌ה䌢חUSVFחז׏ג׃תֲ ❌رؿٕؓزך㹋鄲ָㄎן⳿ׇזְ

Slide 17

Slide 17 text

@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public Object debugReturnMethod(ProceedingJoinPoint jp) { // ΞϊςʔγϣϯͷதͷҾ਺(key)Λऔಘ͢Δॲཧ ... final DebugSetting debugSetting = DebugSetting.getInstance(); if (debugSetting.contains(key)) { return debugSetting.get(key); } return jp.proceed(); } @DebugReturn(“tutorial”) fun isShowTutorialTiming(): Boolean { ... } "TQFDU+׾⢪׏ג׫׷

Slide 18

Slide 18 text

@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public Object debugReturnMethod(ProceedingJoinPoint jp) { // ΞϊςʔγϣϯͷதͷҾ਺(key)Λऔಘ͢Δॲཧ ... final DebugSetting debugSetting = DebugSetting.getInstance(); if (debugSetting.contains(key)) { return debugSetting.get(key); } return jp.proceed(); } @DebugReturn(“tutorial”) fun isShowTutorialTiming(): Boolean { ... } "TQFDU+׾⢪׏ג׫׷ ،ظذ٦ءّٝחLFZ׾床ׅ

Slide 19

Slide 19 text

@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public Object debugReturnMethod(ProceedingJoinPoint jp) { // ΞϊςʔγϣϯͷதͷҾ਺(key)Λऔಘ͢Δॲཧ ... final DebugSetting debugSetting = DebugSetting.getInstance(); if (debugSetting.contains(key)) { return debugSetting.get(key); } return jp.proceed(); } "TQFDU+׾⢪׏ג׫׷ ،ظذ٦ءָّٝאְ׋ًاحسךⳢ椚 ׮ה׮הךثُ٦زٔ،ٕⴻ㹀ٗآحؙ ׾ 㹋遤 1SFGFSFODFח⥂䭯׃גְ׋鏣㹀׾⢪ֲ

Slide 20

Slide 20 text

@Around("execution(* *.*(..)) && @annotation(com...DebugReturn)”) public Object debugReturnMethod(ProceedingJoinPoint jp) { // ΞϊςʔγϣϯͷதͷҾ਺(key)Λऔಘ͢Δॲཧ ... final DebugSetting debugSetting = DebugSetting.getInstance(); if (debugSetting.contains(key)) { return debugSetting.get(key); } return jp.proceed(); } "TQFDU+׾⢪׏ג׫׷ 鏣㹀׾⥂㶷׃גְֶגծ鏣㹀ָ֮׸ל׉׸׾⢪ְ זֽ׸לծًاحسⰻך傀㶷ךⳢ椚׾遤ֲ

Slide 21

Slide 21 text

"TQFDU+׾⢪׏ג׫׷ ❌"TQFDU+ך㼪Ⰵָ꬗⦜

Slide 22

Slide 22 text

ٓ؎ـٓٔ⡲׶ת׃׋ IUUQTHJUIVCDPNUBLBIJSPNEFCVHBMUFS החַֻأة٦ָ妜׃ְדׅ

Slide 23

Slide 23 text

˖ رغحًؚصُ٦׾㹋鄲ׅ׷儗ח"TQFDU+׾⢪ֲהفٗتؙءّٝ ך؝٦س׾寅ׁ׆ח㹋鄲׃גְֽתׅկ ˖ 䩛鯪חװ׷ז׵%FCVH"MUFS׾⢪׏ג׫גֻ׌ְׁկ 㹋鄲ה׃גכ ַז׶謬ְדׅ ˖ ⟃♴ךٔهآزٔ׾أة٦׃גֻ׌ְׁկխ
 IUUQTHJUIVCDPNUBLBIJSPNEFCVHBMUFS ˖ 2JJUBח׮֮׷ךד״׹׃ֶֻ격ְ׃תׅկ
 IUUQTRJJUBDPNUBLBIJSPNJUFNTFCCDGED תה׭