はい、確かにあります。並べ替え。
Newspeakには静的な状態もグローバルな状態もありません。つまり、依存関係にアクセスする唯一の方法は、依存関係を明示的に挿入することです。明らかに、これは、言語、またはより正確に言うとIDE が依存性注入を容易にする必要があることを意味します。そうしないと、言語は使用できなくなります。
したがって、この言語はDI用に設計されたものではなく、DIの必要性は言語設計の結果です。
静的な状態もグローバルな状態もない場合、エーテルに「手を差し伸べて」何かを引き出すことはできません。たとえば、Javaでは、パッケージ構造は静的な状態です。私はただ言うことができjava.lang.String
て、私にはString
クラスがあります。Newspeakでは不可能です。あなたが扱うすべてのものは、あなたに明示的に提供されなければなりません。したがって、すべては依存関係であり、すべての依存関係は明示的です。
文字列が必要ですか?さて、最初にstdlib
オブジェクトにString
クラスを渡すように依頼する必要があります。ああ、でもどうやってアクセスするのstdlib
?さて、最初platform
にstdlib
オブジェクトを渡すように依頼する必要があります。ああ、でもどうやってアクセスするのplatform
?さて、あなたは最初に他の誰かにあなたにplatform
オブジェクトを渡すように頼まなければなりません。ああ、しかし、どうすればその誰かの借金にアクセスできますか?さて、最初に他の誰かにオブジェクトを渡すように依頼する必要があります。
これはウサギの穴をどれくらい下に行きますか?再帰はどこで止まりますか?実際、すべての方法。止まらない。それでは、どのようにしてニュースピークでプログラムを書くことができますか?まあ、厳密に言えば、できません!
すべてを結び付ける外部エンティティが必要です。Newspeakでは、そのエンティティはIDEです。IDEはプログラム全体を見ます。異種の部品を一緒に配線できます。Newspeakの標準的なパターンは、アプリケーションの中心クラスにというアクセサーplatform
があり、Newspeak IDEが、プログラミングの基本的な必需品の一部を返すメソッドを持つオブジェクトをそのアクセサーに注入することです。String
クラス、Number
クラス、Array
クラス、等々。
アプリケーションをテストする場合、ダミーメソッドを含むクラスを返すメソッドを持つplatform
オブジェクトを注入できFile
ます。アプリケーションをクラウドにデプロイする場合、File
クラスが実際にAmazon S3によってサポートされているプラットフォームを注入します。クロスプラットフォームGUIは、異なるOSに異なるGUIフレームワークを注入することにより機能します。Newspeakには、実験的なNewspeak-to-ECMAScriptコンパイラとHTMLベースのGUIフレームワークがあり、さまざまなGUI要素を挿入するだけで、フル機能のGUIアプリケーションを変更せずにネイティブデスクトップからブラウザに移植できます。
アプリケーションをデプロイする場合、IDEはアプリケーションをディスク上のオブジェクトにシリアル化できます。(その祖先であるSmalltalkとは異なり、Newspeakにはイメージ外オブジェクトシリアル化形式があります。すべての依存関係が注入されているため、イメージ全体を持ち歩く必要はありません。IDEはアプリケーションのシステムのどの部分を正確に認識しますそのため、アプリケーションを構成するオブジェクト空間の接続されたサブグラフを正確にシリアル化します。
これらはすべて、オブジェクト指向を極端に単純化することで機能します。すべてが仮想メソッド呼び出しです(Smalltalkの用語で「メッセージ送信」。Newspeakはその子孫です)。スーパークラスのルックアップでさえ、仮想メソッド呼び出しです!のようなものを取る
class Foo extends Bar // using Java syntax for familiarity
または、ニュースピークで:
class Foo = Bar () () : ()
Javaでは、これFoo
により静的なグローバル名前空間に名前が作成され、静的なグローバル名前空間で検索さBar
れ、Bar
Foo
のスーパークラスが作成されます。はるかに動的なRubyでも、グローバル名前空間に静的定数が作成されます。
Newspeakでは、同等の宣言は、という名前のゲッターメソッドを作成し、Foo
そのメソッドを呼び出してスーパークラスをルックアップするクラスを返すようにすることを意味しますBar
。注:これは、Rubyとは異なり、実行可能なRubyコードをスーパークラス宣言として配置できますが、クラスが作成され、そのコードの戻り値が固定スーパークラスになると、コードは1回だけ実行されます。いいえ。メソッドBar
はすべてのメソッドルックアップに対して呼び出されます!
これにはいくつかの深い意味があります。
- ミックスインは基本的にそのスーパークラスをまだ知らないクラスであり、Newspeakでは、スーパークラスは動的仮想メソッド呼び出しであり、したがって未知であるため、すべてのクラスは自動的にミックスインでもあります。ミックスインは無料で入手できます。
内部クラスはクラスを返すメソッド呼び出しに過ぎないため、外部クラスのサブクラスでそのメソッドをオーバーライドして、すべてのクラスを仮想化できます。仮想クラスは無料で入手できます。
class Outer {
class Inner { /* … */ }
}
class Sub extends Outer {
override class Inner { /* … */ }
}
ニュースピーク:
class Outer = () (
class Inner = () () : ()
) : ()
class Sub = Outer () (
class Inner = () () : ()
) : ()
スーパークラスはクラスを返す単なるメソッド呼び出しであるため、外部クラスのサブクラスでそのメソッドをオーバーライドできます。スーパークラスで定義された内部クラスは、サブクラスで異なるスーパークラスを持つことができます。クラス階層の継承は無料で取得できます。
class Outer {
class MyCoolArray extends Array { /* … */ }
}
class Sub extends Outer {
override class Array { /* … */ }
// Now, for instances of `Sub`, `MyCoolArray` has a different superclass
// than for instances of `Outer`!!!
}
ニュースピーク:
class Outer = () (
class MyCoolArray = Array () () : ()
) : ()
class Sub = Outer () (
class Array = () () : ()
) : ()
そして最後に、この議論で最も重要なのは、(クラスで定義したものを除いて)明らかに、レキシカルに囲むクラスと、最上位の最外クラスであるスーパークラスでのみメソッドを呼び出すことができるからです。明示的にインジェクトされたものを除いて、メソッドをまったく呼び出すことはできません。最上位クラスには、呼び出すことができるメソッドを含む囲みクラスがありません。また、スーパークラス宣言はメソッド呼び出し、そしてそれは明らかにスーパークラスに行くことができません(それはスーパークラス)が存在しているため、レキシカルに囲んでいるクラスにもアクセスできません。つまり、最上位クラスは完全にカプセル化され、明示的に注入されたものにのみアクセスでき、明示的に要求されたものにのみ注入されます。つまり、最上位クラスはモジュールです。モジュールシステム全体を無料で入手できます。実際、より正確には、最上位クラスはモジュール宣言であり、そのインスタンスはモジュールです。したがって、パラメトリックなモジュール宣言と一流のモジュールを備えたモジュールシステムを無料で入手できます。これは、非常に高度なモジュールシステムでもできないことです。
このインジェクションをすべて簡単にするために、クラス宣言には通常とは異なる構造があります。2つの宣言で構成されています。1つはクラスコンストラクターです。これは、クラスのインスタンスを構築するコンストラクターではなく、クラス本体が実行される環境を構築するコンストラクターです。Javaのような構文では、次のようになります。
class Foo(platform) extends Bar {
Array = platform.collections.Array
String = platform.lang.String
File = platform.io.File
| // separator between class constructor and class body
class MyArray extends Array { /* … */ }
// Array refers to the method defined above which in turn gets it from the
// platform object that was passed into the class "somehow"
}
ニュースピーク:
class Foo using: platform = Bar (
Array = platform collections Array
String = platform streams String
File = platform files ExternalReadWriteStream
) (
class MyArray = Array () () : ()
) : ()
Newspeakプログラマーが実際にクラスを見る方法は次のとおりです。
しかし、私は正義を行うことさえできません。あなたは自分でそれをいじる必要があります。Gilad Brachaは、モジュール性など、システムのさまざまな側面についていくつかの講演を行っています。彼は非常に長い(2時間)講演を行いました。最初の1時間は、モジュール性の話を含め、言語の徹底的な紹介です。The Newspeak Programming Platformの第2章では、モジュール性について説明しています。あなたは脱脂した場合のSqueak上のニュースピーク-困惑のためのAガイド(別名ニュースピーク-101)は、システムのための感触をつかみます。Example by Newspeakはライブドキュメントです(つまり、Newspeak-on-ECMASCriptポート内で実行され、すべてのコード行が編集可能で、すべての結果が検査可能です)。基本的な構文を示しています。
しかし、実際には、それをいじる必要があります。それはすべての主流の言語やほとんどの非主流の言語とはまったく異なるため、説明するのは難しいので、経験する必要があります。