2009-10-05 1 views
5

Я недавно узнал о Presenter First и читать их технические документы и блоги, и т.д.В Presenter Сначала почему метод SubscribeSomeEvent на интерфейсе предпочитает простые старые события?

В большинстве примеров, которые я нашел, что события не объявляются непосредственно на границе, а в качестве способа для него. Например,

public interface IPuzzleView 
{ 
    void SubscribeMoveRequest(PointDelegate listener); 
    // vs 
    event PointDelegate MoveRequest; 
} 

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

UPDATE:

Ниже приведен пример для сравнения:

public class Collect 
{ 
    public static CollectAction<T> Argument<T>(int index, 
     CollectAction<T>.Collect collectDelegate) 
    { 
     CollectAction<T> collect = new CollectAction<T>(index, collectDelegate); 
     return collect; 
    } 
} 

public interface IApplicationView 
{ 
    event EventHandler Load; 

    // or 

    void SubscribeLoad(Action action); 
} 

Mockery mockery = new Mockery(); 
IApplicationView view = mockery.NewMock<IApplicationView>(); 
IApplicationModel model = mockery.NewMock<IApplicationModel>(); 

Подписаться Стиль:

Action savedAction = null; 
Expect.Once.On(view).Method("SubscribeLoad").Will(
    Collect.Argument<Action>(0, 
    delegate(Action action) { savedAction = action; })); 
Expect.Once.On(model).Method("LoadModules"); 
new ApplicationPresenter(view, model); 
savedAction(); 
mockery.VerifyAllExpectationsHaveBeenMet(); 

против событий:

Expect.Once.On(view).EventAdd("Load", Is.Anything); 
Expect.Once.On(model).Method("LoadModules"); 
new ApplicationPresenter(view, model); 
Fire.Event("Load").On(view); 
mockery.VerifyAllExpectationsHaveBeenMet(); 

FYI, стиль события выше не будет работать, так как ApplicationPresenter сразу же получает сборку мусора, и проводка никогда не происходит.

+1

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

ответ

3

Короткий ответ: Presenter Сначала развился изначально в дни .NET 1.1 и VS2003, а события C# могли быть проблематичными.

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

Для опубликованных примеров мы хотели избежать связывания технологии Presenter First с функцией, специфичной для языка. (Например, Java не имеет эквивалента событиям или делегатам C#, но это не означает, что вы не можете использовать шаблон Observer.)

Я вижу, что события, анонимные делегаты и насмешливые инструменты прошли долгий путь в последние несколько лет. В следующий раз, когда я заберу проект C#, я буду переоценивать все мои предположения на «лучший способ» для обработки подписки на события и отправки. Вышеприведенные примеры интригуют.

Резюмируя наш оригинал, может быть устаревшей, причины скрывается наше использование событий C#: - Mocking подписки на событие не было возможно в блоке тестов - Иногда мы используем различный внутренний механизм для обработки подписки на события/отправка , Это привело к несогласованности от одного интерфейса к другому. - Несколько раз мы рассматривали отказ от событий C# даже внутри страны, поскольку они вели себя по-разному, когда абонентов не существовало. Выявление событий извне значительно усложнило бы повторное внедрение.

Когда Jiho Han послал мне сообщение с этим вопросом, он также поинтересовался привязкой данных и более склеенным примером PF, на который я ответил, опубликовав a newer, fuller example of Presenter First and elaborating on Adapters.

 Смежные вопросы

  • Нет связанных вопросов^_^