Вне моей головы (я еще ничего не реализовал), я мог бы сделать что-то вроде этого:
Создание таблиц базы данных для Customer
и License
. В пределах Customer
наряду со всей другой общей информацией о клиенте я бы добавил столбец для licenseType
, который будет reference
таблицей License
.
License
будет хранить licenseId
, а также любые соответствующие метаданные. Сюда не входят правила, относящиеся к лицензии.
На стороне кода я бы создал класс LicenseFactory
, который бы создал экземпляр интерфейса лицензии (ILicense
). ILicense
может выглядеть примерно так (в PHP):
interface ILicense
{
public isValid($customer);
}
Тогда у меня будут реализации для конкретной лицензии:
class TrialLicense implements ILicense
{
public isValid($customer)
{
// business logic for this specific license type here
}
}
Фабричный класс будет выглядеть примерно так:
class LicenseFactory
{
public static function getInstance($type)
{
switch($type)
{
case 0:
return new TrialLicense();
break;
}
}
}
Итак, мой код приложения может выглядеть примерно так:
public function isLicenseValid($customer)
{
return LicenseFactory::getLicense($customer->licenseType)->isValid($customer);
}
Ничего из этого не было проверено, и это только мои (довольно длинные) мысли. Надеюсь, это немного поможет (хотя ваше приложение может не управляться php :))
Edit:
Забыл упомянуть - сила в этом подходе - расширяемость. Каждый раз, когда вы хотите добавить новый тип лицензии, вы просто добавляете новую строку в таблицу License
и новую реализацию ILicense
с любыми необходимыми бизнес-правилами.