Play框架中的命名约定

时间:2013-09-26 04:35:29

标签: scala playframework playframework-2.0 naming-conventions

以下是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 个答案:

答案 0 :(得分:1)

作为免责声明,我不是用Java编写,也不是在项目中使用Play。

对象。从OOP的角度来看,Scala中的第一类对象只是一个用Java中的单例模式实例化的对象(我不使用Java,如果我弄错的话,儿子会纠正我)。所以我可以猜测Play团队使用小写单例对象名称是因为Java兼容性而Java变量是用第一个小写字母写的:

Tyme varName = new Type()

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

当您使用trait对所有内容进行建模时,此技巧也可用于scala的功能方式。 Trait as本身无法实例化,你可以只写new Sometrait {},这不是很漂亮,但你可以为此添加一个方法:

trait Welcome {
  def welcome: String
}

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

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

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