Какова лучшая архитектура для моделирования, при наиболее общем возможном c способе поведения, которое зависит от двух основных типов (или их подтипов)? - PullRequest
0 голосов
/ 05 февраля 2020

Я бы хотел, чтобы вы рассмотрели применение в гражданском строительстве, цель которого - определить, какие элементы, называемые Пересечения , проходят через определенные Отверстия в стенах. Конечная цель состоит в том, чтобы связать список Пересечений с каждым Отверстием элемента.

Пересечения может иметь много подтипов (трубы, воздух воздуховоды, оборудование и т. д. c.), а также отверстия (круглые, прямоугольные angular, L-образной формы, полигоны и др. c.). Алгоритм, который обнаруживает, проходит ли данное Crossing через Hole , зависит как от подтипов Hole , так и от Crossing . Обратите внимание, что в начале разработки известны не все подтипы Crossing и Hole .

Учитывая количество возможностей, различные алгоритмы для реализации и их В разной степени сложности архитектура приложения должна позволять добавлять новые алгоритмы и Отверстия / Пересечение без особых усилий.

Поскольку алгоритм обнаружения зависит как от Отверстия и Пересечения , кажется искусственным, чтобы метод вычисления (алгоритм) был построен внутри одного или другого. Это также справедливо для любых возможных подтипов, полученных из этих основных типов.

Тот факт, что не все точные подтипы задействованных объектов ( Отверстие и Пересечение ) известное заранее заставляет меня задуматься о Factory DP. Однако зависимость поведения от подтипов («алгоритмы обнаружения») почему-то меня смущает, когда я пытаюсь применить здесь Factory DP.

Я также думал о том, чтобы рассматривать «алгоритм обнаружения» как объект сам по себе. Тогда своего рода «Фабрика» может быть ответственна за выдачу данного «метода расчета» в зависимости от конкретной пары c Hole / Crossing . Однако из-за сложности используемых алгоритмов, я боюсь, что реализация этой «Фабрики» может оказаться злым стадом древних и волосатых мамонтов с шерстью.

Подводя итог, два моих главных вопроса являются:

  • Как мне смоделировать различие между двумя «очевидными» основными типами ( Отверстие и Пересечение ) и их множественными, и в основном неизвестными подтипами ?
  • Как мне смоделировать «алгоритм обнаружения»?

На эти вопросы следует ответить, имея в виду, что в будущем больше Отверстий , Пересечения и их соответствующие алгоритмы должны быть легко добавлены.

Может кто-нибудь помочь мне найти элегантное решение этой проблемы архитектуры?

Спасибо

1 Ответ

0 голосов
/ 13 февраля 2020

Способ моделирования домена сильно зависит от того, какие данные потребуются и как вы собираетесь с ним работать. Читая ваш вопрос, я пришел к следующим выводам, не стесняйтесь комментировать, если я не прав. - У вас будет набор алгоритмов, которые принимают входные параметры: Пересечение и Отверстие соответственно. - Пересечения и Отверстия бывают нескольких разных видов, некоторые из которых в настоящее время неизвестны.

Первое, что необходимо принять во внимание, - это то, что информация, необходимая для представления Каждый вид отверстия будет отличаться. Например, круглое отверстие и L-образное отверстие не будут иметь одинаковую информацию, первое имеет центр и радиус, а второе - нет. Это происходит аналогичным образом для объектов Crossing. Поэтому мы должны спросить себя, каково было бы лучшее представление, которое могло бы учитывать эти различия.

Если бы мы смоделировали это в модели OOP, то мог бы прийти на ум подход, основанный на Baseclass + Inheritance. Тем не менее, есть два предостережения, во-первых, как указывает @Lini Crossings / Holes, не демонстрируют поведение, это простые данные. Во-вторых, у Baseclass не будет общих атрибутов с подклассами, поскольку каждый вид Crossing / Hole будет представлен различными атрибутами, и то же самое происходит с методами доступа, поэтому у нас будет пустой BaseClass, целью которого является: знать, является ли объект подтипом пересечения или подтипом отверстия. В зависимости от языка, над которым вы работаете, этот подход может быть обязательным, и IMO я тоже не считаю плохим подходом.

Если вместо этого вы используете функциональный язык, такой как Clojure, вы можете смоделировать Crossings и Отверстия в виде словарей с двумя полями для представления Типа и Подтипа, которые позволяют использовать стандартные функции для доступа к данным и их изменения. В конце концов, добавление новых подтипов будет простым в обоих сценариях ios.

Во-вторых, количество возможных пар может стать очень большим, поэтому вам нужен способ упорядочить алгоритмы и решить, при каждом сопряжении, который следует вызывать так, чтобы можно было легко обрабатывать новые подтипы. Лично мне не нравится делать алгоритм обнаружения Классом, потому что это вещь обработки данных, а не сами данные (я немного пурист здесь :). Мой подход к этому был бы мультиметоды , которые являются динамическими c диспетчерскими функциями. Общая идея такова:

  • Создайте все необходимые алгоритмы для обработки каждой пары. Если один алгоритм может обрабатывать несколько пересечений или отверстий, вы также можете сделать это.
Alg1 :: (CrossA HoleA) --> Result
Alg2 :: (CrossA HoleB) --> Result
Alg3 :: (CrossB (Either HoleB HoleC)) --> Result
  • Создайте функцию сопряжения, чтобы создать процесс сопряжения, который будет возвращать ключевое слово, используемое для определения алгоритма обнаружения. позвонить.
Pairing :: (Crossing Hole) --> Keyword
  • Создать мультиметод. Он примет любую пару Crossing и Hole, затем вызовет Pairing и, наконец, отправит соответствующий алгоритм на основе результата спаривания.
Detection :: (AnyCross AnyHole) --> result

При таком подходе каждый алгоритм изолирован и добавление новых просто требуется добавить новое соответствие в функции сопряжения и обнаружения. Кроме того, добавление типов и алгоритмов не нарушит существующий код из-за разделения проблем. Единственный недостаток, который я могу вспомнить, это то, что, возможно, этот шаблон проектирования немного сложнее реализовать на языке OOP, чем на функциональном, но, конечно, в языках обеих сторон будут нюансы.

Надеюсь, этот TL; DR поможет вам немного рассмотреть имеющиеся варианты.

...