co-
私は、標準ライブラリ (例: collectionsとcontravariance
trait Function
)の使用について知っており、「現実世界」のビジネス アプリケーションの設計にどのように使用されているのco-
か疑問に思っています。contravariance
2 に答える
古典的な例は関数で、引数が 1 つの関数に Scala インターフェースを使用します。
trait Function1[-T1, +R]
どちらが-
引数の反変 ( +
) であり、戻り値の型の共変 ( ) です。
なんで?
次のクラスがあるとします。
class Timelord { ... }
class Doctor extends Timelord { ... }
class Enemy { ... }
class Dalek extends Enemy { ... }
Doctor => Enemy
パラメータとして関数を取るメソッドがある場合。のインスタンスを提供しても問題ありませんTimeLord => Enemy
。のインスタンスは引き続き受け入れますDoctor
。
SoTimeLord => Enemy
は のサブクラスなDoctor => Enemy
ので、TimeLord
は のスーパークラスでありDoctor
、そのパラメータで反変です。
同様に、 a を返す関数は、 aが is-anであるため、Dalek
some を返す関数が必要な場合に有効です。Enemy
Dalek
Enemy
SoDoctor => Dalek
は のサブクラスであるDoctor => Enemy
ため、Dalek
は のサブクラスでありEnemy
、そのパラメータで共変です。
基本的に、パラメトリック ポリモーフィズム (ジェネリック)と継承の両方を利用したい場合は、宣言サイト バリアンス ( +
/ -
)、サイト バリアンス (ワイルドカード)の使用、またはその両方が必要になる可能性があります。
通常、ポリモーフィック型はかなり高レベルの抽象化であるため、ドメイン オブジェクトにバリアンス アノテーションは必要ないかもしれませんが、少なくともドメイン オブジェクトが継承の一部である場合は、ドメイン オブジェクトを操作するために記述するコードでバリアンス アノテーションを使用する必要がある可能性があります。非常に頻繁に見られる階層。
基本的にすべてのライブラリまたはフレームワークを見ると、バリアンス アノテーションが頻繁に使用されていることがわかります。「実世界」のアプリケーションを正しく抽象化している場合、おそらくそれをサポートするために多くのライブラリを作成し、重要なビジネス ロジックの小さなコアをすべてのサポート インフラストラクチャから適切に分離することになります。インフラストラクチャをサポートするすべてのものは、おそらく分散アノテーションも頻繁に使用するでしょう。