Единичный тест проверит SomeClass
максимум. Поэтому вы обычно издеваетесь classWithEvent. Использование какой-то инъекции для classWithEvent в ctor в порядке. Как Томас Уэллер сказал, что проводка - это назначение поля.
Вариант 2 на самом деле плохо ИМХО. Как будто вы опускаете вызов ActivateEventHandling
, вы получаете неправильный инициализированный класс и должны передавать знания о требовании для вызова ActivateEventHandling
в комментариях или как-то еще, что делает класс более сложным в использовании и, вероятно, приводит к использованию класса, которое было даже не проверены вами, так как вы вызвали ActivateEventHandling
и протестировали его, но не проинформированный пользователь, не указав активацию, не сделал этого, и вы, конечно же, не тестировали свой класс, когда ActivateEventHandling
не был вызван, не так ли? :)
Edit: Там могут быть альтернативные подходы здесь, которые стоит упомянуть его
В зависимости от парадигмы может быть мудрым, чтобы избежать проводки событий в классе вообще. Мне нужно релятивизировать мой комментарий к ответу Стивена Бирна.
Проводка может рассматриваться как знание контекста. single responsibility principle говорит, что класс должен выполнять только одну задачу. Кроме того, класс можно использовать более универсальным, если он не имеет зависимости от чего-то другого. Очень слабосвязанная система обеспечит много классов, имеющих события и обработчики, и не знает других классов.
Затем среда отвечает за подключение всех классов для правильного подключения событий с обработчиками. Окружающая среда создаст контекст, в котором классы будут взаимодействовать друг с другом значимым образом. Класс в этом случае поэтому не знает, кому это будет связано, и на самом деле это не волнует. Если он требует значения, он запрашивает его, которого он задает, должен быть неизвестен. В этом случае даже не было бы интерфейса, введенного в ctor, чтобы избежать зависимости. Эта концепция похожа на нейроны в мозге, поскольку они также излучают сообщения в окружающую среду и ожидают ответа, не зная соседних нейронов.
Однако я рассматриваю зависимость от интерфейса, если он каким-то образом вводит инъекционный контейнер зависимостей только в другой парадигме и не менее ошибочен.
Нетривиальная задача среды для подключения всех классов при запуске может привести к ошибкам во время выполнения (которые смягчаются очень хорошим испытанием на функциональные и интеграционные тесты, что может быть сложной задачей для крупных проектов) и это становится очень раздражающим, если вам нужно провести несколько десятков классов и, возможно, сотни событий при запуске вручную. Хотя я согласен с тем, что проводка в среде, а не в самом классе, может быть приятной, она не практична для крупномасштабного кода.
Ralf Westphal (один из основателей clean code developer initiative (sorry german only)) написал программное обеспечение, которое автоматически выполняет проводку в концепции под названием «компоненты, основанные на событиях» (не обязательно придумано самим собой). Он использует соглашения об именах и соответствие подписи с отражением для объединения событий и обработчиков вместе.
Думаю, я был в спешке, чтобы ответить на этот вопрос :) (если вы не видите мой ответ, потому что он удален) – Abhinav
lol ditto. нужно больше кофе. –