通用功能集的设计 - 分割数据和代码

时间:2012-12-14 19:53:17

标签: perl

我是Perl编程的新手,想了解一下以Perl模块的形式构造一段代码的最佳方法。它应该提供一个框架,使“数据”可以在不影响代码的情况下增长/缩小。

基本上,程序需要执行3个不同的事情('数据'部分):

  1. 从多个文件(整个文本)中收集文本,具体取决于主机上安装的RPM(RPM名称分别为'A','B','C',为了参数)。文件列表将会增长,并应存储在一个易于编辑的简单外部化文件中。
  2. 在操作系统(Linux)上运行OS命令,并将命令输出捕获到文本文件中,具体取决于RPM(RPM名称='A','B','C',为了参数的缘故)安装在主机上。
  3. 在特定数据库上运行数据库命令(我们称之为'DBA','DBB','DBC',3个主机对应3个主机)并将输出捕获到文本文件,具体取决于哪个RPM(RPM名称=主机上安装了'A','B','C',为了论证。

我需要以这样一种方式对逻辑进行编程:

  1. 必须有一个“RPM to file / command / DB-command”映射,它可以与主要的Perl程序分开编辑
  2. 文件数量,名称/位置+ OS + DB命令预计会发生变化,因此应该可以与主要的Perl程序分开编辑
  3. RPM名称和上述数据的映射可以更改,因此应该可以与主要的Perl程序分开编辑

到目前为止我研究过的想法:

  1. 散列哈希(在Perl模块中)
  2. 数组数组(在Perl模块中)
  3. 外部XML
  4. 外部键值对文件
  5. 有关最简单,最简单的方法的指导是什么?说明性的代码将非常有用。

1 个答案:

答案 0 :(得分:1)

如何存储配置取决于它的复杂程度,以及对未编程系统的人员的访问权限。

将配置存储为Perl代码的好处是,解析非常便宜。但是,可能存在安全问题,因为配置文件不会被加载,而是被执行。而且,这是一个可怕的设计。

XML非常灵活,但是(a)手动编辑非常糟糕,并且(b)处理成本比其他解决方案 [citation needed]

如果您的配置数据可以非常容易地表示为键值对,那就去做吧。另外,看看JSON或YAML,它将为您提供所需的所有功能(大部分时间)。


我会以这样的方式编写系统,即在程序开始时加载主对象。构造函数将RPM类型作为参数,并处理相应的配置文件。

然后,您将创建此对象的接口,以便处理文本文件,运行系统命令和运行数据库查询将使用正确的配置值。

请确保使您的代码更好并且通用,以便程序的主要逻辑不需要知道它使用的RPM,除了初始化。

Perl类通常同时是一个模块。在合理的情况下,根据需要创建辅助模块。



示例构造函数:

package MyObject;
use strict; use warnings; use Carp;
use YAML qw(LoadFile);
my $config_file_dir = "/foo/bar/";
sub new {
   my ($class, $type) = @_;
   do_rpm_type_sanity_check($type) or confess qq(Invalid type given: $!);
   my $self = LoadFile($config_file_dir . $type . ".yaml");
   do_config_sanity_check($self) or confess qq(Really weird configuration: $!);
   bless $self, $class;
}

使用示例

#!/usr/bin/perl
use strict; use warnings;
use MyObject;

my $type = magically_get_type();

my $obj = MyObject->new($type);
...; # do something useful with the object.