Scala pitfalls

Post on 26-May-2015

525 views 0 download

Tags:

Transcript of Scala pitfalls

Scala pitfallsVSUG meetup 22.05.2013

Manuel Bernhardt - manuel@delving.eu - @elmanu

Thursday, May 23, 13

Motivation

Thursday, May 23, 13

Motivation

Thursday, May 23, 13

Thursday, May 23, 13

Thursday, May 23, 13

Orders of ignorance

• 0th Order Ignorance: Lack of Ignorance

• 1st Order Ignorance: Lack of Knowledge

• 2nd Order Ignorance: Lack of Awareness

• 3rd Order Ignorance: Lack of a Suitably Efficient Process

• 4th Order Ignorance: Meta Ignorance

Thursday, May 23, 13

Thursday, May 23, 13

One-liner of death

Thursday, May 23, 13

BIG SCREEN

I HAZ IT !Thursday, May 23, 13

//  update  the  thumbnailsetThumbnaiL(id,  USERCOLLECTION,  collectionModel.thumbnail,  findThumbnailUrl(collectionModel.thumbnail,  collectionModel.objects),  updatedUserCollection.links.filter(_.linkType  ==  Link.LinkType.THUMBNAIL).map(_.link).headOption)

Thursday, May 23, 13

//  update  the  thumbnailsetThumbnail(id,  USERCOLLECTION,  collectionModel.thumbnail,  findThumbnailUrl(collectionModel.thumbnail,  collectionModel.objects),  updatedUserCollection.links.filter(_.linkType  ==  Link.LinkType.THUMBNAIL).map(_.link).headOption)

Thursday, May 23, 13

• hard to read

• hidden context switching

• debugging?

Thursday, May 23, 13

//  update  the  thumbnailval  thumbnailUrl  =  findThumbnailUrl(    collectionModel.thumbnail,    collectionModel.objects)val  maybeThumbnailLink  =  updatedUserCollection.links    .filter(_.linkType  ==  Link.LinkType.THUMBNAIL)    .map(_.link)    .headOption

setThumbnail(    id,    USERCOLLECTION,    collectionModel.thumbnail,    thumbnailUrl,    maybeThumbnailLink)

Thursday, May 23, 13

• Scala Style guide

• Tools! Scalastyle, Scalariform

Thursday, May 23, 13

null

Thursday, May 23, 13

null

Thursday, May 23, 13

So many Options

Thursday, May 23, 13

val  user:  Option[User]  =  ???

if  (user  ==  None)  {    //  foo!}  else  {    //  bar!    val  u  =  user.get}

Thursday, May 23, 13

val  user:  Option[User]  =  ???

if  (user.isDefined)  {    //  do  something  user-­‐full}  else  {    //  oh  my,  what  now?}

Thursday, May 23, 13

val  user:  Option[User]  =  ???

user  match  {    case  Some(u)  =>  //  now  I'm  happy!    case  None  =>  //  well,  doh}

Thursday, May 23, 13

• Option monad

• Option[T] ~= List of zero or one elements

Thursday, May 23, 13

val  maybeUser:  Option[User]  =  ???

maybeUser  map  {  user  =>    user.email}  getOrElse  {    "foo@bar.com"}

Thursday, May 23, 13

val  maybeUser:  Option[User]  =  ???

def  turnLeft(u:  User):  Option[User]  =  ???def  shake(u:  User):  Option[User]  =  ???def  shower(u:  User):  Option[User]  =  ???

val  transformedUser:  Option[User]  =  maybeUser    .flatMap  (turnLeft)    .flatMap  (shake)    .flatMap  (shower)

Thursday, May 23, 13

Did you say implicit?

Thursday, May 23, 13

implicit  def  string2Int(s:  String):  Int  =    Integer.parseInt(s)

Thursday, May 23, 13

implicit  def  string2Int(s:  String):  Int  =  Integer.parseInt(s)

val  foo  =  "22"val  bar  =  "some"

def  fooBar(i:  Int)  =  i  +  1

fooBar(foo)fooBar(bar)  //  ouch

Thursday, May 23, 13

It’s all about design

Thursday, May 23, 13

• use implicit conversions wisely: specific types

• use within the correct scope

• implicit lookup scope

Thursday, May 23, 13

A word on IDEs

Thursday, May 23, 13

Thursday, May 23, 13

• Scala is complex

• IDEs are getting there, but are not there yet

• False negatives be especially misleading at the beginning

Thursday, May 23, 13

Modularity

Thursday, May 23, 13

Thursday, May 23, 13

Cake pattern pitfalls

• Initialization order

• Initialization order

• Compilation time overhead (traits)

• Beautiful theory, less beautiful practice

Thursday, May 23, 13

Cake pattern pitfalls

• Initialization order

• Initialization order

• Compilation time overhead (traits)

• Beautiful theory, less beautiful practice

WAT?Thursday, May 23, 13

Alternatives

• Subcut

• MacWire - macros!

• Guice, Spring Scala

Thursday, May 23, 13

Time is money

Thursday, May 23, 13

http://xkcd.com/303/

Thursday, May 23, 13

• Scala compilation is slow

• Incremental compilation about to get better

• Get appropriate hardware

Thursday, May 23, 13

Useful links• Scala style guide - http://docs.scala-lang.org/style/

• Scalastyle - http://www.scalastyle.org

• SBT-scalariform: https://github.com/sbt/sbt-scalariform

• Post on implicits - http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits

• Cake pattern - http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/

• Subcut - https://github.com/dickwall/subcut

• MacWire - https://github.com/adamw/macwire

• Play 2.1 MacWire demo - https://github.com/przemek-pokrywka/play-2.1-macwire-demo

• Orders of ignorance - http://www-plan.cs.colorado.edu/diwan/3308-s10/p17-armour.pdf

Thursday, May 23, 13

Questions?

• @elmanu

• manuel@delving.eu

• http://github.com/manuelbernhardt

Thursday, May 23, 13