В этом выпуске:
Раздел: Средний .NET разработчик
- Вопрос #10: Опишите разницу между интерфейсно-ориентированным, объектно-ориентированным и аспектно-ориентированным стилями программирования.
- Вопрос #11: Дайте описание Интерфейса и опишите основные его отличия от Класса.
- Вопрос #12: Что такое Reflection?
Вопрос #10: Опишите разницу между интерфейсно-ориентированным, объектно-ориентированным и аспектно-ориентированным стилями программирования.
Ответ: Основная идея аспектно-оринетированного подхода (АОП) – возможность из кода управлять содержимым этого кода при сборке. Такое управление осуществляется посредством специальных конструкций – аспектов, фактически подпрограмм, логически связанных с какой-либо особенностью разрабатываемого ПО. Простейшим примером аспекта является аспект, отвечающий за логирование. Например, необходимо добавить в начало и конец тел всех методов вызов логировщика, для журналирования состояния в моменты входа в метод и выхода из него. Оофрмляется аспект, который как раз это правило и описывает, и далее, при компиляции, результирующий бинарий получает все необходимые изменения.
Объектно- (ООП) и интерфейсно-ориентированные (ИОП) подходы по сути представляют собой одно и то же, только в случае ИОП политики переопределения поведения базовых классов более жесткие, что вытекает из особенностей интерфейсов. А так, те же 3 концепции: наследование, инкапсуляция, полиморфизм.
Можно рационально ли говорить о каких-либо различиях? Не уверен. В рамках .NET успешно применяются все 3 подхода: интерфейсы и классы описаны в спецификации, об этом следующий вопрос, а аспекты реализуются посредством атрибутов классов.
Вопрос #11: Дайте описание Интерфейса и опишите его основные отличия от Класса.
Ответ: Ответ на этот вопрос чрезвычайно объемен. Попробую сделать выжимку. Начать, думаю, стоит с определений, доступных в спецификации языка C#:
Класс – структура данных, которая может содержать: члены-данные, такие как константы и переменные; члены-функции, такие как методы, свойства, события, индексаторы, операторы, конструкторы класса, деструкторы и статические конструкторы; вложенные типы. Классы поддерживают одиночное наследование.
Интерфейс – структура данных, которая может содержать: методы, свойства, события и индексаторы. Интерфейс не содержит реализации этих типов. Он определяет контракт, предписывающий, классам и структурам, которые реализуют этот интерфейс реализовывать все его члены. Интерфейсы поддерживают множественное наследование.
Уже из определения видно, что основное различие – идеологическое. Не смотря на то, что с точки зрения CLR и то и то является типом данных, класс – это контейнер, а интерфейс – контракт.
Вообще говоря, вопрос, поставленный в самом начале не совсем верен. О различиях, как мне кажется, мы можем говорить, в случае сущностей противоположных или в каких-то аспектах, претендующих на одну и ту же роль. Такая ситуация имеет место быть, например, в случаях с абстрактными классами и интерфейсами. В обобщенном же случае мы говорим и связке «класс-интерфейс», эффективно они существуют в паре. Отсутствие механизма множественного наследования в CLR в большинстве случаев разрешается множественной реализацией интерфейсов. В случае значимых типов, когда имеется базовый тип ValueType, наличие интерфейсов позволяет создавать пользовательские типы, удовлетворяющие определенным ограничениям и т.п.
Вопрос #12: Что такое Reflection?
Ответ: Говоря формально, Reflection или Отражение (перевод, принятый в русскоязычной литературе), по сути, процесс, при котором приложение во время выполнения, может отслеживать трассу исполнения, поведение и собственную структуру и менять их. В разрезе .NET, а мы говорим, уже о конкретной реализации отражений в среде виртуальной машины .NET, этот механизм реализован с помощью средств, доступных в пространстве имен System.Reflection. Эти средства позволяют читать метаданные сборок, подгружать их в домены приложений, исполнять методы и использовать типы сторонних сборок, о которых приложение в момент компиляции ничего не знает. Чаще всего, практическое применение механизм отражений находит в создании приложений, поддерживающих подключаемые модули (add-in). Однако наличие механизмов отражений открывает широкие возможности для метапрограммирования и создания суперкомпиляторов.




.png)