我想重新编写这些库,在必要时使用更多模块和OOP.我目前正在讨论如何设置主库,Perl脚本将包括使用Net :: SFTP来放置/获取文件,以及Crypt :: PGPSimple来加密/解密文件.
库模块应该用OOP编写吗?那有意义吗?或者是否应根据需要导入(并按程序设计)方法,并根据需要创建Net :: SFTP和Crypt :: PGPSimple对象?我只是不确定我是否想创建一个lib对象,并在新的sub中初始化SFTP,PGP,Constants等.我想我看到这种类更像是一个带有静态方法的Java类,但是应该只有一个SFTP对象/连接(不确定Net :: SFTP是否已经处理过这个?),还有一个Crypt :: PGPSimple,等等
此外,回到冗余,该库还应该有一个父类,它定义了许多第三方库使用的功能(FTP,PGP等).
我不是在寻找一个明确的答案,因为可能没有一个,但也许其他人如何接近这样的设计,以及最有意义的是什么.
谢谢
更新:添加了我的OOP库模块的示例代码,该代码还使用了其他对象(PGPSimple,SFTP).如果您能想到更好的设计/实施,请告诉我.再次感谢.
lib.pm
use Crypt::PGPSimple;use Net::SFTP;use file::copy;use Log::Log4perl qw(get_logger :levels);use file::Basename;my %CONS = ( RECIPIENT => "ClIEntname"; URL => 'ftp.host.com'; USER => 'user'; PASS => ''; # use subroutine to obfuscate the password PORT => '22' HOME_DIR => '/Home'; IN_DIR => '/Incoming'; OUT_DIR => '/Outgoing';);my %VARS;# private member variablesmy ($logger);BEGIN { %VARS = ( IS_PROD => $L_is_prod ? 1 : 0; APPS => $ENV{'APPS'}; OUTDIR => $ENV{'OUTDIR'}; TIME_ZONE => $ENV{"TZ"}; ); $logger = get_logger("lib");}sub new { my ($class,$self) = @_; $self = { pgp => _setup_pgp(); sftp => undef; # Don't create SFTP connection until we need it }; return bless($self,$class);}sub _setup_pgp { my $pgp = Crypt::PGPSimple->new(); $pgp->PgpVersion(6.5.8); $pgp->PgpExePath("/path/to/pgp-6.5.8"); $pgp->PgpKeyPath("/home/username/.pgp"); # Set this based on environment $pgp->PublicKey("pubring.pkr"); $pgp->PrivateKey("secring.skr"); $pgp->Password(pp()); $pgp->UserID(); $pgp->PgpTempDir("/tmp/"); $pgp->PgpTimeZone(); $pgp->PgpVerbose(2); return $pgp;}sub _setup_sftp { # Create SFTP connection my $sftp; my ($host,$user,$pass); $host = $CONS{URL}; $user = $CONS{USER}; $pass = $CONS{PASS}; $sftp = _connect_sftp($host,(user => $user,password => $pass)); return $sftp;}sub encrypt { my ($self,$plain_file) = @_; my $pgp = $self->{pgp}; $logger->info("Setting $pgp->PlainTextfile to $plain_file"); $pgp->PlainTextfile($plain_file); $pgp->PgpFlags("e"); my $result = $pgp->Encryptfile; if($result != 0) { $logger->info("Failed to successfully encrypt $plain_file. Error code: " . $pgp->ErrCode() . ",Result: " . $pgp->Result()); } return $result;}sub put { my $self = shift; $self->{sftp} = _setup_sftp() if(!defined $self->{sftp}); my $local = $self->{pgp}->EncryptedTextfile(); my $remote = basename($local); ... $sftp->put($local,$remote) ...}解决方法 如果我为每个实例需要某种状态,我倾向于使用OO.但我认为程序方法没有什么不好,不需要“状态”.
关于单一连接问题:我们(我的公司)使用“服务类”(过程),它返回一个合适的连接 – 如果使用线程/分支或者可能有多个连接(例如,使用不同的选项),这是很有用的.
更新:如果你决定去OO,我强烈建议尽可能使用Moose.它将为您节省大量的时间,工作和错误…看看,有多么幸运的参考工作,但使用Moose或鼠标代码.
总结以上是内存溢出为你收集整理的perl – OOP /程序设计问题全部内容,希望文章能够帮你解决perl – OOP /程序设计问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)