n-арная ассоциация в uml диаграмме
Непонятно как работает в данном примере ассоциация, как она представлена кодом, если есть возможность показать на любом языке для примера, буду рад помощи.
Ответы (1 шт):
На диограмме нет 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/.
* это буквально то что нарисовано, т.е. у операции может быть ноль или больше источников, а у перевода — ноль или больше получателей. Но вполне возможно, что это просто ошибка. Тогда вместо массивов были бы обычные указатели.
