CallCenter (C#) ООП решение

Опубликовано Apr 24, 2013 в ООП | Нет комментариев

, , ,

CallCenter (C#) ООП решение

Для того, чтобы покончить с задачей про CallCenter, приведем решение, в котором ООП-принципы используются гораздо более широко, чем в предыдущем варианте. Смысл изменений – построение иерархии классов операторов Call-центра, с тем, чтобы было возможно естественным образом расширять поведение сущностей системы. Под этими сущностями понимаются сотрудники, выполняющие в том числе и функции оператора для звонка клиента. Поведение этих сущностей будет неизбежно будет разным, в зависимости от того, какую должность они занимают.

Из рисунка видно, что класс Operator  теперь стал использоваться как абстрактный базовый класс и из него убрано поле Rank, которое в предыдущем решении определяло тип сотрудника-оператора. Теперь эту информацию можно определить, основываясь на том, какой из производных классов использован для создания объекта, приведенного к базовому типу.

Имеются два варианта получения CallHandler.

  • Один из них внутри своей реализации анализирует непосредственные данные о производном типе объектов полиморфного контейнера. Недостатки – хардкод имени типа. Расширяемость: при добавлении нового типа оператора нужно переписать логику метода getCallHandler.
  • Второй вариант таков, что в каждом производном классе имеется переопределенный виртуальный метод, который возвращает числовую меру предпочтения оператора с данной должностью для выбора его при поступлении вызова. В результате сам метод выбора оператора на звонок написан короче и полностью универсально, но при добавлении нового класса сотрудника-оператора может оказаться, что нужно скорректировать эти значения в других классах.

Интересно попытаться придумать еще какое-нибудь лучшее решение.

Код классов для задачи Callcenter на C#

  public abstract class Operator
    {
        int m_Id;
        bool m_isFree;
 
        public Operator()
        {
        }
 
        public Operator(int _Id, bool _isFree)
        {
            Id = _Id;
            isFree = _isFree;
        }
 
        public int Id
        {
            get { return m_Id; }
            set { m_Id = value; }
        }
 
        public bool isFree
        {
            get { return m_isFree; }
            set { m_isFree = value; }
        }
 
        abstract public int GetAssignCallPreference();
    }
 
    public class OperatorManager : Operator
    {
        public OperatorManager(int _Id, bool _isFree)
            : base(_Id, _isFree)
        {
        }
 
        public override int GetAssignCallPreference()
        {
            return 2;
        }
    }
 
    public class OperatorGroupLead : Operator
    {
        public OperatorGroupLead(int _Id, bool _isFree)
            : base(_Id, _isFree)
        {
        }
 
        public override int GetAssignCallPreference()
        {
            return 1;
        }
    }
 
    public class OperatorOrdinal : Operator
    {
        public OperatorOrdinal(int _Id, bool _isFree)
            : base(_Id, _isFree)
        {
        }
 
        public override int GetAssignCallPreference()
        {
            return 0;
        }
    }
  class CallCenter
    {
        List _operators = new List();
 
        public void AddOperatorManager(int _Id, bool _isFree)
        {
            _operators.Add(new OperatorManager(_Id, _isFree));
        }
 
        public void AddOperatorGroupLead(int _Id, bool _isFree)
        {
            _operators.Add(new OperatorGroupLead(_Id, _isFree));
        }
 
        public void AddOperatorOrdinal(int _Id, bool _isFree)
        {
            _operators.Add(new OperatorOrdinal(_Id, _isFree));
        }
 
        public int getCallHandler()
        {
            if (_operators == null)
                return -1;
 
            Operator free_op = _operators.Where
                (x => x.isFree && x.GetType().ToString()
                    == "CALL_CENTER.OperatorOrdinal").FirstOrDefault();
 
            if (free_op == null)
                free_op = _operators.Where
                   (x => x.isFree && x.GetType().ToString()
                       == "CALL_CENTER.OperatorGroupLead").FirstOrDefault();
            else
            {
                return free_op.Id;
            }
 
            if (free_op == null)
                free_op = _operators.Where
                   (x => x.isFree && x.GetType().ToString()
                       == "CALL_CENTER.OperatorManager").FirstOrDefault();
            else
            {
                return free_op.Id;
            }
 
            if (free_op == null)
            {
                return -1;
            }
            else
            {
                return free_op.Id;
            }
        }
 
        public int getCallHandler1()
        {
            if (_operators == null)
                return -1;
 
            Operator free_op =
                _operators.Where(x => x.isFree).
                  OrderBy(x => x.GetAssignCallPreference()).FirstOrDefault();
 
            if (free_op != null)
            {
                return free_op.Id;
            }
            else
                return -1;
        }
    }
 class Program
    {
        static void Main(string[] args)
        {
            CallCenter callCenter = new CallCenter();
 
            callCenter.AddOperatorManager(1,  true);
            callCenter.AddOperatorGroupLead(2, true);
            callCenter.AddOperatorManager(3,  false);
            callCenter.AddOperatorOrdinal(4,  true);
            callCenter.AddOperatorManager(5, true);
            callCenter.AddOperatorGroupLead(6, false);
            callCenter.AddOperatorOrdinal(7,  true);
 
            int first_Free = callCenter.getCallHandler();
 
            int first_Free1 = callCenter.getCallHandler1();
 
        }
    }

By Galyna Miroshnychenko


Автор публикации: