如何在Scala项目中组织代码?
经过多年的Java开发(大多数时候使用Spring),我们试图在Scala中提出一个快速原型。
首先出现的问题之一是:我们基本上只使用相同的软件包名称和代码组织,只是在Scala中编写代码吗?
例如,我们习惯为实体(AccountHelper,CacheHelper ...)提供帮助,有时我们也会使用服务也是(AccountService ......)。
ot:我们还将研究如何将我们的maven子模块移植到sbt,但这完全是另一回事。
答案 0 :(得分:8)
答案部分取决于对您最重要的事情。如果您对快速原型部分非常认真,那么就物理文件/目录布局而言,我只会从一个平面文件开始,只有在有足够的代码生成时才开始分解它那很尴尬。这至少应该使您的代码的全局重构更容易,直到您获得正确的整体结构。 Scala没有强制执行这个包:目录,类:文件通信,并且考虑到Scala的简洁性,无论如何在很多情况下都是过度的。 没有什么可以阻止你在一个文件中将事物组织成多个包之后,一旦你拥有了正确的结构,就可以在物理上将其分解。实际上,当你需要的时候打破文件应该很容易。
你没有多说Helper
& Service
类可以,但从命名约定来看,它们听起来像是通用(也称为参数)特征或类的良好候选者。这将允许您分解所有不同助手的共同点(对于服务也是如此)。它们应该有一些共同点来证明命名约定。然后,您最终会使用或可能扩展Helper[Cache]
和Service[Account]
等类型。我也猜测这些类型的实例范围相当广泛,并且可以通过隐式传递,使Helper[_]
和Service[_]
成为类型类而受益。此时您也可能不再需要Spring,因为隐式查找可能会为您提供所需的依赖注入。但是,我只是通过你提供的几个班级名称,并且阅读了大量的名字,所以很有可能我完全不在这里。
另一种可能性是辅助类,如Helper&服务只是伪装的关闭。这是Java中此类类的常见情况。在这种情况下,您应该将它们实现为Scala中的函数,但我只是从名称中猜测......
您还可以查看图层蛋糕模式,看看这对您的项目是否有意义。
关于你的项目的更多信息可能会比我的过度活跃的想象力产生更好的建议:)。
Hera是一些可能有用的链接:
答案 1 :(得分:6)
我以基本相同的方式组织包裹,但结束了 以不同方式实施。 当我第一次开始编写来自java的scala时,我花了一段时间 习惯了几件事:
使用随播对象而不是“静态”
类Bla {} 对象Bla {...}
忘掉“get *”,“set *”getter和setter - 使用val,var - prefer val。
了解scala.collection。,Option和scala.collection.JavaConversions。 - (提供java和scala集合类型之间的隐式转换), 所以你可以写这样的代码:
class Helper {
def lookupUser( name:String ):Option[UserInfo]
...
}
val jsonUsers:Seq[String] =
Seq( "fred", "mary", "jose" ).flatMap(
name => helper.lookupUser( name )
).map( info => helper.toJson( info ) )
或
val jsonUsers:Seq[String] = for ( name <- Seq( "fred", "mary", "jose" );
info <- helper.lookupUser( name )
) yield helper.toJson( info )
或
val jsResult = helper.lookupUser( "fred" ).map( info => helper.toJson( info )
).getOrElse( jsErrorRespose )
如果您对这种代码感到满意,那么您就有了一个良好的开端......
祝你好运!答案 2 :(得分:5)
我们已经用java编写了整个平台。我对scala的工作非常热心。所以我只是将我的scala代码添加到同一级别的现有代码库,即src / main / java,我也很容易从scala到java发现几乎100%的兼容性。只需包含maven scala插件即可。 但我建议将scala代码保存在src / main / scala下,以获得更清晰的代码库组织,并帮助解决次要编译器依赖性问题。在sbt和mvn中都具有双重构建,为构建过程提供了极大的灵活性。