antipatterns: i vizi del programmatore
Embed Size (px)
DESCRIPTION
Scopriamo come migliorare il nostro codice con le ultime novità dal mondo .NET: MEF, Code Contracts, T4, Task Parallel Library e molto altro ancora.TRANSCRIPT

presenta :
PATTERNSI vizi del programmatore
Speaker : Manuel Scapolan
1 0nn va
ANTI
Pordenone , 26 Novembre 2010

ANTI-PATTERN Definizione:
Un anti-pattern è una frequente, ma in gran parte inefficace soluzione ad un problema … descrive il modo in cui da un problema si ottiene una “cattiva“ soluzione … con l'aggiunta di ulteriori difficoltà a quelle che in origine esistevano, un anti-pattern può lasciare in una situazione peggiore rispetto a quella di partenza.
tradotto con google translate da2
““

ANTI-PATTERN Definizione:
3
Ripeto sempre gli
stessi ERRORI

COSA FARE?
Quando il codice “puzza” come un paio di scarpe …
4

5

ANTI-PATTERN Soluzione:
6

ANTI-PATTERN menù
7
#1 - Spaghetti code
#2 - Overuse of Inheritance
#3 - Excessive Coupling
#4 - Blind Faith
#5 - Copy & Paste programming
#6 - Premature Optimization
#7 - …?

#1 - Spaghetti code8

Problema
9

Soluzione
10

if … else if … o switch
11
“
“
codice client

Replace Conditional
with Polymorphism
12
classe base
classi derivate
codice client
Refactoring :

Risultato
13

#2 - Overuse of Inheritance(“Sovraccarico” dell’ereditarietà) 14

Problema
15

Soluzione
16
Dove possibile devo sempre preferire la composizione
all’ereditarietà

17
Phone
LandLine
Mobile
Ereditarietà
OldLandLine

18
Phone
LandLine Mobile
Composizione
SMSBehavior
ISendBehavior
MMSBehavior
ISendBehavior

19
In pratica ho applicato il …
Define a family of alghoritms, encapsulate each one, and make them interchangeable. Strategy lets teìhe algorithm vary independently from clients that use it.
“
“
Pattern Strategy
GoF

#3 - Excessive Coupling(alto accoppiamento) 20

Problema
21

Significa che …
22
ho creato una catena di dipendenze che
lega le mie classi attraverso una loro
implementazione

Risultato
23

Legge di Demeter
24
For all classes C, and for all methods M attached to C, all objects to which M sends a message must be instances of classes associated with the following classes:
1, The argument classes of M (including C).2. The instance variable classes of C.
(Objects created by M, or by functions or methods which M calls, and objects in global variables are considered as arguments of M).
“
“
Bisogna solo applicare correttamente l’incapsulamento!
http://www.ccs.neu.edu/research/demeter/papers/law-of-demeter/oopsla88-law-of-demeter.pdf

Obiettivo
25
Ridurre le dipendenze tra le classi del dominio
Program to interfaces, not to implementations! “

Cosa sbaglio?
26
L’OrderController è dipendente dall’implementazione OrderRepository

Creare un oggetto?
27
new

IoC - Inversion of Control
28
OrderController
OrderRepository
OrderController
OrderRepository
IOrderRepository
(inversione delle dipendenze)
astrazione
una delle possibili implementazioni
separazione dei livelli

Principio di Hollywood
29
“Non chiamarci tu, ti chiamiamo noi!”

Dependency Injection
30
Posso ottenere l’IoC“iniettando” le dipendenze:
• tramite il costruttore (constructor injection)
• tramite le proprietà (setter injection)

StructureMap
31
http://structuremap.net/structuremap/index.html
StructureMap is a Dependency Injection / Inversion of Control tool. It can enable looser coupling between classes and their dependencies, improve the testability of a class structure, and provide generic flexibility mechanisms. Used judiciously, StructureMap can greatly enhance the opportunities for code reuse by minimizing direct coupling between classes and configuration mechanisms.
“
“Global.Asax
Service Locator

Auto-Wiring
32
L’injector riconosce i servizi richiesti dal client e li collega autonomamentesecondo la configurazione impostata

Managed Extensibility
Framework (MEF)
33
Plugin
SDK (Standard)
Application
The Managed Extensibility Framework (or MEF for short) simplifies the creation of extensible applications. MEF offers discovery and composition capabilities that you can leverage to load application extensions.
“
“

Plug-In Pattern
34
Definisce la possibilità di estendere le funzionalità di una applicazione senza doverla modificare

How does MEF work?
35

MEF in Action
36
Definiamo il servizio fornito dall’applicazione
Con [Import] specifichiamo il punto di estensione
1
2

MEF in Action
37
Definiamo un plug-in che implementi il servizio e lo decoriamo con [Export]
3

MEF in Action
38
4 Configuriamo MEF:
• Definiamo un catalogo (dove trovo i plugin?)
• Defininiamo un container e componiamo le parti del sistema

MEF in Action
39
5 Non ci resta che provare l’applicazione:

MEF in Action
dynamic loading
40
Plugin
MEFApplication
Plugin
Plugin
Plugin
MEF offers a set of discovery approaches for your application to locate and load available extensions. .
“ “
[ImportMany]

#4 - Blind Faith(fede cieca) 41

Problema
42
o speriamo sempre che vada tutto bene?

Problema
43

Soluzioni
44

Design by Contract
45
Una classe garantisce un servizio nel rispetto di un contratto definito attraverso:
InvariantiChe cosa devo mantenere invariato?
Post-condizioni Che cosa sono in grado di garantire?
Pre-condizioniChe cosa mi aspetto di ricevere?

46
Code Contracts provide a language-agnostic way to express coding assumptions in .NET programs. The contracts take the form of pre-conditions, post-conditions, and object invariants. Contracts act as checked documentation of your external and internal APIs. The contracts are used to improve testing via runtime checking, enable static contract verification, and documentation generation.
“
“
DbC by Microsoft

Code Contracts in Action
47
1 Pre-condizioni:
2 Post-condizioni:

Code Contracts in Action
48
3 Invarianti:

#5 - Copy&Paste Programming(Programmazione copia&incolla) 49

Problema
50

Order
TakeAwayOrder EatNowOrder
CodeSmell : Duplicated Code
51

Refactoring : Form Template Method
52
Order
TakeAwayOrder EatNowOrder

Altri Refactoring
53
Extract Method
Extract Class
Pull Up Method
Incapsulare in un metodo le istruzioni che possono essere raggruppate logicamente
Muovere in un metodo della classe base le istruzioni comuni alle derivate
Incapsulare in una classe campi e metodi che possono rappresentare un concetto comune

54

Soluzione
55
Code Generation!

T4(Text Template Transformation Toolkit)
56
T4 is a template-based code generation engine. You can use T4 templates to generate Visual Basic, C#, T-SQL, XML or any other text files.
“
“
Oleg Sychwww.olegsych.com

T4 in Action
57
Installare T4 Toolboxda http://t4toolbox.codeplex.com/
Definire il template, un mix di:2• Direttive
(es. il tipo di file da generare)
• Codice testuale (viene riportato tale e quale nel file di output)
• Codice sorgente (serve a rendere dinamiche le parti generate)
Installare T4 Editor (per l’intellisense)da http://t4-editor.tangible-engineering.com
1

T4 in Action
58
Direttive
Codice testuale
Marcatori segnaposto
+
Codice sorgente

T4 in Action
59
Eseguire Run Custom Tool da menu:3

T4 in Action
60
Verificare il risultato:4

#6 - Premature Optimization(Ottimizzazione prematura) 61

A volte
62
Ottimizzo il codice prima di aver finito con il design
dell’applicazione …

Invece
63
Devo pensare ad ottimizzare il codice solo dopo aver
definito correttamente il design dell’applicazione

Performance
64
Applicare i principi della programmazione ad oggetti
Velocità(performance)
Posso sempre migliorare le performance di un codice scritto pensando al design, non viceversa!
“
“

Task Parallel Library
65
Qualcosa però posso farlo da subito con la …
Quando si utilizza TPL, è possibile ottimizzare le prestazioni del codice concentrandosi sulle operazioni per cui il programma è stato progettato.
“ “

A “velocità normale” …
66
… ho un semplice foreach

Diapositiva lasciata intenzionalmente bianca
67

Alla fine però il vero
problema forse è …
68

#7 - Be a programmer …(Fare il programmatore) 69

70
… costantemente sotto pressione

71

Consoliamoci ci sono
lavori peggiori …
72

73

74

Slide 4 : http://www.flickr.com/photos/[email protected]/262288685/
Slide 5 : http://www.flickr.com/photos/[email protected]/4065926258/
Slide 8 : http://www.flickr.com/photos/zitona/4147791422/
Slide 14 : http://www.flickr.com/photos/[email protected]/876197487/
Slide 20 : http://www.flickr.com/photos/[email protected]/2428552288/
Slide 21 : http://www.flickr.com/photos/[email protected]/3015796994/
Slide 22 : http://www.flickr.com/photos/[email protected]/23781529/
Slide 29 : http://www.flickr.com/photos/[email protected]/450642954/
Slide 41 : l’accoltellatore è di mark holthusen
Slide 49 : http://www.flickr.com/photos/terrypaton/4558724856/
Slide 50 : http://www.flickr.com/photos/[email protected]/3601448310/
Slide 54 : http://www.flickr.com/photos/[email protected]/13553883/
Slide 61 : http://www.flickr.com/photos/[email protected]/4256936358/
Slide 64 : http://www.flickr.com/photos/[email protected]/4133411028/
Slide 69 : http://www.flickr.com/photos/[email protected]/214854623
Slide 70 : http://crazy-picsblog.blogspot.com/2010/01/15-of-worlds-crazy-and-strange-jobs.html
Slide 71 : http://www.funny-city.com
Slide 73 : http://www.nuffy.net/misc/pics/worlds-worst-jobs-in-pics.html
Slide 74 : http://crazy-picsblog.blogspot.com/2010/01/15-of-worlds-crazy-and-strange-jobs.html
CreditsLe immagini contenute in questa presentazione
hanno licenza Creative Commons
75

Thank You! MANUEL SCAPOLAN
website: www.manuelscapolan.it
twitter: manuelscapolan
e-mail: [email protected]
76