2012-07-28 9 views
8

Martin's keynote on Reflection and Compilersを見た後、私はこの狂った質問を頭から出すことはできません。マーティンは、 "ウェディングケーキパターン"について、他のものの中で話します。なぜ私たちはすでに特産品を持っているときにパッケージが必要なのでしょうか? packageができることは何ですか、trait(少なくとも理論上は)できないものはありますか?Scalaの特性とパッケージ

私は現在の実装については言及していませんが、パッケージを特質に置き換えるとどのようなプログラミングになるか想像してみようとしています。以下

  • つのキーワード(packageは不要です)
  • すべての私の質問を要約するpackage object

の必要はありません:

  1. です私の頭では、このようなものです理論的には言語からパッケージを削除し、代わりに特性を使用することが可能です。
  2. この変更により他にどんなメリットがありますか? (私はファーストクラスのパッケージとファーストクラスのインポートについて考えていましたが、スーパーミックスは動的にバインドされていますが、mixinのコンポジションはコンパイル時のものです)
  3. Java/JVMとの互換性は唯一のものですか?

更新

依存性の注入を使用して、ケーキのパターンを使用して実行できるすべてのものの氷山のほんのトップであることについて this keynote

ダニエルスピーバック会談。

+0

これは単なる(静的)[newspeak](http://newspeaklanguage.org/)です! :) –

答えて

7

Martin Oderskyは、Scalaがただの特性、オブジェクト、メソッド、パス(私が何かを忘れていないことを願っています)で得ることができたと言いました。

Scalaがホスト言語(つまり、実際には興味のあるビットではありません)で実行される言語、つまり(これは重要なポイント)と相互運用するため、プラットフォーム。 Scalaが相互運用できるホストプラットフォームの中には、JavaプラットフォームとCLI(クラスとパッケージ(CLIの場合は名前空間)の概念を持つもの)の2つがあります。形質または物体。これは、純粋に抽象的な特性に簡単にマッピングできるインターフェイスとは異なります。

上記のステートメントは、ジェネリックスが行うことができるのは、抽象型によっても達成できるため、Scalaからジェネリックを削除する可能性について議論したものです。

+0

実際に理論的には可能ですが、実装する価値はありません。 )実際に私たちに買うものを想像することができます; – agilesteel

+0

それは言語の大幅な簡略化を購入し、シンプルさが1つのScalaの主な目標なので、間違いなく理にかなっています。しかし、これはホストプラットフォームの相互運用性を失いますが、これはScalaのもう一つの主な目標です。パッケージを使用するすべてのケースでオブジェクトを使用できますが、ScalaオブジェクトをJavaパッケージまたはCLIの名前空間にマッピングするきれいな方法はありません。インターフェイスが完全に抽象的な特性とインタフェースの間に明白なマッピングがあるため、ScalaはJava/CLIインタフェースと相互運用できます。 –

6

スケーラでは、オブジェクトとパッケージはほぼ同じ目的を果たし、オブジェクトはモジュールとも呼ばれます。オブジェクトはもちろん、他のオブジェクトやもちろんのものを含むあらゆる定義を含むことができるので、モジュールと考える価値があります。

形質は抽象的なモジュールと考えることができます。それは任意の定義を含むことができ、どのメンバーも、抽象的なメンバーになることができます。私はこれだけを対称性を強調するために挙げています。おそらく、OTだが、私の特質は、オブジェクトと機能的アイデアの融合と同じように、スケーラの革新と同じように思える。私はパッケージがオブジェクト(ない特性)に有利に除去することができたと思います

  1. :最終的な答えを与えることを

  2. 利点は単純化されます。パッケージオブジェクトは明示的に定義する必要はありません。
  3. 私はパッケージがJava/JVMとの互換性のためにオブジェクトと異なると思います。

ビデオの中で、マーティンは、抽象的なモジュールのいくつかの組み合わせを組み立てて正式化する最後の時点でしか現れないので、特性(抽象モジュール)を具体的なモジュールよりも多く語ります。

"ケーキを混ぜていない"場合でも抽象モジュールを使用するとよいです。例えばいくつかのコードをスケッチするとき、定義を含むモジュールを定義するかもしれません。しかし、入力する準備ができていないタイプまたは値になるとすぐに、nullなどのダミーを入力しないでください。代わりに、オブジェクトを形質に切り替え、メンバを抽象化したままにしておきます。

+0

「OT」とは何ですか? sidenoteとして、あなたはまだ書く準備ができていない実装のために 'NotImplementedError'をスローする素敵な' ??? '関数があります。あなたのプログラムに構造的な変更を加えるよりもはるかに便利だと思います。 –

+0

申し訳ありませんが、OT =トピックをオフにしています。うん、???型はありませんが、 "スケッチ"しながら値を入力するのに適しています。 –

+0

特性はScalaの前に発明されました。http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf – iwein

関連する問題