“模块化”Scala 指南

Posted

技术标签:

【中文标题】“模块化”Scala 指南【英文标题】:"Modular" Scala guidelines 【发布时间】:2011-10-13 10:02:11 【问题描述】:

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

对于 Scala 如何/何时使用包、对象、包对象来组织代码有任何指导吗?

【问题讨论】:

不是指导方针,但 Netbeans 在访问另一个对象内定义的案例类时遇到问题,尽管这与编译器无关。就我而言,我不在另一个类或对象中做案例类。 【参考方案1】:

了解 Scala 的功能

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

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

对象

对象可以包含任何东西——方法、字段、其他对象、类、特征等。子类、特征和对象实际上是它们自己的独立实体,包含对象作为名称损坏的前缀(就JVM 关心)。一个对象必须完全包含在一个文件中,尽管您可以任意深度地嵌套子类,但这是通过修改越来越长的名称来完成的,而不是添加到类加载器的路径中。

包对象

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

scala.xml
scala.xml.include
scala.xml.include.sax

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

import scala.xml._

使您可以使用各种常量和隐式转换,以便您需要使用对象。 Package objects来救援;它们本质上和普通的物体是一样的,但是当你说

import scala.xml._

您将获得包中的所有内容 (scala.xml._) 以及相应包对象 (scala.xml.package) 中的所有内容。

如何模块化你的代码

既然我们知道了每个部分的工作原理,那么如何组织就有相当明显的规则:

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

【讨论】:

sbt 子项目呢?! @ŁukaszRzeszotarski - 这是另一个有趣的问题,但这个问题专门询问了 Scala 特性,而不是构建工具。你可以谈论很长时间关于如何使用构建工具来帮助组织你的 Scala 项目。【参考方案2】:

除了包和对象之外,还有一些“隐含”可以帮助您构建代码。可以在这里找到一个很好的使用指南(避免误用): http://suereth.blogspot.com/2011/02/slides-for-todays-nescala-talk.html

我还建议使用类型类来构建您的代码。这里有一篇关于这个主题的好文章:http://debasishg.blogspot.com/2010/07/refactoring-into-scala-type-classes.html

【讨论】:

我两个都用。这也是我问如何组织代码的原因之一。但是,我相信您的回答对那些偶然发现这个问题的人很有用,可以给他们另一个见解。 为了给出代码结构,可以使用很多概念和抽象。隐式本身很强大,但很容易被误用。这就是为什么我也建议使用 typeclass 方法。如果你喜欢我的回答,你也可以投票;)【参考方案3】:

我尽可能使用包,也就是说,当“模块”只是由类/特征/对象定义组成时。包的优点是可以从 Java 中直接访问而无需奇怪的语法。

在所有其他情况下,我主要使用普通对象。

有时,我在项目包的根目录中的每个项目都有一个包对象。该包对象存储所有必要的隐式和最重要的类和对象。它允许对所有项目进行很好的单行导入。

【讨论】:

【参考方案4】:

如果您只对命名空间和将代码拆分为单独的文件感兴趣(听起来像 OP),请参阅@Rex 的答案。

如果您对模块系统有更多期望,例如可互换性或标准 M​​L 风格的函子,您可以使用here 描述的方法。

基本上,模块接口(在 SML 中也称为签名)成为 Scala 中的特征。模块(又名结构)是 Scala 中的对象。仿函数可以转换为类、抽象类,甚至是带有某些实现的特征,其中仿函数参数转换为抽象字段或构造函数参数,具体取决于您是否希望生成的模块具有兼容的类型。

【讨论】:

以上是关于“模块化”Scala 指南的主要内容,如果未能解决你的问题,请参考以下文章

ant 使用指南---java模块化编译

App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南

2021年BATJ30套大厂Android经典高频面试题,使用指南

前端每周清单:JavaScript 模块化现状;Node V8 与V6 真实性能对比;Nuxt.js SSR与权限验证指南

Webpack使用指南

react学习 | 踩坑指南