SlideShare une entreprise Scribd logo
1  sur  26
Fody
Халявная реализация АОП для .NET
АОП
Аспектно-ориентированное программирование
– парадима программирования, основанная на
понятии сквозной функциональности, т.е.
служебной функциональности.
Если реализовывать сквозную
функциональность вместе с бизнес-логикой, то
код становится полнейшей гадостью.
Примеры сквозной функциольности:
• Логирование
• Обработка исключений
• Проверка прав доступа
• Проверка правильности аргументов
• Кеширование
Fody
Fody – это фреймворк для
внедрения сквозной
функциональности во время
компиляции.
Fody позволяет
манипулировать IL кодом
сборки.
Fody
В действительности Fody – это не совсем АОП.
Цель у них одна, но у Fody теоретических
возможностей больше, а практических
меньше.
Поскольку Fody сам по себе нам не интересен,
мы будем рассматривать его плагины.
Fody / лицензия
Fody распространяется под MIT License
Разрешено:
Не разрешено:
• Коммерческое
• Жаловаться
использование
на качество
• Изменение
• Распространение

Необходимо:
• Включать
копирайт
(если вы
собираетесь
расширять
Fody)
Fody / PropertyChanged
Облегчает жизнь при написании
классов, реализующих INotifyPropertyChanging.
Нету необходимости дергать event
PropertyChanged вручную -> снижается
количество кода на объявление свойств
Fody / PropertyChanged / Атрибуты
[ImplementPropertyChanged]
Вешается на класс и все свойства автоматически
начинают уведомлять о изменениях самих себя.
Все классы-наследники тоже начинают ввести себя
подобным образом.
Те свойства, которые уже уведомляли о изменениях не
будут уведомлять дважды.
Написанный
программистом
код

Скомпилированн
ый код
private int age;

public int Age
{
get

public int Age { get; set; }

=>

{
return this.age;
}
set
{
this.age = value;
this.RaisePropertyChanged();
}
}
Fody сам отслеживает дерево завимостей свойств.
Т.е. если меняется свойство FirstName и от него зависит свойство
FullName, то происходит автоматическое уведомление о
изменении обоих свойств.
public string FirstName { get; set; }
public string LastName { get; set; }

public string FullName { get { return this.FirstName + this.LastName; } }
Fody / PropertyChanged / Атрибуты

[DoNotNotify]
Вешается на свойство для того, чтобы Fody не пытался
уведомлять о его изменениях.

Типичное применение – для свойств, которые содержат какую-то
страшную кастомную логику
Fody / PropertyChanged / Атрибуты

[AlsoNotifyFor]
Вешается на свойство для того, чтобы уведомить о изменениях
другого свойства.
[AlsoNotifyFor(“FullName”)]
public string FirstName { get; set; }
public string FullName { get; set; }
Fody / PropertyChanged / Атрибуты

[DependsOn]
Вешается на свойство для того, чтобы происходили уведомления
о его изменении, при изменении других.
public string FirstName { get; set; }
[DependsOn(“FirstName”)]
public string FullName { get; set; }
On{PropertyName}Changed()
Если в классе есть есть метод с сигнатурой
подобной
void On{PropertyName}Changed()
, то при изменении свойства PropertyName будет
вызываться этот метод.
OnPropertyChanged()
Если в классе есть есть метод с сигнатурой

void OnPropertyChanged(
string name,
object before,
object after)
, то при изменении свойств будет вызываться этот
метод.
Fody / Ionad
Позволяет заменять статические вызовы одних
методов статическими вызовами других.
[StaticReplacement(typeof(DateTime))]
public static class DateTimeSubstitute
{
public static IDateTime Current { get; set; }
public static DateTime Now { get { return Current.Now; } }
}
public void SomeMethod()
{
var time = DateTime.Now;
// ...
}

=>

public void SomeMethod()
{
var time = DateTimeSubstitute.Now;
// ...
}
Fody / NullGuard
Автоматический выброс исключений, если входное
значение или выходное значение равно null.
Контроль осуществляется с помощью двух
атрибутов:
[NullGuard] – вешается на сборку или класс
[AllowNull] – вешается на аргумент, возвращаемое
значение или целое свойство
Fody / NullGuard
Конструктор [NullGuard] принимает перечисление
ValidationFlags:
• Properties = 1,
• Arguments = 2,
• OutValues = 4,

• ReturnValues = 8,
• NonPublic = 16,
• Methods = Arguments | OutValues | ReturnValues,
• AllPublicArguments = Properties | Arguments,
• AllPublic = Properties | Methods,
• All = AllPublic | NonPublic
Fody / NullGuard / Примеры
использования:
abstract void Method([AllowNull] string arg);
[return: AllowNull]
abstract string MethodAllowsNullReturnValue() { return null; }
[AllowNull]
public string NullProperty { get; set; }
public string NullPropertyOnSet { get; [param: AllowNull] set; }
Fody / NullGuard / Замечания
Не рекомендуется его использовать на UI-шной
сборке.
Более адекватным видится использование в
DataAccess-слое и вью-моделях.
Fody / Equals
Занимается генерацией методов Equals(),
GetHashCode(), операторов сравнения и заставляет
класс реализовывать интерфейс IEquatable<T>.
Fody / Equals / Средства контроля
Атрибут [Equals] – вешается на класс, который должен
будет поддерживать сравнение.
При создании можно указать следующие параметры:
• bool DoNotAddEqualityOperators
• bool DoNotAddGetHashCode
• bool DoNotAddEquals
• TypeCheck (перечисление, которое содержит
возможности проверки типа (тот же тип; тот же или
наследник)
Fody / Equals / Средства контроля
Атрибут [IgnoreDuringEquals] – вешается на свойство,
которое нужно исключить из сравнения.
Атрибут [CustomEqualsInternal] – вешается на метод для
кастомной части сравнения. Этот метод должен
возвращать булево значение.
Fody / Equals / Средства контроля
Недоработка авторов плагина: [IgnoreDuringEquals]
исключает свойство из генерации хеш-кода и нет
возможности описать метод кастомного обсчета хеш-кода
Fody / MethodCache
Кеширование возвращаемых значений метода.
Что надо сделать:
1. В классе оставить свойство вида
private ICache Cache { get; set; }
2. В это свойство положить нашу реализацию кеша.
3. Навешать атрибут [Cache] на нужный метод.
Fody / MethodCache
Небольшой фейл разработчика.
Ключ для кеширования метода, принимающего два
параметра выглядит так:
string.Format("Namespace.Class.Add_{0}_{1}", new
object[] { a, b });
Т.е. параметры a и b должны реализовывать
хороший ToString() метод

Contenu connexe

Tendances

C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.Igor Shkulipa
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеmetaform
 
Gang of four review.Structural patterns
Gang of four review.Structural patternsGang of four review.Structural patterns
Gang of four review.Structural patternsMykyta Hopkalo
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011etyumentcev
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real worldEPAM
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
Java весна 2013 лекция 4
Java весна 2013 лекция 4Java весна 2013 лекция 4
Java весна 2013 лекция 4Technopark
 
Java. Generic - шаблонные типы.
Java.  Generic - шаблонные типы.Java.  Generic - шаблонные типы.
Java. Generic - шаблонные типы.Unguryan Vitaliy
 
Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибкиUnguryan Vitaliy
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.genericsmuqaddas_m
 

Tendances (15)

Step 5
Step 5Step 5
Step 5
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 
Gang of four review.Structural patterns
Gang of four review.Structural patternsGang of four review.Structural patterns
Gang of four review.Structural patterns
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
Java весна 2013 лекция 4
Java весна 2013 лекция 4Java весна 2013 лекция 4
Java весна 2013 лекция 4
 
Java. Generic - шаблонные типы.
Java.  Generic - шаблонные типы.Java.  Generic - шаблонные типы.
Java. Generic - шаблонные типы.
 
Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибки
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 

Similaire à Fody - AOP

ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 
Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Dima Dzuba
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)Andrey Gordienkov
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAndrey Gordienkov
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
WordCamp Russia 2015: Фильтры и события в WordPress.
WordCamp Russia 2015: Фильтры и события в WordPress.WordCamp Russia 2015: Фильтры и события в WordPress.
WordCamp Russia 2015: Фильтры и события в WordPress.Igor Zinovyev
 
Symfony(keremet research)
Symfony(keremet research)Symfony(keremet research)
Symfony(keremet research)Alex Polorotov
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerLEDC 2016
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...lshevtsov
 
Михаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знанияМихаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знанияYandex
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalAndrei Solntsev
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.Igor Shkulipa
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Online TechTalk “Flutter Mobile Development”
Online TechTalk “Flutter Mobile Development”Online TechTalk “Flutter Mobile Development”
Online TechTalk “Flutter Mobile Development”GlobalLogic Ukraine
 
Relational databases versioning
Relational databases versioningRelational databases versioning
Relational databases versioningAlexey Rusnak
 

Similaire à Fody - AOP (20)

ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 
Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
WordCamp Russia 2015: Фильтры и события в WordPress.
WordCamp Russia 2015: Фильтры и события в WordPress.WordCamp Russia 2015: Фильтры и события в WordPress.
WordCamp Russia 2015: Фильтры и события в WordPress.
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Symfony(keremet research)
Symfony(keremet research)Symfony(keremet research)
Symfony(keremet research)
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developer
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
 
Михаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знанияМихаил Давыдов: JavaScript. Базовые знания
Михаил Давыдов: JavaScript. Базовые знания
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - final
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Online TechTalk “Flutter Mobile Development”
Online TechTalk “Flutter Mobile Development”Online TechTalk “Flutter Mobile Development”
Online TechTalk “Flutter Mobile Development”
 
Relational databases versioning
Relational databases versioningRelational databases versioning
Relational databases versioning
 
drools introduction
drools introductiondrools introduction
drools introduction
 

Fody - AOP

  • 2. АОП Аспектно-ориентированное программирование – парадима программирования, основанная на понятии сквозной функциональности, т.е. служебной функциональности. Если реализовывать сквозную функциональность вместе с бизнес-логикой, то код становится полнейшей гадостью.
  • 3. Примеры сквозной функциольности: • Логирование • Обработка исключений • Проверка прав доступа • Проверка правильности аргументов • Кеширование
  • 4. Fody Fody – это фреймворк для внедрения сквозной функциональности во время компиляции. Fody позволяет манипулировать IL кодом сборки.
  • 5. Fody В действительности Fody – это не совсем АОП. Цель у них одна, но у Fody теоретических возможностей больше, а практических меньше. Поскольку Fody сам по себе нам не интересен, мы будем рассматривать его плагины.
  • 6. Fody / лицензия Fody распространяется под MIT License Разрешено: Не разрешено: • Коммерческое • Жаловаться использование на качество • Изменение • Распространение Необходимо: • Включать копирайт (если вы собираетесь расширять Fody)
  • 7. Fody / PropertyChanged Облегчает жизнь при написании классов, реализующих INotifyPropertyChanging. Нету необходимости дергать event PropertyChanged вручную -> снижается количество кода на объявление свойств
  • 8. Fody / PropertyChanged / Атрибуты [ImplementPropertyChanged] Вешается на класс и все свойства автоматически начинают уведомлять о изменениях самих себя. Все классы-наследники тоже начинают ввести себя подобным образом. Те свойства, которые уже уведомляли о изменениях не будут уведомлять дважды.
  • 9. Написанный программистом код Скомпилированн ый код private int age; public int Age { get public int Age { get; set; } => { return this.age; } set { this.age = value; this.RaisePropertyChanged(); } }
  • 10. Fody сам отслеживает дерево завимостей свойств. Т.е. если меняется свойство FirstName и от него зависит свойство FullName, то происходит автоматическое уведомление о изменении обоих свойств. public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get { return this.FirstName + this.LastName; } }
  • 11. Fody / PropertyChanged / Атрибуты [DoNotNotify] Вешается на свойство для того, чтобы Fody не пытался уведомлять о его изменениях. Типичное применение – для свойств, которые содержат какую-то страшную кастомную логику
  • 12. Fody / PropertyChanged / Атрибуты [AlsoNotifyFor] Вешается на свойство для того, чтобы уведомить о изменениях другого свойства. [AlsoNotifyFor(“FullName”)] public string FirstName { get; set; } public string FullName { get; set; }
  • 13. Fody / PropertyChanged / Атрибуты [DependsOn] Вешается на свойство для того, чтобы происходили уведомления о его изменении, при изменении других. public string FirstName { get; set; } [DependsOn(“FirstName”)] public string FullName { get; set; }
  • 14. On{PropertyName}Changed() Если в классе есть есть метод с сигнатурой подобной void On{PropertyName}Changed() , то при изменении свойства PropertyName будет вызываться этот метод.
  • 15. OnPropertyChanged() Если в классе есть есть метод с сигнатурой void OnPropertyChanged( string name, object before, object after) , то при изменении свойств будет вызываться этот метод.
  • 16. Fody / Ionad Позволяет заменять статические вызовы одних методов статическими вызовами других. [StaticReplacement(typeof(DateTime))] public static class DateTimeSubstitute { public static IDateTime Current { get; set; } public static DateTime Now { get { return Current.Now; } } } public void SomeMethod() { var time = DateTime.Now; // ... } => public void SomeMethod() { var time = DateTimeSubstitute.Now; // ... }
  • 17. Fody / NullGuard Автоматический выброс исключений, если входное значение или выходное значение равно null. Контроль осуществляется с помощью двух атрибутов: [NullGuard] – вешается на сборку или класс [AllowNull] – вешается на аргумент, возвращаемое значение или целое свойство
  • 18. Fody / NullGuard Конструктор [NullGuard] принимает перечисление ValidationFlags: • Properties = 1, • Arguments = 2, • OutValues = 4, • ReturnValues = 8, • NonPublic = 16, • Methods = Arguments | OutValues | ReturnValues, • AllPublicArguments = Properties | Arguments, • AllPublic = Properties | Methods, • All = AllPublic | NonPublic
  • 19. Fody / NullGuard / Примеры использования: abstract void Method([AllowNull] string arg); [return: AllowNull] abstract string MethodAllowsNullReturnValue() { return null; } [AllowNull] public string NullProperty { get; set; } public string NullPropertyOnSet { get; [param: AllowNull] set; }
  • 20. Fody / NullGuard / Замечания Не рекомендуется его использовать на UI-шной сборке. Более адекватным видится использование в DataAccess-слое и вью-моделях.
  • 21. Fody / Equals Занимается генерацией методов Equals(), GetHashCode(), операторов сравнения и заставляет класс реализовывать интерфейс IEquatable<T>.
  • 22. Fody / Equals / Средства контроля Атрибут [Equals] – вешается на класс, который должен будет поддерживать сравнение. При создании можно указать следующие параметры: • bool DoNotAddEqualityOperators • bool DoNotAddGetHashCode • bool DoNotAddEquals • TypeCheck (перечисление, которое содержит возможности проверки типа (тот же тип; тот же или наследник)
  • 23. Fody / Equals / Средства контроля Атрибут [IgnoreDuringEquals] – вешается на свойство, которое нужно исключить из сравнения. Атрибут [CustomEqualsInternal] – вешается на метод для кастомной части сравнения. Этот метод должен возвращать булево значение.
  • 24. Fody / Equals / Средства контроля Недоработка авторов плагина: [IgnoreDuringEquals] исключает свойство из генерации хеш-кода и нет возможности описать метод кастомного обсчета хеш-кода
  • 25. Fody / MethodCache Кеширование возвращаемых значений метода. Что надо сделать: 1. В классе оставить свойство вида private ICache Cache { get; set; } 2. В это свойство положить нашу реализацию кеша. 3. Навешать атрибут [Cache] на нужный метод.
  • 26. Fody / MethodCache Небольшой фейл разработчика. Ключ для кеширования метода, принимающего два параметра выглядит так: string.Format("Namespace.Class.Add_{0}_{1}", new object[] { a, b }); Т.е. параметры a и b должны реализовывать хороший ToString() метод