Обратите внимание, что для всех случаев требуется модульный тест, а это C# без начального класса. У меня есть только
- ItemService.cs
- VendorReviewRepository.cs
- OurLocalBranchDataDB .cs
- OurOverseasDataDB.cs
- OverseasVendorDataDB.cs
- и другие классы интерфейса.
Но я **не думаю** что было бы неплохо добавить стартовый класс, поскольку перед нами стоят задачи, на которых мы должны сосредоточиться
GetItem(int itemId, bool isUrgent)
Класс InventoryService имеет метод GetItem.
public Order GetItem(int orderId, bool isUrgent)
Дело в исследовании
Это дешевле получить элементы от поставщиков и заставить их отправлять клиентам.
Но если мы получим срочный заказ, мы будем искать местный товар через нашу базу данных. Если заказ не срочный, мы получим его у поставщика, потому что на Дальнем Востоке дешевле получить товар у нашего поставщика. Однако отзывы о производителе ужасные. Мы постараемся получить его из нашего местного склада. Если на местном складе имеется менее 1000 запасов, мы получаем их из наших зарубежных запасов, которые мы предпочитаем зарезервировать для срочной доставки.
Метод GetItem извлекает элементы и возвращает их вызывающему объекту на основе следующая логика:
- Если параметр isUrgent действителен, извлеките элемент из нашего локального инвентаря.
Если это не срочно, система проверит, оправдал ли поставщик наши ожидания за последние три месяца, что неверно; у них не должно быть более трех отрицательных отзывов. - В противном случае попробуйте получить Товар из местного или нашего зарубежного инвентаря на основе запасы в локальном инвентаре
ItemService с Получить элемент
public ItemService(IVendorReviewRepository vendorReviewRepository, IDataAccess ourLocalBranchDataDB, IDataAccess ourOverseasDataDB, IDataAccess overseasVendorDataDB)
{
_vendorReviewRepository = vendorReviewRepository;
_ourLocalBranchDataDB = ourLocalBranchDataDB;
_ourOverseasDataDB = ourOverseasDataDB;
_overseasVendorDataDB = overseasVendorDataDB;
}
public async Task GetItem(int itemId, bool isUrgent)
{
if (isUrgent)
{
ItemDetail i = await _ourLocalBranchDataDB.LoadItemAsync(itemId); //local Branch
return i.ItemCode;
}
else
{
ItemDetail itemD = IsGoodVendor() ? await _overseasVendorDataDB.LoadItemAsync(itemId) : await _ourDB.LoadItemAsync(itemId);
if (itemD.HaveMoreThan1000Stock)
{
ItemDetail i = await _ourLocalBranchDataDB.LoadItemAsync(itemId); //local Branch
return i.ItemCode;
}
else
{
return itemD.ItemCode; // our overseas Branches
}
}
}
Все репозитории
public class OurLocalBranchDataDB : IDataAccess
{
public async Task LoadItemAsync(int id)
{
return ...;
}
}
public class OurLocalBranchDataDB : IDataAccess
{
public async Task LoadItemAsync(int id)
{
return ...;
}
}
public class OurOverseasDataDB : IDataAccess
{
public async Task LoadItemAsync(int id)
{
return ...;
}
}
public class OverseasVendorDataDB : IDataAccess
{
public async Task LoadItemAsync(int id)
{
return ...;
}
}
private bool IsGoodVendor() {
var badReviews = _vendorReviewRepository.GetBadReviews();
return ReviewHelper.IsBadVendor(badReviews.ToList());
}
Проведите рефакторинг кода в методе GetItem с помощью SOLID и простоты обслуживания
Что еще я могу улучшить для приведенного ниже метода?
У меня такое ощущение, что я могу больше, поскольку все...DataDB унаследована от IDataAccess
public Order GetItem(int orderId, bool isUrgent)
Подробнее здесь: https://stackoverflow.com/questions/785 ... et-c-sharp
Мобильная версия