5

プロジェクト用の Perl モジュールがあります。おそらく十数個のプログラムがぶら下がっていて、その多くはゴミです。私はこれまでDBIと個人的な時間をあまり過ごしたことがなかったので、その部分は修正可能ですが、大きなことはそれが大きいということです。文字通り2KLOC。

この関数 (Dumb.pm と呼びましょう) を別々のモジュール ( Dumb::FormTools 、 Dumb::Database など) に分割するのは簡単です。 '

Dumb::Database のエクスポート可能な関数を、Dumb を介してエクスポートしたいと思います。このバリエーションを何度も繰り返す必要はありません。

sub my_dumb_function { return Dumb::Database::my_dumb_function( @_ ) ; }

私がそれを上回っているわけではありません。これは、問題を処理するためのばかげた、洗練されていない方法のように見えるだけです。私は一度「よくわからない」という言い訳を使いました。ヘルプ?

4

4 に答える 4

7

コード ベースが異なれば必要な戦略も異なるため、具体的なアドバイスを提供することは困難です。500 行のサブルーチンを含むモジュールを、小さなサブルーチンと多くの繰り返しコードを含むモジュールとは異なる方法でリファクタリングします。インターフェイスも変更する必要がある場合は、そのためのさまざまな戦略があります。

  1. すべてをソース管理に入れます。元のバージョンと中間バージョンを維持する必要があります。
  2. テスト スイートをまだ持っていない場合は、作成します。できるだけ高いテスト カバレッジを取得します。このテスト スイートは、将来のバージョン、バグなどで同じ動作を維持するためのベースラインです。おそらく、元のモジュールのバグに依存するプログラムに遭遇するでしょう。
  3. ハッキングを開始します。各ステップで、残りが引き続き元のテストに合格し、公開されたインターフェースが引き続き同じ動作になることを確認します。

ただし、実際の質問は「ダムをロードした元のモジュールにエクスポートするにはどうすればよいですか?」だと思います。importExporter のimport_to_levelメソッドを使用する独自のルーチンを提供できます。ロードした直前のレベルよりも高いレベルにインポートできます。したがって、 は、それが loadであっても、Dumb::Database importロードされた名前空間にそのエクスポートをロードできます。DumbDumbDumb::Database

于 2010-01-28T19:13:52.377 に答える
3

現在どのように使用しているかわかりませんが (現在、メソッドをエクスポートしていますか?)、新しい子モジュールをセットアップして、関数をインポートできるようにし (エクスポーターを使用)、元のモジュールに現在壊れているモジュールを明示的にインポートさせることができます。ピース。何かのようなもの:

package Dumb;

use Dumb::Database qw(my_dumb_function);

1;

package Dumb::Database;

use base qw(Exporter);

our @EXPORT_OK = qw(my_dumb_function);

sub my_dumb_function { 1; }

1;
于 2010-01-28T18:48:23.827 に答える
3

Dumb.pm は現在 Exporter を使用していると思います。関数の名前を変更したくない場合 (それらを個別のモジュールに分割するだけ)、既存の@EXPORT定義を保持し、サブモジュールからすべてをインポートして、単に関数を再エクスポートできるはずです。

package Dumb;
use Dumb::FormTools ':all';
use Dumb::Database  ':all';

use Exporter 'import';

our @EXPORT = ...;    # Unchanged from original version
our @EXPORT_OK = ...; # Unchanged from original version

1;

タグは:allデフォルトでは定義されていません。手動で(各サブモジュールで)定義する必要があります。

our %EXPORT_TAGS = ( all => [ @EXPORT, @EXPORT_OK ] );
# or, for a module that doesn't export anything by default:
our %EXPORT_TAGS = ( all => \@EXPORT_OK );

一方、サブモジュールに機能がない場合は、タグを@EXPORT_OKスキップして.:alluse Dumb::Submodule;

于 2010-01-28T19:25:05.097 に答える
1

Sub::Exporterも調べてみてください。

于 2010-01-29T00:08:02.777 に答える