Object Calisthenics - 9 steps to better OO code

A presentation at PyCon SK in March 2017 in Bratislava, Slovakia 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 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 3

Slide 3

R a i s e

y o u

h a n d

i f

y o u

k n o w o n e

o f

t h e

f o l l o w i n g : D R Y K I S S S O L I D Y A G N I Z e n

o f

P y t h o n

Slide 4

Slide 4

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

Slide 5

Slide 5

C a l

i s

t h e n

i c s

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

Slide 6

Slide 6

" 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 7

Slide 7

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 8

Slide 8

W r i t t e n

f o r

J a v a

Slide 9

Slide 9

W h y

b o t h e r ?

Slide 10

Slide 10

C o d e

i s

r e a d

m o r e t h a n

i t ' s

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

u n k n o w n

Slide 11

Slide 11

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 z 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 12

Slide 12

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 13

Slide 13

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 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 ) :

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 15

Slide 15

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 16

Slide 16

C h a i n

o f

c o m m a n d

Slide 17

Slide 17

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 18

Slide 18

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 19

Slide 19

i f

o p t i o n s . g e t _ c a t e g o r i e s ( )

i s

N o n e :

. . . e l i f

l e n ( o p t i o n s . g e t _ c a t e g o r i e s ( ) )

=

1 :

. . . e l i f

S P E C I A L _ C A T E G O R Y

i n

o p t i o n s . g e t _ c a t e g o r i e s ( ) :

. . . e l i f

o p t i o n s . g e t _ c a t e g o r i e s ( )

a n d

o p t i o n s . g e t _ q u e r y ( ) :

. . . e l i f

o p t i o n s . g e t _ c o n t e n t _ t y p e ( ) :

. . .

Slide 20

Slide 20

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 21

Slide 21

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 22

Slide 22

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 23

Slide 23

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 24

Slide 24

Slide 25

Slide 25

E x t r a c t

c o d e

Slide 26

Slide 26

D e f a u l t

v a l u e

Slide 27

Slide 27

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

Slide 28

Slide 28

S t r a t e g y

p a t t e r n

Slide 29

Slide 29

S t a t e

p a t t e r n

Slide 30

Slide 30

E x a m p l e s h t t p s : / / g i t h u b . c o m / g e n n a d / D e s i g n

P a t t e r n s

i n

P y t h o n

Slide 31

Slide 31

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 32

Slide 32

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 33

Slide 33

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 34

Slide 34

V a l u e

O b j e c t

i n

D D D

Slide 35

Slide 35

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 36

Slide 36

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 37

Slide 37

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 38

Slide 38

R u l e

4 O n l y

o n e

d o t

p e r

l i n e

Slide 39

Slide 39

O K :

F l u e n t

i n t e r f a c e

Slide 40

Slide 40

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 41

Slide 41

N o t

O K :

g e t t e r

c h a i n

Slide 42

Slide 42

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 43

Slide 43

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 44

Slide 44

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 45

Slide 45

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 46

Slide 46

R u l e

5 D o

n o t

a b b r e v i a t e

Slide 47

Slide 47

W h y

a b b r e v i a t e ?

Slide 48

Slide 48

T o o

m a n y

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

Slide 49

Slide 49

N a m e

t o o

l o n g ?

Slide 50

Slide 50

S p l i t

&

e x t r a c t

Slide 51

Slide 51

D u p l i c a t e d

c o d e ?

Slide 52

Slide 52

R e f a c t o r !

Slide 53

Slide 53

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 54

Slide 54

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 55

Slide 55

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 56

Slide 56

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 57

Slide 57

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 58

Slide 58

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

Slide 59

Slide 59

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 60

Slide 60

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 61

Slide 61

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 62

Slide 62

Slide 63

Slide 63

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 64

Slide 64

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 65

Slide 65

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 66

Slide 66

c o l l e c t i o n s

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

Slide 68

Slide 68

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 69

Slide 69

A c c e s s o r s

a r e

f i n e

Slide 70

Slide 70

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 71

Slide 71

L e t

c l a s s

d o

i t ' s

j o b

Slide 72

Slide 72

T e l l ,

d o n ' t

a s k

Slide 73

Slide 73

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 74

Slide 74

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 75

Slide 75

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 76

Slide 76

C a t c h

' e m

a l l !

Slide 77

Slide 77

C a t c h

' e m

a l l !

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 78

Slide 78

C a t c h

' e m

a l l !

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 1 0 .

? ? ? 1 1 .

P R O F I T !

Slide 79

Slide 79

H o m e w o r k

Slide 80

Slide 80

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 81

Slide 81

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 82

Slide 82

D r a w

y o u r

o w n

c o n c u l s i o n s

Slide 83

Slide 83

C u s t o m i z e

t h e s e

r u l e s

Slide 84

Slide 84

F i n a l

t h o u g h t s

Slide 85

Slide 85

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 86

Slide 86

T h e s e

a r e

j u s t

g u i d e l i n e s

Slide 87

Slide 87

U s e

w i t h

c a u t i o n !

Slide 88

Slide 88

Q u e s t i o n s ?

Slide 89

Slide 89

L i n k s h t t p s : / / e n . w i k i p e d i a . o r g / w i k i / C a l i s t h e n i c 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 : / / g i t h u b . c o m / g e n n a d / D e s i g n

P a t t e r n s

i n

P y t h o n 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 90

Slide 90

T h a n k

y o u !