Я создаю веб-приложение PHP, которое должно предоставить пользователю возможность заказать "установку" /настройку соединения (ConnectDirect или File Transfer Gateway) между ним и другим человеком/организацией.
(Техническая спецификация реализации соединения не важна - в приложении она касается только соединений как продукта, которые можно заказать и управлять).
Иерархия классов для своего модельного слоя должна представлять собой следующую инфраструктуру реального мира:
- Есть соединения, которые можно заказать.
- Соединение может быть соединением IBM Connect: Direct или соединением шлюза IBM File Transfer.
- Соединение с компакт-диском прямо от A (источника) до B (цель).
- Соединение FTGW состоит из двух соединений: A (источник) на FTGW-сервер и от FTGW-сервера до B (target), но логически (для пользователя заказа) это также одно соединение.
- (Дополнительно есть соединение FTGW, которое использует Connect: Direct как protokoll.)
- Каждая конечная точка является либо источником, либо целью.
Итак, я вижу следующие логические элементы: логическое соединение, физическое соединение, роль (источник и цель), тип соединения, порядок, конечная точка, тип конечной точки (CD и FTGW).
Структура, которую я сейчас имеет, выглядит следующим образом:
Но есть некоторые проблемы:
-
Существует два дерева иерархии, где каждый элемент одного состоит из содержит элементы определенного подмножества /strong > другого (каждое соединение CD состоит из конечных точек CD, каждое соединение FTGW состоит из двух конечных точек FTGW или, что более правильно: каждое логическое соединение FTGW состоит из двух физических соединений FTGW и каждый из них состоит из конечной точки FTGW и сервер FTGW в качестве второй конечной точки).
Альтернативой может быть замена отношения между
Endpoint
иPsysicalConnection
двумя отношениями:EndpointCD-PsysicalConnectionCD
иEndpointFTGW-PsysicalConnectionFTGW
.
Pro: более согласованный; исключает логическую неточность (или, может быть, даже ошибку) фальшивой возможности построить каждое соединение (тип) из пары любых конечных точек. Contra: на самом деле требование содержать две конечные точки является характеристикой каждого физического соединения - с этой точки зрения правильным местом для этого является самый базовый класс PsysicalConnection
.
-
Каждая конечная точка может быть и исходной и целевой, а содержит не только общие свойства конечной точки, но и источник и целевые свойства. Это означает, что в зависимости от роли конечной точки currnt некоторые свойства отходы. И это также будет влиять на структуру базы данных (столбцы, которые иногда должны быть установлены, а иногда и должны быть би
NULL
).Альтернативой является расширение иерархии...
а.... такими классами, как
EndpointSource
иEndpoitTarget
, наследующими непосредственно изEndpoint
и наследуемыми классамиEndpointCD
иEndpointFTGW
(что означает: два одинаковых поддеревья - подEndpointSource
и подEndpointTarget
);б.... с помощью классов типа
EndpointCDSource
иEndpointCDTarget
(наследующих от классаEndpointCD
) иEndpointFTGWSource
иEndpointFTGWTarget
(наследующих от классаEndpointFTGW
), наследуемых каждым из конкретных классов конечных точек CD или FTGW (это означает: дважды два одинаковых поддерева);с.... классами, такими как
MyConcreteEndpoint***Source
иMyConcreteEndpoint***Target
, наследующими от конкретных классов конечных точек (это означает, что каждый классMyConcreteEndpoint
становится абстрактным и получает две подстилки -MyConcreteEndpoint***Source
иMyConcreteEndpoint***Target
, напримерEndpointCDLinux
) абстрактно и наследуетсяEndpointCDLinuxSource
иEndpointCDLinuxTarget
).Pro: устраняет свойства отходов. Contra: более сложная иерархия классов.
Ну, это о архитектуре программного обеспечения и должно (и, конечно же, будет) быть моим дизайнерским решением. Но было бы неплохо услышать/прочитать некоторых экспертов (или неспециалистов), как справиться с таким делом. Каковы правильные способы организации логических элементов для инфраструктуры, как описано мной?