Вопрос

Я поддерживаю приложение, которое было разработано следующим образом:

messy code --abuses--> simplePoco (POCO data capsule)

Капсула данных - это простой класс с множеством средств получения и установки (свойств) Он использует платформу DI и последовательно использует контейнер IoC для предоставления экземпляров капсулы данных (мне повезло!).

Проблема в том, что мне нужно внедрить механизм "уведомления об изменениях" в simplePoco

messy code --abuses--> simplePoco 
               |
               V
         changes logger,
         status monitor
     (I wanna know about changes)

У меня есть несколько вариантов:

  • Представить IPoco и измените беспорядочный код, чтобы я мог иметь simplePoco для скорости или notifyingPoco когда я хочу уведомление об изменении (выборочно медленное)?или...

  • Сделайте все виртуальным и создайте мой собственный кастом notifyingPoco класс на вершине simplePoco (еще медленнее)?

  • шаблоны проектирования, которые я не знаю?

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

Будет ли использование интерфейса препятствовать JIT встраиванию вызовов в getter / setter?

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

Это было полезно?

Решение

Любой вид виртуального вызова (будь то в интерфейсе или непосредственно в классе - ВСЕ интерфейсные вызовы являются виртуальными!) не будут встроены CLR JIT.Тем не менее, интерфейсные вызовы немного медленнее, потому что они всегда должны проходить через потенциально удаленный / проксируемый путь, и потому что они должны сдвигаться this-указатель на точку в начале класса перед входом в тело функции.Виртуальные вызовы непосредственно к членам класса никогда не должны выполнять сдвиг, и, если только класс не является производным от MarshalByRefObject, не нажимайте на проверки прокси-сервера.

Тем не менее, различия в производительности между этими двумя очень незначительны, поэтому вам, вероятно, следует игнорировать их и вместо этого сосредоточиться на чистоте дизайна и простоте реализации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top