2010-01-28 8 views
5

Bir proje için Perl modülüm var. Bende bir düzine program var ve bir sürü çöp var. Daha önce DBI ile çok yakın kişisel zaman geçirmemiştim, bu yüzden bu parça düzeltilebilir, ama büyük olan şey büyük. Tam anlamıyla 2KLOC.Bir canavar Perl modülünü alt modüller halinde yeniden düzenlemenin iyi bir yolu nedir?

Bu işlevin ayrılmasının (Dumb.pm olarak adlandırın) ayrı modüllere (Dumb :: FormTools, Dumb :: Database, vb.) Ayrılması kolay olurdu. 'Dumb'ı kullan;'

Ben tekrar tekrar bu varyasyonları var kalmadan Dumb aracılığıyla Dumb :: veritabanı'nın ihraç işlevleri vermek istiyoruz

:

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

Ben yukarıda olduğumu değil. Bu, sorunun ele alınmasının aptal ve adaletsiz şekli gibi gözüküyor. Bir keresinde "daha iyi bilme" mazeretini kullandım ve bir zamanlar senden gerçekten daha fazla. Yardım et?

+2

içine bakmak isteyebilirsiniz, ancak özel bir 'yolları için' import' çağırır Dumb' 'de import' işlevi kullanabilirsiniz çeşitli çocuk modülleri. – daotoad

+2

Sadece 2k LOC? Vay, güzel küçük bir modül! ;) –

+3

... ve son işimde miras kaldığım 7K taahhüt kütükleri ile 14K canavarı vardı ... – Penfold

cevap

3

Şu anda nasıl kullandığınızdan emin değil misiniz (şu anda yöntemleri dışa aktarıyor mu?), Ancak işlevlerini içe aktarmanıza (Exporter kullanarak) izin vermek için yeni alt modülleri kurabilir ve sonra özgün modülü açıkça almalısınız. şimdi parçalanmış parçaları içe aktar. Şunlar gibi:

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

Sadece "Exporter qw (import) kullanıyorum" ifadesini kullandıysam işe yarayabiliyordum, ama bu onu işe alabildiğim anlamına geliyor. Teşekkür ederim! –

+0

Ayrıca, İhracatçı'dan da miras almam demek istedim. Bunun için düzeltildim, üzgünüm. – macabail

7

Size özel tavsiyelerde bulunmak zordur, çünkü farklı kod tabanları farklı stratejiler gerektirir. Bir alt modülün ve tekrarlanan kodun birçoğundan farklı olarak 500 satırlık altprogramlarla bir modülü yeniden düzenlerim. Arabirimi de değiştirmem gerekirse, bunun için farklı stratejiler var.

  1. Her şeyi kaynak kontrolüne alın. Orijinal ve ara sürümleri tutmaya devam etmelisiniz.
  2. Zaten bir test paketiniz yoksa, bir tane yazın. Test kapsamını olabildiğince yüksek tutun. Bu test paketi, gelecekteki sürümlerde, hatalarda ve hepsinde aynı davranışı korumak için temeldir. Muhtemelen orijinal modülde bir hatayı etkileyen bir programla karşılaşacaksınız.
  3. Bilgisayarı kapatmaya başlayın. Her adımda, kalan kısımların hala orijinal testleri geçtiğini ve yayınlanan arayüzün hala aynı davranışla sonuçlandığını kontrol edin.

Aslında asıl sorunuzu "Dumb yüklenen orijinal modüle nasıl dışa aktarırım?" Diye düşünüyorum. Exporter'ın import_to_level yöntemini kullanan kendi import rutinini sağlayabilirsiniz. Sizi yükleyen acil durumdan daha yüksek seviyelere alabilirsiniz. Dumb::Databaseimport, Dumb::Database yüklüyse Dumb öğelerini Dumb yüklenen ad alanına yükleyebilir.

+2

Neden import_to_level' tercih ettiğini anlamıyorum. 'Dumb', Dumb'ı kullanana kadar bir geriye dönük uyumluluk modülü olacak, 'özel programın ihtiyaç duyduğu modüllerle değiştirilebilir. Niçin 'import' 'Dumb' 'in yeni modülden aldığı fonksiyonları yeniden ihraç etmesine izin verdiğinde, hangi seviyeye ihraç edeceğine karar vermek zorunda olan her yeni modülde neden bir '' '' '' '' '' '' '' '' 'yazmanız gerekir? – cjm

+0

Eğer "Aptal" ın ayrı modüllere bölünmesi gerekiyorsa ve en üst düzey programlar, sadece "Dumb" kullanarak bu ayrı modüllerdeki ihracatı almak istiyorsa, o zaman "Dumb" içinde ithal etmek istemezsiniz. Ancak, OP'nin başka bir şey yapmak istemesi durumunda bunu bir çözüm olarak önermem. Buraya gitmek için birçok yol var. Cevabınız işe yarıyor, ama bence Dumb'a ithal etmek zorunda değilsiniz, aynı şeyi daha yüksek seviyeye ihraç edebilirsiniz. –

+0

OP'nin sorusunu anladığım kadarıyla, bir sürü farklı şey yapan dev bir modülü var. Bireysel modüller kullanmasını isterdi, bu yüzden bir betik sadece gerçekte kullandığını yükleyebilirdi. Ancak, “Dumb'u kullan” diyen ve doğru modülleri almak için onu tamir eden her programı izlemek zorunda kalmak istemiyor. Geriye dönük uyumluluk için mevcut ihracat ile bir Dumb.pm'ye ihtiyaç duyuyor, bu yüzden 'Dumb'ı kullanan programları yalnızca gerçekten ihtiyaç duyduğu modülleri kullanacak şekilde düzeltebiliyor. – cjm

3

Dumb.pm'in şu anda Exporter'ı kullandığını farz ediyorum. İşlevleri yeniden adlandırmak istemediğinizi varsayarak (sadece bunları ayrı modüllere ayırın), mevcut @EXPORT tanımlarını saklayabilir, alt modüllerinizden her şeyi içe aktarabilir ve işlevleri yeniden dışa aktarabilirsiniz.

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 etiketi

varsayılan olarak tanımlanmadı. Bunu manuel olarak tanımlamanız gerekir (her alt modülde).bir alt modül yok @EXPORT_OK fonksiyonları varsa

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

, o zaman :all etiketi atlayıp sadece use Dumb::Submodule; söylüyorlar.

1

Ayrıca doğru dürüst bir cevap yazmaya vaktim yok Sub::Exporter