perl – OOP 程序设计问题

perl – OOP 程序设计问题,第1张

概述我们有一些第三方Perl库用于传输文件,以及使用PGP加密/解密文件等.目前,这些库使用冗余代码,并使用system()和命令行二进制文件执行上述方法. 我想重新编写这些库,在必要时使用更多模块和OOP.我目前正在讨论如何设置主库,Perl脚本将包括使用Net :: SFTP来放置/获取文件,以及Crypt :: PGPSimple来加密/解密文件. 库模块应该用OOP编写吗?那有意义吗?或者是否 我们有一些第三方Perl库用于传输文件,以及使用PGP加密/解密文件等.目前,这些库使用冗余代码,并使用system()和命令行二进制文件执行上述方法.

我想重新编写这些库,在必要时使用更多模块和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 /程序设计问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1242300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存