我用Java开发了很多代码,并涉足Groovy和Haskell,现在我已经把我带到了Scala.
我对Scala的功能方面感到相对舒服,但我发现自己在Scala中的面向对象设计上有些不稳定,因为它感觉与Java有点不同,特别是由于特性/混合.
我的目标是编写尽可能可测试的代码,这在我的Java开发中一直都是关注的
现在我正试图在这个新的Scala领域站起来,我很难弄清楚我应该采取什么方法,特别是我是否应该为某些目的开始使用继承.
编程Scala(Wampler和Payne; O'Reilly,第2版)有一个考虑因素("良好的面向对象设计:一个题外话"),我已经阅读了很多关于SO的帖子,但我还没有看到明确提到可测试性的设计考虑因素.本书提供了有关使用继承的建议:
- 抽象基类或特征由具体类(包括案例类)分为一级.
- 除了两种情况外,具体类永远不会被子类化:
- 混合在特征中定义的其他行为的类(...)
- 仅测试版本,以促进自动化单元投影.
- 当子类化似乎是正确的方法时,考虑将行为划分为特征并改为混合这些特征.
- 永远不要跨父子类型边界拆分逻辑状态.
对SO的一些挖掘也表明,有时混合比组合更好.
所以本质上我有两个问题:
是否有一些常见的情况,即使考虑可测试性,使用继承会更好?
混合是否提供了增强代码可测试性的好方法?