More Related Content More from Manuel Bernhardt More from Manuel Bernhardt (13) Scala pitfalls6. 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
10. //
update
the
thumbnail
setThumbnaiL(id,
USERCOLLECTION,
collectionModel.thumbnail,
findThumbnailUrl(collectionModel.thumbnail,
collectionModel.objects),
updatedUserCollection.links.filter(_.linkType
==
Link.LinkType.THUMBNAIL).map(_.link).headOption)
Thursday, May 23, 13
11. //
update
the
thumbnail
setThumbnail(id,
USERCOLLECTION,
collectionModel.thumbnail,
findThumbnailUrl(collectionModel.thumbnail,
collectionModel.objects),
updatedUserCollection.links.filter(_.linkType
==
Link.LinkType.THUMBNAIL).map(_.link).headOption)
Thursday, May 23, 13
12. • hard to read
• hidden context switching
• debugging?
Thursday, May 23, 13
13. //
update
the
thumbnail
val
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
14. • Scala Style guide
• Tools! Scalastyle, Scalariform
Thursday, May 23, 13
18. val
user:
Option[User]
=
???
if
(user
==
None)
{
//
foo!
}
else
{
//
bar!
val
u
=
user.get
}
Thursday, May 23, 13
19. val
user:
Option[User]
=
???
if
(user.isDefined)
{
//
do
something
user-‐full
}
else
{
//
oh
my,
what
now?
}
Thursday, May 23, 13
20. val
user:
Option[User]
=
???
user
match
{
case
Some(u)
=>
//
now
I'm
happy!
case
None
=>
//
well,
doh
}
Thursday, May 23, 13
21. • Option monad
• Option[T] ~= List of zero or one elements
Thursday, May 23, 13
23. 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
26. 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
28. • use implicit conversions wisely: specific
types
• use within the correct scope
• implicit lookup scope
Thursday, May 23, 13
31. • Scala is complex
• IDEs are getting there, but are not there
yet
• False negatives be especially misleading at
the beginning
Thursday, May 23, 13
34. Cake pattern pitfalls
• Initialization order
• Initialization order
• Compilation time overhead (traits)
• Beautiful theory, less beautiful practice
Thursday, May 23, 13
35. Cake pattern pitfalls
• Initialization order
• Initialization order
• Compilation time overhead (traits)
• Beautiful theory, less beautiful practice
WAT?
Thursday, May 23, 13
39. • Scala compilation is slow
• Incremental compilation about to get
better
• Get appropriate hardware
Thursday, May 23, 13
40. 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