У меня есть существующее приложение 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 в поиске наилучшего подхода к этой проблеме.