Play框架中的命名规范

3

这是 Play Framework 的源代码的一部分:

package play.api.mvc
trait Results extends java.lang.Object {
  def $init$() : scala.Unit = { /* compiled code */ }

  def Async(promise : scala.concurrent.Future[play.api.mvc.Result]) : play.api.mvc.AsyncResult = { /* compiled code */ }
  val Ok : Results.this.Status = { /* compiled code */ }
  val Created : Results.this.Status = { /* compiled code */ }
  val Accepted : Results.this.Status = { /* compiled code */ }
//.......................

我想知道,为什么他们要用大写字母命名valdef

此外,某些类和对象以小写字母开头:

package views.html.play20

object book extends BaseScalaTemplate[play.api.templates.Html, play.templates.Format[play.api.templates.Html]] with play.api.templates.Template1[scala.Seq[scala.Predef.String], play.api.templates.Html] {
  def apply(pages : scala.Seq[scala.Predef.String]) : play.api.templates.Html = { /* compiled code */ }
  //.............
}

package views.html.play20

object manual extends play.templates.BaseScalaTemplate[play.api.templates.Html, play.templates.Format[play.api.templates.Html]] with play.api.templates.Template3[scala.Predef.String, scala.Option[scala.Predef.String], scala.Option[scala.Predef.String], play.api.templates.Html] {
  def apply(title : scala.Predef.String, main : scala.Option[scala.Predef.String], sidebar : scala.Option[scala.Predef.String]) : play.api.templates.Html = { /* compiled code */ }
 //............
}

package views
package object xml extends java.lang.Object {
}
1个回答

1
作为免责声明,我不使用Java或在项目中使用Play。
至于对象。从面向对象的角度来看,Scala中的第一类对象只是在Java中使用单例模式实例化的对象(如果我错了,请纠正我)。因此,我可以猜测Play团队使用小写单例对象名称是因为Java的兼容性,在Java中变量用第一个小写字母写:
Tyme varName = new Type()

以大写字母开头的defs/vals。例如Async,再次使用大写字母的Async看起来像是一些数据的构造函数,可以通过创建一些case class Async、单例object Async和一个apply方法或者只是创建一个需要参数的函数来实现。在Async的情况下,你只需要注意这个计算应该异步完成,你不需要一个实际的数据类型,只需要它的结果:AsyncResult,它被作为case class完成。

此外,在scala的函数式模型中,这个技巧也可以被用于将所有东西都建模为trait。Trait本身不能被实例化,你只能写new Sometrait {},这并不美观,但你可以为此添加一个方法:

trait Welcome {
  def welcome: String
}

def Welcome(name: String) = new Welcome {
  def welcome = s"Welcome! $name"
}

这是一种更传统的制作对象的方式。

至于这个惯例背后真正的原因,我想只有Play团队的人才能回答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接