10

OOP では、実装ではなくインターフェイスと対話することをお勧めします。したがって、たとえば、次のように記述します (つまりSeq:) scala.collection.immutable.Seq):

// talk to the interface - good OOP practice
doSomething[A](xs: Seq[A]) = ???

次のようなものではありません。

// talk to the implementation - bad OOP practice
doSomething[A](xs: List[A]) = ???

ただし、Haskell などの純粋な関数型プログラミング言語では、サブタイプ ポリモーフィズムはなく、代わりに型クラスによるアドホック ポリモーフィズムを使用します。したがって、たとえば、list データ型と list のモナド インスタンスがあります。そのような概念がないため、インターフェイス/抽象クラスの使用について心配する必要はありません。

Scala などのハイブリッド言語では、型クラス (実際にはパターンを介して、Haskell のようなファーストクラスの市民ではありませんが、余談ですが) とサブタイプのポリモーフィズムの両方があります。scalazなどではcats、もちろん、抽象型ではなく、具象型のモナド インスタンスがあります。

最後に質問: Scala のこのハイブリッド性を考慮して、インターフェイスと対話するための OOP 規則を引き続き尊重しますか、それとも、使用する必要があるたびに具象型に変換する必要なく、ファンクターやモナドなどを直接利用するために具象型と対話しますか?彼ら?別の言い方をすれば、OOP の代わりに FP を採用したい場合でも、インターフェースと対話することは Scala でまだ良い習慣ですか? そうでない場合は、使用することを選択し、後でa の方が適切な選択Listであることに気付いたとしたらどうしますか?Vector

PS: 私の例では単純な方法を使用しましたが、同じ理由がユーザー定義型にも当てはまります。例えば:

case class Foo(bars: Seq[Bar], ...)
4

2 に答える 2

0

これらは、この件に関する私の 2 セントです。Haskell にはデータ型 (ADT) があります。リスト (リンクされたリスト) とベクトル (int インデックス付き配列) の両方がありますが、共通のスーパータイプを共有していません。関数がリストを取る場合、ベクトルを渡すことはできません。

Scala では、ハイブリッド OOP-FP 言語であるため、サブタイプ ポリモーフィズムも存在するため、クライアント コードが aListまたは aを渡すかどうかは気にせず、 (おそらく不変の) Vectora を要求するだけで完了です。Seq

この質問に答えるには、別の質問を自問する必要があると思います:「FPを全体として受け入れたいですか?」。答えが「はい」の場合はSeq、OOP の意味でまたは他の抽象スーパークラスを使用しないでください。もちろん、この規則の例外は、Scala で ADT を定義する際の特性/抽象クラスの使用です。例えば:

sealed trait Tree[+A]
case object Empty extends Tree[Nothing]
case class Node[A](value: A, left: Tree[A], right: Tree[A]) extends Tree[A]

この場合Tree[A]、もちろん型として require し、たとえばパターン マッチングを使用して、 または のいずれかであるかどうかを判断しEmptyますNode[A]

この主題についての私の気持ちは、赤い本( Functional Programming in Scala ) によって確認されていると思います。そこでは、 を使用することはありませんSeqListVectorなどを使用します。また、ハスケラーはこれらの問題を気にせず、リンクされたリストのセマンティックが必要なときは常にリストを使用し、int-indexed-array セマンティックが必要なときはいつでもベクトルを使用します。

一方、OOP を採用し、Scala をより優れた Javaとして使用したい場合は、OOP のベスト プラクティスに従い、実装ではなくインターフェイスと対話する必要があります。

あなたが考えているなら: 「私はむしろほとんど機能的なものを選びたい」なら、Erik Meijer のThe Curse of the Excluded Middleを読むべきです。

于 2016-05-12T12:31:36.060 に答える