Если вас просто интересует синтаксис UML
Если вы хотите выразить некоторые условия, ограничения или инварианты в UML, вы можете использовать ограничение UML .Затем ограничение выражается между фигурными скобками { ... }
либо на естественном языке, либо в OCL .
Вы можете использовать ограничение атрибута , рядом с атрибутом:
------------------------------------------
IpAddrV4
------------------------------------------
Address: String { matching regex '...' }
Или вы можете использовать более общее ограничение класса ,запись вашего ограничения в поле для комментариев, соединенное с соответствующим классом пунктирной линией:
{ inv: Address matching regex ... }
Насколько я знаю, спецификации OCL не предоставляют встроенной поддержки регулярных выражений.Но некоторые диалекты (например, Eclipse) делают, согласно этому SO ответу .
Если вы хотите получить больше от своей модели
В чем заключается скрытая проблема в вашем подходе к моделированию?
Ваш вопрос сосредоточен на возможной реализации адреса IPv4.Вы предполагаете, что это строка, которая должна соответствовать определенному ограничению, и ваша модель не соответствует этому предположению.
Но вас действительно интересует только конкретное представление адреса IPv4 в виде строки?Или вас интересует, что это за адрес на самом деле и что вы можете с ним сделать?И в последнем случае, каково поведение этого класса?
Я боюсь, что с вашим текущим подходом вы рискуете получить модель UML, которая просто транскрибирует ваш текущий код в графическое представление.Тогда вы можете не пользоваться всеми преимуществами реальной модели, такими как абстракция, инкапсуляция и разделение задач.
Что такое IPv4-адрес
Возвращаясь к корням RFC 791 (раздел 2.3) представляется, что IP-адрес:
- состоит из четырех октетов, поэтому 32 бита (и это 32-битное представление используется в функциях низкого уровня);
- можно рассматривать как сетевой адрес, за которым следует локальный адрес;
- имеет «класс адресов», который определяет структуру сети и локального адреса.
В RFC 1180 (раздел 2) указывается, что когда пользовательский ввод предоставляет IP-адрес, он должен использовать точечный десятичный формат нумерации.
Стандарт POSIX предлагает некоторый стандарт преобразование между точечной десятичной строкой и интернет-адресом.
Класс UML
Я бы предложил что-то вроде того, к которому нужно добавить упомянутое выше ограничение на формат строки:
----------------------------------------------
IpAddrV4
----------------------------------------------
-address: Integer //UInt32 in fact
----------------------------------------------
+IPAddrV4()
+IPAddrV4(Address: String)
+GetAddress() : String
+GetBinaryAddress(): Integer //UInt32 in fact
+GetAddressClass(): String //Char in reality
----------------------------------------------
Конечное слово
Извините, если это звучит грубо.Но проектирование в 2019 году приложения IPv4 звучит странно и неполно.Преимущество абстракции в том, что она может позволить вам разработать более общий адрес, который будет способен справляться с форматами IPv6 и внутренней структурой.