如何绘制必须是有效 IP 地址的 UML class
How can I draw a UML class that must be a valid 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 属性和函数。
如果我有一个 class 用 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>
如果您只对 UML 语法感兴趣
如果你想在 UML 中表达一些条件、限制或不变量,你可以使用 UML constraint. The constraint is then expressed between curly braces { ... }
either in natural language or in OCL。
您可以使用 属性约束 ,就在属性旁边:
------------------------------------------
IpAddrV4
------------------------------------------
Address: String { matching regex '...' }
或者您可以使用更通用的 class 约束条件,将您的约束条件写在评论框中,并用虚线连接到相关的 class :
{ inv: Address matching regex ... }
据我所知,OCL 规范不提供对正则表达式的原生支持。但是根据这个 SO answer.
,有些方言(例如 Eclipse)会
如果你想从你的模型中获得更多
您的建模方法中隐藏的问题是什么?
您的问题集中在 IPv4 地址的可能实现上。您假设它是一个需要遵守特定约束的字符串,而您的模型泄露了这一假设。
但是您真的只对 IPv4 地址作为字符串的特定表示感兴趣吗?或者您对地址的真实含义以及您可以用它做什么感兴趣吗?在后一种情况下,这个 class 的行为是什么?
我担心使用您当前的方法,您有可能最终得到一个 UML 模型,该模型只是将您当前的代码转录为图形表示。然后,您可能无法享受真实模型可以提供的全部好处,例如抽象、封装和关注点分离。
什么是 IPv4 地址
回到 RFC 791 (section 2.3) 的根源,IP 地址似乎是:
- 由四个八位字节组成,所以是 32 位(这个 32 位表示用于低级函数);
- 可以看作是网络地址后接本地地址;
- 有一个控制网络布局和本地地址的“地址 class”。
在RFC 1180 (section 2)中出现,当用户输入提供IP地址时,它应该使用点分十进制编号格式。
POSIX标准在点十进制字符串和互联网地址之间提出了一些标准conversion。
UMLclass
我建议您需要在字符串格式上添加上述约束:
----------------------------------------------
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 格式和内部结构。
我希望能够绘制使用 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 属性和函数。
如果我有一个 class 用 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>
如果您只对 UML 语法感兴趣
如果你想在 UML 中表达一些条件、限制或不变量,你可以使用 UML constraint. The constraint is then expressed between curly braces { ... }
either in natural language or in OCL。
您可以使用 属性约束 ,就在属性旁边:
------------------------------------------
IpAddrV4
------------------------------------------
Address: String { matching regex '...' }
或者您可以使用更通用的 class 约束条件,将您的约束条件写在评论框中,并用虚线连接到相关的 class :
{ inv: Address matching regex ... }
据我所知,OCL 规范不提供对正则表达式的原生支持。但是根据这个 SO answer.
,有些方言(例如 Eclipse)会如果你想从你的模型中获得更多
您的建模方法中隐藏的问题是什么?
您的问题集中在 IPv4 地址的可能实现上。您假设它是一个需要遵守特定约束的字符串,而您的模型泄露了这一假设。
但是您真的只对 IPv4 地址作为字符串的特定表示感兴趣吗?或者您对地址的真实含义以及您可以用它做什么感兴趣吗?在后一种情况下,这个 class 的行为是什么?
我担心使用您当前的方法,您有可能最终得到一个 UML 模型,该模型只是将您当前的代码转录为图形表示。然后,您可能无法享受真实模型可以提供的全部好处,例如抽象、封装和关注点分离。
什么是 IPv4 地址
回到 RFC 791 (section 2.3) 的根源,IP 地址似乎是:
- 由四个八位字节组成,所以是 32 位(这个 32 位表示用于低级函数);
- 可以看作是网络地址后接本地地址;
- 有一个控制网络布局和本地地址的“地址 class”。
在RFC 1180 (section 2)中出现,当用户输入提供IP地址时,它应该使用点分十进制编号格式。
POSIX标准在点十进制字符串和互联网地址之间提出了一些标准conversion。
UMLclass
我建议您需要在字符串格式上添加上述约束:
----------------------------------------------
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 格式和内部结构。