Magic Development with Aspects (Big Android BBQ Europe 2016)

Magic Development with Aspects (Big Android BBQ Europe 2016)

Cf95f93e78f6d6dd0630049396f723c6?s=128

Xavier Gouchet

August 16, 2016
Tweet

Transcript

  1. Magic development with Aspects Initiation to Aspect Oriented Programming Big

    Android BBQ Europe 2016
  2. About... Xavier F. Gouchet Android Architect Jenkins/Sonar Admin Bad Puns

    Advocate @xgouchet on Github, StackOverflow, Twitter, …
  3. “ “Let's start at the very beginning (A very good

    place to start)” Julie Andrews @xgouchet
  4. It’s NOT ... ◎ A new programming language ◎ Something

    to replace OOP ◎ The solution to all your problems ! @xgouchet
  5. It is a tool to ... ◎ Enhance modularity ◎

    Separate cross cutting concerns ◎ Focus on business logic ◎ Reduce noise in the source code @xgouchet
  6. Cross-cutting concerns ? Any concern that is not business logic

    and appears everywhere @xgouchet
  7. Cross-cutting concerns Logging Performances Security Transactions Validation Serialisation Cache Notification

    Multithreading Memoization @xgouchet
  8. “ “Let me tell you a story (to chill the

    bones)” Iron Maiden @xgouchet
  9. void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  10. void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  11. void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  12. void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  13. void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  14. void foo() { Log.v("Tag", "foo"); beginTransaction(); try { bar(); //

    ... setTransactionSuccessful(); } catch (Exception e) { reportError(e); } finally { endTransaction(); } Log.v("Tag", "foo done"); } Before / After
  15. @Trace @SafeTransaction void foo() { bar(); // ... } Before

    / After
  16. “ “I've been browsing… (... inspectin’)” Weird Al Yankovic @xgouchet

  17. input[type=text] { font-family: monospace; } blockquote:before { content: '\201C'; font-size:

    300%; font-family: serif; } #nav-home p { color: #FF4630; cursor: pointer; } .contact img:hover { border: 1px #004080; } CSS + HTML
  18. CSS Attributes Changes in appearance applied to … Elements Nodes

    in the source code , defined by … Selectors Rules and patterns @xgouchet
  19. “ “If you know how to use CSS, Then you

    know how to use AOP” …me @xgouchet
  20. Pointcuts Rules and patterns JoinPoints Positions in the source code

    , defined by … Advices Changes in behavior applied to … Aspects @xgouchet
  21. Advice New behavior (=code) @xgouchet

  22. JoinPoint Almost every selectable step in bytecode execution @xgouchet

  23. Pointcuts Description of a (list of) joinpoints where an advice

    should be applied @xgouchet
  24. “ “You can knit a sweater by the fireside” The

    Beatles @xgouchet
  25. Bytecode weaving AspectJ @xgouchet

  26. Code Weaving @xgouchet

  27. “ “It's time to get our hands dirty” Natalie Grant

    @xgouchet
  28. None
  29. “ “It’s a kind of magic” Queen @xgouchet

  30. Wizardry or Witchcraft @Aspect public class PreventNPEAspect { @Pointcut("within(com.example.model.*)") public

    void withinModelClass() {} @Around("withinModelClass() && execution(* *(..))") public void advice(ProceeJoinPoint jp) { Object[] args = jp.getArgs(); for (int i = 0; i < args.length; i++) { if (args[i] == null) { args[i] = ""; } } jp.proceed(args); } }
  31. Wizardry or Witchcraft @Aspect public class PreventNPEAspect { @Around("execution(@PreventStringNPE *

    *(..))") public void advice(ProceeJoinPoint jp) { Object[] args = jp.getArgs(); for (int i = 0; i < args.length; i++) { if (args[i] == null) { args[i] = ""; } } jp.proceed(args); } }
  32. “ “I wanna find some answers I wanna ask for

    some help ” Bruce Springsteen @xgouchet
  33. FAQ ◎ What about stack traces ? Caused by: java.lang.RuntimeException

    at com.sample.aspectMyAspect.myAdvice(MyAspect.java:666) at com.app.model.Foo.bar(Foo.java:69) at com.app.model.Foo.<init>(Foo.java:42) at java.lang.Class.newInstance(Native Method) <9 more> ◎ What about breakpoints ? Stepping through your code is ok ◎ What about proguard ? Obfuscation performed after weaving @xgouchet
  34. “ “Forever in debt to your priceless advice” Nirvana @xgouchet

  35. Bad practices and code smells ◎ Pokemon (gotta catch’em all)

    ◎ Wizard of Oz (pay no attention to the man behind the curtain) ◎ Dr Octopus (my left tentacle doesn’t know what my right is doin’) ◎ Inception (aspects within aspects …) ◎ MacGyver (the swiss army knife @xgouchet
  36. More about AspectJ… ◎ Aspects are singleton by default ◎

    Inter-type declarations ◦ Change class hierarchy ◦ Add fields ◎ Declare aspects precedence ◎ Patch jar libraries @xgouchet
  37. Things to remember ◎ Focus on Cross Cutting concerns ◎

    If you can do it more easily with OOP don’t use AOP ◎ You can only weave code you own @xgouchet
  38. Writing Aspects… ◎ Inheritance, abstracts, generics, inner classes… ◎ Unit

    tests ◎ Android flavors ◎ AOP is real programming @xgouchet
  39. “ “There’s somethin’ we can use, so don't say no”

    Toni Basil @xgouchet
  40. Useful links ◎ Android AspectJ plugin ◦ https://github.com/deezer/Android-Aspectj-Plugin ◎ Counsel

    ◦ https://github.com/deezer/Counsel ◎ AspectJ Documentation ◦ https://eclipse.org/aspectj/doc/next/progguide/ @xgouchet
  41. https://speakerdeck.com/xgouchet Thanks for listening! Any question ? Deezer’s hiring http://jobs.deezer.com