"模块化"Scala指南

Zde*_*k F 14 scala modular

最近我对如何组织我的Scala代码感到困惑,因为有很多选项.

Scala是否/何时使用包,对象,包对象来组织代码?

Rex*_*err 9

了解Scala的功能

首先,我们需要了解每种模块化策略的功能和局限性.

这些工作就像在Java中一样.您可以使用许多文件来声明一个包的不同部分,并且可以深层嵌套多个级别.这为您的布局提供了最大的灵活性.但是,由于默认的类加载器只能在包中找到类和接口,所以Scala允许你放在那里.(类,特征和对象.)

对象

对象可以包含任何东西 - 方法,字段,其他对象,类,特征等.子类,特征和对象实际上是它们自己的独立实体,包含对象作为名称错位的前缀(就JVM而言) ).一个对象必须完全包含在一个文件中,虽然你可以任意深入地嵌套子类,但它是通过修改越来越长的名称来完成的,而不是添加到类加载器的路径中.

包对象

只有对象和包的问题是您可能需要嵌套结构:

scala.xml
scala.xml.include
scala.xml.include.sax
Run Code Online (Sandbox Code Playgroud)

所以你需要使用包(避免有一个巨大的文件和令人不安的长类名).但你也可能想要

import scala.xml._
Run Code Online (Sandbox Code Playgroud)

使您可以使用各种常量和隐式转换,以便您需要使用对象. 包裹物品来救援; 它们与普通物体基本相同,但是当你说的时候

import scala.xml._
Run Code Online (Sandbox Code Playgroud)

你可以获得package(scala.xml._)中的所有内容,还可以获得相应包对象(scala.xml.package)中的所有内容.

如何模块化你的代码

现在我们知道每个部分的工作原理,对于如何组织有相当明显的规则:

  • 将相关代码放入包中
  • 如果有许多相关的子部件,请将它们放入子包中
  • 如果包需要implicits或常量,请将它们放入该包的包对象中
  • 如果您有一个包层次结构的终端分支,则可以选择它是对象还是包对象.有些东西不允许包对象(尽管列表一直变小 - 我不确定除了禁止在包中隐藏其他名称之外还剩下什么),所以常规对象可能会是一个更好的选择.只要您不担心二进制兼容性,以后就可以轻松改变主意 - 在大多数情况下只需更改object即可package object.