我为页面视图定义了一个类,它接受一些值来呈现它:
class LoginPage {
val template = new Template("login")
def render(data: LoginPage#Data):String = {
template.apply(data)
}
case class Data(username:String, password:String)
}
使用时:
val loginPage = new LoginPage
loginPage.render(new LoginPage.Data("freewind", "123"))
虽然有效,但我真的不喜欢使用LoginPage#Data
来定义render()
方法。
有没有更好的解决方案来组织代码?
答案 0 :(得分:2)
您应该将Data
放入LoginPage
的伴随对象而不是类本身,否则Data
存在于 LoginPage
的每个实例 },这可能会导致一些意想不到的结果:
scala> val loginPage = new LoginPage
val loginPage2 = new LoginPage
scala> val data = new loginPage.Data("freewind", "123")
val data2 = new loginPage2.Data("freewind", "123")
scala> data == data2
res6: Boolean = false
这样的事情会更好:
class LoginPage {
val template = new Template("login")
def render(data: LoginPage.Data):String = {
template.apply(data)
}
}
object LoginPage {
case class Data(username:String, password:String)
}
至于不使用完整的LoginPage.Data
路径,如果你真的希望它包含在类/对象中,那么我认为你可以用它做很多事情。您可以在import LoginPage._
的班级定义中 LoginPage
,因此Data
的签名中只需要render
。
class LoginPage {
import LoginPage._
def render(data: Data): String = ...
}
答案 1 :(得分:0)
我会render
接受两个参数name
/ password
,将它们组合成一个元组,并将其传递给template#apply
。我不知道这个方法可以采取什么...
trait LoginPage {
val template = new Template("login")
def render(name: String, pw: String) = template((name, pw))
}