31
GroovyのTraitを使い倒す 2014/06/20 JGGUG G*Workshop NTTソフトウェア株式会社上原潤 14621日土曜日

Introduce Groovy 2.3 trait

Embed Size (px)

DESCRIPTION

Trait is new feature which is introduced to Groovy 2.3. This presentation explain short summary of trait and how to use it, what purpose it suit for.

Citation preview

  • 1. GroovyTrait 2014/06/20 JGGUG G*Workshop NTT 14621

2. Copyright (C) 2014 NTT Software Corp. (@uehaj) NTT()Grails JGGUG(Grails/Groovy) :GROOVY( ),Grails() Gr GroovyServ, LispBuilder, GVM(JVM written in Groovy) 14621 3. Copyright (C) 2014 NTT Software Corp. Trait Self, Squeak Smalltalk, PHP, Rust, D,Scala...Trait C++Traits / Groovy 2.3(?) GroovytraitScala 14621 4. Copyright (C) 2014 NTT Software Corp. Groovytrait oo (Java8Default Method) () 14621 5. Copyright (C) 2014 NTT Software Corp. trait trait T { ... } Trait def x = new T() // Trait class C implements T {} // like interface def y = new C() // OK Trait def z = new String() as T def z2 = new String().withTraits(T1,T2) assert ! (z instanceof String) assert z instanceof T 14621 6. Copyright (C) 2014 NTT Software Corp. trait trait T { ... } Trait def x = new T() // Trait class C implements T {} // like interface def y = new C() // OK Trait def z = new String() as T def z2 = new String().withTraits(T1,T2) assert ! (z instanceof String) assert z instanceof T as Interface Groovy 14621 7. Copyright (C) 2014 NTT Software Corp. traitHelloable{//hello voidhello(){ println"hello"+this.toString() } voidhello2(){ println"hello"+proxyTarget.toString() } } classWorldimplementsHelloable{ StringtoString(){"world"} } x=newWorld() x.hello()//==>helloworld y="abc"asHelloable y.hello()//==>helloString1_groovyProxy@5560a7b1 z="def"asHelloable z.hello2()//==>hellodef Trait Trait String 14621 8. Copyright (C) 2014 NTT Software Corp. proxyTarget Trait def x = new String() def y = x.withTraits(T1,T2) assert x == y.proxyTarget assert y.proxyTarget instanceof String http://jira.codehaus.org/browse/GROOVY-6692 14621 9. Copyright (C) 2014 NTT Software Corp. traitsuper Traitsuper? trait superTrait traitsimplements trait super Trait super.super 14621 10. Copyright (C) 2014 NTT Software Corp. traitA{Stringwhoami(){"A->"+super.whoami()}} traitB1extendsA{Stringwhoami(){"B1->"+super.whoami()}}; traitB2extendsA{Stringwhoami(){"B2->"+super.whoami()}}; traitC1extendsB1{Stringwhoami(){"C1->"+super.whoami()}}; traitC2extendsB1{Stringwhoami(){"C2->"+super.whoami()}}; traitC3extendsB2{Stringwhoami(){"C3->"+super.whoami()}}; traitC4extendsB2{Stringwhoami(){"C4->"+super.whoami()}}; classDimplementsC4,C3,A,C2,C1{Stringwhoami(){"D"}} classEextendsDimplementsC1,C2,C3,C4{} m=newE() printlnm.whoami() //C4->B2->A->C3->C2->B1->C1->D 14621 11. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D 14621 12. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 14621 13. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E 14621 14. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 15. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 16. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 17. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 18. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 19. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 20. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 21. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 22. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 23. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 D traitimplements E super E Scala 14621 24. Copyright (C) 2014 NTT Software Corp. traitA{Stringwhoami(){"A->"+super.whoami()}} traitB1extendsA{Stringwhoami(){"B1->"+super.whoami()}}; traitB2extendsA{Stringwhoami(){"B2->"+super.whoami()}}; traitC1extendsB1{Stringwhoami(){"C1->"+super.whoami()}}; traitC2extendsB1{Stringwhoami(){"C2->"+super.whoami()}}; traitC3extendsB2{Stringwhoami(){"C3->"+super.whoami()}}; traitC4extendsB2{Stringwhoami(){"C4->"+super.whoami()}}; classDimplementsC4,C3,A,C2,C1{Stringwhoami(){"D"}} classEextendsDimplementsC1,C2,C3,C4{} m=newE() printlnm.whoami() //C4->B2->A->C3->C2->B1->C1->D Dimplementstraits Esuper 14621 25. Copyright (C) 2014 NTT Software Corp. (1) classEextendsDimplements C1,C2,C3,C4{} C1 B2 B1 C4 C2 C3 E D A traitClass ( @ForceOverride ) super Dsuper 14621 26. Copyright (C) 2014 NTT Software Corp. (2) classEimplementsC1,C2,C3,C4{} C1 B2 B1 C4 C2 C3 E Object(?) A Dextendstrait( C1) C1 C1super.whoami() 14621 27. Copyright (C) 2014 NTT Software Corp. Stackable Trait Trait 14621 28. Copyright (C) 2014 NTT Software Corp. Wiki(1) traitBold{ Stringconvert(Strings){ super.convert(s).replaceAll(/**([^*]*)**/,'$1') } } traitHeading{ Stringconvert(Strings){ super.convert(s).replaceAll(/(?m)^(#+)?(.*)$/){g0,g1,g2-> ""+g2+""+g1.size()+">" } } } traitUL{ Stringconvert(Strings){ super.convert(s).replaceAll(/(?m)(^s*[^*]*n)(s**)/){g0,g1,g2-> g1+"

  • n"+g2 }.replaceAll(/(?m)(^s**.*n)(s*[^*]*n)/){g0,g1,g2-> g1+"

n"+g2 }.replaceAll(/(?m)^s**s*(.*)$/,"$1") } } classHtmlConverter{ Stringconvert(Strings){ ""+s+"nn" } } 14621 29. Copyright (C) 2014 NTT Software Corp. Wiki(2) classWikiEngine1extendsHtmlConverterimplementsBold,Heading,UL{} classWikiEngine2extendsHtmlConverterimplementsUL,Bold,Heading{} printlnnewWikiEngine1().convert(text) printlnnewWikiEngine2().convert(text) printlnnewHtmlConverter().withTraits(Bold,Heading,UL).convert(text) printlnnewHtmlConverter().withTraits(UL,Bold,Heading).convert(text) ##thisisHeading1 #thisisHeading2 Thisissampledocumentforwiki engine. Ifyouwanto**emphasize**,use **This**markup. #Thisisheading3 Thisissampledocumentforwiki engine. *list1 *list2 *list3 Thisisend. **hoge** thisisHeading1 thisisHeading2 Thisissampledocumentforwikiengine. Ifyouwantoemphasize,use Thismarkup. Thisisheading3 Thisissampledocumentforwikiengine.

  • list1
  • list2
  • list3

Thisisend. hoge

  • *hoge**

14621 30. Copyright (C) 2014 NTT Software Corp. Groovytraitmixin () () read from le + write to le => read write le GroovyJavaTrait DI? DCI? Scala 14621 31. Copyright (C) 2014 NTT Software Corp. http://beta.groovy-lang.org/docs/latest/html/documentation/ #_traits http://www.artima.com/scalazine/articles/ stackable_trait_pattern.html http://www.atmarkit.co.jp/ait/articles/1206/20/ news137_3.html http://groovyconsole.appspot.com/script/5738600293466112 http://groovyconsole.appspot.com/script/5653164804014080 OracleJavaOracle Corporation 14621