加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – OOP /程序设计问题

发布时间:2020-12-16 06:18:24 所属栏目:大数据 来源:网络整理
导读:我们有一些第三方Perl库用于传输文件,以及使用PGP加密/解密文件等.目前,这些库使用冗余代码,并使用system()和命令行二进制文件执行上述方法. 我想重新编写这些库,在必要时使用更多模块和OOP.我目前正在讨论如何设置主库,Perl脚本将包括使用Net :: SFTP来放置
我们有一些第三方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 variables
my ($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或鼠标代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读