我从11岁起就开始扮演角色扮演游戏,而我和我的团队每年仍然扮演一两次。 最近,他们决定再次玩Earthdawn,这是我们15年来从未玩过的游戏! 这激发了我创建一个应用程序来滚动所有这些形状奇异的骰子的愿望。 为了将实用性和愉快性结合起来,我决定使用我不太熟悉的技术:Scala语言,Android平台和Gradle构建系统。
第一步是在Scala中设计一个简单且通用的模具轧制API,这是我上一篇文章的主题。 第二步是在此API的基础上构建一些特定于Earthdawn的东西并设计GUI。 这是我对这一发展的沉思。
以下是一般组件概述:
![组件概述](https://i-blog.csdnimg.cn/blog_migrate/08ae98032a2cd2136bce26ef0c931694.png)
重做基础
经过大量内部辩论之后,在对reddit进行了相关评论之后,我终于将roll
方法的返回类型从(Rollable[T], T)
更改为简单的T
我得出的结论是,要让调用者掌握模子本身,并在需要时将其返回。 这就是我在Earthdawn域层中所做的。
Scala规格
使用Scala意味着我也进入了Scala Specs 2框架。 Specs 2提供了一种行为驱动的编写测试的方式,并通过运行器和特性通过Mockito与JUnit集成。 测试实例可以在一个专用的类中单独初始化,而与所有其他实例隔离。
我最大的挑战是配置Maven Surefire插件以执行Specs 2测试:
<plugin>
<artifactId> maven-surefire-plugin </artifactId>
<version> 2.17 </version>
<configuration>
<argLine> -Dspecs2.console </argLine>
<includes>
<include> **/*Spec.java </include>
</includes>
</configuration>
</plugin>
Scala + Android = Scaloid
尽管起初可能令人失望,但想要在Android上运行Scala也是可行的。 普通Java被编译为字节码,然后转换为Dalvik兼容的Dex文件。 由于Scala也被编译为字节码,因此也可以应用相同的过程。 不仅可以轻松地将Scala移植到Android,而且可以在线使用一些框架来完成这些工作:似乎最成熟的框架是Scaloid 。
Scaloid最重要的功能是在implicit
的帮助下避开传统的基于XML的声明式布局,而转而使用基于Scala的领域特定语言:
vallayout=newSLinearLayout{
SButton("Click").<<.Weight(1.0f).>>
}
Scaloid还提供:
- 生命周期管理
- 隐式转换
- 基于特征的层次
- 改进的吸气器和安装器
- 等等
如果您想在Android上执行Scala,这是您要考虑的目标!
关于Gradle的更多bit子
我将Gradle用于API项目,但我必须承认它比Maven更简洁。 例如,无需添加整个maven-scala-plugin XML代码段,只需告诉Gradle将其用于:
applyplugin:'scala'
但是,最大的优点是Gradle保持了项目的状态,因此不会执行不必要的任务。 例如,如果代码未更改,则将不执行编译。
现在,以政治上正确的方式,而不是最优的方式:
- 首先,很有趣的是,Gradle不会在控制台中输出测试结果。 对于Maven用户,这有点令人不安。 但是即使没有这个缺陷,我恐怕任何潜在的用户都对测试输出感兴趣。 但是,可以使用一些Groovy代码来补救:
test{ onOutput{descriptor,event-> logger.lifecycle("Test: "+descriptor+": "+event.message) } }
- 然后,当我想将生成的程序包安装到本地Maven存储库中时,我不得不添加Maven插件:足够简单...这也需要Maven坐标,这是人们所期望的。 但是,为什么我可以不执行测试阶段就安装? 这不仅令人不安,而且我不能接受任何未经测试即可安装的理由。
- 但是,以上任何一点都没有被证明是表演的制胜法宝。 对于Scala-Android项目,您可能会认为我只需要同时应用
scala
和android
插件并完成此操作。 好吧,这是错误的! 似乎尽管Android被展示为Gradle 的用例,但是scala和android插件并不兼容。 这是我Gradle冒险的结束,并且可能在可预见的将来。
轻松而灵活地进行测试
生成过程, 即将每个类文件转换为Dex,将它们打包为.apk并签名需要很长时间。 如果使用Google Android SDK中的模拟器,情况将更糟。 但让您高兴的是, Genymotion是一个高级的Android模拟器,不仅速度非常快,而且易于使用。
无需进行adb安装,只需在Genymotion上拖放apk即可,只需将其拖放到仿真设备上即可。 更好的是,它不需要先卸载旧版本就可以直接启动应用程序。 就像我告诉你的馅饼一样简单!
结论
我现在有一个可以正常工作的Android应用程序,其中包含测试和可重复的构建。 它虽然不多,但可以完成工作,并且教会了我一些以前不知道的新知识。 我只能鼓励您做同样的事情:选择一个小型应用程序,并使用日常工作中不使用的语言/工具/平台进行开发。 最后,您将学到东西并拥有一个有效的应用程序。 不会让你感到温暖吗?
翻译自: https://blog.frankel.ch/scala-on-android-and-stuff-lessons-learned/