Je viens de lire un article assez intéressant concernant
la programmation par contrat.
Que pensez-vous de cette méthode ?
Peut-on facilement la coupler avec des tests unitaires ?
Je viens de lire un article assez intéressant concernant
la programmation par contrat.
Que pensez-vous de cette méthode ?
Peut-on facilement la coupler avec des tests unitaires ?
Je viens de lire un article assez intéressant concernant
la programmation par contrat.
Que pensez-vous de cette méthode ?
Peut-on facilement la coupler avec des tests unitaires ?
Bonjour,
Je viens de lire un article assez intéressant concernant la programmation
par contrat.
Que pensez-vous de cette méthode ?
Peut-on facilement la coupler avec des tests unitaires ?
Voici l'article en question :
http://www.zdnet.fr/builder/programmation/java_c_cplusplus/0,39020934,39176810,00.htm
Bonjour,
Je viens de lire un article assez intéressant concernant la programmation
par contrat.
Que pensez-vous de cette méthode ?
Peut-on facilement la coupler avec des tests unitaires ?
Voici l'article en question :
http://www.zdnet.fr/builder/programmation/java_c_cplusplus/0,39020934,39176810,00.htm
Bonjour,
Je viens de lire un article assez intéressant concernant la programmation
par contrat.
Que pensez-vous de cette méthode ?
Peut-on facilement la coupler avec des tests unitaires ?
Voici l'article en question :
http://www.zdnet.fr/builder/programmation/java_c_cplusplus/0,39020934,39176810,00.htm
Je viens de lire un article assez intéressant concernant la
programmation par contrat.
Que pensez-vous de cette méthode ?
Peut-on facilement la coupler avec des tests unitaires ?
Voici l'article en question :
http://www.zdnet.fr/builder/programmation/java_c_cplusplus/0,39020934,39176810,00.htm
Je viens de lire un article assez intéressant concernant la
programmation par contrat.
Que pensez-vous de cette méthode ?
Peut-on facilement la coupler avec des tests unitaires ?
Voici l'article en question :
http://www.zdnet.fr/builder/programmation/java_c_cplusplus/0,39020934,39176810,00.htm
Je viens de lire un article assez intéressant concernant la
programmation par contrat.
Que pensez-vous de cette méthode ?
Peut-on facilement la coupler avec des tests unitaires ?
Voici l'article en question :
http://www.zdnet.fr/builder/programmation/java_c_cplusplus/0,39020934,39176810,00.htm
Peux-tu m'en dire plus concernant les évolutions et méthodes
véritables de la programmation par contrat ? Par exemple, un
document, une URL, ou quelque chose de comparable.
Peux-tu m'en dire plus concernant les évolutions et méthodes
véritables de la programmation par contrat ? Par exemple, un
document, une URL, ou quelque chose de comparable.
Peux-tu m'en dire plus concernant les évolutions et méthodes
véritables de la programmation par contrat ? Par exemple, un
document, une URL, ou quelque chose de comparable.
Stephane Wirtel wrote:Peux-tu m'en dire plus concernant les évolutions et méthodes
véritables de la programmation par contrat ? Par exemple, un
document, une URL, ou quelque chose de comparable.
Malheureusement, je n'en connais pas. (Ça fait un moment que je me
dis que je dois écrire un article là-dessus, mais le temps me manque
toujours.) Ça a été beaucoup discuté à diverses époques dans
comp.lang.c++.moderated, mais à part ça, je ne connais pas
d'informations disponibles ; les idées semblent passaient plutôt de
bouche à l'oreille.
Le principe de base est assez simple : quand une interface veut
imposer un contrat, elle rend les fonctiions virtuelles privées (ou
éventuellement protégées), et elle fournit des fonctions publiques
non virtuelles qui les appellent, en encapsulant les appels aux
fonctions virtuelles dans des vérifications du contrat.
Stephane Wirtel wrote:
Peux-tu m'en dire plus concernant les évolutions et méthodes
véritables de la programmation par contrat ? Par exemple, un
document, une URL, ou quelque chose de comparable.
Malheureusement, je n'en connais pas. (Ça fait un moment que je me
dis que je dois écrire un article là-dessus, mais le temps me manque
toujours.) Ça a été beaucoup discuté à diverses époques dans
comp.lang.c++.moderated, mais à part ça, je ne connais pas
d'informations disponibles ; les idées semblent passaient plutôt de
bouche à l'oreille.
Le principe de base est assez simple : quand une interface veut
imposer un contrat, elle rend les fonctiions virtuelles privées (ou
éventuellement protégées), et elle fournit des fonctions publiques
non virtuelles qui les appellent, en encapsulant les appels aux
fonctions virtuelles dans des vérifications du contrat.
Stephane Wirtel wrote:Peux-tu m'en dire plus concernant les évolutions et méthodes
véritables de la programmation par contrat ? Par exemple, un
document, une URL, ou quelque chose de comparable.
Malheureusement, je n'en connais pas. (Ça fait un moment que je me
dis que je dois écrire un article là-dessus, mais le temps me manque
toujours.) Ça a été beaucoup discuté à diverses époques dans
comp.lang.c++.moderated, mais à part ça, je ne connais pas
d'informations disponibles ; les idées semblent passaient plutôt de
bouche à l'oreille.
Le principe de base est assez simple : quand une interface veut
imposer un contrat, elle rend les fonctiions virtuelles privées (ou
éventuellement protégées), et elle fournit des fonctions publiques
non virtuelles qui les appellent, en encapsulant les appels aux
fonctions virtuelles dans des vérifications du contrat.
wrote:Stephane Wirtel wrote:Peux-tu m'en dire plus concernant les évolutions et
méthodes véritables de la programmation par contrat ? Par
exemple, un document, une URL, ou quelque chose de
comparable.
Malheureusement, je n'en connais pas. (Ça fait un moment que
je me dis que je dois écrire un article là-dessus, mais le
temps me manque toujours.) Ça a été beaucoup discuté à
diverses époques dans comp.lang.c++.moderated, mais à part
ça, je ne connais pas d'informations disponibles ; les idées
semblent passaient plutôt de bouche à l'oreille.
Le principe de base est assez simple : quand une interface
veut imposer un contrat, elle rend les fonctiions virtuelles
privées (ou éventuellement protégées), et elle fournit des
fonctions publiques non virtuelles qui les appellent, en
encapsulant les appels aux fonctions virtuelles dans des
vérifications du contrat.
On a deja discuste de ca il y a quelques annees (mois?), mais
il faut tout de meme mentionner que ce principe peut mener a
des bugs difficiles a trouver notament parce qu'on se croit
protege. Le mot clef sur lequel tu passes un peu vite c'est
INTERFACE.
Cette technique fonctionne si les pre/post conditions sont les
memes pour toutes les classes derivees ce qui est une
contrainte tres forte et relativement rare.
Et pour ce qui est des invariants c'est encore pire puisqu'il
s'applique exclusivement a this.
class A { // interface
public:
void f(int i) {
f_precond(i); f_(i); f_postcond(); _invariant();
}
protected:
virtual void f_(int i) = 0;
private:
void f_precond(int i) { ... }
void f_postcond() { ... }
void _invariant() { ... }
}
class B : public A {
public:
void f(int i) { // probleme, pas possible
f_precond(i); f_(i); f_postcond(); _invariant();
}
protected:
virtual void f_(int i) { ... }
private:
void f_precond(int i) { ... }
void f_postcond() { ... }
void _invariant() { ... }
}
si B::f_ est definie, ce qui est generalement le cas, et si
les conditions (notament les invariants) changent dans B::f_,
alors il faut redefinir aussi B::f.
Si ensuite on utilise A comme une interface, qui est
effectivement le cas le plus courant, sur une variete
d'intances de classes derivees de A (ex: B), ca ne remplit pas
correctement le contrat alors que l'on serait tente de le
croire.
En revanche, l'inverse ne m'a jamais pose de probleme (il me
semble que tu en avait trouves mais je ne me souvient plus
lesquels ;-) ), sauf du point de vue de l'efficacite (mais tu
as deja souligne ce probleme).
class A {
public:
virtual void f(int i) = 0;
protected:
void f_precond(int i) { ... }
void f_postcond() { ... }
void _invariant() { ... }
}
class B : public A {
public:
virtual void f(int i) {
f_precond(i); ... f_postcond(); _invariant();
}
protected:
void f_precond(int i) { A::f_precond(i); ... }
void f_postcond() { ... A::f_postcond(); }
void _invariant() { ... A::_invariant(); }
}
Si B ne redefinit pas les contrats, ce sont ceux de A qui sont
automatiquement utilises. Si B redefinit les contrats, elle
peut aussi se baser sur les contrats de A. Tout le couplage se
fait de B vers A au lieu de A vers B, ce qui est bien mieux.
kanze@gabi-soft.fr wrote:
Stephane Wirtel wrote:
Peux-tu m'en dire plus concernant les évolutions et
méthodes véritables de la programmation par contrat ? Par
exemple, un document, une URL, ou quelque chose de
comparable.
Malheureusement, je n'en connais pas. (Ça fait un moment que
je me dis que je dois écrire un article là-dessus, mais le
temps me manque toujours.) Ça a été beaucoup discuté à
diverses époques dans comp.lang.c++.moderated, mais à part
ça, je ne connais pas d'informations disponibles ; les idées
semblent passaient plutôt de bouche à l'oreille.
Le principe de base est assez simple : quand une interface
veut imposer un contrat, elle rend les fonctiions virtuelles
privées (ou éventuellement protégées), et elle fournit des
fonctions publiques non virtuelles qui les appellent, en
encapsulant les appels aux fonctions virtuelles dans des
vérifications du contrat.
On a deja discuste de ca il y a quelques annees (mois?), mais
il faut tout de meme mentionner que ce principe peut mener a
des bugs difficiles a trouver notament parce qu'on se croit
protege. Le mot clef sur lequel tu passes un peu vite c'est
INTERFACE.
Cette technique fonctionne si les pre/post conditions sont les
memes pour toutes les classes derivees ce qui est une
contrainte tres forte et relativement rare.
Et pour ce qui est des invariants c'est encore pire puisqu'il
s'applique exclusivement a this.
class A { // interface
public:
void f(int i) {
f_precond(i); f_(i); f_postcond(); _invariant();
}
protected:
virtual void f_(int i) = 0;
private:
void f_precond(int i) { ... }
void f_postcond() { ... }
void _invariant() { ... }
}
class B : public A {
public:
void f(int i) { // probleme, pas possible
f_precond(i); f_(i); f_postcond(); _invariant();
}
protected:
virtual void f_(int i) { ... }
private:
void f_precond(int i) { ... }
void f_postcond() { ... }
void _invariant() { ... }
}
si B::f_ est definie, ce qui est generalement le cas, et si
les conditions (notament les invariants) changent dans B::f_,
alors il faut redefinir aussi B::f.
Si ensuite on utilise A comme une interface, qui est
effectivement le cas le plus courant, sur une variete
d'intances de classes derivees de A (ex: B), ca ne remplit pas
correctement le contrat alors que l'on serait tente de le
croire.
En revanche, l'inverse ne m'a jamais pose de probleme (il me
semble que tu en avait trouves mais je ne me souvient plus
lesquels ;-) ), sauf du point de vue de l'efficacite (mais tu
as deja souligne ce probleme).
class A {
public:
virtual void f(int i) = 0;
protected:
void f_precond(int i) { ... }
void f_postcond() { ... }
void _invariant() { ... }
}
class B : public A {
public:
virtual void f(int i) {
f_precond(i); ... f_postcond(); _invariant();
}
protected:
void f_precond(int i) { A::f_precond(i); ... }
void f_postcond() { ... A::f_postcond(); }
void _invariant() { ... A::_invariant(); }
}
Si B ne redefinit pas les contrats, ce sont ceux de A qui sont
automatiquement utilises. Si B redefinit les contrats, elle
peut aussi se baser sur les contrats de A. Tout le couplage se
fait de B vers A au lieu de A vers B, ce qui est bien mieux.
wrote:Stephane Wirtel wrote:Peux-tu m'en dire plus concernant les évolutions et
méthodes véritables de la programmation par contrat ? Par
exemple, un document, une URL, ou quelque chose de
comparable.
Malheureusement, je n'en connais pas. (Ça fait un moment que
je me dis que je dois écrire un article là-dessus, mais le
temps me manque toujours.) Ça a été beaucoup discuté à
diverses époques dans comp.lang.c++.moderated, mais à part
ça, je ne connais pas d'informations disponibles ; les idées
semblent passaient plutôt de bouche à l'oreille.
Le principe de base est assez simple : quand une interface
veut imposer un contrat, elle rend les fonctiions virtuelles
privées (ou éventuellement protégées), et elle fournit des
fonctions publiques non virtuelles qui les appellent, en
encapsulant les appels aux fonctions virtuelles dans des
vérifications du contrat.
On a deja discuste de ca il y a quelques annees (mois?), mais
il faut tout de meme mentionner que ce principe peut mener a
des bugs difficiles a trouver notament parce qu'on se croit
protege. Le mot clef sur lequel tu passes un peu vite c'est
INTERFACE.
Cette technique fonctionne si les pre/post conditions sont les
memes pour toutes les classes derivees ce qui est une
contrainte tres forte et relativement rare.
Et pour ce qui est des invariants c'est encore pire puisqu'il
s'applique exclusivement a this.
class A { // interface
public:
void f(int i) {
f_precond(i); f_(i); f_postcond(); _invariant();
}
protected:
virtual void f_(int i) = 0;
private:
void f_precond(int i) { ... }
void f_postcond() { ... }
void _invariant() { ... }
}
class B : public A {
public:
void f(int i) { // probleme, pas possible
f_precond(i); f_(i); f_postcond(); _invariant();
}
protected:
virtual void f_(int i) { ... }
private:
void f_precond(int i) { ... }
void f_postcond() { ... }
void _invariant() { ... }
}
si B::f_ est definie, ce qui est generalement le cas, et si
les conditions (notament les invariants) changent dans B::f_,
alors il faut redefinir aussi B::f.
Si ensuite on utilise A comme une interface, qui est
effectivement le cas le plus courant, sur une variete
d'intances de classes derivees de A (ex: B), ca ne remplit pas
correctement le contrat alors que l'on serait tente de le
croire.
En revanche, l'inverse ne m'a jamais pose de probleme (il me
semble que tu en avait trouves mais je ne me souvient plus
lesquels ;-) ), sauf du point de vue de l'efficacite (mais tu
as deja souligne ce probleme).
class A {
public:
virtual void f(int i) = 0;
protected:
void f_precond(int i) { ... }
void f_postcond() { ... }
void _invariant() { ... }
}
class B : public A {
public:
virtual void f(int i) {
f_precond(i); ... f_postcond(); _invariant();
}
protected:
void f_precond(int i) { A::f_precond(i); ... }
void f_postcond() { ... A::f_postcond(); }
void _invariant() { ... A::_invariant(); }
}
Si B ne redefinit pas les contrats, ce sont ceux de A qui sont
automatiquement utilises. Si B redefinit les contrats, elle
peut aussi se baser sur les contrats de A. Tout le couplage se
fait de B vers A au lieu de A vers B, ce qui est bien mieux.