A presentation at PHPCon PL in in 96-200 Ossa, Poland by Paweł Lewtak
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
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
C a l i s t h e n i c s
C a l
•
i s
•
t h e n
•
i c s
/ ˌ k a l ə s ˈ T H e n i k s /
" 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
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
W r i t t e n
f o r
J a v a
W h y
b o t h e r ?
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
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
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
0 ;
$ i < 1 0 ;
$ i + + )
{
/ /
1
f o r
0 ;
$ j < 1 0 ;
$ j + + )
{
/ /
2
$ b u f
$ d a t a [ $ i ] [ $ j ]
}
}
r e t u r n
$ b u f ;
} }
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
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
0 ;
$ i < 1 0 ;
$ i + + )
{
$ b u f
$ d a t a [ $ r o w ] [ $ i ] ;
}
} }
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
R u l e
2 D o
n o t
u s e
e l s e
k e y w o r d
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
{
. . . }
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
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 " ) ;
} }
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
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 " ) ; }
E x t r a c t
c o d e
D e f a u l t
v a l u e
P o l y m o r p h i s m
S t r a t e g y
p a t t e r n
S t a t e
p a t t e r n
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
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
V a l u e
O b j e c t
i n
D D D
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
c h e c k D a t e ( 2 0 1 6 ,
1 0 ,
1 2 ) ;
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 ) {
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 ) ) ;
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
R u l e
4 O n l y
o n e
p e r
l i n e
O K :
F l u e n t
i n t e r f a c e
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 ( ) ) ;
N o t
O K :
g e t t e r
c h a i n
$ t o k e n
=
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 ?
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
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 ;
} }
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
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
.
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 )
{
a d d T o ( $ b u f ) ;
}
r e t u r n
$ b u f ;
}
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
R u l e
5 D o
n o t
a b b r e v i a t e
W h y
a b b r e v i a t e ?
N a m e
t o o
l o n g ?
T o o
m a n y
r e s p o n s i b i l i t i e s
S p l i t
&
e x t r a c t
D u p l i c a t e d
c o d e ?
R e f a c t o r !
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
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
W h a t
i s
s m a l l
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
2 0 0
l i n e s
p e r
c l a s s
1 0
m e t h o d s
p e r
c l a s s
1 5
c l a s s e s
p e r
n a m e s p a c e
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
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
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
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
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 ;
/ /
. . . }
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
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
D o c t r i n e ' s
A r r a y C o l l e c t i o n
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
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
A c c e s s o r s
a r e
f i n e
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
L e t
c l a s s
d o
i t ' s
j o b
T e l l ,
d o n ' t
a s k
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 )
{
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
s c o r 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 ) ;
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 )
{
s c o r e
=
$ d e l t a ;
} } / /
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 ) ;
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
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 !
H o m e w o r k
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
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
D r a w
c o n c u l s i o n s
C u s t o m i z e
t h e s e
r u l e s
F i n a l
t h o u g h t s
T h e s e
a r e
n o t
b e s t
p r a c t i c e s
T h e s e
a r e
j u s t
g u i d e l i n e s
U s e
w i t h
c a u t i o n !
T h a n k
y o u !
Prezentacja jest o tym jak przy zastosowaniu kilku zasad pisać krótszy, bardziej czytelny i dużo prostszy w testowaniu kod. Pokażę czym jest Object Calisthenics, jak może pomóc w programowaniu na co dzień i czemu to bardziej wskazówki niż sztywne reguły.