Представьте себе следующий класс:Предположения о событии повышения
class A
{
public event EventHandler AnyEvent;
}
Вы создаете экземпляр класса A
, и приложить некоторые обработчиков событий. Теперь, если AnyEvent
будет поднят, я бы не стал предполагать, что обработчики событий выполняются в другом потоке, чем поток, который я создал. Это было бы очень важно, если бы вы создали объект в потоке GUI, а обработчик событий выполнял операции с элементами GUI. Это заставит меня использовать соответствующие шаблоны вызова.
Это действительно становится злом, если вы используете интерфейсы, определяющие события:
interface B
{
event EventHandler SomeEvent;
}
Теперь одна реализация может поднять событие с оригинальной резьбой, следующий из второго потока. Это может привести к тому, что ваше приложение будет успешно работать с ним и не выполнит другую реализацию.
Я думаю, что кодирование всегда должно быть прозрачным - это не так! И если я не создаю другой поток, я не предполагаю, что мои методы выполняются из любого другого, кроме моего ,.
Есть ли какие-либо аспекты, которые я не рассматривал? Любое, что лишало бы моего предположения?
Хорошо, я никогда не слышал, что изначально я должен предположить, что классы не являются потокобезопасными. Однако, что вы думаете о интерфейсной части моего вопроса? – Matthias
К сожалению, это не то, что может быть реализовано интерфейсом. Лучшее, что вы можете сделать, это документировать интерфейс определенным образом и предположить, что исполнитель будет следовать рекомендациям. Абстракции будут протекать http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Davy8