我正在构建一个PHP Web应用程序,该应用程序应向用户提供命令他与另一个人/组织之间的(ConnectDirect或文件传输网关)连接的“安装”/设置的可能性。

(连接实现的技术规范并不重要-在应用程序中,仅是作为产品的连接,可以对其进行订购和管理。)

其模型层的类层次结构应表示以下实际基础结构:

  • 有连接,可以订购。
  • 连接可以是IBM Connect:Direct连接或IBM File Transfer Gateway连接。
  • CD连接直接从A(源)到B(目标)。
  • FTGW连接实际上由两个连接组成:A(源)到FTGW服务器,从FTGW服务器到B(目标),但从逻辑上讲(对于订购用户),它也是一个连接。
  • (另外还有一种FTGW连接,它使用Connect:Direct作为protokoll。)
  • 每个端点都是源或目标。

  • 因此,我看到以下逻辑元素:逻辑连接,物理连接,角色(源和目标),连接类型,顺序,端点,端点类型(CD和FTGW)。

    我目前拥有的结构如下所示:

    但是有一些问题:
  • 两层树,其中一个的每个元素组成,而包含另一个特定子集的元素(每个CD连接由CD端点组成;每个FTGW连接由两个FTGW端点组成,或更正确地说:每个FTGW逻辑连接由两个物理FTGW连接组成-每个连接都由FTGW端点和FTGW服务器作为第二端点)。

    一种替代方法是用两个关系替换相互之间的关系EndpointPsysicalConnection:EndpointCD-PsysicalConnectionCDEndpointFTGW-PsysicalConnectionFTGW


  • 专业版:更加一致;消除了从一对任意端点建立每个连接(类型)的虚假可能性的逻辑不精确(甚至是错误)。 相反:实际上,包含两个端点的要求是每个虚拟连接的特征-从这个角度来看,正确的位置是非常基本的PsysicalConnection类。
  • 每个端点都可以是源和目标,并且不仅包含,而且还包含源和目标属性。这意味着,取决于终结点的当前角色,某些属性为 waste 。这也将影响数据库的结构(列,有时必须设置,有时需要bi NULL)。

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

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

    b。 ...由具体的CD或FTGW端点类(分别是两个相同的子树两次)继承的EndpointCDSourceEndpointCDTarget(从EndpointCD类继承)以及EndpointFTGWSourceEndpointFTGWTarget(从EndpointFTGW类继承)之类的类组成;

    C。 ...由像MyConcreteEndpoint***SourceMyConcreteEndpoint***Target这样的类继承自具体的终结点类(这意味着:每个MyConcreteEndpoint类都成为抽象并得到两个子类-MyConcreteEndpoint***SourceMyConcreteEndpoint***Target,例如EndpointCDLinux现在是抽象的,并由EndpointCDLinuxSourceEndpointCDLinuxTarget继承)。

    专业版:消除了废物性质。 相反 :(更多)复杂的类层次结构。

  • 好吧,这是关于软件体系结构的,应该(当然,这)将是我的设计决定。但是,很高兴听到/阅读一些专家(或非专家)的想法,如何处理这种情况。有什么适当的方法可以为我所描述的基础结构组织逻辑项?

    最佳答案

    也许我想得太过分了,但是我建议您使用略有不同的模型来反射(reflect)您的业务逻辑。

    跟随可能是一个完全误会,但我会试一试。

    所以:

    根据实际上是什么连接,这是一个概念:

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

    基于此,我建议采用以下模型来构建,管理和存储产品配置:

    php - 当成员也是按层次结构构造时,如何构建类结构?-LMLPHP

    这里:
  • LogicalConnection是对实际连接,节点和协议(protocol)类
  • 的内置组成的引用
  • Connection包含节点的双向链接列表,这些节点按顺序作为数据流组成。即:第一个元素是源节点,第二个元素是目标节点,依此类推。
  • 具体节点包含特定于平台的配置,对目标(* Node),源节点(* Node)和具体协议(protocol)(* Protocol)的引用
  • 协议(protocol)包含其针对源和目标的特定配置,Node实例可以引用Protocol实例以提取所需的配置。
  • 目标节点和源节点通过双向链接列表结构“相互查看”对方和源目标协议(protocol)的配置。
  • Configurations\* ConfigBuilder实现实现协调处理过程,以根据情况从UI接受数据并将其转换为Connection,Node和Protocol的实际组成。
  • IBM\ConnectDirect\和IBM\FTGW\命名空间包含协议(protocol)和* Node(例如WindowsNode,UnixNode)的具体实现

  • 如果仍然需要节点或协议(protocol)同时包含源和目标相关属性,并且在某些配置中它们的一部分仍可能为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..
        }
      ]
    }
    

    关于php - 当成员也是按层次结构构造时,如何构建类结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35415323/

    10-11 23:08