traitUserModule{
defloadUser(id:Long): User}traitTweetModule{
defpost(userId:Long, body: String)
Q: What is the essence of modularity?
A: Informationhiding!
defbippy(t: Thing[Int, String]) = {
valstate: t.X
It’s a module, Jim, but not as weknow it…
traitUserModule{
deflogin(name: String, pass: String) = {
// do stuff}
defsave(user: User) {
traitMessageModule
extendsUserModule{
defrender(msg: Message): Group[Node]= {
// yay, anti-xml user!}
uh oh…
traitMessageModule
extendsUserModule{
objectmessage{
defrender(msg: Message): Group[Node]= {
// yay, anti-xml user!
traitUserModule{
deflogin(name: String,pass: String): Option[User]
defsave(user: User):Unit
traitMongoUserModule
extendsUserModule{
deflogin(user: String, pass: String) = {
…}
…}
traitUserModule{
…
typeUser <: UserLike
traitUserLike{this: User=>
traitMongoUserModule
extendsUserModule{
…
classUser(…)extendsUserLike
traitSystemModule{
valuserModule:UserModule
defdoStuff() = {userModule.makeUsers()userModule.encourageMemes()
// ???
traitSystemModule{
defdoStuff(userModule: UserModule) = {userModule.makeUsers()userModule.encourageMemes()
// ???userModule.profit()}}
traitStorageModule{
defstore(id:Long, data: ByteBuffer)
defretrieve(id:Long): ByteBuffer}
// curse you, naming conventions!traitUserModuleModule
extendsStorageModule{
traitUserModule{
typeUser <: UserLike
…}}trait