AntiPatterns: i vizi del programmatore
-
Upload
manuel-scapolan -
Category
Technology
-
view
1.866 -
download
5
description
Transcript of AntiPatterns: i vizi del programmatore
![Page 1: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/1.jpg)
presenta :
PATTERNSI vizi del programmatore
Speaker : Manuel Scapolan
1 0nn va
ANTI
Pordenone , 26 Novembre 2010
![Page 2: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/2.jpg)
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
““
![Page 3: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/3.jpg)
ANTI-PATTERN Definizione:
3
Ripeto sempre gli
stessi ERRORI
![Page 4: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/4.jpg)
COSA FARE?
Quando il codice “puzza” come un paio di scarpe …
4
![Page 5: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/5.jpg)
5
![Page 6: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/6.jpg)
ANTI-PATTERN Soluzione:
6
![Page 7: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/7.jpg)
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 - …?
![Page 8: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/8.jpg)
#1 - Spaghetti code8
![Page 9: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/9.jpg)
Problema
9
![Page 10: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/10.jpg)
Soluzione
10
![Page 11: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/11.jpg)
if … else if … o switch
11
“
“
codice client
![Page 12: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/12.jpg)
Replace Conditional
with Polymorphism
12
classe base
classi derivate
codice client
Refactoring :
![Page 13: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/13.jpg)
Risultato
13
![Page 14: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/14.jpg)
#2 - Overuse of Inheritance(“Sovraccarico” dell’ereditarietà) 14
![Page 15: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/15.jpg)
Problema
15
![Page 16: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/16.jpg)
Soluzione
16
Dove possibile devo sempre preferire la composizione
all’ereditarietà
![Page 17: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/17.jpg)
17
Phone
LandLine
Mobile
Ereditarietà
OldLandLine
![Page 18: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/18.jpg)
18
Phone
LandLine Mobile
Composizione
SMSBehavior
ISendBehavior
MMSBehavior
ISendBehavior
![Page 19: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/19.jpg)
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
![Page 20: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/20.jpg)
#3 - Excessive Coupling(alto accoppiamento) 20
![Page 21: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/21.jpg)
Problema
21
![Page 22: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/22.jpg)
Significa che …
22
ho creato una catena di dipendenze che
lega le mie classi attraverso una loro
implementazione
![Page 23: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/23.jpg)
Risultato
23
![Page 24: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/24.jpg)
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
![Page 25: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/25.jpg)
Obiettivo
25
Ridurre le dipendenze tra le classi del dominio
Program to interfaces, not to implementations! “
![Page 26: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/26.jpg)
Cosa sbaglio?
26
L’OrderController è dipendente dall’implementazione OrderRepository
![Page 27: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/27.jpg)
Creare un oggetto?
27
new
![Page 28: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/28.jpg)
IoC - Inversion of Control
28
OrderController
OrderRepository
OrderController
OrderRepository
IOrderRepository
(inversione delle dipendenze)
astrazione
una delle possibili implementazioni
separazione dei livelli
![Page 29: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/29.jpg)
Principio di Hollywood
29
“Non chiamarci tu, ti chiamiamo noi!”
![Page 30: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/30.jpg)
Dependency Injection
30
Posso ottenere l’IoC“iniettando” le dipendenze:
• tramite il costruttore (constructor injection)
• tramite le proprietà (setter injection)
![Page 31: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/31.jpg)
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
![Page 32: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/32.jpg)
Auto-Wiring
32
L’injector riconosce i servizi richiesti dal client e li collega autonomamentesecondo la configurazione impostata
![Page 33: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/33.jpg)
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.
“
“
![Page 34: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/34.jpg)
Plug-In Pattern
34
Definisce la possibilità di estendere le funzionalità di una applicazione senza doverla modificare
![Page 35: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/35.jpg)
How does MEF work?
35
![Page 36: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/36.jpg)
MEF in Action
36
Definiamo il servizio fornito dall’applicazione
Con [Import] specifichiamo il punto di estensione
1
2
![Page 37: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/37.jpg)
MEF in Action
37
Definiamo un plug-in che implementi il servizio e lo decoriamo con [Export]
3
![Page 38: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/38.jpg)
MEF in Action
38
4 Configuriamo MEF:
• Definiamo un catalogo (dove trovo i plugin?)
• Defininiamo un container e componiamo le parti del sistema
![Page 39: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/39.jpg)
MEF in Action
39
5 Non ci resta che provare l’applicazione:
![Page 40: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/40.jpg)
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]
![Page 41: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/41.jpg)
#4 - Blind Faith(fede cieca) 41
![Page 42: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/42.jpg)
Problema
42
o speriamo sempre che vada tutto bene?
![Page 43: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/43.jpg)
Problema
43
![Page 44: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/44.jpg)
Soluzioni
44
![Page 45: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/45.jpg)
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?
![Page 46: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/46.jpg)
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
![Page 47: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/47.jpg)
Code Contracts in Action
47
1 Pre-condizioni:
2 Post-condizioni:
![Page 48: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/48.jpg)
Code Contracts in Action
48
3 Invarianti:
![Page 49: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/49.jpg)
#5 - Copy&Paste Programming(Programmazione copia&incolla) 49
![Page 50: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/50.jpg)
Problema
50
![Page 51: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/51.jpg)
Order
TakeAwayOrder EatNowOrder
CodeSmell : Duplicated Code
51
![Page 52: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/52.jpg)
Refactoring : Form Template Method
52
Order
TakeAwayOrder EatNowOrder
![Page 53: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/53.jpg)
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
![Page 54: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/54.jpg)
54
![Page 55: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/55.jpg)
Soluzione
55
Code Generation!
![Page 56: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/56.jpg)
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
![Page 57: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/57.jpg)
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
![Page 58: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/58.jpg)
T4 in Action
58
Direttive
Codice testuale
Marcatori segnaposto
+
Codice sorgente
![Page 59: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/59.jpg)
T4 in Action
59
Eseguire Run Custom Tool da menu:3
![Page 60: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/60.jpg)
T4 in Action
60
Verificare il risultato:4
![Page 61: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/61.jpg)
#6 - Premature Optimization(Ottimizzazione prematura) 61
![Page 62: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/62.jpg)
A volte
62
Ottimizzo il codice prima di aver finito con il design
dell’applicazione …
![Page 63: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/63.jpg)
Invece
63
Devo pensare ad ottimizzare il codice solo dopo aver
definito correttamente il design dell’applicazione
![Page 64: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/64.jpg)
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!
“
“
![Page 65: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/65.jpg)
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.
“ “
![Page 66: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/66.jpg)
A “velocità normale” …
66
… ho un semplice foreach
![Page 67: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/67.jpg)
Diapositiva lasciata intenzionalmente bianca
67
![Page 68: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/68.jpg)
Alla fine però il vero
problema forse è …
68
![Page 69: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/69.jpg)
#7 - Be a programmer …(Fare il programmatore) 69
![Page 70: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/70.jpg)
70
… costantemente sotto pressione
![Page 71: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/71.jpg)
71
![Page 72: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/72.jpg)
Consoliamoci ci sono
lavori peggiori …
72
![Page 73: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/73.jpg)
73
![Page 74: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/74.jpg)
74
![Page 75: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/75.jpg)
Slide 4 : http://www.flickr.com/photos/71477195@N00/262288685/
Slide 5 : http://www.flickr.com/photos/94214577@N00/4065926258/
Slide 8 : http://www.flickr.com/photos/zitona/4147791422/
Slide 14 : http://www.flickr.com/photos/11058550@N00/876197487/
Slide 20 : http://www.flickr.com/photos/67681928@N00/2428552288/
Slide 21 : http://www.flickr.com/photos/22911005@N06/3015796994/
Slide 22 : http://www.flickr.com/photos/49503002894@N01/23781529/
Slide 29 : http://www.flickr.com/photos/46026252@N00/450642954/
Slide 41 : l’accoltellatore è di mark holthusen
Slide 49 : http://www.flickr.com/photos/terrypaton/4558724856/
Slide 50 : http://www.flickr.com/photos/50717535@N00/3601448310/
Slide 54 : http://www.flickr.com/photos/78364563@N00/13553883/
Slide 61 : http://www.flickr.com/photos/45928872@N08/4256936358/
Slide 64 : http://www.flickr.com/photos/8663326@N06/4133411028/
Slide 69 : http://www.flickr.com/photos/51035608580@N01/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
![Page 76: AntiPatterns: i vizi del programmatore](https://reader034.fdocuments.net/reader034/viewer/2022042510/55389afc5503469f338b4840/html5/thumbnails/76.jpg)
Thank You! MANUEL SCAPOLAN
website: www.manuelscapolan.it
twitter: manuelscapolan
e-mail: [email protected]
76