Smalltalkの「become:」の用途は何ですか?


12

become:Smalltalk のメッセージは、1つのオブジェクトを別のオブジェクトに変更し、そのオブジェクトへのすべての参照に影響を与えます。

この言語機能にはどのような用途がありますか?実際のコードで使用されますか?それは単なる好奇心ですか?それを使用するのは良い/悪い習慣と見なされますか?

回答:


11

ギラッド・ブラシャbecome:ある程度の長さについて語っています:

Smalltalkの最もユニークで強力な機能の1つは、Smalltalkコミュニティ以外ではあまり知られていない機能の1つでもあります。これは、becomeと呼ばれる小さなメソッドです。

なるのは、受信者のIDと引数を入れ替えることです。つまり、後

なる:b

呼び出しポイントの前にaで示されたオブジェクトへのすべての参照は、bで示されたオブジェクトを参照し、逆も同様です。

これを内部化するために時間をかけてください。あなたはそれを些細なものと誤解するかもしれません。これは2つの変数を交換することではなく、文字通り1つのオブジェクトが別のオブジェクトになることです。この機能を備えた他の言語は知りません。それは巨大な力と危険の特徴です。

永続オブジェクトをサポートするために言語を拡張するタスクを検討してください。ディスクからオブジェクトをロードしたいが、それが一時的に参照するすべてのオブジェクトをロードしたくないとしましょう(そうでなければ、単なるオブジェクトの逆シリアル化です)。したがって、オブジェクト自体をロードしますが、直接参照をロードする代わりに、それらを殻オブジェクトに置き換えます。

殻は、セカンダリストレージの実際のデータの代わりになります。そのデータは遅延ロードされます。実際に外皮でメソッドを呼び出す必要がある場合、そのdoesNotUnderstand:メソッドは対応するデータオブジェクトをディスクからロードします(ただし、一時的にではなく)。

次に、bek:を実行し、殻へのすべての参照を新しく読み込まれたオブジェクトへの参照に置き換え、呼び出しを再試行します。

永続エンジンの中には、このようなことを何十年も行ってきたものがありますが、通常は表現への低レベルのアクセスに依存していました。なる:ソースコードレベルでこれを行うことができます。

Javaでこれを行ってください。または、別の動的言語でも。この方法で先物の一般的なフォームを実行できるため、怠であることを認識するでしょう。実装の仕組みへの特権アクセスなし。また、インスタンス変数をクラスに追加する場合など、スキーマの進化にも役立ちます。必要に応じて、すべてのインスタンスを「再形成」できます。

もちろん、次のように使用するべきではありません:何気なく。これにはコストがかかりますが、多くの実装では禁止されている場合があります。初期のSmalltalkでは、すべてのオブジェクトがオブジェクトテーブルを介して間接的に参照されていたため、安価になりました。オブジェクトテーブルがない場合は、次のようになります。ガベージコレクターと同様の方法でヒープを走査します。メモリが多いほど、より高価になります。

オブジェクトテーブルがあるとストレージが占有され、アクセスが遅くなります。しかし、それはあなたに大きな柔軟性をもたらします。ハードウェアのサポートにより、パフォーマンスの低下を緩和できます。利点は、前もってオブジェクトテーブルを介して間接的なコストを支払う意思がある場合、多くの難しい問題が非常に扱いやすくなることです。覚えておいてください:コンピュータサイエンスのすべての問題は、間接レベルを追加することで解決できます。たとえば、Alex Warthには、このカテゴリに該当する非常に興味深い作品がいくつかあります。

Becom:いくつかのバリエーションがあります-1つの方法は、オブジェクトAのアイデンティティを別のオブジェクトBのアイデンティティに変更し、Aへの参照がBを指すようにします。Bへの参照は変更されません。一括で-配列内のすべてのオブジェクトのIDを(単方向または双方向に)変換するのが便利です。グループは次のようになります。原子的に魔法のように振る舞うのは、たとえばシステムに反射的な更新を実装するのに最適です。クラスとそのインスタンスのセット全体を一度に変更できます。

タイプセーフになることも考えられます。2つの方法は、AのタイプがBのタイプと同じ場合のみタイプセーフになりますが、1つの方法は、新しいオブジェクトが古いオブジェクトのサブタイプであることのみを要求します。

オブジェクトテーブルを作成することが実際に良いことであるかどうかを再検討するときが来るかもしれません。

実質的には、メタプログラミングの量を介した遅延読み込みの形式が得られます。Brachaが指摘しているように、これは非常に便利ですが、パフォーマンスに重大な影響を与える可能性があるため、危険でもあります。


私はもっと心配するだろうbecome...私のプログラムのパフォーマンスよりも私の正気上の影響
ベンジャミン・ホジソン

Hardware support could ease the performance penalty.私がこれを聞いたすべての場所の中で、Smalltalkコミュニティは最も有名です。代わりにパフォーマンスの向上、電力使用量の削減、または機能の向上につながる可能性があるのに、理想的なプログラミングパラダイムを有効にするためにハードウェアの改善を「費やす」必要があるのはなぜですか。
アレクサンダー-モニカーの復活

2

あまり使われていません。私が開いているPharo 5の画像には、#become:の送信者が9人いて、そのうち7人がユニットテストに参加しています。これは、コード生成のコンパイラーおよびFuelシリアル化ライブラリーで使用され、プロキシをコンテンツで置き換えます。


面白い。単体テストは何のためにそれを使用しますか?
dpk

それが機能するかどうかを確認するには...
ステファンEggermont
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.