Привет!
Я пытаюсь решить, какой подход лучше всего реализовать в следующем сценарии:
Транспортное средство и Деталь - это "предметы", которые могут быть Предметом в Инвентаризации.
Транспортное средство имеет обычный VIN, год, марку, модель, тип и т. Д., И т. Д., В то время как деталь имеет PartNumber, QuantityOnHand, IsPartOfSet, Vendor ...
При «складировании» в Инвентаризации как товара оба имеют RetailPrice, PurchasePrice, PurchaseDate, но в то же время имеют множество других свойств, которые не являются общими
(например, у транспортного средства есть CurrentM Пробег, NewOrUsed и т. д. и т. д., в то время как у части есть TreshholdCount, LastCountDate и т. д. и т. д.)
Таким образом, вы можете видеть, что и Деталь, и Автомобиль могут быть в Инвентаризации, но у них очень мало общих свойств (больше, чем у них) ...
В сценарии выше я пытаюсь выбрать один из нескольких подходов:
Вариант 1 - Отдельные классы для всего (без наследования)
- Автомобиль - общие свойства автомобиля (VIN, год, марка, модель и т. Д.)
- VehicleInventoryItem - содержит ссылку на Vehicle и содержит другие специфические для инвентаря свойства (цены, гарантии, статус)
- VehicleInventoryManager - синглтон с бизнес-логикой, добавление, удаление, уведомление и т. Д. И т. Д.
- Часть
- PartInventoryItem
- PartInventoryManager
Я думаю, что этот подход является наиболее гибким, хотя и страдает от повторения некоторых свойств. У менеджеров тоже могут быть самые разные методы ...
Вариант 2 - Базовый класс простого наследования
- Автомобиль - такой же, как вариант 1
- Деталь - так же, как вариант 1
- InventoryItem - базовый класс
- VehicleInventoryItem - расширяет InventoryItem, ссылки Автомобиль
- PartInventoryItem - расширяет InventoryItem, ссылается на Part
- InventoryManager - все методы принимают InventoryItem в качестве параметров
При таком подходе меня беспокоит загрязнение InventoryManager различными операциями, необходимыми для деталей по сравнению с транспортными средствами
Вариант 3 - Обобщения
- Item - где T будет частью или транспортным средством (я могу даже сказать более конкретно, например, - VehicleItem: Item)
- Инвентарь - содержит ссылку на элемент
- InventoryManager - синглтон, работающий на T
В этом подходе меньше классов, но я снова беспокоюсь об InventoryManager
Резюме
- Транспортное средство и деталь имеют очень мало свойств при хранении в Inventory.
- Управление запасами для Транспортного средства и его частей также будет в основном различным (детали «переупорядочиваются», когда количество в наличии мало, при продаже транспортного средства аналогичная может быть приобретена, но она уникальна)
- В моем сценарии не будет других объектов / моделей, которые можно было бы "запасать" (находиться в инвентаре любого вида)
Вопросы
Что думает сообщество? Есть ли другой подход (возможно, интерфейсы?)
Если 2 объекта домена имеют хотя бы одно свойство (например, PurchasePrice), следует ли иметь такое наследование (например, вариант 2 или 3)