Абстракция вызов. Как подойти к инкапсуляции для этого - PullRequest
0 голосов
/ 24 марта 2012

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

Я пытаюсь смоделировать систему, которая позволяет пользователю вводить объект с именем TASK с определенными параметрами конфигурации, а затем TASK выполняет действия, специфичные для этой задачи.

Некоторые примеры определений задач могут быть:
* Создайте файл {имя_файла} в каталоге {path}.
* Скопируйте файл {имя_файла} из {исходного каталога} в {целевой каталог}.
* Откройте приложение «Блокнот», введите текст {образец текста} и сохраните файл как {имя файла}.
* Откройте {sample.docx}, введите текст {sample text} в конце второго абзаца.

Каждое задание имеет описательное имя и до 5 параметров. В приведенных выше примерах параметры заключены в фигурные скобки {}. Пользователи будут проинструктированы о выполнении вышеуказанных задач, и наше приложение проверит, были ли они выполнены Каждая задача должна иметь следующую функцию:

В статическом мире я бы создал следующие классы:

public abstract class TaskBase { public abstract void Perform(param1, ... param5); }<br> public class TaskFileCopy: TaskBase { public override void Perform(param1, ... param5) {} }

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

Здесь две проблемы: к тому времени, когда мы выполним 2000 задач, у нас будет не более 2000 производных классов, и, во-вторых, базовый OODB будет увязнуть.

В какой-то момент я думал о System.AddIn, но убежден, что этот сценарий имеет лучшее решение в рамках ООП-дизайна.

1 Ответ

0 голосов
/ 03 апреля 2012

Я сомневаюсь, что System.AddIn подходит для такого рода вещей. IMHO System.AddIn для более статичных API, а не для чего-то, что будет быстро расширяться. Возможно, вместо этого вы могли бы взглянуть на MEF, который проще и основан на расширяемости и композиции.

Как вы говорите, наследование - это тоже не тот путь, потому что иметь 2000 производных классов будет кошмаром.

Я думаю, вам следует искать шаблоны проектирования, основанные на композиции, а не на наследовании. Есть несколько из них. Одним из них является Composite pattern. С этим шаблоном у вас могут быть очень простые многократно используемые задачи, которые вы можете объединить в более сложные задачи. Вы можете иметь задачи, которые включают в себя подзадачи, которые включают в себя подзадачи и так далее.

Также вы можете посмотреть динамические языки, которые могут быть размещены на DLR. Как IronPython . Вы можете создать хранилище скриптов. Каждый скрипт задача.

Также для вдохновения вы можете взглянуть на Windows Workflow Foundation и, в частности, Действия.

Что очевидно, так это то, что вам нужно максимизировать повторное использование. Конечно, это легче сказать, чем сделать.

С уважением и удачи.

...