SlideShare a Scribd company logo
1 of 38
eleks.comeleks.com
Advanced C#. Part 3
Exception Handling, AOP
• Повинні наслідуватись від System.Exception
• Стандартна обробка помилок в C#
• Викидається коли:
a) код досягає виразу throw
b) виникає системний вийняток (такий як ділення на нуль)
• Не перевіряються вийнятки чи їх специфікації
Вийнятки (Exceptions) в C#
• Потрібно викинути екземпляр виключення:
throw(new MyException(“Error”));
• Може бути використана тільки в блоці catch
catch
{
throw;
}
throw statement
• Наслідуємо від System.Exception або дочірного класу
public class Exception1 : System.Exception
{
public Exception1(string message) : base(message){}
}
public class SomeException : Exception1
{
public SomeException(string message) : base(message){}
}
Створення класу Exception
• Колись вийнятки, визначені у додатку повинні були розширювати
(наслідуватись від ) System.ApplicationException (obsolete)
ApplicationException(obsolete)
• Блок catch пов’язаний з блоком try
• Блок try може мати більше ніж один блок catch
• catch блок відловлює тип вийнятку або наслідуваний тип вийнятку
що проходять через:
блоки catch проглядаються в порядку їх появи в коді
блоки catch для специфічних типів повинні іти перед більш
загальними типами
• Порожній блок catch буде виловлювати всі типи
• Блок catch не потребує імені змінної
catch(Exception)
Виловлення вийнятків
Блоки catch
Невірно
void function1()
{
try
{
// code
}
catch(Exception ex)
{
}
catch(Exception1 ex)
{
}
}
Вірно
void function1()
{
try
{
// code
}
catch(Exception1 ex)
{
}
catch(Exception ex)
{
}
// if no rethrow occurs
// execution resumes here
}
• Вийняток передається вгору поки він не знайде прийнятний
обробник
void function1()
{
try
{
try
{
throw(new SomeOtherException(“Error Message”));
}
catch(Exception1 ex)
{
}
}
catch(Exception2 ex)
{
}
}
Exception Flow Control
• Якщо не буде знайдено підходящого обробника, то вийняток буде
переданий до методу, що викликається
void function2()
{
try
{
Function1();
}
catch(Exception3 ex3)
{
}
catch(Exception2 ex4)
{
}
catch(Exception ex)
{
}
}
Exception Flow Control
• Якщо не буде знайдено підходящого обробника, то виконання
програми перерветься і контроль буде передано операційній
системі (Windows)
Unhandled Exceptions
• Повинен бути повязаним з try блоком
• try блок може мати тільки один finally блок
• finally блок завжди виконується (але спочатку
виконується відповідний блок catch)
Блок finally
void function1()
{
try
{
try
{
throw(new SomeException(“Error Message”));
}
catch(Exception1 ex)
{
}
finally
{
}
}
catch(Exception2 ex)
{
}
finally
{
}
}
finally Flow Control
•Unhandeled exception в деструкторі
деструктор припиняє виконання, вийняток
нехтується, викликається базовий деструктор
•Catch без параметрів відловить усі
неопрацьовані вийнятки з інших мов
Деякі спеціальні правила
• ArithmeticException
• ArrayTypeMismatchException
• DivideByZeroException
• IndexOutOfRangeException
• InvalidCastException
• NullReferenceException
• OutOfMemoryException
• OverflowException
• StackOverflowException
• TypeInitializationException
Бібіліотека вийнятків
• Message –
Повідомлення (string) асоційоване з вийнятком
• InnerException
Якщо вийняток був згенерований всередині обробника вийнятків, це посилає на
оригінальний вийняток
• Source
Посилається на клас – джерело вийнятку
• StackTrace
Текстовий рядок, який представляє стек виклику, файл і номер рядка
System.Exception Class
eleks.com
Демонстрація 1
• Робота з вийнятками. Деббагінг
• Структурний шаблон проектування, призначений для динамічного підключення
додаткових можливостей до обєкта.
• Шаблон Decorator надає гнучку альтернативу методу визначення підкласів з метою
розширення функціональності.
Паттерн Декоратор
• Завдання
Об'єкт, який передбачається використовувати, виконує основні функції.
Проте може виникнути потреба додати до нього деяку додаткову
функціональність, яка виконуватиметься до або після основної
функціональності об'єкта.
• Спосіб вирішення:
Декоратор передбачає розширення функціональності об'єкта без
визначення підкласів.
• Реалізація
Створюється абстрактний клас, що представляє як початковий клас, так і
нові функції, що додаються в клас. У класах-декораторах нові функції
викликаються в необхідній послідовності — до або після виклику
подальшого об'єкта.
Паттерн Декоратор
Паттерн Декоратор
• Component: абстрактний клас, який визначає інтерфейс для наслідуваних обєктів
• ConcreteComponent: конкретна реалізація компонента, в яку з допомогою
декоратора добавляється нова функціональність
• Decorator: сам декоратор, реалізується в вигляді абстрактного класу і має той ж
базовий клас, що й обєкти що декоруються. Тому базовий клас Component повинен
бути легким і визначати тільки базовий інтерфейс. Клас декоратор також зберігає
посилання на обєкт що декорується в вигляді базового класу Componentі реалізує
звязок з базовим класм через наслідування
• ConcreteDecorstorA і ConcreteDecoratorB надають додатковий функціональності,
якими повинен бути розширений обєкт ConcreteComponent. ConcreteDecorstorA
добавляє нову властивість NewState, а ConcreteDecoratorB добавляє новий метод
NewMethod().
Паттерн Декоратор. Учасники
Розглянемо приклад.
Припустимо, у нас є піцерія, яка готує різні типи піц з різними добавками.
Є італійська, болгарська піци.
До них можуть додаватися помідори, сир і т.д.
І в залежності від типу піц і комбінацій добавок піца може мати різну вартість.
Тепер подивимося, як це зобразити в програмі на C #:
Паттерн Декоратор
eleks.com
Демонстрація 2
• Decorator Pattern
• Парадигма програмування, яка дозволяє виокремити перехресну (наскрізну)
функціональність.
• Часто згадуваним недоліком обєктно-орієнтовного підходу є неможливість локалізації
наскрізної функціональності в одному класі. Як приклад такої функціональності часто
називають необхідність ведення журналів подій, керування винятковими ситуаціями, перевірку
прав доступу. Код, що відповідає за дану функціональність, часто розкиданий по різних класах.
Це, з одного боку, не дозволяє сконцентрувати увагу на основній бізнес-логіці класу і
ускладнює читання коду. З іншого боку, ускладнюється внесення змін у методи роботи
наскрізної функціональності, що не завжди можна виправити правильним використанням
інтерфейсів чи шаблонів проектування.
Aspect Oriented Programming
• Аспект ( aspect) — модуль або клас, який реалізує наскрізну функціональність. Аспект змінює
поведінку іншого коду, застосовуючи поради в точках з'єднання, визначених деяким зрізом;
• Порада (advice) — додаткова логіка, код, який повинен бути викликаний з точки з'єднання.
Порада може бути виконана до, після або замість точки з'єднання;
• Ціль ( target) — об'єкт, до якого будуть застосовуватися поради;
• Точка з'єднання (join point) — точка в виконуваній програмі (виклик методу, створення об'єкта,
звернення до змінної), де слід застосувати пораду;
• Зріз (pointcut) — набір точок з'єднання. Зріз визначає, чи підходить дана точка з'єднання до
заданої поради;
• Впровадження (introduction) — зміна структури класу та/або зміна ієрархії успадкування для
додавання функціональності аспекту в чужорідний код;
• Переплетення ( weaving) — зв'язування об'єктів з відповідними аспектами (можливе на етапі
компіляції, завантаження або виконання програми).
Основні поняття
Переваги використання
• Аспектно-орієнтований підхід розглядає програмну систему як набір модулів,
кожен з яких виражає особливість функціонування системи.
• При проектуванні системи розробник вибирає модулі так, щоб кожен із них
реалізовував певну функціональну вимогу.
• Аспектно-орієнтований підхід зменшує складність розроблюваного коду
Переваги використання
• Аспектно-орієнтований підхід розглядає програмну систему як набір модулів,
кожен з яких виражає особливість функціонування системи.
• При проектуванні системи розробник вибирає модулі так, щоб кожен із них
реалізовував певну функціональну вимогу.
• Аспектно-орієнтований підхід зменшує складність розроблюваного коду
• АОП обробляє аспекти, як фреймворки компонентів. Він використовує щось, що називають
аспектною обгорткою, щоб вставити наші аспект-методи в наші класи під час компіляції.
• Проте, C # приходить з обгорткою аспекта аспектом.
• C # є гібридом процедурної та об'єктно-орієнтовної мов програмування.
• Таким чином, ми повинні наслідувати АОП з використанням комбінації спеціальних класів,
просторів імен і інтерфейсів.
Aspect Oriented Programming С#
• Ми повинні наслідувати наші АОП класи з ContextBoundClass.
• Клас ContextBoundClass дозволяє нам створювати компоненти АОП, через змогу розширення
.Net Framework для надання метаданих для наших компонентів.
public class ContextClass: ContextBoundObject { }
• Ми додаємо наші метадані до цього класу, де ми повинні реалізувати наші методи аспект.
• В C #, ми створюємо наші аспект модулі як класи атрибутів.
ContextBoundClass
• Як бачите нижче, наші класи атрибутів матимуть свої власні атрибути. У нашому прикладі
атрибут AttributeTarget контролює застосування атрибута класу / методу / властивості і так далі.
ContextBoundClass
eleks.com
Демонстрація 2
• Замикання (англ. Closure) - це процедура, яка посилається на вільні змінні в своєму лексичному
контексті.
• Замикання, так само як і екземпляр об'єкта, є спосіб представлення функціональності та даних,
пов'язаних і упакованих разом.
• Замикання (closures) представляють собою фрагменти (блоки) коду, який можна
використовувати в якості аргументів функцій і методів
• Ідея замикань полягає в доступі анонімного методу не тільки до переданих параметрів, а й до
зовнішнього оточення.
Замикання (Closures)
Замикання (Closures)
private void EnclosingMethod(bool outerVariable1,
ref int nonOuterVariable)
{
int outerVariable2 = 10;
string capturedVariable = "captured";
if (outerVariable2 % 2 == 0)
{
int normalLocalVariable = 5;
Console.WriteLine("Normal local variable: {0}", normalLocalVariable);
}
WaitCallback d = delegate(object o)
{
int anonymousMethodLocalVariable = 12;
Console.WriteLine("Captured variable is {0}", capturedVariable);
};
ThreadPool.QueueUserWorkItem(d, null);
}
Поведінка зохоплених змінних
Ще однією важливою особливістю реалізації замикань в
мові C # є те, що при замиканні здійснюється
захоплення змінної, а не захоплення значення змінної,
яке було перед визначенням делегата.
Поведінка зохоплених змінних
var funcs = new List<Func<int>>();
for (int i = 0; i < 3; i++)
{
funcs.Add(() => i);
}
foreach (var f in funcs)
Console.WriteLine(f());
var funcs = new List<Func<int>>();
for (int i = 0; i < 3; ++i)
{
int tmp = i;
funcs.Add(() => tmp);
}
foreach (var f in funcs)
Console.WriteLine(f());
eleks.com
Демонстрація 4
Замикання 1
eleks.com
Демонстрація 4
Замикання 2
© Denys Prylutskyi, 2015
Практичне завдання
Рекомендована література
1. R. Sedgewick “Algorithms”
2. A. Troelsen “C# 6.0 and the .NET 4.6 Framework”
3. H. Schildt “C# 4.0 The Complete Reference”
4. J. Richter “CLR via C#”
5. J. Skeet “C# in Depth”
6. Stackoverflow.com

More Related Content

What's hot

10 asp.net
10 asp.net 10 asp.net
10 asp.net
eleksdev
 
07 Database Access
07 Database Access07 Database Access
07 Database Access
eleksdev
 
G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2
eleksdev
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаються
cit-cit
 
11 web services
11 web services11 web services
11 web services
eleksdev
 
Net Framework and c# module 2. OOP
Net Framework and c# module 2. OOPNet Framework and c# module 2. OOP
Net Framework and c# module 2. OOP
Andrii Hladkyi
 
01 c# basics
01 c# basics01 c# basics
01 c# basics
eleksdev
 
NET Framework and C# Module 6.2. Generics
NET Framework and C# Module 6.2. GenericsNET Framework and C# Module 6.2. Generics
NET Framework and C# Module 6.2. Generics
Andrii Hladkyi
 

What's hot (20)

10 asp.net
10 asp.net 10 asp.net
10 asp.net
 
Rpc
RpcRpc
Rpc
 
07 Database Access
07 Database Access07 Database Access
07 Database Access
 
Windows service
Windows serviceWindows service
Windows service
 
G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2
 
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
 
Advanced C#. Part 2
Advanced C#. Part 2Advanced C#. Part 2
Advanced C#. Part 2
 
System programing module 1. Processes
System programing module 1. ProcessesSystem programing module 1. Processes
System programing module 1. Processes
 
System programing module 2. Threads
System programing module 2. ThreadsSystem programing module 2. Threads
System programing module 2. Threads
 
Web service lecture
Web service lectureWeb service lecture
Web service lecture
 
NET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. InterfacesNET Framework and C# Module 5. Interfaces
NET Framework and C# Module 5. Interfaces
 
лаб. роб. №2 обєкти та сервіси що ними надаються
лаб. роб. №2   обєкти та сервіси що ними надаютьсялаб. роб. №2   обєкти та сервіси що ними надаються
лаб. роб. №2 обєкти та сервіси що ними надаються
 
Design patterns part 1
Design patterns part 1Design patterns part 1
Design patterns part 1
 
Xdebug (ukr)
Xdebug (ukr)Xdebug (ukr)
Xdebug (ukr)
 
Net framework and C# module 17. Serialization
Net framework and  C# module 17. SerializationNet framework and  C# module 17. Serialization
Net framework and C# module 17. Serialization
 
11 web services
11 web services11 web services
11 web services
 
Design patterns part 2
Design patterns part 2Design patterns part 2
Design patterns part 2
 
Net Framework and c# module 2. OOP
Net Framework and c# module 2. OOPNet Framework and c# module 2. OOP
Net Framework and c# module 2. OOP
 
01 c# basics
01 c# basics01 c# basics
01 c# basics
 
NET Framework and C# Module 6.2. Generics
NET Framework and C# Module 6.2. GenericsNET Framework and C# Module 6.2. Generics
NET Framework and C# Module 6.2. Generics
 

Viewers also liked (20)

SDLC. PM Role
SDLC. PM RoleSDLC. PM Role
SDLC. PM Role
 
#2 integration + ui tests
#2 integration + ui tests#2 integration + ui tests
#2 integration + ui tests
 
If unit2 summary
If unit2 summaryIf unit2 summary
If unit2 summary
 
SDLC. QA Role
SDLC. QA RoleSDLC. QA Role
SDLC. QA Role
 
Frontend basics
Frontend basicsFrontend basics
Frontend basics
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Code Practices
Code PracticesCode Practices
Code Practices
 
SQL Grouping, Joins
SQL Grouping, JoinsSQL Grouping, Joins
SQL Grouping, Joins
 
tsql
tsqltsql
tsql
 
#4 code quality
#4 code quality#4 code quality
#4 code quality
 
Mvvw patterns
Mvvw patternsMvvw patterns
Mvvw patterns
 
SQL: Indexes, Select operator
SQL: Indexes, Select operatorSQL: Indexes, Select operator
SQL: Indexes, Select operator
 
Improving rpc bkp
Improving rpc bkpImproving rpc bkp
Improving rpc bkp
 
Sql 04n edited
Sql 04n editedSql 04n edited
Sql 04n edited
 
Unit1 summary
Unit1 summaryUnit1 summary
Unit1 summary
 
Communication in android
Communication in androidCommunication in android
Communication in android
 
Css animation, html5 api
Css animation, html5 apiCss animation, html5 api
Css animation, html5 api
 
NoSQL basics
NoSQL basicsNoSQL basics
NoSQL basics
 
Lecture android best practices
Lecture   android best practicesLecture   android best practices
Lecture android best practices
 
Solid and ioc principles
Solid and ioc principlesSolid and ioc principles
Solid and ioc principles
 

Similar to Advanced c sharp part 3

Using Metatags in Flex Developing
Using Metatags in Flex DevelopingUsing Metatags in Flex Developing
Using Metatags in Flex Developing
Roman Shuper
 
ASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptxASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptx
Ihor34
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
Dmitry Chabanenko
 
Лекція №12 Передача параметрів у функцію.pptx
Лекція №12 Передача параметрів у функцію.pptxЛекція №12 Передача параметрів у функцію.pptx
Лекція №12 Передача параметрів у функцію.pptx
ssuserf57884
 
Uml+Patterns2
Uml+Patterns2Uml+Patterns2
Uml+Patterns2
apofig
 
алгоритми
алгоритмиалгоритми
алгоритми
borys1982
 

Similar to Advanced c sharp part 3 (20)

[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
 
V24 com to_net
V24 com to_netV24 com to_net
V24 com to_net
 
cpp-2013 #20 Best practices
cpp-2013 #20 Best practicescpp-2013 #20 Best practices
cpp-2013 #20 Best practices
 
Using Metatags in Flex Developing
Using Metatags in Flex DevelopingUsing Metatags in Flex Developing
Using Metatags in Flex Developing
 
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
 
Practices
PracticesPractices
Practices
 
"Elements of functional programming in C# based on Language-Ext library as an...
"Elements of functional programming in C# based on Language-Ext library as an..."Elements of functional programming in C# based on Language-Ext library as an...
"Elements of functional programming in C# based on Language-Ext library as an...
 
Net framework і c# module 9
Net framework і c# module 9Net framework і c# module 9
Net framework і c# module 9
 
ASP.Net MVC
ASP.Net MVCASP.Net MVC
ASP.Net MVC
 
ASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptxASP.NET Core лекція 02.pptx
ASP.NET Core лекція 02.pptx
 
Automated testing
Automated testingAutomated testing
Automated testing
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
 
C# oop exception
C# oop exceptionC# oop exception
C# oop exception
 
l9
l9l9
l9
 
Net framework і c# module 5
Net framework і c# module 5Net framework і c# module 5
Net framework і c# module 5
 
Лекція №12 Передача параметрів у функцію.pptx
Лекція №12 Передача параметрів у функцію.pptxЛекція №12 Передача параметрів у функцію.pptx
Лекція №12 Передача параметрів у функцію.pptx
 
C# OOP exception
C# OOP exceptionC# OOP exception
C# OOP exception
 
Lecture 06. iOS Programming. Основи Objective-C
Lecture 06. iOS Programming. Основи Objective-CLecture 06. iOS Programming. Основи Objective-C
Lecture 06. iOS Programming. Основи Objective-C
 
Uml+Patterns2
Uml+Patterns2Uml+Patterns2
Uml+Patterns2
 
алгоритми
алгоритмиалгоритми
алгоритми
 

More from eleksdev (8)

Hello android world
Hello android worldHello android world
Hello android world
 
Android location and sensors API
Android location and sensors APIAndroid location and sensors API
Android location and sensors API
 
Lecture java basics
Lecture   java basicsLecture   java basics
Lecture java basics
 
G rpc lection1
G rpc lection1G rpc lection1
G rpc lection1
 
Continuous Delivery concept overview. Continuous Integration Systems. DevOps ...
Continuous Delivery concept overview. Continuous Integration Systems. DevOps ...Continuous Delivery concept overview. Continuous Integration Systems. DevOps ...
Continuous Delivery concept overview. Continuous Integration Systems. DevOps ...
 
SDLC. UX Role
SDLC. UX RoleSDLC. UX Role
SDLC. UX Role
 
SDLC. BA Role
SDLC. BA RoleSDLC. BA Role
SDLC. BA Role
 
sql introduction
sql introductionsql introduction
sql introduction
 

Advanced c sharp part 3

  • 1. eleks.comeleks.com Advanced C#. Part 3 Exception Handling, AOP
  • 2. • Повинні наслідуватись від System.Exception • Стандартна обробка помилок в C# • Викидається коли: a) код досягає виразу throw b) виникає системний вийняток (такий як ділення на нуль) • Не перевіряються вийнятки чи їх специфікації Вийнятки (Exceptions) в C#
  • 3. • Потрібно викинути екземпляр виключення: throw(new MyException(“Error”)); • Може бути використана тільки в блоці catch catch { throw; } throw statement
  • 4. • Наслідуємо від System.Exception або дочірного класу public class Exception1 : System.Exception { public Exception1(string message) : base(message){} } public class SomeException : Exception1 { public SomeException(string message) : base(message){} } Створення класу Exception
  • 5. • Колись вийнятки, визначені у додатку повинні були розширювати (наслідуватись від ) System.ApplicationException (obsolete) ApplicationException(obsolete)
  • 6. • Блок catch пов’язаний з блоком try • Блок try може мати більше ніж один блок catch • catch блок відловлює тип вийнятку або наслідуваний тип вийнятку що проходять через: блоки catch проглядаються в порядку їх появи в коді блоки catch для специфічних типів повинні іти перед більш загальними типами • Порожній блок catch буде виловлювати всі типи • Блок catch не потребує імені змінної catch(Exception) Виловлення вийнятків
  • 7. Блоки catch Невірно void function1() { try { // code } catch(Exception ex) { } catch(Exception1 ex) { } } Вірно void function1() { try { // code } catch(Exception1 ex) { } catch(Exception ex) { } // if no rethrow occurs // execution resumes here }
  • 8. • Вийняток передається вгору поки він не знайде прийнятний обробник void function1() { try { try { throw(new SomeOtherException(“Error Message”)); } catch(Exception1 ex) { } } catch(Exception2 ex) { } } Exception Flow Control
  • 9. • Якщо не буде знайдено підходящого обробника, то вийняток буде переданий до методу, що викликається void function2() { try { Function1(); } catch(Exception3 ex3) { } catch(Exception2 ex4) { } catch(Exception ex) { } } Exception Flow Control
  • 10. • Якщо не буде знайдено підходящого обробника, то виконання програми перерветься і контроль буде передано операційній системі (Windows) Unhandled Exceptions
  • 11. • Повинен бути повязаним з try блоком • try блок може мати тільки один finally блок • finally блок завжди виконується (але спочатку виконується відповідний блок catch) Блок finally
  • 12. void function1() { try { try { throw(new SomeException(“Error Message”)); } catch(Exception1 ex) { } finally { } } catch(Exception2 ex) { } finally { } } finally Flow Control
  • 13. •Unhandeled exception в деструкторі деструктор припиняє виконання, вийняток нехтується, викликається базовий деструктор •Catch без параметрів відловить усі неопрацьовані вийнятки з інших мов Деякі спеціальні правила
  • 14. • ArithmeticException • ArrayTypeMismatchException • DivideByZeroException • IndexOutOfRangeException • InvalidCastException • NullReferenceException • OutOfMemoryException • OverflowException • StackOverflowException • TypeInitializationException Бібіліотека вийнятків
  • 15. • Message – Повідомлення (string) асоційоване з вийнятком • InnerException Якщо вийняток був згенерований всередині обробника вийнятків, це посилає на оригінальний вийняток • Source Посилається на клас – джерело вийнятку • StackTrace Текстовий рядок, який представляє стек виклику, файл і номер рядка System.Exception Class
  • 16. eleks.com Демонстрація 1 • Робота з вийнятками. Деббагінг
  • 17. • Структурний шаблон проектування, призначений для динамічного підключення додаткових можливостей до обєкта. • Шаблон Decorator надає гнучку альтернативу методу визначення підкласів з метою розширення функціональності. Паттерн Декоратор
  • 18. • Завдання Об'єкт, який передбачається використовувати, виконує основні функції. Проте може виникнути потреба додати до нього деяку додаткову функціональність, яка виконуватиметься до або після основної функціональності об'єкта. • Спосіб вирішення: Декоратор передбачає розширення функціональності об'єкта без визначення підкласів. • Реалізація Створюється абстрактний клас, що представляє як початковий клас, так і нові функції, що додаються в клас. У класах-декораторах нові функції викликаються в необхідній послідовності — до або після виклику подальшого об'єкта. Паттерн Декоратор
  • 20. • Component: абстрактний клас, який визначає інтерфейс для наслідуваних обєктів • ConcreteComponent: конкретна реалізація компонента, в яку з допомогою декоратора добавляється нова функціональність • Decorator: сам декоратор, реалізується в вигляді абстрактного класу і має той ж базовий клас, що й обєкти що декоруються. Тому базовий клас Component повинен бути легким і визначати тільки базовий інтерфейс. Клас декоратор також зберігає посилання на обєкт що декорується в вигляді базового класу Componentі реалізує звязок з базовим класм через наслідування • ConcreteDecorstorA і ConcreteDecoratorB надають додатковий функціональності, якими повинен бути розширений обєкт ConcreteComponent. ConcreteDecorstorA добавляє нову властивість NewState, а ConcreteDecoratorB добавляє новий метод NewMethod(). Паттерн Декоратор. Учасники
  • 21. Розглянемо приклад. Припустимо, у нас є піцерія, яка готує різні типи піц з різними добавками. Є італійська, болгарська піци. До них можуть додаватися помідори, сир і т.д. І в залежності від типу піц і комбінацій добавок піца може мати різну вартість. Тепер подивимося, як це зобразити в програмі на C #: Паттерн Декоратор
  • 23. • Парадигма програмування, яка дозволяє виокремити перехресну (наскрізну) функціональність. • Часто згадуваним недоліком обєктно-орієнтовного підходу є неможливість локалізації наскрізної функціональності в одному класі. Як приклад такої функціональності часто називають необхідність ведення журналів подій, керування винятковими ситуаціями, перевірку прав доступу. Код, що відповідає за дану функціональність, часто розкиданий по різних класах. Це, з одного боку, не дозволяє сконцентрувати увагу на основній бізнес-логіці класу і ускладнює читання коду. З іншого боку, ускладнюється внесення змін у методи роботи наскрізної функціональності, що не завжди можна виправити правильним використанням інтерфейсів чи шаблонів проектування. Aspect Oriented Programming
  • 24. • Аспект ( aspect) — модуль або клас, який реалізує наскрізну функціональність. Аспект змінює поведінку іншого коду, застосовуючи поради в точках з'єднання, визначених деяким зрізом; • Порада (advice) — додаткова логіка, код, який повинен бути викликаний з точки з'єднання. Порада може бути виконана до, після або замість точки з'єднання; • Ціль ( target) — об'єкт, до якого будуть застосовуватися поради; • Точка з'єднання (join point) — точка в виконуваній програмі (виклик методу, створення об'єкта, звернення до змінної), де слід застосувати пораду; • Зріз (pointcut) — набір точок з'єднання. Зріз визначає, чи підходить дана точка з'єднання до заданої поради; • Впровадження (introduction) — зміна структури класу та/або зміна ієрархії успадкування для додавання функціональності аспекту в чужорідний код; • Переплетення ( weaving) — зв'язування об'єктів з відповідними аспектами (можливе на етапі компіляції, завантаження або виконання програми). Основні поняття
  • 25. Переваги використання • Аспектно-орієнтований підхід розглядає програмну систему як набір модулів, кожен з яких виражає особливість функціонування системи. • При проектуванні системи розробник вибирає модулі так, щоб кожен із них реалізовував певну функціональну вимогу. • Аспектно-орієнтований підхід зменшує складність розроблюваного коду
  • 26. Переваги використання • Аспектно-орієнтований підхід розглядає програмну систему як набір модулів, кожен з яких виражає особливість функціонування системи. • При проектуванні системи розробник вибирає модулі так, щоб кожен із них реалізовував певну функціональну вимогу. • Аспектно-орієнтований підхід зменшує складність розроблюваного коду
  • 27. • АОП обробляє аспекти, як фреймворки компонентів. Він використовує щось, що називають аспектною обгорткою, щоб вставити наші аспект-методи в наші класи під час компіляції. • Проте, C # приходить з обгорткою аспекта аспектом. • C # є гібридом процедурної та об'єктно-орієнтовної мов програмування. • Таким чином, ми повинні наслідувати АОП з використанням комбінації спеціальних класів, просторів імен і інтерфейсів. Aspect Oriented Programming С#
  • 28. • Ми повинні наслідувати наші АОП класи з ContextBoundClass. • Клас ContextBoundClass дозволяє нам створювати компоненти АОП, через змогу розширення .Net Framework для надання метаданих для наших компонентів. public class ContextClass: ContextBoundObject { } • Ми додаємо наші метадані до цього класу, де ми повинні реалізувати наші методи аспект. • В C #, ми створюємо наші аспект модулі як класи атрибутів. ContextBoundClass
  • 29. • Як бачите нижче, наші класи атрибутів матимуть свої власні атрибути. У нашому прикладі атрибут AttributeTarget контролює застосування атрибута класу / методу / властивості і так далі. ContextBoundClass
  • 31. • Замикання (англ. Closure) - це процедура, яка посилається на вільні змінні в своєму лексичному контексті. • Замикання, так само як і екземпляр об'єкта, є спосіб представлення функціональності та даних, пов'язаних і упакованих разом. • Замикання (closures) представляють собою фрагменти (блоки) коду, який можна використовувати в якості аргументів функцій і методів • Ідея замикань полягає в доступі анонімного методу не тільки до переданих параметрів, а й до зовнішнього оточення. Замикання (Closures)
  • 32. Замикання (Closures) private void EnclosingMethod(bool outerVariable1, ref int nonOuterVariable) { int outerVariable2 = 10; string capturedVariable = "captured"; if (outerVariable2 % 2 == 0) { int normalLocalVariable = 5; Console.WriteLine("Normal local variable: {0}", normalLocalVariable); } WaitCallback d = delegate(object o) { int anonymousMethodLocalVariable = 12; Console.WriteLine("Captured variable is {0}", capturedVariable); }; ThreadPool.QueueUserWorkItem(d, null); }
  • 33. Поведінка зохоплених змінних Ще однією важливою особливістю реалізації замикань в мові C # є те, що при замиканні здійснюється захоплення змінної, а не захоплення значення змінної, яке було перед визначенням делегата.
  • 34. Поведінка зохоплених змінних var funcs = new List<Func<int>>(); for (int i = 0; i < 3; i++) { funcs.Add(() => i); } foreach (var f in funcs) Console.WriteLine(f()); var funcs = new List<Func<int>>(); for (int i = 0; i < 3; ++i) { int tmp = i; funcs.Add(() => tmp); } foreach (var f in funcs) Console.WriteLine(f());
  • 37. © Denys Prylutskyi, 2015 Практичне завдання
  • 38. Рекомендована література 1. R. Sedgewick “Algorithms” 2. A. Troelsen “C# 6.0 and the .NET 4.6 Framework” 3. H. Schildt “C# 4.0 The Complete Reference” 4. J. Richter “CLR via C#” 5. J. Skeet “C# in Depth” 6. Stackoverflow.com

Editor's Notes

  1. private static IEnumerable<int> GetFibonacciNumbers(int maxValue) { int previous = 0; int current = 1; while (true) { int next = current + previous; if (next <= maxValue) { previous = current; current = next; yield return next; } else { yield break; } } }
  2. private static IEnumerable<int> GetFibonacciNumbers(int maxValue) { int previous = 0; int current = 1; while (true) { int next = current + previous; if (next <= maxValue) { previous = current; current = next; yield return next; } else { yield break; } } }
  3. private static IEnumerable<int> GetFibonacciNumbers(int maxValue) { int previous = 0; int current = 1; while (true) { int next = current + previous; if (next <= maxValue) { previous = current; current = next; yield return next; } else { yield break; } } }