0

plugin1.rbそれを取り込んでロードするルビースクリプトがあります。それから私は電話runplugin1、そのことをします。

その後、ロードplugin2.rbしてから を呼び出しrunplugin2その処理を実行することにするかもしれません。

2 つのプラグインは、実際に実行するための方法を提供するという事実を除けば、互いに何の関係もありませんrunが、クラスと定数を好きなように定義できます。

クラスの競合などが発生しない理由はないので、プラグインの実行が終了した後にクリーンアップするのが最善だと思います。

プラグインの 1 つを実際にロードする前に、以前のセッションから何かを適切にクリーンアップして、新しいスクリプトの準備ができるように、Ruby スクリプトをどのように記述すればよいですか?

どのようなものを削除する必要があるか、およびそれらを削除する方法を知りたいです。

アップデート

周りを見回すと、 を使用して定義された定数のリストを取得できますObject.constants。これには、ロードされたすべてのクラスとモジュールが含まれています。

だから私は次の行で何かを考えています

# get start-up constants
initial_consts = Object.constants

# load a plugin
load "plugin1.rb"

# get new constants
new_consts = Object.constants - initial_consts

# run plugin
test = NewClass.new #defined in plugin
test.run

# clean-up new things
new_consts.each {|c| Object.send(:remove_const, c) }

これは、変更されたクラスを「元に戻す」わけではありませんが、私の設計では、プラグインが特定の名前でクラスまたはメソッドを定義できないようになっているため、それほど大きな問題にはなりません。

4

1 に答える 1

2

ダメダメダメ。これはひどい。まず第一に、明日完全なたわごとコードを受け入れることを目標に、今日コードを書こうとするのは間違っています。理解しやすく、やや賢く、拡張可能なコードを書くことはできますが、次の開発者よりも賢いはずのコードを書こうとして捕まらないでください。

では、製図板に戻ってください。「プラグイン」とは何かについて知っていることや、PHP や C、その他のあまり動的でない言語についてこれまでに学んだことはすべて忘れてください。あなたのニーズは何ですか?今日機能し、明日拡張できる方法でそれらにどのように対処できますか? それをして、それ以上のことではありません。すべてのクラスに対してグローバル名前空間を使用してコードを記述しますか?それとも、これを防ぐために、ライブラリにちなんで名付けられたモジュールにクラスをカプセル化しますか?

クリーンルームなど、環境をロックダウンするために利用できるあらゆる種類のツールがありますが、これはまったく必要ないと思います. あらゆる可能性を処理するという野心的な目標を持って、あいまいなニーズに対応するコードを書くのをやめる必要があると思います。

于 2012-07-31T02:43:57.447 に答える