Scala中软件包的混淆命名约定

时间:2018-11-24 05:00:52

标签: scala sun-coding-conventions

我正在学习scala,并且正在查看scala样式指南的官方文档。但是我很困惑为什么同一个表情同时受到鼓励和劝阻。
根据{{​​3}},第一个package coolness是错误的,但是第二个package coolness在示例中间,是正确的。

// wrong! this is definitely wrong
package coolness

// right! puts only coolness._ in scope
package com.novell.coolness

// right! puts both novell._ and coolness._ in scope
package com.novell
package coolness //but why is it OK?

// right, for package object com.novell.coolness
package com.novell
/**
 * Provides classes related to coolness
 */
package object coolness {
}

已解决:我不知道超过2行的程序包声明与用点分隔的一行声明相同。

说到 package com.novell.coolnesspackage com.novell; package coolness

2 个答案:

答案 0 :(得分:4)

它在您引用的代码上方说,程序包名称应遵循Java程序包命名约定。 Java程序包命名约定规定,程序包名称应该是全局唯一的,这是通过使用Internet域名来实现的,该域名受程序包作者的控制,作为程序包名称的前缀。

例如,如果您控制域example.com,则可以为软件包使用com.example._之类的任何软件包名称,但是不能使用com.microsoft.coolness。 / p>

因此,com.novell.coolness可以,因为它遵循上述规则(假设您是Ray Noorda),但是coolness则不是,因为它没有遵循该规则(或者,如果遵循遵循该规则,则意味着您处于.根域名称空间的控制之下,除非您是ICANN,否则几乎可以肯定这是不正确的。

这真的根本不是关于Scala的问题,这是关于Java包命名约定的问题,Scala样式指南建议您遵循此规范。

答案 1 :(得分:3)

我只想添加一些基本原理。 Jorg所说的一切都是正确的:以下两个声明了相同的包

package com.novell.coolness

package com.novell
package coolness

但是后者有一个优势。假设我的项目结构包含这三个软件包

com.novell.coolness
com.novell.morecoolness
com.novell.utilities.coolness

现在,我正在com.novell.coolness中编写一个文件,该文件需要使用其他两个软件包中的某些内容。如果我们使用第一个约定,则会得到

package com.novell.coolness

import com.novell.morecoolness.MyClass
import com.novell.utilities.coolness.MyOtherClass

但是,如果我们使用第二种约定,则会得到

package com.novell
package coolness

import morecoolness.MyClass
import utilities.coolness.MyOtherClass

因此com.novell实际上在范围内,我们可以将 relative 导入其中。如果您有几个来自您自己项目的导入文件,但它们位于不同的程序包中,则这会非常方便,因为它消除了每个导入文件中的com.novell