Scala pitfalls
Upcoming SlideShare
Loading in...5
×
 

Scala pitfalls

on

  • 558 views

 

Statistics

Views

Total Views
558
Views on SlideShare
558
Embed Views
0

Actions

Likes
0
Downloads
4
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Scala pitfalls Scala pitfalls Presentation Transcript

    • Scala pitfallsVSUG meetup 22.05.2013Manuel Bernhardt - manuel@delving.eu - @elmanuThursday, May 23, 13
    • MotivationThursday, May 23, 13
    • MotivationThursday, 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 SuitablyEfficient Process• 4th Order Ignorance: Meta IgnoranceThursday, May 23, 13
    • Thursday, May 23, 13
    • One-liner of deathThursday, May 23, 13
    • BIG SCREENI 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)    .headOptionsetThumbnail(    id,    USERCOLLECTION,    collectionModel.thumbnail,    thumbnailUrl,    maybeThumbnailLink)Thursday, May 23, 13
    • • Scala Style guide• Tools! Scalastyle, ScalariformThursday, May 23, 13
    • nullThursday, May 23, 13
    • nullThursday, May 23, 13
    • So many OptionsThursday, 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  Im  happy!    case  None  =>  //  well,  doh}Thursday, May 23, 13
    • • Option monad• Option[T] ~= List of zero or one elementsThursday, 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  +  1fooBar(foo)fooBar(bar)  //  ouchThursday, May 23, 13
    • It’s all about designThursday, May 23, 13
    • • use implicit conversions wisely: specifictypes• use within the correct scope• implicit lookup scopeThursday, May 23, 13
    • A word on IDEsThursday, May 23, 13
    • Thursday, May 23, 13
    • • Scala is complex• IDEs are getting there, but are not thereyet• False negatives be especially misleading atthe beginningThursday, May 23, 13
    • ModularityThursday, May 23, 13
    • Thursday, May 23, 13
    • Cake pattern pitfalls• Initialization order• Initialization order• Compilation time overhead (traits)• Beautiful theory, less beautiful practiceThursday, May 23, 13
    • Cake pattern pitfalls• Initialization order• Initialization order• Compilation time overhead (traits)• Beautiful theory, less beautiful practiceWAT?Thursday, May 23, 13
    • Alternatives• Subcut• MacWire - macros!• Guice, Spring ScalaThursday, May 23, 13
    • Time is moneyThursday, May 23, 13
    • http://xkcd.com/303/Thursday, May 23, 13
    • • Scala compilation is slow• Incremental compilation about to getbetter• Get appropriate hardwareThursday, 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.pdfThursday, May 23, 13
    • Questions?• @elmanu• manuel@delving.eu• http://github.com/manuelbernhardtThursday, May 23, 13