SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
Design by Contract â Perl
  Âÿ÷åñëàâ Òèõàíîâñêèé (vti)




          2012-12-22
showmetheco.de
ÎÎÏ
Moose, Moos, Moo, Mo, M?
Èíòåðôåéñû è íàñëåäîâàíèå îò àáñòðàêòíîãî
                 êëàññà
package A b s t r a c t R e n d e r e r ;

sub new { . . . }

sub r e n d e r { die ' I m p l e m e n t me ! ' }
package TT ;
use b a s e ' A b s t r a c t R e n d e r e r ' ;
sub r e n d e r {
    my $ s e l f = s h i f t ;
    my ( $ t e m p l a t e , $ l a y o u t , %v a r s ) = @_;

      return  $ r e n d e r e d ;
}

package Caml ;
use b a s e ' A b s t r a c t R e n d e r e r ' ;
sub r e n d e r {
    my $ s e l f = s h i f t ;
    my ( $ t e m p l a t e , %v a r s ) = @_;

      return $ r e n d e r e d ;
}
Design by Contract
Ïðîâåðêà âõîäíûõ è âûõîäíûõ óñëîâèé
Ïðîâåðêà âõîäíûõ è âûõîäíûõ óñëîâèé

Ñëåäîâàíèå ïðèíöèïó ïîäñòàíîâêè Ëèñêîâ (L
â SOLID) ïðè íàñëåäîâàíèè
Ïðîâåðêà âõîäíûõ è âûõîäíûõ óñëîâèé

Ñëåäîâàíèå ïðèíöèïó ïîäñòàíîâêè Ëèñêîâ (L
â SOLID) ïðè íàñëåäîâàíèè

Äîêóìåíòèðîâàíèå èíòåðôåéñà
package A b s t r a c t R e n d e r e r ;
sub new { . . . }

# R e q u i r e s ( STRING ,   %HASH_OF_ANY_VALUES)
# E n s u r e s ( STRING )
# Throws ( E x c e p t i o n : : TemplateNotFound )
sub r e n d e r {
    my $ s e l f = s h i f t ;
    my ( $ t e m p l a t e , %v a r s ) = @_;

       ...

      return $ r e n d e r e d ;
}
package TT ;
use b a s e ' A b s t r a c t R e n d e r e r ' ;
sub r e n d e r { . . . }

package Caml ;
use b a s e ' A b s t r a c t R e n d e r e r ' ;
sub r e n d e r { . . . }
Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
Íå äîëæíî ñíèæàòü ÷èòàåìîñòü

Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ
ðåñóðñîâ
Íå äîëæíî ñíèæàòü ÷èòàåìîñòü

Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ
ðåñóðñîâ

Îòêëþ÷àåìî
Íå äîëæíî ñíèæàòü ÷èòàåìîñòü

Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ
ðåñóðñîâ

Îòêëþ÷àåìî

Íàñëåäóåìî
Íå äîëæíî ñíèæàòü ÷èòàåìîñòü

Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ
ðåñóðñîâ

Îòêëþ÷àåìî

Íàñëåäóåìî

Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõ
êëàññàõ
Íå äîëæíî ñíèæàòü ÷èòàåìîñòü

Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ
ðåñóðñîâ

Îòêëþ÷àåìî

Íàñëåäóåìî

Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõ
êëàññàõ

Ïîíÿòíûå îøèáêè
Íå äîëæíî ñíèæàòü ÷èòàåìîñòü

Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ
ðåñóðñîâ

Îòêëþ÷àåìî

Íàñëåäóåìî

Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõ
êëàññàõ

Ïîíÿòíûå îøèáêè

Êàê ìîæíî ìåíüøå ìàãèè*
Íå äîëæíî ñíèæàòü ÷èòàåìîñòü

Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ
ðåñóðñîâ

Îòêëþ÷àåìî

Íàñëåäóåìî

Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõ
êëàññàõ

Ïîíÿòíûå îøèáêè

Êàê ìîæíî ìåíüøå ìàãèè*

Ïîõîæå íà Perl*
Class::Contract
use C l a s s : : C o n t r a c t ;

contract {
  i n h e r i t s ' BaseClass ' ;

     c t o r ' new ' ;

     method ' methodname ' ;
       pre { . . . };
         f a i l m s g ' E r r o r message ' ;

        post { . . . };
          f a i l m s g ' E r r o r message ' ;

        impl { . . . };
};
Sub::Contract
use Sub : : C o n t r a c t qw ( c o n t r a c t ) ;

contract ( ' surface ' )
   −>i n (& i s _ i n t e g e r , & i s _ i n t e g e r )
   −>o u t (& i s _ i n t e g e r )
   −>e n a b l e ;

sub s u r f a c e {
      # no     need    to    validate       arguments         anymore !
      #   just    implement        the    logic :
      return $_ [ 0 ] ∗ $_ [ 1 ] ;
}
Sub::Assert
assert
    pre           => {
      ' p a r a m e t e r l a r g e r t h a n one ' => '$PARAM [ 0 ] >
    },
    post          => ' $VOID o r $RETURN <= $PARAM [ 0 ] ' ,
    sub           => ' s q u a r e r o o t ' ,
    c o n t e x t => ' n o v o i d ' ,
    a c t i o n => ' c a r p ' ;
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 '
       => a c c e p t s [ . . . t y p e . . . ]
       => r e t u r n s v o i d ,
        with_context (
                 p r e => sub {
                         ...
                },
                 p o 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 −>{v a l u e } += $ i n c r ;
        return ;
}
Attribute::Contract
package A b s t r a c t R e n d e r e r ;
use A t t r i b u t e : : C o n t r a c t ;

sub new { . . . }

sub r e n d e r
    : C o n t r a c t R e q u i r e s (VALUE( S t r ) , %ANY)
    : C o n t r a c t E n s u r e s (VALUE( S t r ) )
    : C o n t r a c t T h r o w s ( E x c e p t i o n : : TemplateNotFound ) {
}
DbC è TDD
DbC è Defensive programming
Êîãäà ïðèìåíÿòü?

Áèáëèîòåêè, ìîäóëè

Èíòåðôåéñû
Êàê íå ïðèìåíÿòü?

Íå âàëèäèðîâàòü äàííûå

Íå ïðîèçâîäèòü ïîáî÷íûõ ýôôåêòîâ
Ñïàñèáî!

Contenu connexe

Tendances

Luis cuñas programacion
Luis cuñas programacionLuis cuñas programacion
Luis cuñas programacion
luisitofranklin
 
Para la suma y la multiplicacion de 2
Para la suma y la multiplicacion de 2Para la suma y la multiplicacion de 2
Para la suma y la multiplicacion de 2
fabiorodriguez123
 
Practica 4 errores
Practica 4 erroresPractica 4 errores
Practica 4 errores
UVM
 

Tendances (18)

07 5 반복문(break,contine).key
07 5 반복문(break,contine).key07 5 반복문(break,contine).key
07 5 반복문(break,contine).key
 
Luis cuñas programacion
Luis cuñas programacionLuis cuñas programacion
Luis cuñas programacion
 
Doi xung mang mot chieu
Doi xung mang mot chieuDoi xung mang mot chieu
Doi xung mang mot chieu
 
Sujet bac info 2012 g1, g2 et g3 avec correction
Sujet bac info 2012 g1, g2 et g3 avec correctionSujet bac info 2012 g1, g2 et g3 avec correction
Sujet bac info 2012 g1, g2 et g3 avec correction
 
Vcs6
Vcs6Vcs6
Vcs6
 
Bubble sort
Bubble sortBubble sort
Bubble sort
 
Programacion
ProgramacionProgramacion
Programacion
 
Vcs12
Vcs12Vcs12
Vcs12
 
Vevaiosi imerida
Vevaiosi imeridaVevaiosi imerida
Vevaiosi imerida
 
Kelompok 2.5
Kelompok 2.5Kelompok 2.5
Kelompok 2.5
 
Para la suma y la multiplicacion de 2
Para la suma y la multiplicacion de 2Para la suma y la multiplicacion de 2
Para la suma y la multiplicacion de 2
 
Ejercicios ADE
Ejercicios ADEEjercicios ADE
Ejercicios ADE
 
bai tap-loi-giai-ngon-ngu-lap-trinh-c
 bai tap-loi-giai-ngon-ngu-lap-trinh-c bai tap-loi-giai-ngon-ngu-lap-trinh-c
bai tap-loi-giai-ngon-ngu-lap-trinh-c
 
Programas for
Programas forProgramas for
Programas for
 
Ujian semester tip fany sheet 2
Ujian semester tip fany sheet 2Ujian semester tip fany sheet 2
Ujian semester tip fany sheet 2
 
TUGAS TIP MS EXCEL
TUGAS TIP MS EXCELTUGAS TIP MS EXCEL
TUGAS TIP MS EXCEL
 
TUGAS TIP MS EXCEL
TUGAS TIP MS EXCELTUGAS TIP MS EXCEL
TUGAS TIP MS EXCEL
 
Practica 4 errores
Practica 4 erroresPractica 4 errores
Practica 4 errores
 

En vedette

En vedette (7)

Dancing with websocket
Dancing with websocketDancing with websocket
Dancing with websocket
 
Working with WebSockets in Perl
Working with WebSockets in PerlWorking with WebSockets in Perl
Working with WebSockets in Perl
 
VTI presentation
VTI presentationVTI presentation
VTI presentation
 
Valve timing diagrams
Valve timing diagramsValve timing diagrams
Valve timing diagrams
 
ASO Best Practices 2016
ASO Best Practices 2016ASO Best Practices 2016
ASO Best Practices 2016
 
Variable Valve Timing
Variable Valve TimingVariable Valve Timing
Variable Valve Timing
 
Variable Valve Timing (VVT)
Variable Valve Timing (VVT)Variable Valve Timing (VVT)
Variable Valve Timing (VVT)
 

Slides

  • 1. Design by Contract â Perl Âÿ÷åñëàâ Òèõàíîâñêèé (vti) 2012-12-22
  • 5. Èíòåðôåéñû è íàñëåäîâàíèå îò àáñòðàêòíîãî êëàññà
  • 6. package A b s t r a c t R e n d e r e r ; sub new { . . . } sub r e n d e r { die ' I m p l e m e n t me ! ' }
  • 7. package TT ; use b a s e ' A b s t r a c t R e n d e r e r ' ; sub r e n d e r { my $ s e l f = s h i f t ; my ( $ t e m p l a t e , $ l a y o u t , %v a r s ) = @_; return $ r e n d e r e d ; } package Caml ; use b a s e ' A b s t r a c t R e n d e r e r ' ; sub r e n d e r { my $ s e l f = s h i f t ; my ( $ t e m p l a t e , %v a r s ) = @_; return $ r e n d e r e d ; }
  • 9. Ïðîâåðêà âõîäíûõ è âûõîäíûõ óñëîâèé
  • 10. Ïðîâåðêà âõîäíûõ è âûõîäíûõ óñëîâèé Ñëåäîâàíèå ïðèíöèïó ïîäñòàíîâêè Ëèñêîâ (L â SOLID) ïðè íàñëåäîâàíèè
  • 11. Ïðîâåðêà âõîäíûõ è âûõîäíûõ óñëîâèé Ñëåäîâàíèå ïðèíöèïó ïîäñòàíîâêè Ëèñêîâ (L â SOLID) ïðè íàñëåäîâàíèè Äîêóìåíòèðîâàíèå èíòåðôåéñà
  • 12. package A b s t r a c t R e n d e r e r ; sub new { . . . } # R e q u i r e s ( STRING , %HASH_OF_ANY_VALUES) # E n s u r e s ( STRING ) # Throws ( E x c e p t i o n : : TemplateNotFound ) sub r e n d e r { my $ s e l f = s h i f t ; my ( $ t e m p l a t e , %v a r s ) = @_; ... return $ r e n d e r e d ; }
  • 13. package TT ; use b a s e ' A b s t r a c t R e n d e r e r ' ; sub r e n d e r { . . . } package Caml ; use b a s e ' A b s t r a c t R e n d e r e r ' ; sub r e n d e r { . . . }
  • 14. Íå äîëæíî ñíèæàòü ÷èòàåìîñòü
  • 15. Íå äîëæíî ñíèæàòü ÷èòàåìîñòü Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ ðåñóðñîâ
  • 16. Íå äîëæíî ñíèæàòü ÷èòàåìîñòü Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ ðåñóðñîâ Îòêëþ÷àåìî
  • 17. Íå äîëæíî ñíèæàòü ÷èòàåìîñòü Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ ðåñóðñîâ Îòêëþ÷àåìî Íàñëåäóåìî
  • 18. Íå äîëæíî ñíèæàòü ÷èòàåìîñòü Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ ðåñóðñîâ Îòêëþ÷àåìî Íàñëåäóåìî Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõ êëàññàõ
  • 19. Íå äîëæíî ñíèæàòü ÷èòàåìîñòü Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ ðåñóðñîâ Îòêëþ÷àåìî Íàñëåäóåìî Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõ êëàññàõ Ïîíÿòíûå îøèáêè
  • 20. Íå äîëæíî ñíèæàòü ÷èòàåìîñòü Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ ðåñóðñîâ Îòêëþ÷àåìî Íàñëåäóåìî Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõ êëàññàõ Ïîíÿòíûå îøèáêè Êàê ìîæíî ìåíüøå ìàãèè*
  • 21. Íå äîëæíî ñíèæàòü ÷èòàåìîñòü Íå òðåáóåò áîëüøèõ âû÷èñëèòåëüíûõ ðåñóðñîâ Îòêëþ÷àåìî Íàñëåäóåìî Çàïðåùàåò ìåíÿòü êîíòðàêò â äî÷åðíèõ êëàññàõ Ïîíÿòíûå îøèáêè Êàê ìîæíî ìåíüøå ìàãèè* Ïîõîæå íà Perl*
  • 23. use C l a s s : : C o n t r a c t ; contract { i n h e r i t s ' BaseClass ' ; c t o r ' new ' ; method ' methodname ' ; pre { . . . }; f a i l m s g ' E r r o r message ' ; post { . . . }; f a i l m s g ' E r r o r message ' ; impl { . . . }; };
  • 25. use Sub : : C o n t r a c t qw ( c o n t r a c t ) ; contract ( ' surface ' ) −>i n (& i s _ i n t e g e r , & i s _ i n t e g e r ) −>o u t (& i s _ i n t e g e r ) −>e n a b l e ; sub s u r f a c e { # no need to validate arguments anymore ! # just implement the logic : return $_ [ 0 ] ∗ $_ [ 1 ] ; }
  • 27. assert pre => { ' p a r a m e t e r l a r g e r t h a n one ' => '$PARAM [ 0 ] > }, post => ' $VOID o r $RETURN <= $PARAM [ 0 ] ' , sub => ' s q u a r e r o o t ' , c o n t e x t => ' n o v o i d ' , a c t i o n => ' c a r p ' ;
  • 29. 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 ; }
  • 31. c o n t r a c t ' add ' => a c c e p t s [ . . . t y p e . . . ] => r e t u r n s v o i d , with_context ( p r e => sub { ... }, p o 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 −>{v a l u e } += $ i n c r ; return ; }
  • 33. package A b s t r a c t R e n d e r e r ; use A t t r i b u t e : : C o n t r a c t ; sub new { . . . } sub r e n d e r : C o n t r a c t R e q u i r e s (VALUE( S t r ) , %ANY) : C o n t r a c t E n s u r e s (VALUE( S t r ) ) : C o n t r a c t T h r o w s ( E x c e p t i o n : : TemplateNotFound ) { }
  • 35. DbC è Defensive programming
  • 37. Êàê íå ïðèìåíÿòü? Íå âàëèäèðîâàòü äàííûå Íå ïðîèçâîäèòü ïîáî÷íûõ ýôôåêòîâ