如何绘制必须为有效IP地址的UML类

时间:2019-04-12 23:06:03

标签: string class uml ip-address

我希望能够绘制使用IPv4地址的代码的UML图。它们通常只是一个字符串,但是必须以非常特定的方式创建它们才有效。这是其中一个的正则表达式:

\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 个答案:

答案 0 :(得分:3)

如果您只对UML语法感兴趣

如果要在UML中表达某些条件,限制或不变量,则可以使用UML constraint。然后,用自然语言或OCL在大括号{ ... }之间表达约束。

您可以在属性旁边使用属性约束

------------------------------------------
IpAddrV4
------------------------------------------
Address: String { matching regex '...' }  

或者您可以使用更通用的类约束,将约束写在用虚线连接到相关类的注释框中:

{ inv: Address matching regex ... }  

据我所知,OCL规范不提供对正则表达式的本机支持。根据此SO answer,有些方言(例如Eclipse)可以做到。

如果您想从模型中获取更多信息

您的建模方法中隐藏的问题是什么?

您的问题集中在IPv4地址的可能实现上。您假设它是一个字符串,需要遵守一定的约束,并且您的模型泄漏了此假设。

但是您真的只对IPv4地址的特定表示形式感兴趣吗?还是您对地址的真实含义以及该地址的用途感兴趣?在后一种情况下,此类的行为是什么?

我担心,采用当前的方法,您可能会面临最终将UML模型仅将当前代码转录为图形表示形式的风险。然后,您可能无法享受真实模型可以提供的全部好处,例如抽象,封装和关注点分离。

什么是IPv4地址

回到RFC 791 (section 2.3)的根,似乎是一个IP地址:

  • 由四个八位位组组成,因此为32位(该32位表示形式用于低级函数中);
  • 可以被视为网络地址,后跟本地地址;
  • 具有一个“地址类别”,用于管理网络和本地地址的布局。

RFC 1180 (section 2)中,当用户输入提供IP地址时,它应该使用点十进制数字格式。

POSIX标准在点分十进制字符串和Internet地址之间提出了一些标准conversion

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格式和内部结构。