Top Banner
Designing Auto Generated Codes 17 Nov 2015 Roppongi.aar #2 @kikuchy
49

Designing Auto Generated Codes

Apr 12, 2017

Download

Technology

Hiroshi Kikuchi
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Designing Auto Generated Codes

Designing Auto Generated Codes

17 Nov 2015 Roppongi.aar #2 @kikuchy

Page 2: Designing Auto Generated Codes

• Hiroshi Kikuchi (@kikuchy)

• Belonging to , inc , Working on , inc (mixi group)

• Making “Dating App” for Android

• Strict review OJISAN

Who am I

Page 3: Designing Auto Generated Codes

APT made our work reduced!!

So, you use APT, and be happy!!

\\\\٩( 'ω' )و ////

Page 4: Designing Auto Generated Codes

… I was going to talk about like that, but

Page 5: Designing Auto Generated Codes
Page 6: Designing Auto Generated Codes
Page 7: Designing Auto Generated Codes

Oh, you are already using APT.

Page 8: Designing Auto Generated Codes

fin.

Page 9: Designing Auto Generated Codes

\(^o^)/

Page 10: Designing Auto Generated Codes

So, I’ll talk about

Page 11: Designing Auto Generated Codes

Designing Auto Generated Codes

Page 12: Designing Auto Generated Codes

What is the best way to use Generated Code in our project?

Please consider and discuss.

Page 13: Designing Auto Generated Codes

The Problem Make Us Wakeful

Page 14: Designing Auto Generated Codes

Case 1 (/2)

Page 15: Designing Auto Generated Codes

If you make an awesome library hiding generated codes…

// Fields@ExecuteSomethingString foo;

// Executor class “ThisClass$$Executor” is generated.// My library loads executor class automatically!AwesomeLibrary.execute(this);

Page 16: Designing Auto Generated Codes

Alice changes “Naming Rule” of Generated Class.

ex) (ClassName)$$Executor -> (ClassName)$$Doer

Page 17: Designing Auto Generated Codes

proguard-rules.pro ????

Page 18: Designing Auto Generated Codes

< Hey, I obfuscated your code!

Proguard @ Production Build

Page 19: Designing Auto Generated Codes
Page 20: Designing Auto Generated Codes
Page 21: Designing Auto Generated Codes
Page 22: Designing Auto Generated Codes

Case 2 (/2)

Page 23: Designing Auto Generated Codes

If you make awesome “proguard-safe” library…

// Fields@ExecuteSomethingString foo;

// Executor class “ThisClassExecutor” is generated.// There are no reflection, no ClassNotFoundException!!new ThisClassExecutor().execute(this);

Page 24: Designing Auto Generated Codes

Bob often asks you “What’s the name of Generated Classes and methods and constructor arguments and

interfaces will use in Generated Code blablabla…”

Page 25: Designing Auto Generated Codes

“Why ask me repeatedly”? Why I have to remember invisible codes?

Bob

<

https://www.flickr.com/photos/greeblie/2190709020/

Page 26: Designing Auto Generated Codes

 / / / /    / |  /    `、 i  !  |i   i  ,  l   / / //   /   | /       | |  |  l !  i  |  | `/ー- 、 / /    | /       | l   |  l l  !  !  i / ,,,,- ニ=x- 、_   !/       |i  _, +十'イ  i  !  ! ''" / :;;r jヽ ` ̄  リ      ,, -=、 レ | / /  :|  /:::::;;;;;;;:`::::::l          / :;;r ヽヽ   |/| /   :!  |::::::::;;;;;;;;:::::::l             l:::;;;;;` ::| l  //    :!   '、:_ ''''  ノ          l  '''' ノ |  /    :| ::::::::..  ̄               ` ー '   ,'      :| ::::::::::::            ,    ..::::::::::::..l  .:|   :| ::::::::::                :::::::::::::::::::|  :|   :| Mmmm…                     ::::::::::::::: l .:|  l  :|                          /  :| :l  :|                       , '   :::| :|  :| ` 、     ⊂ニ==ー‐-     , イ    ::::| :|  :|

Page 27: Designing Auto Generated Codes

hiding generated codes

no reflection

vs

Page 28: Designing Auto Generated Codes

“Butter Knife” pattern

“Dagger2” pattern

vs

Page 29: Designing Auto Generated Codes

Compare patterns“Butter Knife” pattern (hiding generated codes)

“Dagger2” pattern(no reflection)

How to load generated codes Library dose everything Developers have to import

Proguard configuration is needed not needed

Developers have to learn only usage of library + generated class naming rules

Type-Safe No Yes

Page 30: Designing Auto Generated Codes

Which we should adopt?

Page 31: Designing Auto Generated Codes

case by case

Page 32: Designing Auto Generated Codes

My Recommend: “Dagger2” pattern

Page 33: Designing Auto Generated Codes

Don’t forget proguard conf?

Start ↓

Like beautiful API?

Is not solidity app necessary? → →

Yes

No↓

“Dagger2” pattern

No

Yes

↓ No↓

“Dagger2” pattern “Dagger2” pattern

“Butter Knife”

pattern

Yes

Page 34: Designing Auto Generated Codes

No proguard, and save the team

Page 35: Designing Auto Generated Codes

https://www.flickr.com/photos/katrinasagemuller/3751402009/

Page 36: Designing Auto Generated Codes

Appendix 1: Auto code generation patterns

Page 37: Designing Auto Generated Codes

• Java Annotated Source Codes

• Using APT.

• ex) Dagger2, ButterKinfe, JsonPullParser, etc…

• Externals

• Gradle Task (depends on “compileJava” task)

• ex ) R.java, genum (← I’m developing now!!!!!!!!!!!)

Source of Source Codes

Page 38: Designing Auto Generated Codes

Generated Class Depends on…• Only Interface

• MyOwnInterface instance = new GeneratedClass();

• ex) Dagger2, (Retrofit)

• Library Classes

• LibrarySuppliedBase instance = new GeneratedClass();

• ex) Shillelagh, etc…

• Nope || Unknown

• (Generated classes are hidden.)

• ex) ButterKnife, IntentBuilder, DeepLinkDispatch

Page 39: Designing Auto Generated Codes

Appendix 2: Episode

Page 40: Designing Auto Generated Codes

POJO ↓

Map<String, String>

Page 41: Designing Auto Generated Codes
Page 42: Designing Auto Generated Codes

https://www.flickr.com/photos/yoshimov/10256644/

Page 43: Designing Auto Generated Codes

public class UserSearchRequest { public EnumSet<UserKind> kind; public String freeWord; public int ageMax;

…}

Page 44: Designing Auto Generated Codes

@ToQueryMappublic class UserSearchRequest { @QueryParam(name = “kind”, adapter = UserKindAdapter.class) public EnumSet<UserKind> kind;

@QueryParam(name = “free_word”, adapter = StringAdapter.class) public String freeWord;

@QueryParam(name = “age_max”, adapter = IntAdapter.class) public int ageMax; …

Page 45: Designing Auto Generated Codes

public final class UserSearchRequestSerializer { public Map<String, String> serialize(UserSearchRequest request) {

Map<String, String> map = new Map<>(); map.put(“kind”, userKindAdapter.adapt(request.kind)); map.put(“free_word”, stringAdapter.adapt(request.freeWord)); map.put(“age_max”, intAdapter.adapt(request.ageMax)); …

return map;}

GENERATED

Page 46: Designing Auto Generated Codes

Yheaaaaaaaa \\\\٩( 'ω' )و ////

Page 47: Designing Auto Generated Codes

Thank you for listening!

Page 48: Designing Auto Generated Codes

Question?

Page 49: Designing Auto Generated Codes

@kikuchy