Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
OO in Scala - The unloved side of the cake?
Search
Tobias Neef
April 17, 2013
Programming
140
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
OO in Scala - The unloved side of the cake?
Component composition in Scala using a variant of the cake pattern
Tobias Neef
April 17, 2013
More Decks by Tobias Neef
See All by Tobias Neef
One night at a METRO depot
tobnee
0
100
Reactive Play and Scala
tobnee
1
280
Behavioural Abstractions in Play
tobnee
0
160
Funktionale Parallelität in Scala
tobnee
0
72
Functional Parallel Architecture
tobnee
1
110
Play Techtalk - Async Play
tobnee
2
530
Other Decks in Programming
See All in Programming
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.5k
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
phperだってパンチカードでコーディングしたい
o0h
PRO
0
340
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
220
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
33k
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
160
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
170
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3.1k
It's Worth the Effort
3n
188
29k
Embracing the Ebb and Flow
colly
88
5.2k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
760
How to make the Groovebox
asonas
2
2.5k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
280
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Optimising Largest Contentful Paint
csswizardry
37
4k
エンジニアに許された特別な時間の終わり
watany
109
250k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
Transcript
OO in Scala The unloved side of the cake?
About Me Tobias Neef Consultant / Dev at innoQ doing
stuff in Berlin
This talk is about OO and cakes in Scala
Disclaimer I love FP but OO still has it’s values
Everybody loves cakes. Do you love the cake in Scala?
The How and Who of component composition
How
None
I
I C C C
I C C C C
I C C C C C
Who
object composition == component configuration
Who combines the objects in the required configuration to one
component?
We can solve this with DI right?
IoC
IoC Who == the container
The typical DI has some serious issues
It evolves into a add-on language
@Component public class OrderRepo { @Autowired BookingWriter bookingWriter; @Autowired OrderHeaderDao
orderHeaderDao; ...
Not covered by the typesystem
@Component public class OrderRepo { @Autowired BookingWriter bookingWriter; @Autowired OrderHeaderDao
orderHeaderDao; ...
Managed Instances
new MyClass == this is not a component
Cyclic dependencies are hard not to express
Back to the cake
Cake Pattern == Scala flavored OO component composition
Ingredients
Traits Are like interfaces with implementation
trait CustomerTS {! def getTicket(id:Long) def default = new ...
}
Self-Types Manual typing of the this reference
trait CustomerTS {! self : CustomerDao => ... }
Dependency Context Though composed traits
trait Component { def instance : ManagedClass trait ManagedClass {
def method():Int } }
trait Component { def instance : ManagedClass trait ManagedClass {
def method():Int } } Logic Context
trait Component { def instance : ManagedClass trait ManagedClass {
def method():Int } } Component Context Logic Context
trait Component { / / New Instances / / Unique
Instances / / Dependencies / / Component Inheritance }
trait ManagedClass { / / normal class / / access
to component / / application logic }
trait AuthComponent { def authComponent: Auth trait Auth { def
load(name: String, pass: String): Option[User] protected def internalUser() = .. } }
Dependencies
Class 1 Class 2 Component 1 Component 2 Depends Uses
trait BookingServiceComponent { ! self : AuthComponent => def bookingService
= ! new BookingService() class BookingService { def book(user: String, pass: String, !! itemId:Id) = ! ! ! authComponent.load(user,pass) ... } }
Inheritance
Class 1 Class 2 Component 1 Component 2 Is Uses
Extends
trait LocalAuthComponent extends AuthComponent { def authComponent = new LocalAuth()
class LocalAuth extends Auth { def load(name: String, pass: String) = ... } }
trait LDAPAuthComponent extends AuthComponent { def authComponent = new LDAPAuth()
class LDAPAuth extends Auth { def load(name: String, pass: String) = ... } }
The Application Cake
trait BookingApp extends AuthComponent BookingServiceComponent
class LiveBookingApp extends LdapAuthComponent BookingServiceComponent Dependencies are checked at compile
time
A cake component == a partial application with dependencies
Is made of the core Scala language It is checked
at compile time It requires no IoC It uses the most specific type available It can express cyclic dependencies It can’t change its configuration at runtime The Cake
Bakery of Doom
Does everything have to be a cake?
Not everything in your app is a component interface
But most of your app should belong to a component
None
None
The cake package pattern
Component Package Component Interface Internal Package Internal Component ...
packages in Scala are more than namespaces
visibility rules can shield the component internals
Your App == Functional Components / Packages Result
None
Functional and technical contexts
Functional Contexts enhance the functionality of an application
Technical Contexts are the basis for the Functional Contexts
Technical Contexts can bridge the outside world and the cake
world
trait TechnicalComponent { def tc : TechnicalContext }
trait FunctionComponent { ! this => TechnicalComponent def fc: FunctionClass
trait FunctionClass { ... } }
None
Requires
Builds Requires
Builds Requires PlayAkka ActorSystem Provides
trait GlobalActorSystem { private[core] def actorSystem: ActorSystem private[core] implicit val
defaultTimeout = Timeout(4,TimeUnit.SECONDS) } Default Implicits Technical Context
class PlayServiceModule( val actorSystem: ActorSystem, ...) extends ServiceModule with GlobalActorSystem
...
import play.api.Play.current lazy val app = new PlayServiceModule( play.api.libs.concurrent.Akka.system, ...)
Bridge the Play framework to an application cake
Thanks!