我有一个部署到多个客户站点的现有 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
包含客户库,任何要定制的方法都将在库中重新定义。然而,这可能是危险的,不被认为是最佳实践。
我寻求 StackOverflow 大师的智慧来寻找解决这个问题的最佳方法。