2010-01-28 19 views
5

Tôi có một mô-đun Perl cho một dự án. Tôi có thể có một tá chương trình treo nó và rất nhiều chương trình là rác. Tôi đã không dành nhiều thời gian cá nhân gần gũi với DBI trước đây, vì vậy mà một phần là fixable, nhưng điều lớn là nó là lớn. Nghĩa đen 2KLOC.Cách tốt nhất để cấu trúc lại mô-đun Perl quái vật thành mô-đun con là gì?

Sẽ dễ dàng chia nhỏ chức năng này (hãy gọi nó là Dumb.pm) thành các mô-đun riêng biệt (Dumb :: FormTools, Dumb :: Database, v.v.) ngoại trừ, như tôi đã nói, có rất nhiều chương trình đã 'sử dụng Dumb;'

Tôi muốn xuất khẩu chức năng xuất khẩu Dumb :: Cơ sở dữ liệu thông qua Dumb mà không cần phải có sự thay đổi điều này hơn và hơn nữa:

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

Nó không phải là tôi đang ở trên đó. Nó chỉ là điều này có vẻ như cách ngu ngốc và không thích hợp để xử lý vấn đề. Tôi đã sử dụng lý do "Không biết không tốt hơn" một lần, và một khi thực sự nhiều hơn bạn nhận được. Cứu giúp?

+2

Tôi không có thời gian để viết một câu trả lời thích hợp, nhưng bạn có thể sử dụng một tùy chỉnh 'import' chức năng trong 'Dumb' rằng tuyến đường gọi cho' import' đến các mô-đun con khác nhau. – daotoad

+2

Chỉ 2k LOC? Wow, một mô-đun nhỏ đẹp! ;) –

+3

... và sau đó có con quái vật 14K với 7K bản ghi cam kết mà tôi thừa kế trong công việc cuối cùng của tôi ... – Penfold

Trả lời

3

Không chắc chắn bạn đang sử dụng nó như thế nào (hiện tại nó có xuất phương pháp không?), Nhưng bạn có thể thiết lập mô-đun con mới để cho phép bạn nhập các chức năng của chúng (sử dụng Trình xuất), và sau đó chỉ có mô-đun gốc rõ ràng nhập khẩu các mảnh vỡ bây giờ. Một cái gì đó như:

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; 
+0

Tôi chỉ có thể làm cho nó hoạt động nếu tôi sử dụng "sử dụng xuất khẩu qw (nhập khẩu);", nhưng điều đó không có nghĩa là tôi đã có thể làm cho nó hoạt động. Cảm ơn bạn! –

+0

Bạn cũng có thể kế thừa từ Nhà xuất khẩu, đó là điều tôi muốn làm ở đó. Tôi đã sửa chữa cho điều đó, xin lỗi. – macabail

7

Rất khó để cung cấp cho bạn lời khuyên cụ thể vì các cơ sở mã khác nhau yêu cầu các chiến lược khác nhau. Tôi tái cấu trúc một mô-đun với các chương trình con 500 dòng khác với chương trình con với các chương trình con nhỏ và nhiều mã lặp lại. Nếu tôi cần phải thay đổi giao diện quá, có những chiến lược khác nhau cho điều đó.

  1. Đưa mọi thứ vào kiểm soát nguồn. Bạn cần giữ lại các phiên bản gốc và trung gian.
  2. Nếu bạn chưa có bộ thử nghiệm, hãy viết một bộ. Nhận phạm vi kiểm tra cao nhất có thể. Bộ thử nghiệm này là đường cơ sở để duy trì hành vi tương tự trong các phiên bản, lỗi và tất cả trong tương lai. Bạn có thể sẽ gặp phải một chương trình phụ thuộc vào một lỗi trong mô-đun ban đầu.
  3. Bắt đầu lấy cắp dữ liệu. Tại mỗi bước, hãy kiểm tra xem phần còn lại vẫn vượt qua các thử nghiệm ban đầu và giao diện đã xuất bản vẫn dẫn đến hành vi tương tự.

Tôi nghĩ câu hỏi thực tế của bạn là "Làm cách nào để xuất sang mô-đun ban đầu đã tải Dumb?". Bạn có thể cung cấp quy trình import của riêng mình sử dụng phương thức import_to_level của Nhà xuất khẩu. Bạn có thể nhập vào các cấp cao hơn cấp độ trực tiếp đã tải bạn. Do đó, Dumb::Databaseimport có thể tải xuất khẩu của nó vào không gian tên đã tải Dumb mặc dù nó là Dumb tải Dumb::Database.

+2

Tôi không thấy lý do bạn đề xuất 'import_to_level'. 'Dumb' sẽ là một mô-đun tương thích ngược cho đến khi' sử dụng Dumb; 'có thể được thay thế bởi các mô-đun riêng mà chương trình cụ thể cần. Tại sao bạn nên viết một 'import' tùy chỉnh trong mỗi module mới mà phải quyết định mức xuất khẩu nào khi' import' sẽ cho phép 'Dumb' tái xuất các hàm mà nó import từ các module mới? – cjm

+0

Nếu 'Dumb' cần được chia thành các mô-đun riêng biệt và các chương trình cấp cao nhất vẫn muốn xuất các mô-đun riêng biệt bằng cách sử dụng' Dumb', thì bạn không muốn nhập vào 'Dumb'. Tuy nhiên, tôi không đề xuất nó như là giải pháp nếu OP muốn làm điều gì đó khác. Có rất nhiều cách để đến đây. Câu trả lời của bạn hoạt động, nhưng tôi nghĩ rằng nó không đủ để bạn nhập vào Dumb chỉ để bạn có thể xuất cùng một thứ lên cấp cao hơn. –

+0

Khi tôi hiểu câu hỏi của OP, anh ta có một mô-đun khổng lồ thực hiện một loạt các thứ khác nhau. Anh ấy ước anh ta đã sử dụng các mô-đun riêng lẻ, vì vậy một tập lệnh có thể chỉ tải các mô-đun mà nó thực sự được sử dụng. Nhưng anh ta không muốn phải theo dõi mọi chương trình nói rằng 'sử dụng Dumb' và sửa nó để nhập các mô-đun chính xác. Anh ta cần một Dumb.pm với các xuất khẩu hiện có để tương thích ngược, vì vậy anh ta có thể dần dần sửa các chương trình mà 'sử dụng Dumb' để chỉ sử dụng các mô-đun mà họ thực sự cần. – cjm

3

Tôi giả sử rằng Dumb.pm hiện đang sử dụng Trình xuất. Giả sử bạn không muốn đổi tên các hàm (chỉ cần tách chúng thành các mô-đun riêng biệt), bạn có thể giữ các định nghĩa hiện tại @EXPORT, nhập mọi thứ từ các mô-đun con của bạn và chỉ cần xuất lại các hàm.

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; 

Thẻ :all không được xác định theo mặc định. Bạn phải định nghĩa nó theo cách thủ công (trong mỗi mô-đun con).

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

Mặt khác, nếu một submodule không có @EXPORT_OK chức năng, sau đó bạn có thể bỏ tag :all và chỉ nói use Dumb::Submodule;.

Các vấn đề liên quan