4

今日はおかしな状況でした(簡略化):

タイプAdapterがa#send#receiveメソッドを持つ通信オブジェクトがあります。私のアプリケーションはDRbによってそれと通信します。だから私のアプリケーションでは、私は、DRbObjectと言うことができますfoo

さて、

foo.send(msg, dest)

の代わりに#sendonを呼び出します。DRbObjectAdapter

もちろん、最も簡単な修正は、sendメソッドの名前を変更することです。ただし、ドキュメント/基盤となるAPIにできるだけ近づけたいと思います。

どう思いますか?メソッドの名前を変更する必要sendがありますか、それともこのためのきちんとした(ローカル)ハックがありますか?

4

1 に答える 1

2

DRbObjectは、を使用してリモートメッセージルーティングの魔法を実行し#method_missingます。したがって、明らかに、メソッドの定義を解除して、代わりにに委任する必要があります。#sendfoo#method_missing

foo.singleton_class.class_eval { undef_method :send }

または、よりオブジェクト指向の方法でそれを行うには:

AdapterDRbObject < DRbObject
  undef_method :send
end

これを行うべきかどうかについては、議論の余地があります。

オーバーライド/削除するのは実際には「大丈夫」#sendです。なぜなら、代わりに常に電話をかける必要があることを誰もが知っているはずだからです。#__send__(実際、を見るとDRbObject#method_missing、と呼ばれます#__send__。)

一方、これ#sendはRubyのかなりコアな概念であり、コードの将来のメンテナを混乱させる可能性があります。

于 2013-04-23T12:40:29.310 に答える