私が従う経験則は、実装に応じて、戻り型を可能な限り具体的にし、引数の型を可能な限り一般的にすることです。従うのは簡単なルールであり、タイププロパティの一貫した保証を最大限の自由度で提供します。
たとえば、またはのようなメソッドを使用してデータ構造をトラバースするだけの関数実装がある場合map
、filter
またはfold
-トレイトに実装されているものであれば、任意のタイプの入力コレクションでTraversable
同等に実行されることが期待できます- List
、、、または、したがって、入力引数はとして指定する必要があります。関数の出力タイプの選択は、その実装にのみ依存する必要があります。この場合もそうする必要があります。ただし、関数でこのデータ構造を、、、などのメソッドを使用してより具体的なタイプに強制する場合は、適切なタイプを指定する必要があります。実装とリターンタイプの一貫性に注意してください。Vector
HashSet
HashMap
Traversable[T]
Traversable
toList
toSeq
toSet
関数がインデックスによって入力の要素にアクセスする場合、入力はとして指定する必要があります。IndexedSeq
これは、メソッドの効果的な実装を保証する最も一般的なタイプであるためですapply
。
抽象メンバーの場合、同じルールが適用されますが、実装ではなく使用方法に基づいて戻りタイプを指定する必要があるという唯一の違いがあります。したがって、ほとんどの場合、実装よりも一般的です。カテゴリの選択肢Seq
、Set
またはMap
最も期待されています。
このルールに従うと、たとえば、アイテムがの代わりに追加されList
たりcontains
呼び出されたりする場合に、ボトルネックの非常に一般的なケースから身を守ることができますが、プログラムは自由度が高く、タイプの選択の意味で一貫しています。Seq
Set