SmalltalkとJavaのOO)の主な違いは何ですか?
私はJavaプログラマーであり、Smalltalkを探索して視野を広げようとしていることに注意してください。現在、Javaよりも純粋であることを除いて、Smalltalkについてはほとんど何も知りません。したがって、その方法を示す回答をお勧めします。さまざまなJavaコンセプトは、対応するSmalltalkコンセプトにマップされ、Javaにはまったく存在しないSmalltalkコンセプトを紹介します。
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']
_1 to: 10 do: [:i | Transcript show: i asString]
_[i := i / 0] ifError: ['oops!']
_[i := i / 0] ensure: [stream close]
_そして、それらすべての_[]
_ sに注意してください-クリーンな構文を持つファーストクラスのクロージャ。
this
と呼ばれる特別な最初の引数です。JavaとSmalltalkの主な違いは、Smalltalkにはファーストクラスのクラスがあることです(しゃれは意図されていません)。
Smalltalkのクラスはオブジェクトです。 static
メソッドと変数に最も近いのは、Frank Shearerによる 言及 のように、クラス側のメソッドと変数です。
しかし、この違いは、継承が使用されるとすぐにさらに深刻になります。 Javaでは、クラス側の継承は存在しませんが、Smalltalkでは可能です。
クラスA
がB
を継承し、a
とb
のインスタンスであるA
とB
がある場合_、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まだ欠けているクロージャがあります。
smalltalkを探索して視野を広げようとしています
Smalltalkを積極的に探索しようとしている場合は、Smalltalkの読み方を知る必要があります-
Javaに存在しないが、近年ますます人気が高まっているSmalltalkの概念の1つはブロックです。ブロックは、定義されたコンテキストを含む無名関数の形式です。重要なのは、ブロックはSmalltalkには、実際には組み込みのif
-ステートメントやfor
-ループなどがありませんでしたが、メッセージパッシングとブロックだけで同じ効果を生み出すことができました。
object isBig ifTrue: [self runIntoObject:object]
ifFalse: [self katamariBall absorbObject:object].
1 to: 10 do: [:number | number print]
SmalltalkではすべてがオブジェクトですがJavaでは、小さな整数のようなものはまだファーストクラスのオブジェクトではありません。また、Smalltalkでは純粋なOO性質と強力な反射機能。整数が小さいか大きいか、小さい整数がオーバーフローして大きい場合にどうなるかなど、数値のサイズを気にする必要はありません。
@JankoMivšekがすべてを意味するとき、彼は本当にすべてを意味します。 :)
メッセージ送信まででさえ、あなたがしていることは、コンテキストであるオブジェクトを作成することです。
また、Smalltalkにないのは、アクセス修飾子(private/protected/public)です。一部のSmalltalk実装にはパッケージがなく、ほとんどのSmalltalk実装パッケージにはJavaと同じセマンティクスがありません。
Smalltalkには、try/catchのような制御構造がありません... Smalltalkにはブロッククロージャがあるため、制御構造は必要ありません。
Smalltalkでは、静的メンバーはなく、代わりにオブジェクトであるクラスがあります(クラスにメッセージを送信したり、変数にクラスを保持したりすることもできます)。
Smalltalkには、ネストされたクラスはありません。
.。