Слишком много слоев косвенности, это слишком много? - PullRequest
1 голос
/ 09 июня 2009

Мне было просто интересно, будет ли это связано со многими слоями косвенности?

Альтернативный текст http://img244.imageshack.us/img244/7371/classdiagram1.jpg

Я пытаюсь немного объяснить. Идея состоит в том, что я создаю API поверх COM-объекта, который предоставляет только методы Do и Eval.

Ранее я только что передал IComObject в класс Table и работаю непосредственно с ним, однако это означает, что когда я пытаюсь и тестирую класс Table, я высмеиваю IComObject и беспокоюсь о командах, отправляемых объекту COM в моем классе таблицы. .

Основная идея заключается в том, что у меня есть исполнители команд, которые отвечают за вызов правильных команд в COM-объекте, а объект Table (и другие) просто общается с исполнителями команд, не беспокоясь о выполняемых командах. Тогда в моих тестах я могу сделать это:

Mock<TableCommandRunner> mockrunner = new Mock<TableCommandRunner>();
mockrunner.Setup(run => run.getName("DummyTable")).Returns("FakeName");

Table table = new Table("DummyTable");
//Table.Name just calls commandrunner.getName
Assert.Equal(table.Name,"FakeName");

Слишком много слоев косвенности или все будет в порядке?

ПРИМЕЧАНИЕ: у меня будет намного больше классов, чем просто Table, такие вещи, как Map, Window, Object и т. Д., Которые будут общаться с участниками команды.

Ответы [ 3 ]

6 голосов
/ 09 июня 2009

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

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

В конечном счете, следуйте своим инстинктам ... абстрагируйтесь, когда это необходимо, но избегайте этого, если можете.

2 голосов
/ 09 июня 2009

Я не думаю, что это слишком много уровней абстракции. Ваше решение выглядит довольно элегантно для меня, потому что вы просто проверяете, что класс Table вызывает правильные функции ComandRunner. Вы проверяете, как класс Table взаимодействует с CommandRunner, и вы удалили все сложности реализаций CommandRunner, включая IComObject. В этом суть насмешки.

0 голосов
/ 09 июня 2009

Я не совсем уверен, но для меня, когда есть сомнения, я всегда хотел бы предоставить удобные методы ярлыков, которые обертывают этот вид абстракции.

Что-то вроде

void runCommand(string cmd) // objects instantiated and used inside

поэтому, даже если у меня слишком много абстракций, все равно есть простой способ просто "сделать это, черт возьми".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...