Что хороший путь состоит в том, чтобы осуществить рефакторинг модуль Perl монстра в подмодули?

У меня есть модуль Perl для проекта. У меня есть, возможно, дюжина программ, зависающих от него, и многое из него является мусором. Я не провел много близкого персонального времени с DBI прежде, так, чтобы часть была закрепляемой, но большая вещь состоит в том, что это является большим. Буквально 2KLOCs.

Было бы легко разбить эту функцию (давайте назовем это Dumb.pm) в отдельные модули (Немой:: FormTools, Немой:: База данных, и т.д.) кроме, как я сказал, существует много программ, которые уже 'используют Немой';

Я хотел бы экспортировать Немой:: экспортные функции Базы данных через Немой, не имея необходимость иметь изменения этого много раз:

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

Не случается так, что я выше этого. Это просто, что это походит на немой и неэлегантный способ обработать проблему. Я использовал, "Не знают не лучше" оправдание однажды, и однажды действительно больше, чем Вы добираетесь.Помощь?

5
задан brian d foy 29 January 2010 в 01:09
поделиться

4 ответа

Не уверены, как вы используете его в настоящее время (в настоящее время он экспортирует методы экспорта?), Но вы можете настроить новые детские модули, чтобы позволить вам импортировать свои функции (с использованием экспортера), а затем просто иметь оригинальный модуль явно импорт Теперь сломанные части. Что-то вроде:

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;
3
ответ дан 18 December 2019 в 13:14
поделиться

Сложно дать конкретный совет, так как разные базы кода требуют разных стратегий. Я рефакторизирую модуль с 500-строчными подпрограммами иначе, чем модуль с маленькими подпрограммами и большим количеством повторяющегося кода. Если мне нужно изменить и интерфейс, то для этого есть разные стратегии.

  1. Перевести все в управление исходными текстами. Нужно сохранить оригинальную и промежуточную версию.
  2. Если у вас еще нет тестового набора, напишите его. Получите максимальное покрытие теста. Этот набор тестов является основой для сохранения такого же поведения в будущих версиях, ошибок и всего остального. Скорее всего, Вы столкнётесь с программой, которая зависит от ошибки в оригинальном модуле.
  3. Начинайте взламывать. На каждом шаге проверьте, что остальные все еще проходят оригинальные тесты, и что опубликованный интерфейс все еще приводит к тому же самому поведению.

Я думаю, что ваш актуальный вопрос - "Как экспортировать в оригинальный модуль, который загрузил Dumb?". Вы можете предоставить свою собственную процедуру импорта , которая использует метод Exporter's import_to_level. Вы можете импортировать в более высокие уровни, чем тот, который был загружен сразу же. Таким образом, Dumb::Database import может загружать свои экспортированные данные в пространство имен, которое загрузило Dumb, несмотря на то, что именно Dumb загружает Dumb::Database.

7
ответ дан 18 December 2019 в 13:14
поделиться

Я предполагаю, что DUBLE.PM в настоящее время использует экспортер. Предполагая, что вы не хотите переименовать функции (просто разделите их на отдельные модули), вы должны быть в состоянии сохранить существующие @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;

: все тег не определяется по умолчанию. Вы должны определить его вручную (в каждом подмодуле).

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 Функции, то вы можете пропустить тег : все и просто сказать , используйте тупого :: подмодуль; .

3
ответ дан 18 December 2019 в 13:14
поделиться

Вы также можете посмотреть в Sub::Exporter

1
ответ дан 18 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: