为多个客户定制现有Perl程序部分的最佳方法是什么?

nos*_*nky 5 perl inheritance subclass

我有一个现有的Perl应用程序,它部署到多个客户站点.不幸的是,代码已被多次克隆,以便为个人客户进行定制.因此,现在有几个完整的代码副本,它们都有轻微的(或主要的)差异.

我的任务是通过创建一个单独的通用代码库来解决这个问题,该代码库具有针对不同客户的自定义库,这些客户端被隔离在他们自己

该应用程序已经具有类层次结构(大约120个类),其行如下:

Control.pm
  \__ BaseJob.pm
           \___Job1.pm
           |
           |__ Job2.pm
           |
           |__ Job3.pm
Run Code Online (Sandbox Code Playgroud)

我的目标是通过仅修改特定客户的库来定制特定的类或方法.

我的第一直觉是为需要为特定客户定制的任何东西创建子类.这些子类将存在于客户特定的lib目录中(每个客户一个).然后,为了为客户定制类或方法,我只需要向客户库添加一个新的子类.

例如,如果Job2.pm需要自定义一个方法,我可能会创建一个子类CustomJob2,该子类继承Job2并仅包含要自定义的方法.

然后在主程序中,这个:

Job2->some_method();
Run Code Online (Sandbox Code Playgroud)

变为:

CustomJob2->some_method();
Run Code Online (Sandbox Code Playgroud)

问题是这会破坏所有其他客户的代码,因为他们CustomJob2的库中没有类.看来我必须CustomJob2为每个客户为库添加一个空类.

有没有更好的办法?

我考虑过的另一种可能性是使用覆盖而不是子类.主程序只需要use lib包含客户库,任何要定制的方法都可以在库中重新定义.然而,这可能是危险的,不被视为最佳做法.

我寻求StackOverflow专家的智慧,找到解决这个问题的最佳方法.

cha*_*aos 4

你对前进方向的大多数想法都是坚定的;当您调用Job2->some_method()而不是$job->some_method()时,问题就出现了。也就是说,您的类方法调用只是一个问题,因为它们从一开始就是一个坏主意——您看到这一点是因为它们干扰了您利用 OOP。

在您的情况下,我要做的是编写代码,以便使用对象方法调用而不是类方法调用,并为每个项目安装一个配置哈希,该配置哈希可用于告诉它要为给定目的使用哪个类。所以它看起来像这样:

my $job2_class = $project->conf->{job2_class} || 'Job2';
my $job2 = new $job2_class;
$job2->some_method();
Run Code Online (Sandbox Code Playgroud)