Member 11732803 Ответов: 2

Как создать диаграмму классов отношений между сотрудниками и менеджерами


I'm having a difficult time trying to figure out how to model a certain scenario as a UML design class diagram.

Suppose I have the following situation: I have an employee called X who is the CEO of the company. A, B and C reports to X and U,V reports to A.

According to me, there should be an Interface called IEmployee which should have employee's name, designation and empNo. Employee class should implement this IEmployee. Manager class should implement Employee.


Что я уже пробовал:

интерфейс IEmployee
{
}
классный работник: IEmployee
{
}
классный руководитель: сотрудник
{
}

F-ES Sitecore

Они оба действительно являются сотрудниками, так что то, что у вас есть до сих пор, имеет смысл. Следующее, о чем вам нужно подумать, - это как вы управляете структурой отчетности. Если это так, что только менеджеры имеют людей, отчитывающихся перед ними, вам понадобится, чтобы ваш класс менеджера имел список объектов IEmployee, которые представляют, кто им отчитывается, поэтому следующий шаг-подумать о том, как вы можете этого достичь.

CHill60

В качестве альтернативы каждый объект Employee имеет атрибут ManagedBy. Для генерального директора это было бы равно нулю. Управляющий класс может иметь метод для определения своих непосредственных подчиненных. Таким образом, вы гарантируете, что сотрудник может появляться только в списке одного менеджера, например, когда они перемещают отдел, вам нужно обновить только один объект (сотрудник) вместо двух (старый менеджер, новый менеджер)

F-ES Sitecore

Или у вас может быть реализация "многие ко многим" между сотрудником и менеджером. Однако, учитывая, что это, очевидно, домашнее задание, я думаю, что более вероятно, что желаемое решение будет тем, которое требует больше размышлений в UML. Ваше решение-это просто одно свойство "ManagedBy", а все остальное делается в коде....это UML-упражнение, поэтому они захотят увидеть какой-нибудь Умлинг.

CHill60

ЛОЛ @ Умлинг. Тут есть новое слово! :-)

Member 11732803

Итак, вы думаете, что я должен добавить свойство в класс Employee под названием "ManagedBy", которое должно быть типа Manager, и оно будет нулевым для генерального директора.? @CHill60

F-ES Sitecore

Если бы это был я, я бы создал интерфейс IManager со свойством, представляющим собой набор объектов IEmployee, который представляет, кем управляет этот человек, а менеджер-это и IEmployee, и IManager. Однако есть много способов решить эту проблему, вам просто нужно пойти с тем, что, по вашему мнению, хочет собеседник.

CHill60

Согласно комментариям F-ES Sitecore - мое решение на самом деле не использует никаких знаний UML - но именно так я бы его реализовал - вам лучше Умлинг

Member 11732803

И да, вы правы насчет более Умлинговой требуемой части :P это то, что я искал некоторые идеи.

2 Ответов

Рейтинг:
1

RickZeeland

Вот пример сотрудника: Композитный шаблон проектирования в java - Java2Blog[^]
Поскольку Java не так уж сильно отличается от C#, я думаю, что вы можете понять это.

В случае, если вы ищете инструмент для построения диаграмм UML: Бест-ОМЛ-приложения-есть[^]


Member 11732803

Эта связь дала мне понимание. Я искал что-то вроде этого.Спасибо!!

Рейтинг:
0

BillWoodruff

Предположим, что все в компании являются сотрудниками:

public interface IEmployeeInfo
{
    string Name {set; get;}
    string Address {set; get;}
    decimal Salary { set; get; }
}

public interface IEmployee : IEmployeeInfo
{
    string Title{set; get;}
    IManager EManager { set; get; }
}
    
public interface IManager : IEmployee
{
    List<IEmployee> EmployeesManaged {set; }

    void AddManagedEmployee(IEmployee employee);
    void RemoveManagedEmployee(IEmployee employee);
    bool IsManagedBy(IEmployee employee);
}
Тогда работник будет наследовать от IEmployee, и менеджер будет наследовать с помощью imanager.

Обратите внимание на свойство 'set only 'EmployeesManaged в 'IManager: предполагая, что вы хотите инкапсулировать использование этого списка, вы можете использовать явную реализацию интерфейса в классе Manager:
private List<IEmployee> EmployeesManaged { get; set; }

// implicit interface impl.
List<IEmployee> IManager.EmployeesManaged
{
    set => this.EmployeesManaged = value;
}
Тогда только внутренние методы "менеджера" могут получить доступ к списку:
public void AddManagedEmployee(IEmployee employee)
{
    if (IsManagedBy(employee))
    {
        // throw error ?
    }
    else
    {
        EmployeesManaged.Add(employee);
        employee.EManager = this;
    }
}