Назад к вопросам
OZON
Middle
8
Существует три метода, которые меняют информацию о товаре (изменяют состояние, изменяют состав тегов и задает вес). Так как в дальнейшем планируется добавить еще 10-20 методов которые меняют информацию о товаре (сами методы могут быть реализованы как nuget в другом сервисе) нужно реализовать единственный метод DoSomethingWithItem который в зависимости от входных параметров мог бы вызывать любое изменение товара. То есть методу может быть сказано "Поменяй состояние" или "Задай вес" и так далее и его реализация уже сама вызовет один из методов StateChanger.Change или WeightSetter.Set и т.д. Классы StateChanger, TagsSetter и WeightSetter можно менять. Главное сохранить бизнесовую функциональность. namespace ItemsService { public sealed class StateChanger { public enum State { Active, InActive } public void Change(int itemId, State newState) { } } public sealed class TagsSetter { public void Set(int itemId, string[] tags) { } } public sealed class WeightSetter { public void Set(int itemId, int weight) { } } public sealed class ItemsService { //public void DoSomethingWithItem } }
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Для реализации единого метода DoSomethingWithItem, который в зависимости от параметров вызывает нужный метод изменения товара, удобно использовать паттерн "Команда" или стратегию с делегатами.
Можно определить интерфейс или базовый класс для всех операций изменения товара, а затем в DoSomethingWithItem выбирать нужную реализацию по типу операции.
Пример с использованием делегатов и enum для типа операции:
namespace ItemsService
{
public sealed class StateChanger
{
public enum State
{
Active,
InActive
}
public void Change(int itemId, State newState)
{
// реализация изменения состояния
}
}
public sealed class TagsSetter
{
public void Set(int itemId, string[] tags)
{
// реализация установки тегов
}
}
public sealed class WeightSetter
{
public void Set(int itemId, int weight)
{
// реализация установки веса
}
}
public sealed class ItemsService
{
private readonly StateChanger _stateChanger = new StateChanger();
private readonly TagsSetter _tagsSetter = new TagsSetter();
private readonly WeightSetter _weightSetter = new WeightSetter();
public enum OperationType
{
ChangeState,
SetTags,
SetWeight
// позже можно добавить новые операции
}
public void DoSomethingWithItem(int itemId, OperationType operation, object value)
{
switch (operation)
{
case OperationType.ChangeState:
if (value is StateChanger.State state)
_stateChanger.Change(itemId, state);
else
throw new ArgumentException("Invalid value for ChangeState");
break;
case OperationType.SetTags:
if (value is string[] tags)
_tagsSetter.Set(itemId, tags);
else
throw new ArgumentException("Invalid value for SetTags");
break;
case OperationType.SetWeight:
if (value is int weight)
_weightSetter.Set(itemId, weight);
else
throw new ArgumentException("Invalid value for SetWeight");
break;
default:
throw new NotSupportedException("Operation not supported");
}
}
}
}
Такой подход позволяет централизованно вызывать нужные методы, а при добавлении новых операций достаточно расширить enum и добавить соответствующую логику. Классы StateChanger, TagsSetter и WeightSetter при этом остаются с прежним интерфейсом, бизнес-логика сохраняется.