Scala pitfallsVSUG meetup 22.05.2013
Manuel Bernhardt - [email protected] - @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 { "[email protected]"}
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
• 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
• http://github.com/manuelbernhardt
Thursday, May 23, 13
Top Related