web-dev-qa-db-ja.com

SmalltalkとJavaのOO)の主な違いは何ですか?

SmalltalkとJavaのOO)の主な違いは何ですか?

私はJavaプログラマーであり、Smalltalkを探索して視野を広げようとしていることに注意してください。現在、Javaよりも純粋であることを除いて、Smalltalkについてはほとんど何も知りません。したがって、その方法を示す回答をお勧めします。さまざまなJavaコンセプトは、対応するSmalltalkコンセプトにマップされ、Javaにはまったく存在しないSmalltalkコンセプトを紹介します。

38
Jim

メッセージパッシング

Smalltalkは、メソッドの呼び出しではなく、メッセージパッシングを使用します。区別は微妙ですが、非常に強力です。

いくつかの用語:_foo bar: baz_が与えられた場合、_#bar:_はselectorであり、fooは_#bar:_と呼ばれるメッセージのreceiverです(#はCommon LISPが_'bar_(またはさらに適切には_:bar_))と言うのとよく似た記号であり、baz引数またはパラメータ。行が実行されると、fooにメッセージ_#:bar:_が引数bazとともに送信されます。これまでのところ、それはかなり正常です。 Javaでは、foo.bar(baz);のようになります。

Javaでは、ランタイムシステムはfooの実際の型を把握し、最も適切なメソッドを見つけて実行します。

物事はほぼ Smalltalkでも同じように見えます。オブジェクトにメッセージを送信すると、そのメソッドディクショナリで、メッセージのセレクタの名前と一致する名前のメソッドが検索されます。見つからない場合は、スーパークラスのメソッドディクショナリなどで検索します。かなり普通のもの。

一致するメソッドが見つからない場合は、元のメッセージをパラメーターとして、_#doesNotUnderstand:_メッセージを送信します。 (はい、メッセージ送信はオブジェクトです。)しかし、_#doesNotUnderstand:_も単なるメソッドです。あなたはそれを上書きすることができます。

たとえば、受信した他のメッセージをデリゲートオブジェクトに転送しながら、メッセージのセットに応答するオブジェクトを作成できます。 _#doesNotUnderstand:_をオーバーライドすると、プロトコルをデリゲートと同期させるためにメンテナンスを必要としないプロキシがあります。

簡単な構文

いいえ、冗談ではありません。 Smalltalkの文法全体はおそらく15行の長さです。 JLSは...そうではありません。なぜ気にするのですか?単純な構文により、コードのチャンクを簡単に分解できます。メタプログラミング!リファクタリング!

構文なし:

  • 条件文:_(n < 3) ifTrue: ['yes'] ifFalse: ['no']_
  • forループ:_1 to: 10 do: [:i | Transcript show: i asString]_
  • try-catch:_[i := i / 0] ifError: ['oops!']_
  • 最後に試してください:_[i := i / 0] ensure: [stream close]_

そして、それらすべての_[]_ sに注意してください-クリーンな構文を持つファーストクラスのクロージャ。

41
Frank Shearar
  1. オブジェクトモデル。Smalltalkでは、すべてのものがオブジェクトです。 Javaには、intやfloatなどのプリミティブ型があり、その表現と動作は複雑なオブジェクトとは異なります。
  2. 動作の呼び出し。Smalltalkオブジェクトの動作は、メッセージを送信することによって呼び出されます。 Javaには、基本的に関数呼び出しであるメソッドがあり、宛先オブジェクトはthisと呼ばれる特別な最初の引数です。
  3. カプセル化。Smalltalkには厳密なカプセル化があります。オブジェクトのフィールドは、メッセージを介してのみ公開できます。対照的に、Javaはパブリックフィールドを許可します。
  4. ダイナミズム。Smalltalkは非常に動的です。すべてのタイプは実行時に識別されます。クラスは実行時にイントロスペクトおよび変更できます(動的メタプログラミング!)。新しいクラスは、実行時に作成およびインスタンス化できます。 Javaには、ランタイムポリモーフィズムとともに静的型チェックがあります。イントロスペクションとリフレクションがありますが、実行中のプログラム内からクラスとオブジェクトを変更することはできません。
  5. 構文。Smalltalkには構文がありません。代わりに、メッセージを送信するためのシンプルで一貫性のある形式があります。 Javaは、Cファミリーの他の言語と同様に、複雑な構文を持っています。
  6. 環境。ほとんどのSmalltalk実装は、 イメージベースの永続性 を備えた完全なスタンドアロンのライブコンピューティング環境を提供します。これらの環境のいくつか ベアメタルで起動することもできます 。次に、JVMは通常、スレッド化、ネットワーキングなどの基盤となるオペレーティングシステムに依存します。ソースコードはテキストファイルに入力し、コンパイルして、実行のためにJVMに明示的にロードする必要があります。
19
Vijay Mathew

JavaとSmalltalkの主な違いは、Smalltalkにはファーストクラスのクラスがあることです(しゃれは意図されていません)。

Smalltalkのクラスはオブジェクトです。 staticメソッドと変数に最も近いのは、Frank Shearerによる 言及 のように、クラス側のメソッドと変数です。

しかし、この違いは、継承が使用されるとすぐにさらに深刻になります。 Javaでは、クラス側の継承は存在しませんが、Smalltalkでは可能です。

クラスABを継承し、abのインスタンスであるABがある場合_、Smalltalkでは、_b class_は_a class_から継承します。これは、Java where a getClass()b getClass()が互いに関連していないClassのインスタンスを返す場合には当てはまりません。 。

ここで、クラスAがシングルトンパターンを実装しているとしましょう。クラス側フィールドinstanceとゲッターメソッドinstanceがあります。クラスBは、独自のinstanceフィールドを持つ別のオブジェクトです。結果として、_A instance_と_B instance_は異なるオブジェクトを返します。

これは明らかに、SmalltalkとJava a OOの観点からの大きな違いの1つです。

その他の違いには、メタクラスの存在、拡張メソッド、ダックタイピングと静的タイピング、doesNotUnderstandの具体化、およびSmalltalkまたはJava.

そしてもちろん、SmalltalkにはJavaまだ欠けているクロージャがあります。

参照 なぜJava静的メソッドのオーバーライドを許可しないのですか?

18
ewernli

smalltalkを探索して視野を広げようとしています

Smalltalkを積極的に探索しようとしている場合は、Smalltalkの読み方を知る必要があります-

"私はC++を読むことができますJavaしかし、私はSmalltalkを読むことができません" pdf

12
igouy

Javaに存在しないが、近年ますます人気が高まっているSmalltalkの概念の1つはブロックです。ブロックは、定義されたコンテキストを含む無名関数の形式です。重要なのは、ブロックはSmalltalkには、実際には組み込みのif-ステートメントやfor-ループなどがありませんでしたが、メッセージパッシングとブロックだけで同じ効果を生み出すことができました。

object isBig ifTrue: [self runIntoObject:object] 
            ifFalse: [self katamariBall absorbObject:object].

1 to: 10 do: [:number | number print]
8
Chuck

SmalltalkではすべてがオブジェクトですがJavaでは、小さな整数のようなものはまだファーストクラスのオブジェクトではありません。また、Smalltalkでは純粋なOO性質と強力な反射機能。整数が小さいか大きいか、小さい整数がオーバーフローして大きい場合にどうなるかなど、数値のサイズを気にする必要はありません。

7
Janko Mivšek

@JankoMivšekがすべてを意味するとき、彼は本当にすべてを意味します。 :)

メッセージ送信まででさえ、あなたがしていることは、コンテキストであるオブジェクトを作成することです。

また、Smalltalkにないのは、アクセス修飾子(private/protected/public)です。一部のSmalltalk実装にはパッケージがなく、ほとんどのSmalltalk実装パッケージにはJavaと同じセマンティクスがありません。

Smalltalkには、try/catchのような制御構造がありません... Smalltalkにはブロッククロージャがあるため、制御構造は必要ありません。

Smalltalkでは、静的メンバーはなく、代わりにオブジェクトであるクラスがあります(クラスにメッセージを送信したり、変数にクラスを保持したりすることもできます)。

Smalltalkには、ネストされたクラスはありません。

.。

5
mathk