Scala项目组织

use*_*320 12 scala organization

如何在Scala项目中组织代码?

经过多年的Java开发(大部分时间都使用Spring),我们试图在Scala中提出一个快速原型.

弹出的第一个问题之一是:我们基本上只使用相同的软件包名称和代码组织,只是在Scala中编写代码吗?

例如,我们曾经有过的助手为我们的实体(AccountHelper,CacheHelper ...),也有时我们使用的服务太(帐户服务...).

ot:更远的地方我们还将研究如何将我们的maven子模块移植到sbt,但这完全是另一回事.

Dan*_*ler 8

答案部分取决于对您最重要的事情.如果你真的认真对待快速原型部分,那么就物理文件/目录布局而言,我只是从一个平面文件开始,只有在有足够的代码才能使其变得笨拙时才开始分解它.这至少应该使您的代码的全局重构更容易,直到您获得正确的整体结构.Scala没有强制执行这个包:目录,类:文件通信,并且考虑到Scala的简洁性,无论如何在很多情况下都是过度的.没有什么可以阻止你在一个文件中将事物组织成多个包之后,一旦你拥有了正确的结构,就可以在物理上将其分解.实际上,当你需要时,打破文件应该很容易.

你没有多说你的HelperService类做什么,但从命名约定来看,它们听起来像是通用(也称为参数)特征(或可能是类)的良好候选者.这将允许您分解所有不同助手的共同点(对于服务也是如此).它们应该有一些共同点来证明命名约定.然后,您将最终使用或可能扩展类似Helper[Cache]和的类型Service[Account].我也猜测这些类型的实例可能会受益于隐式传递Helper[_]Service[_]进入类型类.此时您可能不再需要Spring,因为隐式查找实际上会为您提供所需的依赖注入.但是,我只是通过你提供的几个班级名称,并阅读了很多,所以很有可能我完全不在这里.

另一种可能性是像Helper和Service这样的辅助类只是伪装的闭包.这是Java中此类类的常见情况.在这种情况下,您应该将它们作为Scala中的函数实现,但我只是从名称中猜测...

您还可以查看Layer Cake模式,看看它是否对您的项目有意义.

有关您的项目的更多信息可能会比我的过度活跃想象力的产品给你更好的建议:).

Hera是一些可能有用的链接:

  • 令人惊讶的答案,也给出了我的问题的"模糊性".我肯定会研究你的一些提示(即"参数特征/分类","类型类","隐式查找").我确实意识到春天(或任何DI)可能不再需要了.我还将研究你提到的这个Layer Cake模式.将为问题添加示例/详细信息,以便您更好地了解我们如何使用帮助程序/服务. (2认同)

小智 6

我以基本相同的方式组织包,但最终以不同的方式实现.当我第一次开始编写来自java的scala时,我花了一些时间来习惯一些事情:

  • 使用伴侣对象而不是"静态"

    class 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 ) )
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    val jsonUsers:Seq[String] = for ( name <- Seq( "fred", "mary", "jose" );
                                   info <- helper.lookupUser( name )
       ) yield helper.toJson( info )
    
    Run Code Online (Sandbox Code Playgroud)

    要么

     val jsResult = helper.lookupUser( "fred" ).map( info => helper.toJson( info ) 
                   ).getOrElse( jsErrorRespose )
    
    Run Code Online (Sandbox Code Playgroud)

如果您对这种代码感到满意,那么您就有了一个良好的开端......

祝好运!


FUD*_*FUD 5

我们已经用java编写了整个平台.我对scala的工作非常热心.所以我只是将我的scala代码添加到同一级别的现有代码库,即src/main/java,我也很容易从scala到java发现几乎100%的兼容性.只需包含maven scala插件即可.但我建议将scala代码保存在src/main/scala下,以获得更清晰的代码库组织,并帮助解决次要编译器依赖性问题.在sbt和mvn中都具有双重构建,为构建过程提供了极大的灵活性.