n-арная ассоциация в uml диаграмме

Непонятно как работает в данном примере ассоциация, как она представлена кодом, если есть возможность показать на любом языке для примера, буду рад помощи.


Ответы (1 шт):

Автор решения: Fat-Zer

На диограмме нет n-арных ассоциаций (связывающих одновременно более одной сущности) — обе ассоциации бинарные. Если всё же имелась в виду множественность (multiplicity, звёздочка рядом с линией ассоциации), то в самом примитивном случае такая ассоциация представляет из себя банальный массив указателей. На схеме нарисована следующая структура*:

class Client {
  int id;
  std::string name;
};

class Operation {
  double amount;
  std::string uid;
  std::vector<Client *> source; //< ассоциация с клиентами-источниками
public:
  void setAmount(double s);
};

class Transfert: public Operation { //< Перевод
  std::string comment;
  std::vector<Client *> receiver; //< ассоциация с получателями
}

class Payment: public Operation { //< Оплата
  std::string code;
}

Подразумеваются, но не указаны геттеры/сеттеры и конструкторы. Само собой, это один из вариантов. Вместо обычных указателей могут использоваться, например std::weak_ptr или что-то ещё, вместо вектора можно использовать динамический массив, хеш или связный список и т.п. — сути это не меняет. Внимание можно обратить на следующие детали:

  • т.к. рядом с концом ассоциации «источник» есть точка, то этим концом должна владеть «Операция». т.е. эту ассоциацию не следует реализовывать, например, внешним std::multimap<Operation*, Client*>

  • т.к. к клиенту направлена стрелка, то должно быть возможно легко определить «источники» по «Операции». Обычно это подразумевает также создание геттера.

  • т.к. рядом с этим концом стоит звёздочка, то «Операция» должна ассоциироваться с несколькими «Клиентами» (см. сноску)

  • т.к. обратной стрелки нет, то возможности легко найти список операций по клиенту создавать не обязательно.


см. также описание ассоциаций на https://www.uml-diagrams.org/.


* это буквально то что нарисовано, т.е. у операции может быть ноль или больше источников, а у перевода — ноль или больше получателей. Но вполне возможно, что это просто ошибка. Тогда вместо массивов были бы обычные указатели.

→ Ссылка