SlideShare une entreprise Scribd logo
1  sur  56
Télécharger pour lire hors ligne
An Introduction to Aspect-Oriented Programming in Microsoft .NET.,[object Object],Produce Cleaner Code with Aspect-Oriented Programming,[object Object],Gaël Fraiteur,[object Object],gael@sharpcrafters.comhttp://www.sharpcrafters.com/,[object Object]
AOP Facts,[object Object]
Featured PostSharp Customers,[object Object]
Agenda,[object Object],The Problem with Conventional Programming,[object Object],What is AOP?,[object Object],Why AOP?,[object Object],PostSharp Features,[object Object],Comparing AOP Frameworks,[object Object]
The Problem with Conventional Programming,[object Object],Part 1,[object Object]
In the beginning           there was nothing.,[object Object],publicclassCustomerProcesses,[object Object],{,[object Object],},[object Object]
Customer said: let there be business value.,[object Object],publicclassCustomerProcesses,[object Object],{,[object Object],publicvoid RentBook( int bookId, int customerId ),[object Object],    {,[object Object],Book book = Book.GetById( bookId );,[object Object],Customer customer = Customer.GetById( customerId );,[object Object], ,[object Object],        book.RentedTo = customer;,[object Object],        customer.AccountLines.Add(string.Format( "Rental of book {0}.", book ), book.RentalPrice );,[object Object],        customer.Balance -= book.RentalPrice;,[object Object],    },[object Object],},[object Object],And there was business code.,[object Object]
internalclassCustomerProcesses,[object Object],{,[object Object],privatestaticreadonlyTraceSource trace =,[object Object],newTraceSource( typeof (CustomerProcesses).FullName );,[object Object], ,[object Object],publicvoid RentBook( int bookId, int customerId ),[object Object],    {,[object Object],       trace.TraceInformation(,[object Object],"Entering CustomerProcesses.CreateCustomer( bookId = {0},             customerId = {1} )",,[object Object],            bookId, customerId ); try{ ,[object Object],            Book book = Book.GetById( bookId );,[object Object],Customer customer = Customer.GetById( customerId );,[object Object], ,[object Object],            book.RentedTo = customer;,[object Object],            customer.AccountLines.Add( string.Format( "Rental of book {0}.", book ), book.RentalPrice );,[object Object],            customer.Balance -= book.RentalPrice;,[object Object],            trace.TraceInformation(,[object Object],              "Leaving CustomerProcesses.CreateCustomer( bookId = {0}, customerId = {1} )",,[object Object],              bookId, customerId );,[object Object],        },[object Object],        catch ( Exception e ),[object Object],        {,[object Object],            trace.TraceEvent( TraceEventType.Error, 0,,[object Object],                              "Exception: CustomerProcesses.CreateCustomer(                               bookId = {0}, customerId = {1} ) failed : {2}",,[object Object],                              bookId, customerId, e.Message );,[object Object],             throw;,[object Object],        }  ,[object Object],  },[object Object],},[object Object],Testers said: Letthere be logging,[object Object],And there was logging code.,[object Object]
internalclassCustomerProcesses,[object Object],{,[object Object],privatestaticreadonlyTraceSource trace =,[object Object],newTraceSource(typeof(CustomerProcesses).FullName);,[object Object], ,[object Object],publicvoid RentBook(int bookId, int customerId),[object Object],    {,[object Object],if (bookId <= 0) thrownewArgumentOutOfRangeException("bookId");,[object Object],if (customerId <= 0) thrownewArgumentOutOfRangeException("customerId");,[object Object], ,[object Object],        trace.TraceInformation(,[object Object],"Entering CustomerProcesses.CreateCustomer( bookId = {0}, customerId = {1} )",,[object Object],            bookId, customerId);,[object Object], ,[object Object],try,[object Object],        {,[object Object],Book book = Book.GetById(bookId);,[object Object],Customer customer = Customer.GetById(customerId);,[object Object], ,[object Object],            book.RentedTo = customer;,[object Object],            customer.AccountLines.Add(string.Format("Rental of book {0}.", book),                                      book.RentalPrice);,[object Object],            customer.Balance -= book.RentalPrice;,[object Object], ,[object Object],            trace.TraceInformation(,[object Object],"Leaving CustomerProcesses.CreateCustomer( bookId = {0},                 customerId = {1} )“,  bookId, customerId);,[object Object],        },[object Object],catch (Exception e),[object Object],        {,[object Object],            trace.TraceEvent(TraceEventType.Error, 0,,[object Object],                   "Exception: CustomerProcesses.CreateCustomer( bookId = {0},                     customerId = {1} ) failed : {2}",,[object Object],                    bookId, customerId, e.Message);,[object Object],throw;,[object Object],        },[object Object],    },[object Object],},[object Object],Devssaid: Letthere be defensive programming,[object Object],Thenthere was precondition checking code.,[object Object]
internalclassCustomerProcesses,[object Object],{,[object Object],privatestaticreadonlyTraceSource trace =,[object Object],newTraceSource(typeof(CustomerProcesses).FullName);,[object Object], ,[object Object],publicvoid RentBook(int bookId, int customerId),[object Object],    {,[object Object],if (bookId <= 0) thrownewArgumentOutOfRangeException("bookId");,[object Object],if (customerId <= 0) thrownewArgumentOutOfRangeException("customerId");,[object Object], ,[object Object],        trace.TraceInformation(,[object Object],"Entering CustomerProcesses.CreateCustomer( bookId = {0},            customerId = {1} )“,  bookId, customerId);,[object Object], ,[object Object],try,[object Object],        {,[object Object],for (int i = 0; ; i++),[object Object],            {,[object Object],try,[object Object],                {,[object Object],using (var ts = newTransactionScope()),[object Object],                    {,[object Object],Book book = Book.GetById(bookId);,[object Object],Customer customer = Customer.GetById(customerId);,[object Object], ,[object Object],                        book.RentedTo = customer;,[object Object],                        customer.AccountLines.Add(string.Format("Rental of book {0}.", book),                          book.RentalPrice);,[object Object],                        customer.Balance -= book.RentalPrice;,[object Object], ,[object Object],                        ts.Complete();,[object Object],                    },[object Object], ,[object Object],break;,[object Object],                },[object Object],catch (TransactionConflictException),[object Object],                {,[object Object],if (i < 3),[object Object],continue;,[object Object],else,[object Object],throw;,[object Object],                },[object Object],            },[object Object], ,[object Object],            trace.TraceInformation(,[object Object],"Leaving CustomerProcesses.CreateCustomer(                bookId = {0}, customerId = {1} )",,[object Object],                bookId, customerId);,[object Object],        },[object Object],catch (Exception e),[object Object],        {,[object Object],            trace.TraceEvent(TraceEventType.Error, 0,,[object Object],"Exception: CustomerProcesses.CreateCustomer( bookId = {0},              customerId = {1} ) failed : {2}",,[object Object],              bookId, customerId, e.Message);,[object Object],throw;,[object Object],        },[object Object],    },[object Object],},[object Object],Let there be safe concurrent execution.,[object Object],And there was transaction handling code.,[object Object]
internalclassCustomerProcesses,[object Object],{,[object Object],privatestaticreadonlyTraceSource trace =,[object Object],newTraceSource(typeof(CustomerProcesses).FullName);,[object Object], ,[object Object],publicvoid RentBook(int bookId, int customerId),[object Object],    {,[object Object],if (bookId <= 0) thrownewArgumentOutOfRangeException("bookId");,[object Object],if (customerId <= 0) thrownewArgumentOutOfRangeException("customerId");,[object Object], ,[object Object],try,[object Object],        {,[object Object],            trace.TraceInformation(,[object Object],"Entering CustomerProcesses.CreateCustomer(                  bookId = {0}, customerId = {1} )",,[object Object],                bookId, customerId );,[object Object], ,[object Object],try,[object Object],            {,[object Object],for ( int i = 0;; i++ ),[object Object],                {,[object Object],try,[object Object],                    {,[object Object],using ( var ts = newTransactionScope() ),[object Object],                        {,[object Object],Book book = Book.GetById( bookId );,[object Object],Customer customer = Customer.GetById( customerId );,[object Object], ,[object Object],                            book.RentedTo = customer;,[object Object],                            customer.AccountLines.Add( string.Format( "Rental of book {0}.", book ),                               book.RentalPrice );,[object Object],                            customer.Balance -= book.RentalPrice;,[object Object], ,[object Object],                            ts.Complete();,[object Object],                        },[object Object], ,[object Object],break;,[object Object],                    },[object Object],catch ( TransactionConflictException ),[object Object],                    {,[object Object],if ( i < 3 ),[object Object],continue;,[object Object],else,[object Object],throw;,[object Object],                    },[object Object],                },[object Object], ,[object Object],                trace.TraceInformation(,[object Object],"Leaving CustomerProcesses.CreateCustomer(                     bookId = {0}, customerId = {1} )",,[object Object],                    bookId, customerId );,[object Object],            },[object Object],catch ( Exception e ),[object Object],            {,[object Object],                trace.TraceEvent( TraceEventType.Error, 0,,[object Object],"Exception: CustomerProcesses.CreateCustomer(                   bookId = {0}, customerId = {1} ) failed : {2}",,[object Object],                                  bookId, customerId, e.Message );,[object Object],throw;,[object Object],            },[object Object],        },[object Object],catch ( Exception e ),[object Object],        {,[object Object],if (ExceptionManager.Handle(e)) throw;,[object Object],        },[object Object],    },[object Object],},[object Object],Let there be user-friendly error messages.,[object Object],And there was exception handling code.,[object Object]
AKSEL BACHMEIER architect,[object Object],YOHJI YAMAMOTOcustomer,[object Object]
We want a nice separation of concerns (assembly > namespace > class > method),[object Object],OOP forces us to write crap!,[object Object],Code Scattering,[object Object],Code Tangling,[object Object],Code Coupling,[object Object],Layer 1,[object Object],Layer 2,[object Object],Why do we write ugly code?,[object Object]
Security,[object Object],Exception Handling,[object Object],Tracing,[object Object],Monitoring,[object Object],Transaction,[object Object],Data Binding,[object Object],Thread Sync,[object Object],Caching,[object Object],Validation,[object Object],Non-Functional Requirements,[object Object],Cross-Cutting Concerns,[object Object]
We have patterns. How to implement them?,[object Object],Template-Based Code Generators,[object Object],Anonymous Methods (Functional Programming),[object Object],Object-Oriented Alternatives,[object Object]
Encapsulating Infrastructure Concerns?,[object Object]
Aspects!,[object Object]
Strengthen Applications With Aspects,[object Object],Show Me!,[object Object]
Show Me!,[object Object],1. Add a reference to PostSharp.dll,[object Object]
Show Me!,[object Object],2. Write an aspect,[object Object]
Show Me!,[object Object],3. Apply the aspect,[object Object]
Show Me!,[object Object],How does it work?,[object Object],1. Source,[object Object],2. Compiler,[object Object],3. PostSharp,[object Object],4. Run Time,[object Object]
The Idea Behind AOP,[object Object],Part 3,[object Object]
Problem Domain,[object Object],Cross-Cutting Concerns,[object Object],Solution Domain,[object Object],Separation of Concerns,[object Object]
What is AOP?,[object Object],An extension of (not an alternative to) OOP that addresses the issue of cross-cutting concerns by providing a mean to:,[object Object],Encapsulate cross-cutting concerns into Aspects = collection of transformations of code,[object Object],Applyaspects to elements of code,[object Object]
15 Years of AOP History,[object Object],Hype Years,[object Object],Productivity Years,[object Object],Research Years,[object Object]
Why You Should Care,[object Object],The benefits of aspect-oriented programming,[object Object]
The benefits of aspect-oriented programming,[object Object],Decrease Development Costs,[object Object],WriteFewer lines of code,[object Object],ReadFewer lines of code	,[object Object],Concise, clear, understandable code,[object Object],Size-Cost relationship is superlinear,[object Object]
The benefits of aspect-oriented programming,[object Object],Improve Quality,[object Object],Fewer lines of code	-> Fewer Defects,[object Object],More automation	-> Fewer Defects,[object Object],Less boiler-plate code 	-> More interesting work 	-> Increased attention 	-> Fewer Defects,[object Object]
The benefits of aspect-oriented programming,[object Object],Decrease Maintenance Costs,[object Object],Remember: ,[object Object],Fewer Defects,[object Object],Maintenance = 75% Reading Code,[object Object],How do you change a pattern once it’s implemented?,[object Object],Better architecture metrics:,[object Object],Decreased component coupling,[object Object],Increased component cohesion,[object Object]
The benefits of aspect-oriented programming,[object Object],Decrease Maintenance Costs,[object Object]
The benefits of aspect-oriented programming,[object Object],Optimize Skillsets,[object Object],I understand provisioning processes better than anyone in this company,,[object Object],I master multithreading better than anyone on earth,[object Object],Picture © Darren Rogers and chatwoodsfp (Flicker),[object Object]
Features,[object Object]
Features,[object Object],Code Transformation Primitives,[object Object],Modifications,[object Object],Introductions,[object Object],Around Methods,[object Object],Method Interception,[object Object],Property Interception,[object Object],Field Interception,[object Object],Event Interception,[object Object],Interface Introduction,[object Object],Method Introduction,[object Object],Property Introduction,[object Object],Event Introduction,[object Object],Member Import,[object Object],Custom Attribute Intro,[object Object],Managed Resource Intro,[object Object]
Features,[object Object],Composite Aspects,[object Object],Aspects composed of multiple primitive transformations,[object Object],Advice = Additional Behavior ≈ Transformation,[object Object],Pointcut = Expression selecting target elements of code,[object Object],Declarative,[object Object],LINQ over System.Reflection,[object Object],Adding aspects dynamically: IAspectProvider,[object Object]
Features,[object Object],Aspect Multicasting,[object Object],Using a single line of code, apply an aspects to multiple elements of code based on:,[object Object],Attributes (public/private, virtual/sealed, …),[object Object],Naming conventions,[object Object]
Features,[object Object],Attribute Inheritance,[object Object],Interfaces,[object Object],Classes,[object Object],Virtual Methods,[object Object],Assemblies (!),[object Object],- or -,[object Object]
Robust Aspect Composition,[object Object],Multiple aspects on the same element of code,[object Object],Aspect dependency framework,[object Object],Ordering,[object Object],Requirement,[object Object],Conflict,[object Object],Strong ordering and commutativity,[object Object], Deterministic Behavior,[object Object],D,[object Object],C,[object Object],B,[object Object],A,[object Object]
Visual Studio Extension,[object Object],1. Code Adornment + Clickable Tooltips,[object Object],“What aspects are applied to a given element of code?”,[object Object],1. Adornment + Tooltip,[object Object],Aspects,[object Object],Base Code,[object Object],Bi-Directional Navigation,[object Object],2. Aspect Browser,[object Object],“Which elements of code is a given a given aspect applied to?”,[object Object],2. Aspect Browser,[object Object]
Comparing Aspect Frameworks,[object Object],Part 4,[object Object]
Comparing Aspect Frameworks,[object Object],What to compare?,[object Object],Expressive,[object Object],Non-Invasive,[object Object],Supported,[object Object],Framework,[object Object],Robust,[object Object],Productive,[object Object],Dynamic,[object Object]
Build-Time MSIL Transformation,[object Object],Consumer Object,[object Object],Enhanced Object,[object Object],Aspects,[object Object]
AO Infrastructure,[object Object],Transparent Proxies,[object Object],Enhanced Object,[object Object],Consumer Object,[object Object],Transparent Proxy,[object Object],RealProxy,[object Object],Aspects,[object Object],The transparent proxy is type-compatible with the enhanced object(CLR-provided magic),[object Object]
JIT-Emitted Proxy,[object Object],AO Infrastructure,[object Object],Consumer Object,[object Object],Proxy,[object Object],Enhanced Object,[object Object],Aspects,[object Object],The proxy implements an interface of the enhanced object.,[object Object]
JIT-Emitted Subclass,[object Object],AO Infrastructure,[object Object],Consumer Object,[object Object],Proxy,[object Object],Enhanced Object,[object Object],Aspects,[object Object],The proxy extends (inherits from) the enhanced object.,[object Object]
Comparing Aspect Frameworks,[object Object],Static vs Dynamic AOP,[object Object],Spring.NET,[object Object],Castle,[object Object],MS Unity/PIAB,[object Object],PostSharp,[object Object],LinFu,[object Object],Build-Time:,[object Object],Very Expressive,[object Object],Robust Model,[object Object],Not InvasiveStatic,[object Object],Run-Time:Less ExpressiveBrittle Model,[object Object],InvasiveDynamic,[object Object],Hybrid,[object Object]
Comparing Aspect Frameworks,[object Object],Expressiveness (1/2),[object Object],What can you do with the framework?,[object Object]
Comparing Aspect Frameworks,[object Object],Expressiveness (2/2),[object Object],How do you apply aspects to code?,[object Object]
Comparing Aspect Frameworks,[object Object],Non-Invasiveness,[object Object],Can you use aspects without deep refactoring?,[object Object],Require the use of factory methods,[object Object]
Comparing Aspect Frameworks,[object Object],Robustness,[object Object],Can you prevent aspects from being improperly used?,[object Object]
Comparing Aspect Frameworks,[object Object],Misc.,[object Object],Other points that matter,[object Object]
Comparing Aspect Frameworks,[object Object],My Own Summary,[object Object],Aspects on Service Boundaries: use your favorite application framework.,[object Object],Aspects on Ordinary and GUI Objects: use PostSharp.,[object Object],You can mix PostSharp with your favorite application framework!,[object Object]
Summary,[object Object]
We need Aspects!,[object Object]
We have great frameworks!,[object Object],and PostSharp happens to be the best in .NET :).,[object Object]
http://www.sharpcrafters.com/gael@sharpcrafters.com,[object Object]

Contenu connexe

En vedette

Introduction to Aspect Oriented Programming
Introduction to Aspect Oriented ProgrammingIntroduction to Aspect Oriented Programming
Introduction to Aspect Oriented ProgrammingYan Cui
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented ProgrammingAnumod Kumar
 
Apache Solr lessons learned
Apache Solr lessons learnedApache Solr lessons learned
Apache Solr lessons learnedJeroen Rosenberg
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented ProgrammingRodger Oates
 
Spring aop concepts
Spring aop conceptsSpring aop concepts
Spring aop conceptsRushiBShah
 
Aspect-Oriented Programming for PHP
Aspect-Oriented Programming for PHPAspect-Oriented Programming for PHP
Aspect-Oriented Programming for PHPWilliam Candillon
 
Aspect Oriented Software Development
Aspect Oriented Software DevelopmentAspect Oriented Software Development
Aspect Oriented Software DevelopmentJignesh Patel
 

En vedette (9)

Introduction to Aspect Oriented Programming
Introduction to Aspect Oriented ProgrammingIntroduction to Aspect Oriented Programming
Introduction to Aspect Oriented Programming
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Apache Solr lessons learned
Apache Solr lessons learnedApache Solr lessons learned
Apache Solr lessons learned
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Spring aop concepts
Spring aop conceptsSpring aop concepts
Spring aop concepts
 
Aspect-Oriented Programming for PHP
Aspect-Oriented Programming for PHPAspect-Oriented Programming for PHP
Aspect-Oriented Programming for PHP
 
Aspect Oriented Software Development
Aspect Oriented Software DevelopmentAspect Oriented Software Development
Aspect Oriented Software Development
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 

Similaire à Produce Cleaner Code with Aspect-Oriented Programming

Introduction to Aspect Oriented Programming in .NET with PostSharp by Zubair ...
Introduction to Aspect Oriented Programming in .NET with PostSharp by Zubair ...Introduction to Aspect Oriented Programming in .NET with PostSharp by Zubair ...
Introduction to Aspect Oriented Programming in .NET with PostSharp by Zubair ...Zubair Ahmed
 
Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Juan Pablo
 
Project: Call Center Management
Project: Call Center ManagementProject: Call Center Management
Project: Call Center Managementpritamkumar
 
SH 1 - SES 8 - Stitch_Overview_TLV.pptx
SH 1 - SES 8 - Stitch_Overview_TLV.pptxSH 1 - SES 8 - Stitch_Overview_TLV.pptx
SH 1 - SES 8 - Stitch_Overview_TLV.pptxMongoDB
 
Lab #2: Introduction to Javascript
Lab #2: Introduction to JavascriptLab #2: Introduction to Javascript
Lab #2: Introduction to JavascriptWalid Ashraf
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedMarcinStachniuk
 
Policy Injection in ASP.NET using Enterprise Library 3.0
Policy Injection in ASP.NET using Enterprise Library 3.0Policy Injection in ASP.NET using Enterprise Library 3.0
Policy Injection in ASP.NET using Enterprise Library 3.0PhilWinstanley
 
HashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin InfrastructureHashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin InfrastructureNicolas Corrarello
 
Introduction to trader bots with Python
Introduction to trader bots with PythonIntroduction to trader bots with Python
Introduction to trader bots with Pythonroskakori
 
Advisor Jumpstart: JavaScript
Advisor Jumpstart: JavaScriptAdvisor Jumpstart: JavaScript
Advisor Jumpstart: JavaScriptdominion
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴명신 김
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Datagreenwop
 
Improving Correctness with Types
Improving Correctness with TypesImproving Correctness with Types
Improving Correctness with TypesIain Hull
 
Basics of Java Script (JS)
Basics of Java Script (JS)Basics of Java Script (JS)
Basics of Java Script (JS)Ajay Khatri
 
Practices For Becoming A Better Programmer
Practices For Becoming A Better ProgrammerPractices For Becoming A Better Programmer
Practices For Becoming A Better ProgrammerSrikanth Shreenivas
 

Similaire à Produce Cleaner Code with Aspect-Oriented Programming (20)

Introduction to Aspect Oriented Programming in .NET with PostSharp by Zubair ...
Introduction to Aspect Oriented Programming in .NET with PostSharp by Zubair ...Introduction to Aspect Oriented Programming in .NET with PostSharp by Zubair ...
Introduction to Aspect Oriented Programming in .NET with PostSharp by Zubair ...
 
Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#
 
Project: Call Center Management
Project: Call Center ManagementProject: Call Center Management
Project: Call Center Management
 
SH 1 - SES 8 - Stitch_Overview_TLV.pptx
SH 1 - SES 8 - Stitch_Overview_TLV.pptxSH 1 - SES 8 - Stitch_Overview_TLV.pptx
SH 1 - SES 8 - Stitch_Overview_TLV.pptx
 
Lab #2: Introduction to Javascript
Lab #2: Introduction to JavascriptLab #2: Introduction to Javascript
Lab #2: Introduction to Javascript
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learned
 
Policy Injection in ASP.NET using Enterprise Library 3.0
Policy Injection in ASP.NET using Enterprise Library 3.0Policy Injection in ASP.NET using Enterprise Library 3.0
Policy Injection in ASP.NET using Enterprise Library 3.0
 
HashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin InfrastructureHashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin Infrastructure
 
Functional DDD
Functional DDDFunctional DDD
Functional DDD
 
Introduction to trader bots with Python
Introduction to trader bots with PythonIntroduction to trader bots with Python
Introduction to trader bots with Python
 
Advisor Jumpstart: JavaScript
Advisor Jumpstart: JavaScriptAdvisor Jumpstart: JavaScript
Advisor Jumpstart: JavaScript
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴
 
Rhino Mocks
Rhino MocksRhino Mocks
Rhino Mocks
 
Redux Action Creators
Redux Action CreatorsRedux Action Creators
Redux Action Creators
 
Domain Driven Design 101
Domain Driven Design 101Domain Driven Design 101
Domain Driven Design 101
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
 
UNIT 1 (7).pptx
UNIT 1 (7).pptxUNIT 1 (7).pptx
UNIT 1 (7).pptx
 
Improving Correctness with Types
Improving Correctness with TypesImproving Correctness with Types
Improving Correctness with Types
 
Basics of Java Script (JS)
Basics of Java Script (JS)Basics of Java Script (JS)
Basics of Java Script (JS)
 
Practices For Becoming A Better Programmer
Practices For Becoming A Better ProgrammerPractices For Becoming A Better Programmer
Practices For Becoming A Better Programmer
 

Plus de PostSharp Technologies

Advanced Defensive Coding Techniques (with Introduction to Design by Contract)
Advanced Defensive Coding Techniques (with Introduction to Design by Contract)Advanced Defensive Coding Techniques (with Introduction to Design by Contract)
Advanced Defensive Coding Techniques (with Introduction to Design by Contract)PostSharp Technologies
 
Applying Object Composition to Build Rich Domain Models
Applying Object Composition to Build Rich Domain ModelsApplying Object Composition to Build Rich Domain Models
Applying Object Composition to Build Rich Domain ModelsPostSharp Technologies
 
Building Better Architecture with UX-Driven Design
Building Better Architecture with UX-Driven DesignBuilding Better Architecture with UX-Driven Design
Building Better Architecture with UX-Driven DesignPostSharp Technologies
 
Solving Localization Challenges with Design Pattern Automation
Solving Localization Challenges with Design Pattern AutomationSolving Localization Challenges with Design Pattern Automation
Solving Localization Challenges with Design Pattern AutomationPostSharp Technologies
 
Applying a Methodical Approach to Website Performance
Applying a Methodical Approach to Website PerformanceApplying a Methodical Approach to Website Performance
Applying a Methodical Approach to Website PerformancePostSharp Technologies
 
10 Reasons You MUST Consider Pattern-Aware Programming
10 Reasons You MUST Consider Pattern-Aware Programming10 Reasons You MUST Consider Pattern-Aware Programming
10 Reasons You MUST Consider Pattern-Aware ProgrammingPostSharp Technologies
 

Plus de PostSharp Technologies (10)

Advanced Defensive Coding Techniques (with Introduction to Design by Contract)
Advanced Defensive Coding Techniques (with Introduction to Design by Contract)Advanced Defensive Coding Techniques (with Introduction to Design by Contract)
Advanced Defensive Coding Techniques (with Introduction to Design by Contract)
 
Applying Object Composition to Build Rich Domain Models
Applying Object Composition to Build Rich Domain ModelsApplying Object Composition to Build Rich Domain Models
Applying Object Composition to Build Rich Domain Models
 
Performance is a Feature!
Performance is a Feature!Performance is a Feature!
Performance is a Feature!
 
Building Better Architecture with UX-Driven Design
Building Better Architecture with UX-Driven DesignBuilding Better Architecture with UX-Driven Design
Building Better Architecture with UX-Driven Design
 
Solving Localization Challenges with Design Pattern Automation
Solving Localization Challenges with Design Pattern AutomationSolving Localization Challenges with Design Pattern Automation
Solving Localization Challenges with Design Pattern Automation
 
Applying a Methodical Approach to Website Performance
Applying a Methodical Approach to Website PerformanceApplying a Methodical Approach to Website Performance
Applying a Methodical Approach to Website Performance
 
10 Reasons You MUST Consider Pattern-Aware Programming
10 Reasons You MUST Consider Pattern-Aware Programming10 Reasons You MUST Consider Pattern-Aware Programming
10 Reasons You MUST Consider Pattern-Aware Programming
 
Multithreading Fundamentals
Multithreading FundamentalsMultithreading Fundamentals
Multithreading Fundamentals
 
Multithreading Design Patterns
Multithreading Design PatternsMultithreading Design Patterns
Multithreading Design Patterns
 
Design Pattern Automation
Design Pattern AutomationDesign Pattern Automation
Design Pattern Automation
 

Dernier

Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1DianaGray10
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintMahmoud Rabie
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdfJamie (Taka) Wang
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 
PicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer ServicePicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer ServiceRenan Moreira de Oliveira
 
Babel Compiler - Transforming JavaScript for All Browsers.pptx
Babel Compiler - Transforming JavaScript for All Browsers.pptxBabel Compiler - Transforming JavaScript for All Browsers.pptx
Babel Compiler - Transforming JavaScript for All Browsers.pptxYounusS2
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UbiTrack UK
 
Introduction to Quantum Computing
Introduction to Quantum ComputingIntroduction to Quantum Computing
Introduction to Quantum ComputingGDSC PJATK
 
Do we need a new standard for visualizing the invisible?
Do we need a new standard for visualizing the invisible?Do we need a new standard for visualizing the invisible?
Do we need a new standard for visualizing the invisible?SANGHEE SHIN
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdfPedro Manuel
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Commit University
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfDianaGray10
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesMd Hossain Ali
 
GenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncGenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncObject Automation
 

Dernier (20)

Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 
PicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer ServicePicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer Service
 
Babel Compiler - Transforming JavaScript for All Browsers.pptx
Babel Compiler - Transforming JavaScript for All Browsers.pptxBabel Compiler - Transforming JavaScript for All Browsers.pptx
Babel Compiler - Transforming JavaScript for All Browsers.pptx
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
 
Introduction to Quantum Computing
Introduction to Quantum ComputingIntroduction to Quantum Computing
Introduction to Quantum Computing
 
Do we need a new standard for visualizing the invisible?
Do we need a new standard for visualizing the invisible?Do we need a new standard for visualizing the invisible?
Do we need a new standard for visualizing the invisible?
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdf
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
 
GenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncGenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation Inc
 

Produce Cleaner Code with Aspect-Oriented Programming

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.