Frage

Ich habe ein Perl-Modul für ein Projekt. Ich habe vielleicht ein Dutzend Programme aus ihm hängen und eine Menge davon ist Müll. Ich hatte nicht viel engen persönliche Zeit mit DBI vor ausgegeben, so dass ein Teil fixierbar ist, aber die große Sache ist, dass es groß ist. Wörtlich 2KLOCs.

Es wäre leicht, diese Funktion zu brechen (nennen wir es Dumb.pm) in separate Module (Dumb :: Formstähle, Dumb :: Datenbank, etc.), außer, wie ich schon sagte, es gibt viele Programme, die bereits ' verwenden Dumb;‘

Ich möchte Dumb :: Datenbank der exportierbare Funktionen durch Dumb exportieren, ohne Variationen dieses über müssen und immer wieder:

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

Es ist nicht, dass ich darüber bin. Es ist nur so, dass diese wie die stumm und unelegant Weise scheint das Problem der Handhabung. Früher habe ich die „Do not nicht besser wissen“ einmal entschuldigen, und einmal ist wirklich mehr, als Sie bekommen. Hilfe?

War es hilfreich?

Lösung

Nicht sicher, wie Sie gerade verwenden es (funktioniert es derzeit Methoden exportieren?), Aber Sie können die neue Kind-Module einzurichten, damit Sie ihre Funktionen (mit Exporteur) importieren, und dann nur noch das Original-Modul explizit importieren die jetzt ausgebrochenen Stücke. So etwas wie:

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;

Andere Tipps

Es ist schwierig, Ihnen spezifische Ratschläge zu geben, weil verschiedene Codebasen unterschiedliche Strategien erfordern. Ich Refactoring ein Modul mit 500-line-Subroutinen anders als eine mit kleinen Subroutinen und eine Menge wiederholt Code. Wenn ich auch die Schnittstelle ändern muß, gibt es verschiedene Strategien dafür.

  1. Holen Sie sich alles in der Quellcodeverwaltung. Sie müssen die ursprünglichen und Zwischenversionen halten um.
  2. Wenn Sie nicht bereits über eine Testsuite haben, schreiben Sie ein. Holen Sie sich das Testabdeckung so hoch wie möglich. Dieser Test Suite ist die Grundlage für das gleiche Verhalten in zukünftigen Versionen zu bewahren, Fehler und alle. Du bist wahrscheinlich ein Programm begegnen gehen, der auf einem Fehler in dem ursprünglichen Modul abhängig ist.
  3. Starten Sie hacken. Bei jedem Schritt prüfen, ob der Rest geht nach wie vor die ursprünglichen Tests und dass die veröffentlichte Schnittstelle noch Ergebnisse in dem gleichen Verhalten.

Ich denke, Ihre eigentliche Frage aber ist: „Wie ich den Export in den ursprünglichen Modul, das Dumb geladen?“. Sie können Ihre eigene import Routine bereitstellen, die Exporteurs import_to_level Methode verwendet. Sie können als die unmittelbaren einen zu höheren Ebenen importieren, die Sie geladen. Die Dumb::Database import kann somit seine Exporte in den Namensraum laden, die geladen Dumb obwohl es Dumb dass Lasten Dumb::Database.

Ich gehe davon aus, dass Dumb.pm derzeit Exporter verwendet. Unter der Annahme, dass Sie die Funktionen nicht umbenennen möchten (nur teilen Sie sie in separate Module), sollten Sie in der Lage sein, die bestehenden @EXPORT Definitionen zu halten, Import alles von Ihrem Submodule und einfach Reexport der Funktionen.

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;

Der :all-Tag ist nicht standardmäßig definiert. Sie müssen es (in jedem Modul) manuell definiert werden.

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

Auf der anderen Seite, wenn ein Submodul keine @EXPORT_OK Funktionen hat, dann können Sie den :all Tag überspringen und nur use Dumb::Submodule; sagen.

Sie können auch in aussehen wollen Sub :: Exporteur

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top