質問

私は新しいケースクラスを追加する場合、それは私がパターンマッチングコードのすべてを検索し、新しいクラスを処理する必要が場所を見つける必要がある。

を意味するのでしょうか?私は最近、言語を学ぶしてきた、と私はパターンマッチングのためと賛否両論の一部をについて読んで、私はそれを使用する場所について混乱してきました。以下を参照してください。

プロ: Odersky1 Odersky2する

コン: Beustする

のコメントは、あまりにも、それぞれの場合にかなり良いです。だから、パターン興奮する何かに一致するか、私は使用を避けるべき何かがありますか?実は、私は「それはあなたがそれを使用するときに依存し、」答えをされる想像しますが、それのためにいくつかの肯定的なユースケースをしているとどのようないくつかの否定的なものは何ですか?

役に立ちましたか?

解決

ジェフは、私はあなたが右の直感を持っていると思う:それは依存

。 あなたが実装する必要のあるメソッドの比較的固定されたセットが、階層のルートから継承し、それらのメソッドを実装するかもしれない多くの潜在的なサブクラスを持っている時に仮想メソッドディスパッチと

オブジェクト指向のクラス階層が良いです。そのような設定では、新しいメソッドを(あなたは、彼らが適切に新しいメソッドを実装することを確認するためにすべてのサブクラスを変更する必要があります)を追加する(ちょうどすべてのメソッドを実装して)新しいサブクラスを追加することは比較的容易だが、比較的困難ます。

あなたがデータタイプに属するクラスの比較的固定されたセットが、そのデータ型を操作する多くの潜在的な機能を持っている場合、

パターンマッチングに基づいた機能を持つデータ型が良いです。そのような設定では、それは(あなたが一致するすべての機能を変更する必要があり、データ型の一部である新しいクラスを追加するために、データ型(そのすべてのクラスにだけパターンマッチ)のための新しい機能を追加するのは比較的容易だが、比較的困難データ型にそれらが適切に)新しいクラスをサポートすることを確認します。

オブジェクト指向のアプローチのための標準的な例は、GUIプログラムです。 GUI要素は、(画面上で自分自身を描画することは最低限である)非常に少ない機能をサポートする必要がありますが、新しいGUI要素はすべての時間(ボタン、表、グラフ、スライダー、など)を追加しています。パターンマッチング手法のための標準的な例は、コンパイラです。プログラミング言語は、通常は比較的固定された構文を持っているので、構文木の要素は、(これまでであれば)ほとんど変更されないでしょうが、構文木上の新しい操作は、常に(速く最適化、より徹底的なタイプの分析など)を追加されています。

幸いなことに、Scalaはあなたが両方のアプローチを組み合わせることができます。ケースクラスは、両方のパターンマッチしたことと、仮想メソッドディスパッチをサポートすることができます。定期的なクラスは仮想メソッドディスパッチをサポートし、対応するコンパニオン・オブジェクトに抽出を定義することによって、マッチしたパターンとすることができます。各アプローチが適切である場合には、決定するプログラマ次第ですが、私は両方が便利だと思います。

他のヒント

私はセドリックを尊重しながら、彼はこの問題について完全に間違っているのです。所望の場合Scalaのパターンマッチングは、クラス変更から完全に封入することができます。それが真である間と変化の場合クラスのナイーブな方法でそのようなクラスを使用する場合、これが唯一である、任意の対応するパターンマッチングのインスタンスを変更することが必要となる。

Scalaのパターンマッチングの常にの代表者クラスのコンパニオンオブジェクトのデコンストラクタへ。この自動生成されたバージョンを上書きすることは可能であるものの場合クラスに、このデコンストラクタは自動的に、(コンパニオン・オブジェクトのファクトリメソッドと一緒に)が生成されます。すべての回で、あなたは、クラス自体の潜在的な変化から任意のパターンを絶縁、パターンマッチング処理を完全に制御を主張することができます。従って、パターンマッチングは、他の方法と同様に、単にカプセル化の安全なフィルターを通してクラスデータにアクセスする別の方法である。

だから、博士Odersky著者の意見はここに信頼するものであろう、特に彼は、オブジェクト指向プログラミングとデザインの分野で行われた研究の膨大な量を与えられます。

は、それが使用されるべきである場合については、それは完全に好みに応じています。それはあなたのコードはより簡潔で保守行った場合、それを使用!それ以外の場合は、しないでください。ほとんどのオブジェクト指向プログラムでは、パターンマッチングは不要です。あなたはより多くの機能イディオム(OptionList、など)を統合し始めたらしかし、私はあなたがそのパターンマッチングが大幅型システムによって提供される安全性の向上だけでなく、構文上のオーバーヘッドを削減します見つけることだと思います。一般的に、いつでもあなたが同時に(例えばSomeから値を抽出する)いくつかの条件をテストしながら、データを抽出する、パターンマッチングがおそらく有用であろう。

あなたは関数型プログラミングを行っている場合は、

パターンマッチングは間違いなく良いです。 OOの場合、それは良いですが、いくつかのケースがあります。セドリックの例自体では、それはあなたが概念的print()方法を表示する方法に依存します。それは、各Termオブジェクトの振る舞いですか?それとも、それ外に何かありますか?私はそれが外にあり、かつパターンマッチングを行うことは理にかなって言うでしょう。あなたは、さまざまなサブクラスでEmployeeクラスを持っている一方、基本クラスでその属性にパターンマッチングを(名前を言う)行うには貧弱な設計上の選択である。

また、パターンマッチングは、クラスのメンバーを開梱するエレガントな方法を提供しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top