我正在构建一个PHP Web应用程序,它应该为用户提供在他和另一个人/组织之间订购(ConnectDirect或File Transfer Gateway)连接的“安装”/设置的可能性。
(连接实现的技术细节并不重要 - 在应用程序中,它只是作为产品的连接,可以订购和管理。)
其模型层的类层次结构应代表以下真实世界的基础结构:
所以我看到以下逻辑元素:逻辑连接,物理连接,角色( source 和目标),连接类型,订单,端点,端点类型(CD和FTGW)
我目前的结构如下:
但它有一些问题:
两个层次结构树,其中包含的每个元素包含特定子集<的元素/ strong>另一个(每个CD连接由CD端点组成;每个FTGW连接由两个FTGW端点组成,或者更准确:每个FTGW逻辑连接由两个物理FTGW连接组成 - 每个连接由一个FTGW端点和FTGW服务器作为第二个端点。)
替代方案可能是将Endpoint
和PsysicalConnection
之间的关系替换为两个关系:EndpointCD-PsysicalConnectionCD
和EndpointFTGW-PsysicalConnectionFTGW
。
专业:更加一致;消除了从一对任何端点构建每个连接(类型)的伪造可能性的逻辑不精确(或者甚至可能是错误)。 Contra :实际上,包含两个端点的要求是每个psysical连接的特征 - 从这个角度来看,正确的位置是非常基本的PsysicalConnection
类。
每个端点都可以 源和目标,包含不仅是公共端点属性,还包括源和目标属性。这意味着,根据端点的当前角色,某些属性浪费。这也将影响数据库结构(列,有时必须设置有时必须bi NULL
)。
另一种方法是扩展层次结构......
一个。 ...由EndpointSource
和EndpoitTarget
等类直接从Endpoint
继承并由类EndpointCD
和EndpointFTGW
继承(这意味着:两个相同的子树) - 在EndpointSource
和EndpointTarget
下);
湾...来自EndpointCDSource
和EndpointCDTarget
(继承自班级EndpointCD
),EndpointFTGWSource
和EndpointFTGWTarget
等类(继承自班级EndpointFTGW
)由具体的CD或FTGW端点类继承(这意味着:两次相同的两个子树);
℃。 ...由类MyConcreteEndpoint***Source
和MyConcreteEndpoint***Target
等类继承自具体端点类(这意味着:每个MyConcreteEndpoint
类变为抽象并获得两个成功 - MyConcreteEndpoint***Source
和{{ 1}},例如MyConcreteEndpoint***Target
现在是抽象的,由EndpointCDLinux
和EndpointCDLinuxSource
继承。
Pro :消除废物属性。 Contra :(更多)复杂的类层次结构。
嗯,这是关于软件架构的,应该(当然也是)我的设计决定。但是听听/读一些专家(或非专家),如何处理这种情况会很好。如我所描述的那样,为基础架构组织逻辑项的正确方法是什么?
答案 0 :(得分:1)
也许我在思考,但我建议您使用稍微不同的模型来反映您的业务逻辑。
以下可能是一个完全的误解,但我会试一试。
所以:
基于实际上任何连接,这是一个概念:
基于此,我建议遵循建立,管理和存储产品配置的模型:
下面:
LogicalConnection是对实际连接,节点和协议类的构建组成的引用
Connection包含一个双链节点的节点,这些节点按数据流顺序组成。即:第一个元素是源节点,第二个元素是其目标,依此类推。
具体节点包含特定于平台的配置,对目标(*节点)的引用,源节点(*节点)和具体协议(*协议)
协议包含其针对源和目标的特定配置,节点实例可以引用协议实例来提取所需的配置。
目标和源节点通过双链表结构“查看”每个其他和源目标协议配置。
配置\ * ConfigBuilder实现协调从UI接受数据并根据具体情况将其转换为连接,节点和协议的实际组合的过程。
IBM \ ConnectDirect \和IBM \ FTGW \名称空间包含Protocol和* Node的具体实现(例如WindowsNode,UnixNode)
如果仍然需要节点或协议包含源和目标相关的属性,并且在某些配置中它们的一部分仍然可能为NULL - 我建议如果对未使用的列有任何疑虑,请使用EAV存储模型等。
使用您所描述的建议模型连接可以表示如下:
Connection:IBM_CD {
nodes:[
{//LinuxNode
target:*nextElement,
protocol:{//IBM.ConnectDirect.Protocol
..target attributes..
..source attributes..
}
..platform specific attributes..
},
{//WindowsShareNode
target:*nil,
protocol:{
//IBM.ConnectDirect.Protocol(same instance or null)
}
..platform specific attributes..
},
]
}
Connection:IBM_FTGW {
nodes:[
{//LinuxNode
target:*nextElement,
source:*nil,
protocol:{//IBM.FTGW.Protocol
..target attributes..
..source attributes..
}
..platform specific attributes..
},
{//IntermediateServerLinuxNode
target:*nextElement,
source:*prevElement,
protocol:{//IBM.FTGW.Protocol
..target attributes..
..source attributes..
},
..platform specific attributes
},
{//WindowsShareNode
target:*nil,
source:*prevElement,
protocol:*nil,
..platform specific attributes..
}
]
}