Архитектура для моделирования

Распространенным решением построения модели системы, состоящей из множества элементов разных типов, является создание модульной системы, в которой каждый модуль отвечает за определенный тип. Например, будет модуль для вомбатов WombatModule:IModule, где интерфейс IModule имеет такие методы, как GetCount() (для определения количества вомбатов) и Update() (для обновления состояния всех вомбатов).

Более объектно-ориентированный подход состоял бы в том, чтобы иметь класс для каждого типа элемента и создавать экземпляр для каждого элемента. Это создаст класс Wombat:IItem с такими методами, как Update() (для обновления этого вомбата).

С точки зрения кода разница незначительна, но время выполнения существенно отличается. Модульно-ориентированное решение, безусловно, быстрее: меньше создания объектов, легче оптимизировать операции, общие для всех вомбатов.

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

По крайней мере, один раз я видел, как он деградировал до плохого состояния, когда все, что делает WombatModule, — это хранит коллекцию скрытых объектов Wombat и запускает их методы в цикле.

Когда производительность является меньшей проблемой, чем долгосрочная разработка, можете ли вы определить какие-либо архитектурные причины для использования модулей вместо отдельных объектов? Может быть, есть еще одна возможность, которую я упускаю?


person ima    schedule 11.09.2008    source источник


Ответы (1)


Я работаю на embedded software company, а наш code base довольно большой. База кода была разработана с модулями, которые выполняют определенные функции и поддерживают некоторые объекты, а также некоторые объекты существуют как независимые объекты. Самая большая проблема, которую мы видим в нашем подходе, — это различение границ модулей. Наши модули имеют тенденцию становиться излишне сложными с течением времени и медленно расширяться, чтобы выполнять функции, которые изначально были за его пределами. Я бы сказал, что лучшим направлением было бы модульное проектирование и реализация очень специфических объектов, а также прилагать усилия, чтобы модули не разрастались больше, чем вы предполагаете.

person TJ Seabrooks    schedule 11.09.2008