Почему наследование является плохой практикой в дизайне контрактов сообщений
По мнению создателей MassTransit, наследование на основе классов не считается хорошей практикой - https://masstransittemp.readthedocs.io/en/latest/overview/inheritance.html
Я честно не могу понять почему. Вот мой упрощенный сценарий из реальной жизни: представьте, что у меня есть страховой микросервис, который занимается полисами. Я заранее знаю, что все связанные с политикой события будут иметь обязательные поля, такие как: id, product и т. Д.
public class InsurancePolicyEvent
{
Guid EventId { get; set;}
Guid PolicyId { get; set; }
InsuranceProduct Product { get; set;}
}
Почему я не могу просто использовать наследование здесь и не повторять себя в унаследованных событиях, например так:
public class PolicyTerminated : InsurancePolicyEvent
{
...
}
public class PolicyIssued : InsurancePolicyEvent
{
...
}
1 ответ
Чтобы прояснить мою позицию, MassTransit рекомендует использовать интерфейсы вместо классов и совершенно доволен базовым типом, подобным тому, который вы показали выше, особенно когда это обязательное применение полей в качестве типа события.
Наследование на основе интерфейса в порядке, не бойтесь, но не сходите с ума.
И прямо под этим, да, наследование на основе классов не рекомендуется - главным образом потому, что разработчики часто делают с ним плохие вещи. Теперь то, что вы показали выше, хорошо, я не вижу проблем с этим.
Однако, как только ваш InsuranceProduct
класс начинает эволюционировать, и некоторые ожидания поведения диспетчеризации виртуальных методов базового класса начинают ползти в модель, что ведет к плохим временам. И это может быть не вы, это может быть менее опытный разработчик, который научился проектировать классы ОО и понял, почему не так?
Так что будьте осторожны там:)