Design by Contract â Perl
Âÿ÷åñëàâ Òèõàíîâñêèé (vti)
2012-12-22
showmetheco.de
ÎÎÏ
Moose, Moos, Moo, Mo, M?
Èíòåðôåéñû è íàñëåäîâàíèå îò àáñòðàêòíîãîêëàññà
package Abs t r a c tRende r e r ;
sub new { . . . }
sub r e nd e r { die ' Implement me ! ' }
package TT;use base ' Ab s t r a c tRende r e r ' ;sub r e nd e r {
my $ s e l f = s h i f t ;my ( $template , $ l ayou t , %va r s ) = @_;
return \ $ r ende r ed ;}
package Caml ;use base ' Ab s t r a c tRende r e r ' ;sub r e nd e r {
my $ s e l f = s h i f t ;my ( $template , %va r s ) = @_;
return $ r ende r ed ;}
Design by Contract
I Ïðîâåðêà âõîäíûõ è âûõîäíûõ óñëîâèé
I Ñëåäîâàíèå ïðèíöèïó ïîäñòàíîâêè Ëèñêîâ (Lâ SOLID) ïðè íàñëåäîâàíèè
I Äîêóìåíòèðîâàíèå èíòåðôåéñà
I Ïðîâåðêà âõîäíûõ è âûõîäíûõ óñëîâèé
I Ñëåäîâàíèå ïðèíöèïó ïîäñòàíîâêè Ëèñêîâ (Lâ SOLID) ïðè íàñëåäîâàíèè
I Äîêóìåíòèðîâàíèå èíòåðôåéñà
I Ïðîâåðêà âõîäíûõ è âûõîäíûõ óñëîâèé
I Ñëåäîâàíèå ïðèíöèïó ïîäñòàíîâêè Ëèñêîâ (Lâ SOLID) ïðè íàñëåäîâàíèè
I Äîêóìåíòèðîâàíèå èíòåðôåéñà
package Abs t r a c tRende r e r ;sub new { . . . }
# Requ i r e s (STRING , %HASH_OF_ANY_VALUES)# Ensu re s (STRING)# Throws ( Excep t i on : : TemplateNotFound )sub r e nd e r {
my $ s e l f = s h i f t ;my ( $template , %va r s ) = @_;
. . .
return $ r ende r ed ;}
package TT;use base ' Ab s t r a c tRende r e r ' ;sub r e nd e r { . . . }
package Caml ;use base ' Ab s t r a c tRende r e r ' ;sub r e nd e r { . . . }
I Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
I Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõðåñóðñîâ
I Îòêëþ÷àåìî
I Íàñëåäóåìî
I Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõêëàññàõ
I Ïîíÿòíûå îøèáêè
I Êàê ìîæíî ìåíüøå ìàãèè*
I Ïîõîæå íà Perl*
I Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
I Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõðåñóðñîâ
I Îòêëþ÷àåìî
I Íàñëåäóåìî
I Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõêëàññàõ
I Ïîíÿòíûå îøèáêè
I Êàê ìîæíî ìåíüøå ìàãèè*
I Ïîõîæå íà Perl*
I Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
I Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõðåñóðñîâ
I Îòêëþ÷àåìî
I Íàñëåäóåìî
I Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõêëàññàõ
I Ïîíÿòíûå îøèáêè
I Êàê ìîæíî ìåíüøå ìàãèè*
I Ïîõîæå íà Perl*
I Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
I Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõðåñóðñîâ
I Îòêëþ÷àåìî
I Íàñëåäóåìî
I Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõêëàññàõ
I Ïîíÿòíûå îøèáêè
I Êàê ìîæíî ìåíüøå ìàãèè*
I Ïîõîæå íà Perl*
I Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
I Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõðåñóðñîâ
I Îòêëþ÷àåìî
I Íàñëåäóåìî
I Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõêëàññàõ
I Ïîíÿòíûå îøèáêè
I Êàê ìîæíî ìåíüøå ìàãèè*
I Ïîõîæå íà Perl*
I Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
I Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõðåñóðñîâ
I Îòêëþ÷àåìî
I Íàñëåäóåìî
I Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõêëàññàõ
I Ïîíÿòíûå îøèáêè
I Êàê ìîæíî ìåíüøå ìàãèè*
I Ïîõîæå íà Perl*
I Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
I Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõðåñóðñîâ
I Îòêëþ÷àåìî
I Íàñëåäóåìî
I Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõêëàññàõ
I Ïîíÿòíûå îøèáêè
I Êàê ìîæíî ìåíüøå ìàãèè*
I Ïîõîæå íà Perl*
I Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
I Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõðåñóðñîâ
I Îòêëþ÷àåìî
I Íàñëåäóåìî
I Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõêëàññàõ
I Ïîíÿòíûå îøèáêè
I Êàê ìîæíî ìåíüøå ìàãèè*
I Ïîõîæå íà Perl*
Class::Contract
use C l a s s : : Cont rac t ;
c o n t r a c t {i n h e r i t s ' Ba seC l a s s ' ;
c t o r ' new ' ;
method 'methodname ' ;p r e { . . . } ;
f a i lm s g ' E r r o r message ' ;
po s t { . . . } ;f a i lm s g ' E r r o r message ' ;
imp l { . . . } ;} ;
Sub::Contract
use Sub : : Cont rac t qw( c o n t r a c t ) ;
c o n t r a c t ( ' s u r f a c e ' )−>in (\& i s_ i n t e g e r , \& i s_ i n t e g e r )−>out (\& i s_ i n t e g e r )−>enab l e ;
sub s u r f a c e {# no need to v a l i d a t e arguments anymore !# j u s t implement the l o g i c :return $_ [ 0 ] ∗ $_ [ 1 ] ;
}
Sub::Assert
a s s e r tp r e => {' paramete r l a r g e r than one ' => '$PARAM[ 0 ] >= 1 ' ,
} ,po s t => '$VOID or $RETURN <= $PARAM[ 0 ] ' ,sub => ' s qu a r e r o o t ' ,c on t e x t => ' novo id ' ,a c t i o n => ' ca rp ' ;
Carp::Datum
use Carp : : Datum ;
sub r o u t i n e {DFEATURE my $f_ , " o p t i o n a l message " ;my ( $a , $b ) = @_;DREQUIRE $a > $b , "a > b" ;$a += 1 ; $b += 1 ;DASSERT $a > $b , " o r d e r i n g a > b p r e s e r v e d " ;my $ r e s u l t = $b − $a ;DENSURE $ r e s u l t < 0 ;return DVAL $ r e s u l t ;
}
MooseX::Contract
c o n t r a c t ' add '=> acc ep t s [ . . . t ype . . . ]=> r e t u r n s vo id ,w i th_context (
p re => sub {. . .
} ,po s t => a s s e r t {
. . .}
) ;sub add {
my $ s e l f = s h i f t ;my $ i n c r = s h i f t ;$ s e l f −>{va l u e } += $ i n c r ;return ;
}
Attribute::Contract
package Abs t r a c tRende r e r ;use A t t r i b u t e : : Con t r ac t ;
sub new { . . . }
sub r e nd e r: Con t r a c tRequ i r e s (VALUE( S t r ) , %ANY): Con t r a c tEn su r e s (VALUE( S t r ) ): ContractThrows ( Excep t i on : : TemplateNotFound ) {
}
DbC è TDD
DbC è Defensive programming
Êîãäà ïðèìåíÿòü?
I Áèáëèîòåêè, ìîäóëè
I Èíòåðôåéñû
Êàê íå ïðèìåíÿòü?
I Íå âàëèäèðîâàòü äàííûå
I Íå ïðîèçâîäèòü ïîáî÷íûõ ýôôåêòîâ
Ñïàñèáî!