Sobes.tech
Middle

Անհրաժեշտ է երեք մեթոդ, որոնք փոխում են ապրանքի մասին տեղեկատվությունը (փոխում են վիճակը, փոփոխում են տեգերի կազմը և սահմանում քաշը): Քանի որ ապագայում նախատեսվում է ավելացնել ևս 10-20 մեթոդ, որոնք փոխում են ապրանքի մասին տեղեկատվությունը (նույն մեթոդները կարող են իրականացվել որպես NuGet այլ ծառայությունում), անհրաժեշտ է իրականացնել միակ մեթոդ DoSomethingWithItem, որը կախված մուտքային պարամետրերից կարող է կանչել ցանկացած փոփոխություն ապրանքի վրա: Այսինքն, մեթոդին կարող է ասել «Փոխել վիճակը» կամ «Սահմանել քաշը», և նրա իրականացումը կկոչի մեկը մեթոդներից, ինչպես StateChanger.Change կամ WeightSetter.Set և այլն: Class-երը StateChanger, TagsSetter և WeightSetter կարող են փոփոխվել: Կարևորն այն է, որ պահպանվի բիզնես գործառնականությունը:

sobes.tech AI

Պատասխան 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 при этом остаются с прежним интерфейсом, бизнес-логика сохраняется.