当成员按层次结构构建时,如何构建类结构?

时间:2016-02-15 17:21:00

标签: php inheritance architecture software-design class-structure

我正在构建一个PHP Web应用程序,它应该为用户提供在他和另一个人/组织之间订购(ConnectDirect或File Transfer Gateway)连接的“安装”/设置的可能性。

(连接实现的技术细节并不重要 - 在应用程序中,它只是作为产品的连接,可以订购和管理。)

其模型层的类层次结构应代表以下真实世界的基础结构:

  • 连接,可以订购。
  • 连接可以是IBM Connect:Direct连接或IBM File Transfer Gateway连接。
  • CD 连接直接从A()连接到B(目标)。
  • FTGW 连接包含两个连接的物理:A(源)到FTGW服务器,从FTGW服务器到B(目标) - 但逻辑上(对于订购用户)它也是一个连接。
  • (还有一个FTGW连接的情况,它使用Connect:Direct作为protokoll。)
  • 每个端点都是源或目标。

所以我看到以下逻辑元素:逻辑连接物理连接角色 source 目标),连接类型订单端点端点类型(CD和FTGW)

我目前的结构如下:

connections&endpoints pseudo UML class diagramm

但它有一些问题:

  1. 两个层次结构树,其中包含的每个元素包含特定子集<的元素/ strong>另一个(每个CD连接由CD端点组成;每个FTGW连接由两个FTGW端点组成,或者更准确:每个FTGW逻辑连接由两个物理FTGW连接组成 - 每个连接由一个FTGW端点和FTGW服务器作为第二个端点。)

    替代方案可能是将EndpointPsysicalConnection之间的关系替换为两个关系:EndpointCD-PsysicalConnectionCDEndpointFTGW-PsysicalConnectionFTGW

  2. replaced relationships

    专业:更加一致;消除了从一对任何端点构建每个连接(类型)的伪造可能性的逻辑不精确(或者甚至可能是错误)。 Contra :实际上,包含两个端点的要求是每个psysical连接的特征 - 从这个角度来看,正确的位置是非常基本的PsysicalConnection类。

    1. 每个端点都可以 源和目标,包含不仅是公共端点属性,还包括源和目标属性。这意味着,根据端点的当前角色,某些属性浪费。这也将影响数据库结构(列,有时必须设置有时必须bi NULL)。

      另一种方法是扩展层次结构......

      一个。 ...由EndpointSourceEndpoitTarget等类直接从Endpoint继承并由类EndpointCDEndpointFTGW继承(这意味着:两个相同的子树) - 在EndpointSourceEndpointTarget下);

      湾...来自EndpointCDSourceEndpointCDTarget(继承自班级EndpointCD),EndpointFTGWSourceEndpointFTGWTarget等类(继承自班级EndpointFTGW )由具体的CD或FTGW端点类继承(这意味着:两次相同的两个子树);

      ℃。 ...由类MyConcreteEndpoint***SourceMyConcreteEndpoint***Target等类继承自具体端点类(这意味着:每个MyConcreteEndpoint类变为抽象并获得两个成功 - MyConcreteEndpoint***Source和{{ 1}},例如MyConcreteEndpoint***Target现在是抽象的,由EndpointCDLinuxEndpointCDLinuxSource继承。

      Pro :消除废物属性。 Contra :(更多)复杂的类层次结构。

    2. 嗯,这是关于软件架构的,应该(当然也是)我的设计决定。但是听听/读一些专家(或非专家),如何处理这种情况会很好。如我所描述的那样,为基础架构组织逻辑项的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

也许我在思考,但我建议您使用稍微不同的模型来反映您的业务逻辑。

以下可能是一个完全的误解,但我会试一试。

所以:

基于实际上任何连接,这是一个概念:

  • 每个连接都是一个节点集合,数据应该通过这些节点来到达目的地。
  • 每个节点都可以使用特定协议与下一个节点连接,该协议仅针对两个特定节点之间的直接连接。
  • 协议有自己的源节点和目标节点属性

基于此,我建议遵循建立,管理和存储产品配置的模型:

enter image description here

下面:

  • 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..
    }
  ]
}