antipatterns: i vizi del programmatore

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

Upload: manuel-scapolan

Post on 22-Apr-2015

1.864 views

Category:

Technology


5 download

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

Page 1: AntiPatterns: i vizi del programmatore

presenta :

PATTERNSI vizi del programmatore

Speaker : Manuel Scapolan

1 0nn va

ANTI

Pordenone , 26 Novembre 2010

Page 2: AntiPatterns: i vizi del programmatore

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

ANTI-PATTERN Definizione:

3

Ripeto sempre gli

stessi ERRORI

Page 4: AntiPatterns: i vizi del programmatore

COSA FARE?

Quando il codice “puzza” come un paio di scarpe …

4

Page 5: AntiPatterns: i vizi del programmatore

5

Page 6: AntiPatterns: i vizi del programmatore

ANTI-PATTERN Soluzione:

6

Page 7: AntiPatterns: i vizi del programmatore

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

#1 - Spaghetti code8

Page 9: AntiPatterns: i vizi del programmatore

Problema

9

Page 10: AntiPatterns: i vizi del programmatore

Soluzione

10

Page 11: AntiPatterns: i vizi del programmatore

if … else if … o switch

11

codice client

Page 12: AntiPatterns: i vizi del programmatore

Replace Conditional

with Polymorphism

12

classe base

classi derivate

codice client

Refactoring :

Page 13: AntiPatterns: i vizi del programmatore

Risultato

13

Page 14: AntiPatterns: i vizi del programmatore

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

Page 15: AntiPatterns: i vizi del programmatore

Problema

15

Page 16: AntiPatterns: i vizi del programmatore

Soluzione

16

Dove possibile devo sempre preferire la composizione

all’ereditarietà

Page 17: AntiPatterns: i vizi del programmatore

17

Phone

LandLine

Mobile

Ereditarietà

OldLandLine

Page 18: AntiPatterns: i vizi del programmatore

18

Phone

LandLine Mobile

Composizione

SMSBehavior

ISendBehavior

MMSBehavior

ISendBehavior

Page 19: AntiPatterns: i vizi del programmatore

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

#3 - Excessive Coupling(alto accoppiamento) 20

Page 21: AntiPatterns: i vizi del programmatore

Problema

21

Page 22: AntiPatterns: i vizi del programmatore

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

Risultato

23

Page 24: AntiPatterns: i vizi del programmatore

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

Obiettivo

25

Ridurre le dipendenze tra le classi del dominio

Program to interfaces, not to implementations! “

Page 26: AntiPatterns: i vizi del programmatore

Cosa sbaglio?

26

L’OrderController è dipendente dall’implementazione OrderRepository

Page 27: AntiPatterns: i vizi del programmatore

Creare un oggetto?

27

new

Page 28: AntiPatterns: i vizi del programmatore

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

Principio di Hollywood

29

“Non chiamarci tu, ti chiamiamo noi!”

Page 30: AntiPatterns: i vizi del programmatore

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

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

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

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

Plug-In Pattern

34

Definisce la possibilità di estendere le funzionalità di una applicazione senza doverla modificare

Page 35: AntiPatterns: i vizi del programmatore

How does MEF work?

35

Page 36: AntiPatterns: i vizi del programmatore

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

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

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

MEF in Action

39

5 Non ci resta che provare l’applicazione:

Page 40: AntiPatterns: i vizi del programmatore

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

#4 - Blind Faith(fede cieca) 41

Page 42: AntiPatterns: i vizi del programmatore

Problema

42

o speriamo sempre che vada tutto bene?

Page 43: AntiPatterns: i vizi del programmatore

Problema

43

Page 44: AntiPatterns: i vizi del programmatore

Soluzioni

44

Page 45: AntiPatterns: i vizi del programmatore

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

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

Code Contracts in Action

47

1 Pre-condizioni:

2 Post-condizioni:

Page 48: AntiPatterns: i vizi del programmatore

Code Contracts in Action

48

3 Invarianti:

Page 49: AntiPatterns: i vizi del programmatore

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

Page 50: AntiPatterns: i vizi del programmatore

Problema

50

Page 51: AntiPatterns: i vizi del programmatore

Order

TakeAwayOrder EatNowOrder

CodeSmell : Duplicated Code

51

Page 52: AntiPatterns: i vizi del programmatore

Refactoring : Form Template Method

52

Order

TakeAwayOrder EatNowOrder

Page 53: AntiPatterns: i vizi del programmatore

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

54

Page 55: AntiPatterns: i vizi del programmatore

Soluzione

55

Code Generation!

Page 56: AntiPatterns: i vizi del programmatore

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

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

T4 in Action

58

Direttive

Codice testuale

Marcatori segnaposto

+

Codice sorgente

Page 59: AntiPatterns: i vizi del programmatore

T4 in Action

59

Eseguire Run Custom Tool da menu:3

Page 60: AntiPatterns: i vizi del programmatore

T4 in Action

60

Verificare il risultato:4

Page 61: AntiPatterns: i vizi del programmatore

#6 - Premature Optimization(Ottimizzazione prematura) 61

Page 62: AntiPatterns: i vizi del programmatore

A volte

62

Ottimizzo il codice prima di aver finito con il design

dell’applicazione …

Page 63: AntiPatterns: i vizi del programmatore

Invece

63

Devo pensare ad ottimizzare il codice solo dopo aver

definito correttamente il design dell’applicazione

Page 64: AntiPatterns: i vizi del programmatore

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

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

A “velocità normale” …

66

… ho un semplice foreach

Page 67: AntiPatterns: i vizi del programmatore

Diapositiva lasciata intenzionalmente bianca

67

Page 68: AntiPatterns: i vizi del programmatore

Alla fine però il vero

problema forse è …

68

Page 69: AntiPatterns: i vizi del programmatore

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

Page 70: AntiPatterns: i vizi del programmatore

70

… costantemente sotto pressione

Page 71: AntiPatterns: i vizi del programmatore

71

Page 72: AntiPatterns: i vizi del programmatore

Consoliamoci ci sono

lavori peggiori …

72

Page 73: AntiPatterns: i vizi del programmatore

73

Page 74: AntiPatterns: i vizi del programmatore

74

Page 75: AntiPatterns: i vizi del programmatore

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

Thank You! MANUEL SCAPOLAN

website: www.manuelscapolan.it

twitter: manuelscapolan

e-mail: [email protected]

76