У меня два класса обслуживания. WarehouseManagementService предоставляет методы для администрирования складов и запасов. SalesManagementService предоставляет методы для управления клиентами и их заказами.
Для создания заказа необходимо проверить, достаточно ли количество товара в заказе. Для этого я бы использовал метод availableStock(Product p) в WarehouseManagementService. Но я не знаю, как правильно вызвать этот метод.
Нужно ли создавать экземпляр WarehouseManagementService в SalesManagementService? Или мне следует добавить WarehouseManagementServiceInterface в конструктор SalesManagementService (внедрение зависимостей)?
Как может выглядеть хорошая архитектура для достижения слабой связи этих двух классов?
Заранее спасибо.
public class WarehouseManagementService implements WarehouseManagementServiceInterface {
private DatabaseReadWarehouseInterface dbRead;
private DatabaseWriteWarehouseInterface dbWrite;
public int availableStock(Product p) {
// returns available quantity of product
}
}
public class SalesManagementService implements SalesManagementServiceInterface {
private DatabaseReadSalesInterface dbRead;
private DatabaseWriteSalesInterface dbWrite;
public void addOrder(Order o) {
// creates order, if product quantity is sufficient
}
}
Нет, я не использую Spring Framework. Поскольку это небольшой учебный проект, он не предназначен для использования
хорошо, тогда вам нужно создавать объекты услуг друг в друге
@Mustahsan: я не согласен. Также без использования Spring вы должны разъединить зависимости.
Зависимость от конструктора — лучший вариант вместо создания объекта класса.




У вас есть правильное ощущение: зависимость должна быть внедрена. Просто помните Принцип единой ответственности: «У класса должна быть только одна причина для изменения».
Построив WarehouseManagementService в SalesManagementService, вы добавите вторую причину для изменения SalesManagementService: когда изменится способ построения вашего WarehouseManagementService.
Чтобы решить эту проблему, вы можете либо использовать полноценную структуру внедрения зависимостей, либо просто начать с добавления параметра конструктора в SalesManagementService:
public class SalesManagementService implements SalesManagementServiceInterface {
private DatabaseReadSalesInterface dbRead;
private DatabaseWriteSalesInterface dbWrite;
private WarehouseManagementServiceInterface warehouseManagementService;
constructor(DatabaseReadSalesInterface dbRead,
DatabaseWriteSalesInterface dbWrite,
WarehouseManagementServiceInterface warehouseManagementService) {
this.dbRead = dbRead;
this.dbWrite = dbWrite;
this.warehouseManagementService = warehouseManagementService;
}
public void addOrder(Order o) {
// creates order, if product quantity is sufficient
}
}
Затем в вашем методе main позаботьтесь о создании экземпляра WarehouseManagementService и передайте его SalesManagementService.
В качестве побочного примечания вы можете переместить конструкцию SalesManagementService и WarehouseManagementService в фабрики, которые дают вам SalesManagementServiceInterface и WarehouseManagementServiceInterface, а не конкретные классы («программа для интерфейса, а не реализация»).
вы используете весенний фреймворк?