我希望能够绘制使用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>
答案 0 :(得分:3)
如果要在UML中表达某些条件,限制或不变量,则可以使用UML constraint。然后,用自然语言或OCL在大括号{ ... }
之间表达约束。
您可以在属性旁边使用属性约束:
------------------------------------------
IpAddrV4
------------------------------------------
Address: String { matching regex '...' }
或者您可以使用更通用的类约束,将约束写在用虚线连接到相关类的注释框中:
{ inv: Address matching regex ... }
据我所知,OCL规范不提供对正则表达式的本机支持。根据此SO answer,有些方言(例如Eclipse)可以做到。
您的问题集中在IPv4地址的可能实现上。您假设它是一个字符串,需要遵守一定的约束,并且您的模型泄漏了此假设。
但是您真的只对IPv4地址的特定表示形式感兴趣吗?还是您对地址的真实含义以及该地址的用途感兴趣?在后一种情况下,此类的行为是什么?
我担心,采用当前的方法,您可能会面临最终将UML模型仅将当前代码转录为图形表示形式的风险。然后,您可能无法享受真实模型可以提供的全部好处,例如抽象,封装和关注点分离。
回到RFC 791 (section 2.3)的根,似乎是一个IP地址:
在RFC 1180 (section 2)中,当用户输入提供IP地址时,它应该使用点十进制数字格式。
POSIX标准在点分十进制字符串和Internet地址之间提出了一些标准conversion。
我会建议类似的东西,您需要在字符串格式上添加上述约束:
----------------------------------------------
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格式和内部结构。