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

为多个客户定制现有Perl程序部分的最佳方法是什么?,perl,inheritance,subclass,Perl,Inheritance,Subclass,我有一个部署到多个客户站点的现有Perl应用程序。不幸的是,代码已经被克隆了多次,以便为个别客户定制。因此,现在有几个完整的代码副本,它们都有轻微(或主要)的差异 我的任务是通过创建一个单一的、通用的代码库来解决这个问题,该代码库为不同的客户定制,这些客户被隔离在他们自己的库中 该应用程序已经有一个类层次结构(大约有120个类),大致如下: Control.pm \__ BaseJob.pm \___Job1.pm | |__

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

我的任务是通过创建一个单一的、通用的代码库来解决这个问题,该代码库为不同的客户定制,这些客户被隔离在他们自己的库中

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

Control.pm
  \__ BaseJob.pm
           \___Job1.pm
           |
           |__ Job2.pm
           |
           |__ Job3.pm
我的目标是通过只修改特定客户的库来定制特定的类或方法

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

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

然后在主程序中,执行以下操作:

Job2->some_method();
变成:

CustomJob2->some_method();
问题是,这将破坏所有其他客户的代码,因为他们的库中没有
CustomJob2
类。似乎我必须为每个客户向库中添加一个空的
CustomJob2

有更好的办法吗

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


我寻求大师们的智慧,寻找解决这个问题的最佳方法。

你们关于方向的大部分想法都是可靠的;当您调用Job2->somemethod()而不是$job->somemethod()时,就会出现问题。也就是说,您的类方法调用只是一个问题,因为它们首先是一个坏主意——您看到这一点是因为它们妨碍了您利用OOP

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

my $job2_class = $project->conf->{job2_class} || 'Job2';
my $job2 = new $job2_class;
$job2->some_method();

我强烈建议您在配置中尽可能多地进行定制,而不是编写代码

在配置对象中查找值的代码比实例化子类要简单得多


您还可以通过将类名放在配置文件中并基于这些名称实例化类来混合这两者。这使您可以更轻松地在两个或多个客户之间共享自定义设置。

实际上,大多数方法调用都使用对象,但对“new”的调用必须是类方法调用。但你是对的,一旦我有了目标,问题就消失了。您使用配置来确定类名的想法值得尝试。谢谢。我大部分时间都是这样做的,我需要这样的东西。说得好。通过配置进行定制是最终目标,但代码定制已经由我之前的人完成了。因此,第1阶段是隔离自定义代码,第2阶段是尽可能减少自定义代码,并改用config。