Object Calisthenics – 9 kroków do lepszego kodu

A presentation at PHPCon PL in September 2016 in 96-200 Ossa, 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 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

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

Slide 4

Slide 4

C a l

i s

t h e n

i c s

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

Slide 5

Slide 5

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

Slide 6

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 7

Slide 7

W r i t t e n

f o r

J a v a

Slide 8

Slide 8

W h y

b o t h e r ?

Slide 9

Slide 9

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

Slide 10

Slide 10

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 11

Slide 11

c l a s s

B o a r d

{

p u b l i c

f u n c t i o n

_ _ c o n s t r u c t ( a r r a y

$ d a t a )

{

$ b u f

=

' ' ;

/ /

0

f o r

( $ i

0 ;

$ i < 1 0 ;

$ i + + )

{

/ /

1

f o r

( $ j

0 ;

$ j < 1 0 ;

$ j + + )

{

/ /

2

$ b u f

.

$ d a t a [ $ i ] [ $ j ]

}

}

r e t u r n

$ b u f ;

} }

Slide 12

Slide 12

c l a s s

B o a r d

{

p u b l i c

f u n c t i o n

_ _ c o n s t r u c t ( a r r a y

$ d a t a )

{

$ b u f

=

' ' ;

c o l l e c t R o w s ( $ b u f ) ;

r e t u r n

$ b u f ;

}

p r i v a t e

f u n c t i o n

c o l l e c t R o w s ( $ b u f )

{

f o r

( $ i

0 ;

$ i < 1 0 ;

$ i + + )

{

c o l l e c t R o w ( $ b u f ,

$ i ) ;

}

}

p r i v a t e

f u n c t i o n

c o l l e c t R o w ( $ b u f ,

$ r o w )

{

f o r

( $ i

0 ;

$ i < 1 0 ;

$ i + + )

{

$ b u f

.

$ d a t a [ $ r o w ] [ $ i ] ;

}

} }

Slide 13

Slide 13

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 14

Slide 14

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 15

Slide 15

i f

( . . . )

{

. . . }

e l s e i f

( . . . )

{

. . . }

e l s e i f

( . . . )

{

. . . }

e l s e i f

( . . . )

{

. . . }

e l s e i f

( . . . )

{

. . . }

e l s e i f

( . . . )

{

. . . }

e l s e

{

. . . }

Slide 16

Slide 16

p u b l i c

f u n c t i o n

l o g i n ( $ u s e r n a m e ,

$ p a s s w o r d )

{

i f

( $ t h i s

u s e r R e p o s i t o r y

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

$ p a s s w o r d ) )

{

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

}

e l s e

{

a d d F l a s h ( " e r r o r " ,

" B a d

c r e d e n t i a l s " ) ;

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

} }

Slide 17

Slide 17

p u b l i c

f u n c t i o n

l o g i n ( $ u s e r n a m e ,

$ p a s s w o r d )

{

i f

( $ t h i s

u s e r R e p o s i t o r y

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

$ p a s s w o r d ) )

{

r e t u r n

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

}

a d d F l a s h ( " e r r o r " ,

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

Slide 18

Slide 19

Slide 19

E x t r a c t

c o d e

Slide 20

Slide 20

D e f a u l t

v a l u e

Slide 21

Slide 21

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

Slide 22

Slide 22

S t r a t e g y

p a t t e r n

Slide 23

Slide 23

S t a t e

p a t t e r n

Slide 24

Slide 24

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 25

Slide 25

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 26

Slide 26

V a l u e

O b j e c t

i n

D D D

Slide 27

Slide 27

p u b l i c

f u n c t i o n

c h e c k D a t e ( i n t

$ y e a r ,

i n t

$ m o n t h ,

i n t

$ d a y )

{

. . . } / /

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

c h e c k D a t e ( 2 0 1 6 ,

1 0 ,

1 2 ) ;

Slide 28

Slide 28

p u b l i c

f u n c t i o n

c h e c k D a t e ( Y e a r

$ y e a r ,

M o n t h

$ m o n t h ,

D a y

$ d a y ) {

. . . } $ v a l i d a t o r

c h e c k D a t e ( n e w

Y e a r ( 2 0 1 6 ) ,

n e w

M o n t h ( 1 0 ) ,

n e w

D a y ( 1 2 ) ) ;

Slide 29

Slide 29

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 30

Slide 30

R u l e

4 O n l y

o n e

p e r

l i n e

Slide 31

Slide 31

O K :

F l u e n t

i n t e r f a c e

Slide 32

Slide 32

$ v a l i d a t o r

a d d F i l t e r ( n e w

E m a i l F i l t e r ( ) )

a d d F i l t e r ( n e w

N o t E m p t y F i l t e r ( ) ) ;

Slide 33

Slide 33

N o t

O K :

g e t t e r

c h a i n

Slide 34

Slide 34

$ t o k e n

=

$ t h i s

g e t S e r v i c e ( 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 ( ) ; / /

1 .

W h a t

i f

n o n

o b j e c t

i s

r e t u r n e d ? / /

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 35

Slide 35

c l a s s

L o c a t i o n

{

/ * *

@ v a r

P i e c e

/

p u b l i c

c u r r e n t ; } c l a s s

P i e c e

{

/ * *

@ v a r

s t r i n g

/

p u b l i c

r e p r e s e n t a t i o n ; } c l a s s

B o a r d

{

p u b l i c

f u n c t i o n

b o a r d R e p r e s e n t a t i o n ( a r r a y

$ b o a r d )

{

$ b u f

=

' ' ;

f o r e a c h

( $ b o a r d

a s

$ f i e l d )

{

$ b u f

.

s u b s t r i n g ( $ 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 ,

0 ,

1 ) ;

}

r e t u r n

$ b u f ;

} }

Slide 36

Slide 36

c l a s s

L o c a t i o n

{

/ * *

@ v a r

P i e c e

/

p r i v a t e

$ c u r r e n t ;

p u b l i c

f u n c t i o n

a d d T o ( $ b u f )

{

r e t u r n

$ t h i s

c u r r e n t

a d d T o ( $ b u f ) ;

} } c l a s s

P i e c e

{

/ * *

@ v a r

s t r i n g

/

p r i v a t e

$ r e p r e s e n t a t i o n ;

p u b l i c

f u n c t i o n

c h a r a c t e r ( )

{

r e t u r n

s u b s t r i n g ( r e p r e s e n t a t i o n ,

0 ,

1 ) ;

}

p u b l i c

f u n c t i o n

a d d T o ( $ b u f )

{

r e t u r n

$ b u f

.

$ t h i s

c h a r a c t e r ( ) ;

} } c l a s s

B o a r d

{

p u b l i c

f u n c t i o n

b o a r d R e p r e s e n t a t i o n ( a r r a y

$ b o a r d )

{

$ b u f

=

' ' ;

/ * *

@ v a r

L o c a t i o n

$ f i e l d

/

f o r e a c h

( $ b o a r d

a s

$ f i e l d )

{

$ f i e l d

a d d T o ( $ b u f ) ;

}

r e t u r n

$ b u f ;

}

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

Slide 38

R u l e

5 D o

n o t

a b b r e v i a t e

Slide 39

Slide 39

W h y

a b b r e v i a t e ?

Slide 40

Slide 40

N a m e

t o o

l o n g ?

Slide 41

Slide 41

T o o

m a n y

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

Slide 42

Slide 42

S p l i t

&

e x t r a c t

Slide 43

Slide 43

D u p l i c a t e d

c o d e ?

Slide 44

Slide 44

R e f a c t o r !

Slide 45

Slide 45

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 46

Slide 46

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 47

Slide 47

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 48

Slide 48

2 0 0

l i n e s

p e r

c l a s s

Slide 49

Slide 49

1 0

m e t h o d s

p e r

c l a s s

Slide 50

Slide 50

1 5

c l a s s e s

p e r

n a m e s p a c e

Slide 51

Slide 51

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

n a m e s p a c e s

Slide 52

Slide 52

R u l e

7 N o

m o r e

t h a n

2

5

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 53

Slide 53

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 54

Slide 54

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 55

Slide 55

Slide 56

Slide 56

c l a s s

C a r t S e r v i c e

{

p r i v a t e

$ u s e r S e r v i c e ;

p r i v a t e

$ l o g g e r ;

p r i v a t e

$ c a r t ;

p r i v a t e

$ t r a n s l a t i o n S e r v i c e ;

p r i v a t e

$ e n t i t y M a n a g e r ;

p r i v a t e

$ a u t h S e r v i c e ;

/ /

. . . }

Slide 57

Slide 57

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 58

Slide 58

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 59

Slide 59

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 60

Slide 60

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 61

Slide 61

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 62

Slide 62

A c c e s s o r s

a r e

f i n e

Slide 63

Slide 63

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 64

Slide 64

L e t

c l a s s

d o

i t ' s

j o b

Slide 65

Slide 65

T e l l ,

d o n ' t

a s k

Slide 66

Slide 66

c l a s s

G a m e

{

/ * *

@ v a r

i n t

/

p r i v a t e

s c o r e ;

p u b l i c

f u n c t i o n

s e t S c o r e ( s c o r e )

{

$ t h i s

s c o r e

=

s c o r e ;

}

p u b l i c

f u n c t i o n

g e t S c o r e ( )

{

r e t u r n

$ t h i s

s c o r e ;

} } / /

U s a g 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 67

Slide 67

c l a s s

G a m e

{

/ * *

@ v a r

i n t

/

p r i v a t e

s c o r e ;

p u b l i c

f u n c t i o n

a d d S c o r e ( $ d e l t a )

{

$ t h i s

s c o r e

=

$ d e l t a ;

} } / /

U s a g 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 68

Slide 68

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 69

Slide 69

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 70

Slide 70

H o m e w o r k

Slide 71

Slide 71

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 72

Slide 72

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 73

Slide 73

D r a w

c o n c u l s i o n s

Slide 74

Slide 74

C u s t o m i z e

t h e s e

r u l e s

Slide 75

Slide 75

F i n a l

t h o u g h t s

Slide 76

Slide 76

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 77

Slide 77

T h e s e

a r e

j u s t

g u i d e l i n e s

Slide 78

Slide 78

U s e

w i t h

c a u t i o n !

Slide 79

Slide 79

T h a n k

y o u !