SlideShare una empresa de Scribd logo
1 de 29
Andrea Schiavinato, Marzo 2008
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],public class Esempio1 { /** * Effettua una divisione intera * * @param  x il divisore * @param  y il dividendo * @return il quoziente *  @pre (x >= 0) && (y>0) *  @post x == (quo*y + rem) *  @post rem < y */ public static int div(int x, int y) { int quo = 0; int rem = x; while (rem >= y) {   rem -= y;   quo++; } return quo; }  … }
[object Object],[object Object],public class Esempio1 { /** * Effettua una divisione intera * * @param  x il divisore * @param  y il dividendo * @return il quoziente *  @pre (x >= 0) && (y>0) *  @post x == (quo*y + rem) *  @post rem < y */ public static int div(int x, int y) { int quo = 0; int rem = x; while (rem >= y) {   rem -= y;   quo++; } return quo; }  … }
[object Object],Classpath:  occorre il file tools.jar, perché iContract usa la classe sun.Tools.javac Classe base : il percorso dipende dalla versione di iContract usata, comunque il suo nome è sempre Tool  Genera tutti i file anche se esistono già classi elaborate ed aggiornate Stampa tutti gli avvisi Viene generato il codice che controlla invarianti, precondizioni e postcondizioni Comandi per compilare i file in input all’inizio, i file “repository” ed i file prodotti con i controlli delle asserzioni Posizione dei file con i controlli Posizione dei file “repository” Il file in input (si può usare il carattere jolly *)
Esempio1.java __REP_Esempio1.java   __REP_Esempio1.class Esempio1.java File usati da JContract per gestire l’ereditarietà (non ci interessano) Il nostro programma con l’aggiunta di istruzioni per il controllo esplicito di invarianti/precondizioni/postcondizioni Esempio1.class iContract.Tool()
Lo script “BUILD” contiene il comando per la compilazione con iContract
[object Object],[object Object]
[object Object],/*|*/ try { /*|*/  boolean __pre_passed = false;  // true if at least one pre-cond conj. passed. /*|*/ // checking Esempio1::div(int,int) /*|*/ if (! __pre_passed ) { /*|*/  if ( ((x > 0) && (y>0)  /* do not check prepassed */  ))   __pre_passed = true;  // succeeded in: Esempio1::div(int,int) /*|*/  else /*|*/  __pre_passed = false;  // failed in: Esempio1::div(int,int) /*|*/  } /*|*/ if (!__pre_passed) { /*|*/  throw new RuntimeException (&quot;Esempio1.java:14: error: precondition violated (Esempio1::div(int,int)): (/*declared in Esempio1::div(int,int)*/ ((x > 0) && (y>0))) &quot; /*|*/ ); }} /*|*/ catch ( RuntimeException ex ) { /*|*/  String txt = &quot;&quot;;  if (ex.getClass()==RuntimeException.class) { txt = ex.toString();; } /*|*/  else txt = &quot;Esempio1.java:14:  exception <<&quot;+ex+&quot;>> occured while evaluating PRE-condition in Esempio1.java:14:  Esempio1::div(int,int)): (/*declared in Esempio1::div(int,int)*/ ((x > 0) && (y>0))) &quot; /*|*/ ; /*|*/  throw new RuntimeException(txt);}
[object Object],0..n 0..n
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],* @invariant forall Impiegato imp in getImpiegati().elements() | *  getUffici().contains(imp.getUfficio()) * @invariant forall Impiegato imp1 in getImpiegati().elements() | *  forall Impiegato imp2 in getImpiegati().elements() | *  (imp1 != imp2) implies (imp1.getUfficio() != imp2.getUfficio()) *  Vanno scritti subito prima di “interface Azienda {…”
[object Object],[object Object],[object Object],/** *@return ci sono uffici disponibili?? *@post return implies exists Ufficio u in getUffici().elements() |   u.disponibile() *@post !return implies forall Ufficio u in getUffici().elements() |   !u.disponibile() */ public boolean ufficiDisponibili();
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],/** * Restituisce un ufficio disponibile * @return un ufficio disponibile * @pre ufficiDisponibili() * @post return != null * @post getUffici().contains(return) * @post forall Impiegato imp in getImpiegati().elements() |   imp.getUfficio() != return */ public Ufficio prendiUfficioDisponibile();
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],/** * Inserisce un nuovo impiegato nell'azienda * @param i il neoassunto * @pre i != null * @pre !(getImpiegati().contains(i)) * @pre ufficiDisponibili() * @post getImpiegati().contains(i) * @post getUffici().contains( i.getUfficio() ) * @post prendiUfficioDisponibile()@pre != prendiUfficioDisponibile() */ public void assumi( Impiegato i );
[object Object],[object Object],[object Object],[object Object],[object Object],/** * Sposta un impiegato dell'azienda in un ufficio * @param i l'impiegato che si vuole spostare * @param u il nuovo ufficio dell'impiegato * @pre i != null * @pre u != null * @pre u.disponibile() * @post i.getUfficio() == u * @post !u.disponibile() */ public void sposta( Impiegato i, Ufficio u );
[object Object],[object Object],[object Object],Queste asserzioni  non funzionano :
[object Object],[object Object],public static void main(String[] args) { Azienda luthorCorp = new AziendaImpl(); Impiegato i1 = new ImpiegatoImpl(&quot;Lioner Lutor&quot;); Impiegato i2 = new ImpiegatoImpl(&quot;Lex Lutor&quot;); Impiegato i3 = new ImpiegatoImpl(&quot;Clark Kent&quot;); System.out.println(&quot;Proviamo ad assumere &quot; + i1); luthorCorp.assumi(i1); System.out.println(&quot;Proviamo ad assumere &quot; + i2); luthorCorp.assumi(i2); System.out.println(&quot;Proviamo ad assumere &quot; + i3); luthorCorp.assumi(i3); System.out.println(&quot;Fine.&quot;); }
E’ sbagliato il nostro main o l’implementazione? Non ci sono più uffici o non si possono inserire altri impiegati?
Ora sappiamo che la responsabilità è nostra  (che abbiamo scritto il main), in quanto abbiamo violato la precondizione ufficiDisponibili()
public static void main(String[] args) { Azienda luthorCorp = new AziendaImpl(); Impiegato i1 = new ImpiegatoImpl(&quot;Lioner Lutor&quot;); Impiegato i2 = new ImpiegatoImpl(&quot;Lex Lutor&quot;); Impiegato i3 = new ImpiegatoImpl(&quot;Clark Kent&quot;); System.out.println(&quot;Proviamo ad assumere &quot; + i1); if (luthorCorp.ufficiDisponibili()) luthorCorp.assumi(i1); System.out.println(&quot;Proviamo ad assumere &quot; + i2); if (luthorCorp.ufficiDisponibili()) luthorCorp.assumi(i2); System.out.println(&quot;Proviamo ad assumere &quot; + i3); if (luthorCorp.ufficiDisponibili()) luthorCorp.assumi(i3); System.out.println(&quot;Fine.&quot;); }
[object Object],public static void main(String[] args) { Azienda luthorCorp = new AziendaImpl(5); Impiegato i1 = new ImpiegatoImpl(&quot;Lioner Lutor&quot;); Impiegato i2 = new ImpiegatoImpl(&quot;Lex Lutor&quot;); Impiegato i3 = new ImpiegatoImpl(&quot;Clark Kent&quot;); System.out.println(&quot;Proviamo ad assumere &quot; + i1); if (luthorCorp.ufficiDisponibili()) luthorCorp.assumi(i1); System.out.println(&quot;Proviamo ad assumere &quot; + i2); if (luthorCorp.ufficiDisponibili()) luthorCorp.assumi(i2); System.out.println(&quot;Proviamo ad assumere &quot; + i3); if (luthorCorp.ufficiDisponibili()) luthorCorp.assumi(i3); System.out.println(&quot;Un ufficio più grande per &quot; + i1); luthorCorp.sposta(i1, luthorCorp.prendiUfficioDisponibile()); System.out.println(i2 + &quot; prende l'ufficio di &quot; + i3); luthorCorp.sposta(i1, i3.getUfficio()); System.out.println(&quot;Fine.&quot;);  }
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object]

Más contenido relacionado

La actualidad más candente

Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
STELITANO
 
Laboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabiliLaboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabili
Majong DevJfu
 

La actualidad más candente (20)

Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)
 
Googletest, tdd e mock
Googletest, tdd e mockGoogletest, tdd e mock
Googletest, tdd e mock
 
8 Algoritmi
8   Algoritmi8   Algoritmi
8 Algoritmi
 
Mocking Objects Practices
Mocking Objects PracticesMocking Objects Practices
Mocking Objects Practices
 
Corso c++
Corso c++Corso c++
Corso c++
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
2008 python
2008 python2008 python
2008 python
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
2006 Py02 base
2006 Py02 base2006 Py02 base
2006 Py02 base
 
What's new in C# 7
What's new in C# 7What's new in C# 7
What's new in C# 7
 
Java5
Java5Java5
Java5
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Laboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabiliLaboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabili
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript Overview
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++
 
PHP Object Injection
PHP Object InjectionPHP Object Injection
PHP Object Injection
 
Let's give it a GO!
Let's give it a GO!Let's give it a GO!
Let's give it a GO!
 
Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesigner
 
Acadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS TodayAcadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS Today
 

Destacado (7)

Canteen Menus
Canteen MenusCanteen Menus
Canteen Menus
 
Casamance Slides
Casamance SlidesCasamance Slides
Casamance Slides
 
Customer Service Mar 08
Customer Service Mar 08Customer Service Mar 08
Customer Service Mar 08
 
P1
P1P1
P1
 
Think +Ve
Think +VeThink +Ve
Think +Ve
 
Goede Vrijdag en Pasen
Goede Vrijdag en PasenGoede Vrijdag en Pasen
Goede Vrijdag en Pasen
 
Bonsai
BonsaiBonsai
Bonsai
 

Similar a iContract

02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016
DavideBos
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016
DavideBos
 

Similar a iContract (20)

Unit testing 101
Unit testing 101Unit testing 101
Unit testing 101
 
Js intro
Js introJs intro
Js intro
 
eZ publish - Extension
eZ publish - ExtensioneZ publish - Extension
eZ publish - Extension
 
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven Development
 
TDD in WordPress
TDD in WordPressTDD in WordPress
TDD in WordPress
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)
 
7 Sottoprogrammi
7   Sottoprogrammi7   Sottoprogrammi
7 Sottoprogrammi
 
Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)
 
Junit tutorial
Junit tutorialJunit tutorial
Junit tutorial
 
Spiegazione Programma phone
Spiegazione Programma phoneSpiegazione Programma phone
Spiegazione Programma phone
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016
 
02 Struts Actions
02  Struts  Actions02  Struts  Actions
02 Struts Actions
 
Testing
TestingTesting
Testing
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
 
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
 

iContract

  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9. Esempio1.java __REP_Esempio1.java __REP_Esempio1.class Esempio1.java File usati da JContract per gestire l’ereditarietà (non ci interessano) Il nostro programma con l’aggiunta di istruzioni per il controllo esplicito di invarianti/precondizioni/postcondizioni Esempio1.class iContract.Tool()
  • 10. Lo script “BUILD” contiene il comando per la compilazione con iContract
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22. E’ sbagliato il nostro main o l’implementazione? Non ci sono più uffici o non si possono inserire altri impiegati?
  • 23. Ora sappiamo che la responsabilità è nostra (che abbiamo scritto il main), in quanto abbiamo violato la precondizione ufficiDisponibili()
  • 24. public static void main(String[] args) { Azienda luthorCorp = new AziendaImpl(); Impiegato i1 = new ImpiegatoImpl(&quot;Lioner Lutor&quot;); Impiegato i2 = new ImpiegatoImpl(&quot;Lex Lutor&quot;); Impiegato i3 = new ImpiegatoImpl(&quot;Clark Kent&quot;); System.out.println(&quot;Proviamo ad assumere &quot; + i1); if (luthorCorp.ufficiDisponibili()) luthorCorp.assumi(i1); System.out.println(&quot;Proviamo ad assumere &quot; + i2); if (luthorCorp.ufficiDisponibili()) luthorCorp.assumi(i2); System.out.println(&quot;Proviamo ad assumere &quot; + i3); if (luthorCorp.ufficiDisponibili()) luthorCorp.assumi(i3); System.out.println(&quot;Fine.&quot;); }
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.