Object Calisthenics - 9 steps to better OO code

A presentation at Code Europe Cracow in April 2017 in Kraków, Poland by Paweł Lewtak

Slide 1

Slide 1

O b j e c t

C a l i s t h e n i c s 9

s t e p s

t o

b e t t e r

O O

c o d e

Slide 2

Slide 2

A b o u t

m e P a w e ł

L e w t a k S e n i o r

D e v e l o p e r

a t

X s t r e a m

@ p a w e l _ l e w t a k

Slide 3

Slide 3

A g e n d a L e a r n

h o w

t o

m a k e

o u r

c o d e

m o r e : r e a d a b l e r e u s a b l e t e s t a b l e m a i n t a i n a b l e

Slide 4

Slide 4

T h i n g s

w o r t h

k n o w i n g

D R Y K I S S S O L I D Y A G N I G R A S P

Slide 5

Slide 5

C a l i s t h e n i c s

Slide 6

Slide 6

C a l

i s

t h e n

i c s / ˌ k a l ə s ˈ T H e n i k s /

Slide 7

Slide 7

" C a l i s t h e n i c s

a r e

e x e r c i s e s

c o n s i s t i n g

o f

a v a r i e t y

o f

g r o s s

m o t o r

m o v e m e n t s ;

o f t e n r h y t h m i c a l

a n d

g e n e r a l l y

w i t h o u t

e q u i p m e n t o r

a p p a r a t u s . " W i k i p e d i a

Slide 8

Slide 8

O b j e c t

C a l i s t h e n i c s J e f f

B a y

Slide 9

Slide 9

W r i t t e n

f o r

J a v a

Slide 10

Slide 10

W h y

b o t h e r ?

Slide 11

Slide 11

C o d e

i s

r e a d

m o r e t h a n

i t

i s

w r i t t e n A u t h o r

u n k n o w n

Slide 12

Slide 12

Y o u

n e e d

t o

w r i t e

c o d e

t h a t m i n i m i s e s

t h e

t i m e

i t

w o u l d t a k e

s o m e o n e

e l s e

t o u n d e r s t a n d

i t

e v e n

i f

t h a t s o m e o n e

e l s e

i s

y o u A r t

o f

R e a d a b l e

C o d e

b y

D u s t i n

B o s w e l l , T r e v o r

F o u c h e r

Slide 13

Slide 13

R u l e

1 O n l y

o n e

l e v e l

o f i n d e n t a t i o n

p e r

m e t h o d

Slide 14

Slide 14

c l a s s

B o a r d ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ,

d a t a ) :

L e v e l

0

s e l f . b u f

=

" "

f o r

i

i n

r a n g e ( 1 0 ) :

L e v e l

1

f o r

j

i n

r a n g e ( 1 0 ) :

L e v e l

2

s e l f . b u f

=

d a t a [ i ] [ j ]

Slide 15

Slide 15

c l a s s

B o a r d ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ,

d a t a ) :

s e l f . b u f

=

" "

s e l f . c o l l e c t _ r o w s ( d a t a )

d e f

c o l l e c t _ r o w s ( s e l f ,

d a t a ) :

f o r

i

i n

r a n g e ( 1 0 ) :

s e l f . c o l l e c t _ r o w ( d a t a [ i ] )

d e f

c o l l e c t _ r o w ( s e l f ,

r o w ) :

f o r

j

i n

r a n g e ( 1 0 ) :

s e l f . b u f

=

r o w [ j ]

Slide 16

Slide 16

c l a s s

U s e r S e r v i c e ( o b j e c t ) :

d e f

r e g i s t e r ( s e l f ,

u s e r n a m e ,

e m a i l ,

p r o m o _ c o d e

=

F a l s e ) :

u s e r

=

s e l f . c r e a t e _ u s e r ( u s e r n a m e )

i f

e m a i l :

s e n d _ e m a i l ( u s e r ,

e m a i l )

i f

p r o m o _ c o d e :

s e n d _ p r o m o _ c o d e ( u s e r ,

p r o m o _ c o d e )

Slide 17

Slide 17

p r o d u c t s

=

s e l f . g e t _ p r o d u c t s _ b y _ u s e r ( . . . ) i f

p r o d u c t s

i s

N o n e :

p r o d u c t s

=

s e l f . g e t _ p r o d u c t s _ b y _ m e d i a ( . . . )

i f

p r o d u c t s

i s

N o n e :

p r o d u c t s

=

s e l f . g e t _ p r o d u c t s _ b y _ d o m a i n ( . . . )

i f

p r o d u c t s

i s

N o n e :

p r o d u c t s

=

s e l f . g e t _ a n y _ p r o d u c t s ( . . . ) :

i f

p r o d u c t s

i s

N o n e :

r a i s e

E x c e p t i o n ( ' A c c e s s

d e n i e d ' )

e l s e :

. . .

e l s e :

. . .

e l s e :

. . . e l s e :

. . .

Slide 18

Slide 18

p r o d u c t s

=

s e l f . g e t _ p r o d u c t s _ b y _ u s e r ( . . . ) i f

p r o d u c t s

i s

N o n e :

p r o d u c t s

=

s e l f . g e t _ p r o d u c t s _ b y _ m e d i a ( . . . ) i f

p r o d u c t s

i s

N o n e :

p r o d u c t s

=

s e l f . g e t _ p r o d u c t s _ b y _ d o m a i n ( . . . ) i f

p r o d u c t s

i s

N o n e :

p r o d u c t s

=

s e l f . g e t _ a n y _ p r o d u c t s ( . . . ) : i f

p r o d u c t s

i s

N o n e :

r a i s e

E x c e p t i o n ( ' A c c e s s

d e n i e d ' )

e l s e . . .

Slide 19

Slide 19

C h a i n

o f

c o m m a n d

Slide 20

Slide 20

c l a s s

C o m m a n d ( o b j e c t ) :

n e x t _ c o m m a n d

=

N o n e

d e f

a d d ( s e l f ,

n e x t _ c o m m a n d ) :

i f

s e l f . n e x t _ c o m m a n d

i s

N o n e :

s e l f . n e x t _ c o m m a n d

=

n e x t _ c o m m a n d

e l s e :

s e l f . n e x t _ c o m m a n d . a d d ( n e x t _ c o m m a n d )

d e f

_ p r o c e s s ( s e l f ,

a r g s ,

k w a r g s ) :

" " "

c o m p u t a t i o n s

" " "

p a s s

d e f

p r o c e s s ( s e l f ,

a r g s ,

k w a r g s ) :

r e s u l t

=

s e l f . _ p r o c e s s ( * a r g s ,

k w a r g s )

i f

r e s u l t

i s

N o n e :

i f

s e l f . n e x t _ c o m m a n d

i s

n o t

N o n e :

r e t u r n

s e l f . n e x t _ c o m m a n d . p r o c e s s ( * a r g s ,

k w a r g s )

e l s e :

r e t u r n

r e s u l t

r e t u r n

N o n e

Slide 21

Slide 21

c l a s s

G e t P r o d u c t s F o r U s e r ( C o m m a n d ) :

p a s s c l a s s

G e t P r o d u c t s B y M e d i a ( C o m m a n d ) :

p a s s c l a s s

G e t P r o d u c t s B y D o m a i n ( C o m m a n d ) :

p a s s c l a s s

G e t A n y P r o d u c t s ( C o m m a n d ) :

p a s s c o m m a n d s

=

G e t P r o d u c t s F o r U s e r ( ) c o m m a n d s . a d d ( G e t P r o d u c t s B y M e d i a ) c o m m a n d s . a d d ( G e t P r o d u c t s B y D o m a i n ) c o m m a n d s . a d d ( G e t A n y P r o d u c t s ) p r o d u c t s

=

c o m m a n d s . p r o c e s s ( . . . )

Slide 22

Slide 22

B e n e f i t s S i n g l e

r e s p o n s i b i l i t y B e t t e r

n a m i n g S h o r t e r

m e t h o d s R e u s a b l e

m e t h o d s

Slide 23

Slide 23

R u l e

2 D o

n o t

u s e

e l s e

k e y w o r d

Slide 24

Slide 24

d e f

l o g i n

( s e l f ,

r e q u e s t ) :

i f

r e q u e s t . u s e r . i s _ a u t h e n t i c a t e d ( ) :

r e t u r n

r e d i r e c t ( " h o m e p a g e " )

e l s e :

m e s s a g e s . a d d _ m e s s a g e ( r e q u e s t ,

m e s s a g e s . I N F O ,

' B a d

c r e d e n t i a l s ' )

r e t u r n

r e d i r e c t ( " l o g i n " )

Slide 25

Slide 25

d e f

l o g i n

( s e l f ,

r e q u e s t ) :

i f

r e q u e s t . u s e r . i s _ a u t h e n t i c a t e d ( ) :

r e t u r n

r e d i r e c t ( " h o m e p a g e " )

m e s s a g e s . a d d _ m e s s a g e ( r e q u e s t ,

m e s s a g e s . I N F O ,

' B a d

c r e d e n t i a l s ' )

r e t u r n

r e d i r e c t ( " l o g i n " )

Slide 26

Slide 26

d e f

f u n c t i o n ( p a r a m ) :

i f

p a r a m

i s

n o t

N o n e :

v a l u e

=

p a r a m

e l s e :

v a l u e

=

" d e f a u l t "

r e t u r n

v a l u e

Slide 27

Slide 27

d e f

f u n c t i o n ( p a r a m ) :

v a l u e

=

" d e f a u l t "

i f

p a r a m

i s

n o t

N o n e :

v a l u e

=

p a r a m

r e t u r n

v a l u e

Slide 28

Slide 28

d e f

f u n c t i o n ( v a r _ a ,

v a r _ b ,

v a r _ c ,

v a r _ d ) :

i f

v a r _ a :

i f

v a r _ b :

s o m e

c o d e

e l s e :

s o m e

c o d e

e l i f

v a r _ b

a n d

v a r _ c :

i f

n o t

v a r _ d :

s o m e

c o d e

e l s e :

s o m e

c o d e

e l i f

v a r _ b

a n d

n o t

v a r _ c :

s o m e

c o d e

e l s e :

s o m e

c o d e

Slide 29

Slide 29

Slide 30

Slide 30

E x t r a c t

c o d e

Slide 31

Slide 31

D e f a u l t

v a l u e

Slide 32

Slide 32

P o l y m o r p h i s m

Slide 33

Slide 33

S t r a t e g y

p a t t e r n

Slide 34

Slide 34

S t a t e

p a t t e r n

Slide 35

Slide 35

h t t p s : / / w w w . q u o r a . c o m / I s

i t

t r u e

t h a t

a

g o o d

p r o g r a m m e r

u s e s

f e w e r

i f

c o n d i t i o n s

t h a n

a n

a m a t e u r

Slide 36

Slide 36

B e n e f i t s A v o i d s

c o d e

d u p l i c a t i o n L o w e r

c o m p l e x i t y R e a d a b i l i t y

Slide 37

Slide 37

R u l e

3 W r a p

p r i m i t i v e

t y p e s

i f

i t h a s

b e h a v i o u r

Slide 38

Slide 38

V a l u e

O b j e c t

i n

D D D

Slide 39

Slide 39

c l a s s

V a l i d a t o r ( o b j e c t ) :

d e f

c h e c k _ d a t e ( s e l f ,

y e a r ,

m o n t h ,

d a y ) :

p a s s

1 0 t h

o f

D e c e m b e r

o r

1 2 t h

o f

O c t o b e r ? v a l i d a t o r

=

V a l i d a t o r ( ) v a l i d a t o r . c h e c k _ d a t e ( 2 0 1 6 ,

1 0 ,

1 2 )

Slide 40

Slide 40

c l a s s

V a l i d a t o r ( o b j e c t ) :

d e f

c h e c k _ d a t e ( s e l f ,

y e a r :

Y e a r ,

m o n t h :

M o n t h ,

d a y :

D a y )

b o o l :

p a s s

F u n c t i o n

c a l l

l e a v e s

n o

d o u b t . v a l i d a t o r . c h e c k _ d a t e ( Y e a r ( 2 0 1 6 ) ,

M o n t h ( 1 0 ) ,

D a y ( 1 2 ) )

Slide 41

Slide 41

d e f

c a l c u l a t e _ d i s t a n c e ( s o u r c e _ x ,

s o u r c e _ y ,

t a r g e t _ x ,

t a r g e t _ y ) :

p a s s c a l c u l a t e _ d i s t a n c e ( 1 ,

2 ,

3 ,

4 )

Slide 42

Slide 42

f r o m

c o l l e c t i o n s

i m p o r t

n a m e d t u p l e c l a s s

P o i n t 2 D ( n a m e d t u p l e ( " P o i n t 2 D " ,

" x

y " ) ) :

p a s s d e f

c a l c u l a t e _ d i s t a n c e ( s o u r c e _ p o i n t ,

t a r g e t _ p o i n t ) :

p a s s c a l c u l a t e _ d i s t a n c e ( P o i n t 2 D ( 1 ,

2 ) ,

P o i n t 2 D ( 3 ,

4 ) )

Slide 43

Slide 43

B e n e f i t s E n c a p s u l a t i o n T y p e

h i n t i n g A t t r a c t s

s i m i l a r

b e h a v i o u r

Slide 44

Slide 44

R u l e

4 O n l y

o n e

d o t

p e r

l i n e

Slide 45

Slide 45

O K :

F l u e n t

i n t e r f a c e

Slide 46

Slide 46

c l a s s

P o e m ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ,

c o n t e n t ) :

s e l f . c o n t e n t

=

c o n t e n t

d e f

i n d e n t ( s e l f ,

s p a c e s ) :

s e l f . c o n t e n t

=

"

"

s p a c e s

s e l f . c o n t e n t

r e t u r n

s e l f

d e f

s u f f i x ( s e l f ,

c o n t e n t ) :

s e l f . c o n t e n t

=

s e l f . c o n t e n t

"

"

c o n t e n t

r e t u r n

s e l f P o e m ( " R o a d

N o t

T r a v e l l e d " ) . i n d e n t ( 4 ) \

. s u f f i x ( " R o b e r t

F r o s t " ) \

. c o n t e n t

Slide 47

Slide 47

N o t

O K :

g e t t e r

c h a i n

Slide 48

Slide 48

c l a s s

C a r t S e r v i c e ( o b j e c t ) :

d e f

g e t _ t o k e n ( s e l f ) :

t o k e n

=

s e l f . g e t _ s e r v i c e ( ' a u t h ' ) \

. a u t h _ u s e r ( ' u s e r ' ,

' p a s s w o r d ' ) \

. g e t _ r e s u l t ( ) \

. g e t _ t o k e n ( )

r e t u r n

t o k e n

1 .

W h a t

i f

N o n e

i s

r e t u r n e d

i n s t e a d

o f

o b j e c t ?

2 .

H o w

a b o u t

e x c e p t i o n s

h a n d l i n g ?

Slide 49

Slide 49

c l a s s

F i e l d ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ) :

s e l f . c u r r e n t

=

P i e c e ( ) c l a s s

P i e c e ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ) :

s e l f . r e p r e s e n t a t i o n

=

"

" c l a s s

B o a r d ( o b j e c t ) :

d e f

b o a r d _ r e p r e s e n t a t i o n ( s e l f ,

b o a r d ) :

b u f

=

' '

f o r

f i e l d

i n

b o a r d :

b u f

=

f i e l d . c u r r e n t . r e p r e s e n t a t i o n

r e t u r n

b u f

Slide 50

Slide 50

c l a s s

F i e l d ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ) :

s e l f . c u r r e n t

=

P i e c e ( )

d e f

a d d _ t o ( s e l f ,

b u f f e r ) :

r e t u r n

s e l f . c u r r e n t . a d d _ t o ( b u f f e r ) c l a s s

P i e c e ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ) :

s e l f . r e p r e s e n t a t i o n

=

"

"

d e f

a d d _ t o ( s e l f ,

b u f f e r ) :

r e t u r n

b u f f e r

s e l f . r e p r e s e n t a t i o n c l a s s

B o a r d ( o b j e c t ) :

d e f

b o a r d _ r e p r e s e n t a t i o n ( s e l f ,

b o a r d ) :

b u f

=

' '

f o r

f i e l d

i n

b o a r d :

b u f

=

f i e l d . a d d _ t o ( b u f )

r e t u r n

b u f

Slide 51

Slide 51

B e n e f i t s E n c a p s u l a t i o n D e m e t e r ' s

l a w O p e n / C l o s e d

P r i n c i p l e

Slide 52

Slide 52

R u l e

5 D o

n o t

a b b r e v i a t e

Slide 53

Slide 53

W h y

a b b r e v i a t e ?

Slide 54

Slide 54

T o o

m a n y

r e s p o n s i b i l i t i e s

Slide 55

Slide 55

N a m e

t o o

l o n g

Slide 56

Slide 56

d e f

r e g i s t e r _ u s e r _ s e n d _ w e l c o m e _ e m a i l _ a n d _ a d d _ t o _ d e f a u l t _ g r o u p s ( ) :

p a s s

v s d e f

h a n d l e _ u s e r _ r e g i s t r a t i o n ( ) :

u s e r

=

c r e a t e _ u s e r ( )

s e n d _ w e l c o m e _ e m a i l ( u s e r )

a d d _ t o _ d e f a u l t _ g r o u p s ( )

Slide 57

Slide 57

A v o i d

c o n f u s i o n

Slide 58

Slide 58

a c c

=

0 / /

a c c u m u l a t o r ?

a c c u r a c y ? p o s

=

1 0 0 / /

p o s i t i o n ?

p o i n t

o f

s a l e ?

p o s i t i v e ? a u t h

=

N o n e / /

a u t h e n t i c a t i o n ?

a u t h o r i z a t i o n ?

b o t h ?

Slide 59

Slide 59

D u p l i c a t e d

c o d e

Slide 60

Slide 60

c l a s s

O r d e r ( o b j e c t ) :

d e f

s h i p _ o r d e r ( s e l f ) :

p a s s o r d e r

=

O r d e r ( ) o r d e r . s h i p _ o r d e r ( ) / /

v s c l a s s

O r d e r ( o b j e c t ) :

d e f

s h i p ( s e l f ) :

p a s s o r d e r

=

O r d e r ( ) o r d e r . s h i p ( )

Slide 61

Slide 61

S p l i t

&

e x t r a c t

Slide 62

Slide 62

R e f a c t o r !

Slide 63

Slide 63

T h i n k

a b o u t

p r o p e r

n a m i n g

Slide 64

Slide 64

B e n e f i t s C l e a r

i n t e n t i o n s I n d i c a t e

u n d e r l y i n g

p r o b l e m s

Slide 65

Slide 65

R u l e

6 K e e p

y o u r

c l a s s e s

s m a l l

Slide 66

Slide 66

W h a t

i s

s m a l l

c l a s s ? 1 5

2 0

l i n e s

p e r

m e t h o d 5 0

l i n e s

p e r

c l a s s 1 0

c l a s s e s

p e r

m o d u l e

Slide 67

Slide 67

B e n e f i t s S i n g l e

R e s p o n s i b i l i t y S m a l l e r

m o d u l e s C o h e r e n t

c o d e

Slide 68

Slide 68

R u l e

7 N o

m o r e

t h a n

2

i n s t a n c e

v a r i a b l e

p e r

c l a s s

Slide 69

Slide 69

C l a s s

s h o u l d

h a n d l e

s i n g l e v a r i a b l e

s t a t e

Slide 70

Slide 70

I n

s o m e

c a s e s

i t

m i g h t

b e t w o

v a r i a b l e s

Slide 71

Slide 71

Slide 72

Slide 72

c l a s s

C a r t S e r v i c e ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ) :

s e l f . l o g g e r

=

L o g g e r ( )

s e l f . c a r t

=

C a r t C o l l e c t i o n ( )

s e l f . t r a n s l a t i o n S e r v i c e

=

T r a n s l a t i o n S e r v i c e ( )

s e l f . a u t h _ s e r v i c e

=

A u t h S e r v i c e ( )

s e l f . u s e r _ s e r v i c e

=

U s e r S e r v i c e ( )

Slide 73

Slide 73

c l a s s

C a r t S e r v i c e ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ) :

s e l f . l o g g e r

=

L o g g e r ( )

s e l f . c a r t

=

C a r t C o l l e c t i o n ( )

Slide 74

Slide 74

B e n e f i t s H i g h

c o h e s i o n E n c a p s u l a t i o n F e w e r

d e p e n d e n c i e s

Slide 75

Slide 75

R u l e

8 F i r s t

c l a s s

c o l l e c t i o n s

Slide 76

Slide 76

P y t h o n ' s

c o l l e c t i o n s

m o d u l e

Slide 77

Slide 77

D o c t r i n e ' s

A r r a y C o l l e c t i o n

Slide 78

Slide 78

B e n e f i t s S i n g l e

R e s p o n s i b i l i t y

Slide 79

Slide 79

R u l e

9 D o

n o t

u s e

s e t t e r s / g e t t e r s

Slide 80

Slide 80

A c c e s s o r s

a r e

f i n e

Slide 81

Slide 81

D o n ' t

m a k e

d e c i s i o n s o u t s i d e

o f

c l a s s

Slide 82

Slide 82

L e t

c l a s s

d o

i t ' s

j o b

Slide 83

Slide 83

T e l l ,

d o n ' t

a s k

Slide 84

Slide 84

c l a s s

G a m e ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ) :

s e l f . s c o r e

=

0

d e f

s e t _ s c o r e ( s e l f ,

s c o r e ) :

s e l f . s c o r e

=

s c o r e

d e f

g e t _ s c o r e ( s e l f ) :

r e t u r n

s e l f . s c o r e

U s a g e E N E M Y _ D E S T R O Y E D _ S C O R E

=

1 0 g a m e

=

G a m e ( ) g a m e . s e t _ s c o r e ( g a m e . g e t _ s c o r e ( )

E N E M Y _ D E S T R O Y E D _ S C O R E )

Slide 85

Slide 85

c l a s s

G a m e ( o b j e c t ) :

d e f

_ _ i n i t _ _ ( s e l f ) :

s e l f . s c o r e

=

0

d e f

a d d _ s c o r e ( s e l f ,

s c o r e ) :

s e l f . s c o r e

=

s c o r e

U s a g e E N E M Y _ D E S T R O Y E D _ S C O R E

=

1 0 g a m e

=

G a m e ( ) g a m e . a d d _ s c o r e ( E N E M Y _ D E S T R O Y E D _ S C O R E )

Slide 86

Slide 86

B e n e f i t s O p e n / C l o s e d

P r i n c i p l e

Slide 87

Slide 87

R e c a p 1 .

O n l y

o n e

l e v e l

o f

i n d e n t a t i o n

p e r

m e t h o d , 2 .

D o

n o t

u s e

e l s e

k e y w o r d , 3 .

W r a p

p r i m i t i v e

t y p e s

i f

i t

h a s

b e h a v i o r , 4 .

O n l y

o n e

d o t

p e r

l i n e , 5 .

D o n ’ t

a b b r e v i a t e , 6 .

K e e p

y o u r

e n t i t i e s

s m a l l , 7 .

N o

m o r e

t h a n

t w o

i n s t a n c e

v a r i a b l e

p e r

c l a s s , 8 .

F i r s t

C l a s s

C o l l e c t i o n s , 9 .

D o

n o t

u s e

a c c e s s o r s

Slide 88

Slide 88

H o m e w o r k

Slide 89

Slide 89

C r e a t e

n e w

p r o j e c t

u p

t o 1 0 0 0

l i n e s

l o n g

Slide 90

Slide 90

A p p l y

p r e s e n t e d

r u l e s

a s s t r i c t l y

a s

p o s s i b l e

Slide 91

Slide 91

D r a w

y o u r

o w n

c o n c u l s i o n s

Slide 92

Slide 92

C u s t o m i z e

t h e s e

r u l e s

Slide 93

Slide 93

M a k e

t h e m

y o u r

o w n

Slide 94

Slide 94

F i n a l

t h o u g h t s

Slide 95

Slide 95

T h e s e

a r e

n o t

b e s t

p r a c t i c e s

Slide 96

Slide 96

T h e s e

a r e

j u s t

g u i d e l i n e s

Slide 97

Slide 97

U s e

w i t h

c a r e !

Slide 98

Slide 98

Q u e s t i o n s ?

Slide 99

Slide 99

L i n k s h t t p s : / / w w w . c s . h e l s i n k i . f i / u / l u o n t o l a / t d d

2 0 0 9 / e x t / O b j e c t C a l i s t h e n i c s . p d f h t t p s : / / p r a g p r o g . c o m / b o o k / t w a / t h o u g h t w o r k s

a n t h o l o g y h t t p s : / / e n . w i k i p e d i a . o r g / w i k i / L a w _ o f _ D e m e t e r h t t p s : / / w w w . q u o r a . c o m / I s

i t

t r u e

t h a t

a

g o o d

p r o g r a m m e r

u s e s

f e w e r

i f

c o n d i t i o n s

t h a n

a n

a m a t e u r

Slide 100

Slide 100

T h a n k

y o u !

@ p a w e l _ l e w t a k