Advanced c sharp part 3

38
eleks.com eleks.com Advanced C#. Part 3 Exception Handling, AOP

Transcript of Advanced c sharp part 3

Page 1: Advanced c sharp part 3

eleks.com eleks.com

Advanced C#. Part 3Exception Handling, AOP

Page 2: Advanced c sharp part 3

• Повинні наслідуватись від System.Exception

• Стандартна обробка помилок в C#

• Викидається коли:a) код досягає виразу throwb) виникає системний вийняток (такий як ділення на

нуль)• Не перевіряються вийнятки чи їх специфікації

Вийнятки (Exceptions) в C#

Page 3: Advanced c sharp part 3

• Потрібно викинути екземпляр виключення:

throw(new MyException(“Error”));

• Може бути використана тільки в блоці catchcatch { throw; }

throw statement

Page 4: Advanced c sharp part 3

• Наслідуємо від System.Exception або дочірного класуpublic class Exception1 : System.Exception{ public Exception1(string message) : base(message){}}

public class SomeException : Exception1{ public SomeException(string message) : base(message){}}

Створення класу Exception

Page 5: Advanced c sharp part 3

• Колись вийнятки, визначені у додатку повинні були

розширювати (наслідуватись від )

System.ApplicationException (obsolete)

ApplicationException(obsolete)

Page 6: Advanced c sharp part 3

• Блок catch пов’язаний з блоком try• Блок try може мати більше ніж один блок catch• catch блок відловлює тип вийнятку або наслідуваний тип

вийнятку що проходять через:блоки catch проглядаються в порядку їх появи в кодіблоки catch для специфічних типів повинні іти перед

більш загальними типами• Порожній блок catch буде виловлювати всі типи• Блок catch не потребує імені змінної

catch(Exception)

Виловлення вийнятків

Page 7: Advanced c sharp part 3

Блоки 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}

Page 8: Advanced c sharp part 3

• Вийняток передається вгору поки він не знайде прийнятний обробник

void function1(){ try { try { throw(new SomeOtherException(“Error Message”)); } catch(Exception1 ex) { } } catch(Exception2 ex) { }}

Exception Flow Control

Page 9: Advanced c sharp part 3

• Якщо не буде знайдено підходящого обробника, то вийняток буде переданий до методу, що викликається

void function2(){ try { Function1(); } catch(Exception3 ex3) { } catch(Exception2 ex4) { } catch(Exception ex) { }}

Exception Flow Control

Page 10: Advanced c sharp part 3

• Якщо не буде знайдено підходящого обробника, то виконання програми перерветься і контроль буде передано операційній системі (Windows)

Unhandled Exceptions

Page 11: Advanced c sharp part 3

• Повинен бути повязаним з try блоком• try блок може мати тільки один finally блок• finally блок завжди виконується (але спочатку

виконується відповідний блок catch)

Блок finally

Page 12: Advanced c sharp part 3

void function1(){ try { try { throw(new SomeException(“Error Message”)); } catch(Exception1 ex) { } finally { } } catch(Exception2 ex) { } finally { }}

finally Flow Control

Page 13: Advanced c sharp part 3

•Unhandeled exception в деструкторі

деструктор припиняє виконання, вийняток нехтується, викликається базовий деструктор

•Catch без параметрів відловить усі неопрацьовані вийнятки з інших мов

Деякі спеціальні правила

Page 14: Advanced c sharp part 3

• ArithmeticException• ArrayTypeMismatchException• DivideByZeroException• IndexOutOfRangeException• InvalidCastException• NullReferenceException• OutOfMemoryException• OverflowException• StackOverflowException• TypeInitializationException

Бібіліотека вийнятків

Page 15: Advanced c sharp part 3

• Message – Повідомлення (string) асоційоване з вийнятком

• InnerException Якщо вийняток був згенерований всередині обробника вийнятків, це

посилає на оригінальний вийняток • Source

Посилається на клас – джерело вийнятку• StackTrace

Текстовий рядок, який представляє стек виклику, файл і номер рядка

System.Exception Class

Page 16: Advanced c sharp part 3

eleks.com

Демонстрація 1• Робота з вийнятками. Деббагінг

Page 17: Advanced c sharp part 3

•  Структурний шаблон проектування, призначений для динамічного підключення додаткових можливостей до обєкта.

• Шаблон Decorator надає гнучку альтернативу методу визначення підкласів з метою розширення функціональності.

Паттерн Декоратор

Page 18: Advanced c sharp part 3

•  ЗавданняОб'єкт, який передбачається використовувати, виконує основні

функції. Проте може виникнути потреба додати до нього деяку додаткову функціональність, яка виконуватиметься до або після основної функціональності об'єкта.

• Спосіб вирішення:Декоратор передбачає розширення функціональності об'єкта без визначення підкласів.

• РеалізаціяСтворюється абстрактний клас, що представляє як початковий

клас, так і нові функції, що додаються в клас. У класах-декораторах нові функції викликаються в необхідній послідовності — до або після виклику подальшого об'єкта.

Паттерн Декоратор

Page 19: Advanced c sharp part 3

Паттерн Декоратор

Page 20: Advanced c sharp part 3

• Component: абстрактний клас, який визначає інтерфейс для наслідуваних обєктів

• ConcreteComponent: конкретна реалізація компонента, в яку з допомогою декоратора добавляється нова функціональність

• Decorator: сам декоратор, реалізується в вигляді абстрактного класу і має той ж базовий клас, що й обєкти що декоруються. Тому базовий клас Component повинен бути легким і визначати тільки базовий інтерфейс. Клас декоратор також зберігає посилання на обєкт що декорується в вигляді базового класу Componentі реалізує звязок з базовим класм через наслідування

• ConcreteDecorstorA і ConcreteDecoratorB надають додатковий функціональності, якими повинен бути розширений обєкт ConcreteComponent. ConcreteDecorstorA добавляє нову властивість NewState, а ConcreteDecoratorB добавляє новий метод NewMethod().

Паттерн Декоратор. Учасники

Page 21: Advanced c sharp part 3

Розглянемо приклад.

Припустимо, у нас є піцерія, яка готує різні типи піц з різними добавками.

Є італійська, болгарська піци.

До них можуть додаватися помідори, сир і т.д.

І в залежності від типу піц і комбінацій добавок піца може мати різну вартість.

Тепер подивимося, як це зобразити в програмі на C #:

Паттерн Декоратор

Page 22: Advanced c sharp part 3

eleks.com

Демонстрація 2• Decorator Pattern

Page 23: Advanced c sharp part 3

•  Парадигма програмування, яка дозволяє виокремити перехресну (наскрізну) функціональність.

• Часто згадуваним недоліком обєктно-орієнтовного підходу є неможливість локалізації наскрізної функціональності в одному класі. Як приклад такої функціональності часто називають необхідність ведення журналів подій, керування винятковими ситуаціями, перевірку прав доступу. Код, що відповідає за дану функціональність, часто розкиданий по різних класах. Це, з одного боку, не дозволяє сконцентрувати увагу на основній бізнес-логіці класу і ускладнює читання коду. З іншого боку, ускладнюється внесення змін у методи роботи наскрізної функціональності, що не завжди можна виправити правильним використанням інтерфейсів чи шаблонів проектування. 

Aspect Oriented Programming

Page 24: Advanced c sharp part 3

• Аспект ( aspect) — модуль або клас, який реалізує наскрізну функціональність. Аспект змінює поведінку іншого коду, застосовуючи поради в точках з'єднання, визначених деяким зрізом;

• Порада (advice) — додаткова логіка, код, який повинен бути викликаний з точки з'єднання. Порада може бути виконана до, після або замість точки з'єднання;

• Ціль ( target) — об'єкт, до якого будуть застосовуватися поради;• Точка з'єднання (join point) — точка в виконуваній програмі (виклик методу,

створення об'єкта, звернення до змінної), де слід застосувати пораду;• Зріз (pointcut) — набір точок з'єднання. Зріз визначає, чи підходить дана точка

з'єднання до заданої поради;• Впровадження (introduction) — зміна структури класу та/або зміна ієрархії

успадкування для додавання функціональності аспекту в чужорідний код;• Переплетення ( weaving) — зв'язування об'єктів з відповідними аспектами

(можливе на етапі компіляції, завантаження або виконання програми).

Основні поняття

Page 25: Advanced c sharp part 3

Переваги використання• Аспектно-орієнтований підхід розглядає програмну систему як набір

модулів, кожен з яких виражає особливість функціонування системи.

• При проектуванні системи розробник вибирає модулі так, щоб кожен

із них реалізовував певну функціональну вимогу.

• Аспектно-орієнтований підхід зменшує складність розроблюваного

коду

Page 26: Advanced c sharp part 3

Переваги використання• Аспектно-орієнтований підхід розглядає програмну систему як набір

модулів, кожен з яких виражає особливість функціонування системи.

• При проектуванні системи розробник вибирає модулі так, щоб кожен

із них реалізовував певну функціональну вимогу.

• Аспектно-орієнтований підхід зменшує складність розроблюваного

коду

Page 27: Advanced c sharp part 3

• АОП обробляє аспекти, як фреймворки компонентів. Він використовує щось, що

називають аспектною обгорткою, щоб вставити наші аспект-методи в наші класи

під час компіляції.

• Проте, C # приходить з обгорткою аспекта аспектом.

• C # є гібридом процедурної та об'єктно-орієнтовної мов програмування.

• Таким чином, ми повинні наслідувати АОП з використанням комбінації

спеціальних класів, просторів імен і інтерфейсів.

Aspect Oriented Programming С#

Page 28: Advanced c sharp part 3

• Ми повинні наслідувати наші АОП класи з ContextBoundClass.

• Клас ContextBoundClass дозволяє нам створювати компоненти АОП, через змогу

розширення .Net Framework для надання метаданих для наших компонентів.

public class ContextClass: ContextBoundObject { }

• Ми додаємо наші метадані до цього класу, де ми повинні реалізувати наші методи

аспект.

• В C #, ми створюємо наші аспект модулі як класи атрибутів.

ContextBoundClass

Page 29: Advanced c sharp part 3

• Як бачите нижче, наші класи атрибутів матимуть свої власні атрибути. У нашому

прикладі атрибут AttributeTarget контролює застосування атрибута класу /

методу / властивості і так далі.

ContextBoundClass

Page 30: Advanced c sharp part 3

eleks.com

Демонстрація 2

Page 31: Advanced c sharp part 3

• Замикання (англ. Closure) - це процедура, яка посилається на вільні змінні в

своєму лексичному контексті.

• Замикання, так само як і екземпляр об'єкта, є спосіб представлення

функціональності та даних, пов'язаних і упакованих разом.

• Замикання (closures) представляють собою фрагменти (блоки) коду, який можна

використовувати в якості аргументів функцій і методів

• Ідея замикань полягає в доступі анонімного методу не тільки до переданих

параметрів, а й до зовнішнього оточення.

Замикання (Closures)

Page 32: Advanced c sharp part 3

Замикання (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); }

Page 33: Advanced c sharp part 3

Поведінка зохоплених змінних

Ще однією важливою особливістю реалізації замикань в мові C # є те, що при замиканні здійснюється захоплення змінної, а не захоплення значення змінної, яке було перед визначенням делегата.

Page 34: Advanced c sharp part 3

Поведінка зохоплених змінних

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());

Page 35: Advanced c sharp part 3

eleks.com

Демонстрація 4Замикання 1

Page 36: Advanced c sharp part 3

eleks.com

Демонстрація 4Замикання 2

Page 37: Advanced c sharp part 3

© Denys Prylutskyi, 2015

Практичне завдання

Page 38: Advanced c sharp part 3

Рекомендована література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