Advanced c sharp part 3

Post on 13-Apr-2017

1.259 views 1 download

Transcript of Advanced c sharp part 3

eleks.com eleks.com

Advanced C#. Part 3Exception Handling, AOP

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

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

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

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

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

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

throw(new MyException(“Error”));

• Може бути використана тільки в блоці catchcatch { 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