Как я могу нарисовать класс UML, который должен быть действительным IP-адресом - PullRequest
1 голос
/ 13 апреля 2019

Я хочу иметь возможность нарисовать UML-диаграмму моего кода, использующего адреса IPv4. Обычно это просто строка, но они должны быть созданы особым образом, чтобы быть действительными. Вот регулярное выражение для одного:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Я не совсем уверен, как определить атрибут ipaddr и функции, которые поддерживают его проверку.

Если бы у меня был класс, который делал что-то с ipaddr, вроде создания сокета, у меня было бы что-то вроде этого ...

--------------------------------------------
SocketCreator
--------------------------------------------
socket: Socket
ipaddr: str  # This is what needs to change
--------------------------------------------
create_connection(socket:Socket)
--------------------------------------------

Может быть, что-то подобное?

------------------------------------------
IpAddrV4: String
------------------------------------------
string: String[0-3]=<0-255>+String[4-7]=<0-255>+String[8-11]=<0-255>+String[12-15]=<0-255>

1 Ответ

3 голосов
/ 13 апреля 2019

Если вас просто интересует синтаксис 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 и внутренней структурой.

...