私は Java で多くのコードを開発し、Groovy と Haskell に手を出しました。それが今では Scala につながっています。
私は Scala の機能面には比較的慣れていますが、Scala のオブジェクト指向設計については、特にトレイト/ミックスインが原因で、Java とは少し異なるように感じられるため、少し不安定です。
私はできる限りテストしやすいコードを書くことを目指しています。
- 可能な場合の不変性
- コンストラクターによる状態の注入を優先する
- 常に継承ではなく構成を使用してください ( SO に関するこの投稿の影響を強く受けており、おそらく過剰反応です) 。
今、私はこの新しい Scala テリトリーに足を踏み入れようとしていますが、ここでどのアプローチを採用すべきか、特に何らかの目的で継承を使用する必要があるかどうかを判断するのに苦労しています。
Programming Scala (Wampler and Payne; O'Reilly、第 2 版) には考慮事項のセクション (「優れたオブジェクト指向設計: 余談」) があり、SO に関する多くの投稿を読みましたが、見たことはありません。テスト容易性の設計上の考慮事項についての明示的な言及。この本は、継承の使用に関する次のアドバイスを提供しています。
- 抽象基本クラスまたは特性は、ケース クラスを含む具象クラスによって 1 レベル サブクラス化されます。
- 次の 2 つの場合を除いて、具象クラスはサブクラス化されません。
- 特性で定義された他の動作を混在させるクラス (...)
- 自動化されたユニットテストを促進するためのテスト専用バージョン。
- サブクラス化が適切なアプローチのように思われる場合は、動作を特性に分割し、代わりにそれらの特性を混合することを検討してください。
- 親子型の境界を越えて論理状態を分割しないでください。
SO を掘り下げてみると、ミックスインが合成よりも望ましい場合があることも示唆されています。
本質的に、私は2つの質問があります:
テスト容易性を考慮しても、継承を使用した方がよい一般的なケースはありますか?
ミックスインは、コードのテスト容易性を向上させる良い方法を提供しますか?