Richard Delorme wrote:Je comprends pas. Je propose à imposer un niveau
d'abstraction plus élevé que le C++ actuel, où
l'implémentation doit toujours se trouver dans un fichier à
part, et non dans l'en-tête, et tu me parles de l'assembleur.
(J'ai aussi dit que les compilateurs n'étaient pas assez
mûrs, parce qu'il y a bien des fois où l'inline est
nécessaire, pour des raisons de performance, parce que les
compilateurs courants ne savent pas le faire automatiquement
quand il le faut.)
Une fois que l'en-tête ne contient plus de code, on peut aussi
le supprimer, non ? Avec quelques autres modifications, on
obtient Java...
Par code, j'entendais du code exécutable. Des détails de
l'implémentation, quoi. Je le considère essentiel que la
définition de la classe, ou au moins la partie « publique » dont
se sert le code client, soi dans un fichier séparé du fichier
(ou des fichiers) qui contient les détails de l'implémentation.
Je me suis exprimé plus d'une fois sur cet aspect de Java, que
je considère comme un défaut assez grave, au moins si on compte
implémenter de grands projets (avec plusieurs dizaines de
développeurs).
Richard Delorme wrote:
Je comprends pas. Je propose à imposer un niveau
d'abstraction plus élevé que le C++ actuel, où
l'implémentation doit toujours se trouver dans un fichier à
part, et non dans l'en-tête, et tu me parles de l'assembleur.
(J'ai aussi dit que les compilateurs n'étaient pas assez
mûrs, parce qu'il y a bien des fois où l'inline est
nécessaire, pour des raisons de performance, parce que les
compilateurs courants ne savent pas le faire automatiquement
quand il le faut.)
Une fois que l'en-tête ne contient plus de code, on peut aussi
le supprimer, non ? Avec quelques autres modifications, on
obtient Java...
Par code, j'entendais du code exécutable. Des détails de
l'implémentation, quoi. Je le considère essentiel que la
définition de la classe, ou au moins la partie « publique » dont
se sert le code client, soi dans un fichier séparé du fichier
(ou des fichiers) qui contient les détails de l'implémentation.
Je me suis exprimé plus d'une fois sur cet aspect de Java, que
je considère comme un défaut assez grave, au moins si on compte
implémenter de grands projets (avec plusieurs dizaines de
développeurs).
Richard Delorme wrote:Je comprends pas. Je propose à imposer un niveau
d'abstraction plus élevé que le C++ actuel, où
l'implémentation doit toujours se trouver dans un fichier à
part, et non dans l'en-tête, et tu me parles de l'assembleur.
(J'ai aussi dit que les compilateurs n'étaient pas assez
mûrs, parce qu'il y a bien des fois où l'inline est
nécessaire, pour des raisons de performance, parce que les
compilateurs courants ne savent pas le faire automatiquement
quand il le faut.)
Une fois que l'en-tête ne contient plus de code, on peut aussi
le supprimer, non ? Avec quelques autres modifications, on
obtient Java...
Par code, j'entendais du code exécutable. Des détails de
l'implémentation, quoi. Je le considère essentiel que la
définition de la classe, ou au moins la partie « publique » dont
se sert le code client, soi dans un fichier séparé du fichier
(ou des fichiers) qui contient les détails de l'implémentation.
Je me suis exprimé plus d'une fois sur cet aspect de Java, que
je considère comme un défaut assez grave, au moins si on compte
implémenter de grands projets (avec plusieurs dizaines de
développeurs).
James Kanze writes:
| Et pour revenir au point du départ, ce que j'aurais voulu
| supprimer du C++, c'était des fonctions inline et
| l'implémentation des templates dans les fichiers en-têtes. Je ne
et comme le langage ne fait pas de distinction entre « fichiers
d'en-êtes » et le reste peux-tu expliquer comment la suppersion de ces
choses élève le niveau d'abstraction ?
James Kanze <kanze@none> writes:
| Et pour revenir au point du départ, ce que j'aurais voulu
| supprimer du C++, c'était des fonctions inline et
| l'implémentation des templates dans les fichiers en-têtes. Je ne
et comme le langage ne fait pas de distinction entre « fichiers
d'en-êtes » et le reste peux-tu expliquer comment la suppersion de ces
choses élève le niveau d'abstraction ?
James Kanze writes:
| Et pour revenir au point du départ, ce que j'aurais voulu
| supprimer du C++, c'était des fonctions inline et
| l'implémentation des templates dans les fichiers en-têtes. Je ne
et comme le langage ne fait pas de distinction entre « fichiers
d'en-êtes » et le reste peux-tu expliquer comment la suppersion de ces
choses élève le niveau d'abstraction ?
Gabriel Dos Reis wrote:James Kanze writes:
| Et pour revenir au point du départ, ce que j'aurais voulu
| supprimer du C++, c'était des fonctions inline et
| l'implémentation des templates dans les fichiers en-têtes. Je ne
et comme le langage ne fait pas de distinction entre « fichiers
d'en-êtes » et le reste peux-tu expliquer comment la suppersion de ces
choses élève le niveau d'abstraction ?
Il est vrai qu'il n'y a pas de distinction formelle du point de vue du
langage mais il y a indubitablement une distinction implicite au sein
d'une application entre les fichiers qui apparaissent dans un #include
et les autres.
Ce qui est certain, quelles que soient les motivations pour retirer ou
ajouter telle ou telle chose dans le langage, c'est que plus on peut
simplifier le contenu des fichiers utilisés en #include, plus on gagne
en abstraction (tout en gardant bien évidemment une maitrîse maximale
sur la granularité des unités de compilation : il ne s'agit pas d'être
obligé de mettre toutes les classes dans un seul fichier).
D'ailleurs si, pour ma part, j'avais à supprimer un truc dans le
langage, ça serait le '#include' mais je ne saurais pas par quoi le
remplacer :-p
Gabriel Dos Reis wrote:
James Kanze <kanze@none> writes:
| Et pour revenir au point du départ, ce que j'aurais voulu
| supprimer du C++, c'était des fonctions inline et
| l'implémentation des templates dans les fichiers en-têtes. Je ne
et comme le langage ne fait pas de distinction entre « fichiers
d'en-êtes » et le reste peux-tu expliquer comment la suppersion de ces
choses élève le niveau d'abstraction ?
Il est vrai qu'il n'y a pas de distinction formelle du point de vue du
langage mais il y a indubitablement une distinction implicite au sein
d'une application entre les fichiers qui apparaissent dans un #include
et les autres.
Ce qui est certain, quelles que soient les motivations pour retirer ou
ajouter telle ou telle chose dans le langage, c'est que plus on peut
simplifier le contenu des fichiers utilisés en #include, plus on gagne
en abstraction (tout en gardant bien évidemment une maitrîse maximale
sur la granularité des unités de compilation : il ne s'agit pas d'être
obligé de mettre toutes les classes dans un seul fichier).
D'ailleurs si, pour ma part, j'avais à supprimer un truc dans le
langage, ça serait le '#include' mais je ne saurais pas par quoi le
remplacer :-p
Gabriel Dos Reis wrote:James Kanze writes:
| Et pour revenir au point du départ, ce que j'aurais voulu
| supprimer du C++, c'était des fonctions inline et
| l'implémentation des templates dans les fichiers en-têtes. Je ne
et comme le langage ne fait pas de distinction entre « fichiers
d'en-êtes » et le reste peux-tu expliquer comment la suppersion de ces
choses élève le niveau d'abstraction ?
Il est vrai qu'il n'y a pas de distinction formelle du point de vue du
langage mais il y a indubitablement une distinction implicite au sein
d'une application entre les fichiers qui apparaissent dans un #include
et les autres.
Ce qui est certain, quelles que soient les motivations pour retirer ou
ajouter telle ou telle chose dans le langage, c'est que plus on peut
simplifier le contenu des fichiers utilisés en #include, plus on gagne
en abstraction (tout en gardant bien évidemment une maitrîse maximale
sur la granularité des unités de compilation : il ne s'agit pas d'être
obligé de mettre toutes les classes dans un seul fichier).
D'ailleurs si, pour ma part, j'avais à supprimer un truc dans le
langage, ça serait le '#include' mais je ne saurais pas par quoi le
remplacer :-p
James Kanze wrote:
Mais c'est bien souvent le cas même (surtout ?) en Java ! La
partie publique dont se sert le client, c'est en général une
interface, décrite dans un fichier. Cette interface est
implémentée par une classe, décrite dans un autre fichier.
Il n'y a bien que dans un C++ "moderne" où l'on a réduit le
rôle des héritages d'interface que l'absence d'une telle
séparation se manifeste.
Je me suis exprimé plus d'une fois sur cet aspect de Java,
que je considère comme un défaut assez grave, au moins si on
compte implémenter de grands projets (avec plusieurs dizaines
de développeurs).
Ce que je trouve grave c'est de considérer que l'on peut faire
cohabiter plusieurs dizaines de développeurs au sein d'un même
"projet" -- ou alors il faut m'expliquer ce que signifie le
terme projet dans un tel contexte.
James Kanze wrote:
Mais c'est bien souvent le cas même (surtout ?) en Java ! La
partie publique dont se sert le client, c'est en général une
interface, décrite dans un fichier. Cette interface est
implémentée par une classe, décrite dans un autre fichier.
Il n'y a bien que dans un C++ "moderne" où l'on a réduit le
rôle des héritages d'interface que l'absence d'une telle
séparation se manifeste.
Je me suis exprimé plus d'une fois sur cet aspect de Java,
que je considère comme un défaut assez grave, au moins si on
compte implémenter de grands projets (avec plusieurs dizaines
de développeurs).
Ce que je trouve grave c'est de considérer que l'on peut faire
cohabiter plusieurs dizaines de développeurs au sein d'un même
"projet" -- ou alors il faut m'expliquer ce que signifie le
terme projet dans un tel contexte.
James Kanze wrote:
Mais c'est bien souvent le cas même (surtout ?) en Java ! La
partie publique dont se sert le client, c'est en général une
interface, décrite dans un fichier. Cette interface est
implémentée par une classe, décrite dans un autre fichier.
Il n'y a bien que dans un C++ "moderne" où l'on a réduit le
rôle des héritages d'interface que l'absence d'une telle
séparation se manifeste.
Je me suis exprimé plus d'une fois sur cet aspect de Java,
que je considère comme un défaut assez grave, au moins si on
compte implémenter de grands projets (avec plusieurs dizaines
de développeurs).
Ce que je trouve grave c'est de considérer que l'on peut faire
cohabiter plusieurs dizaines de développeurs au sein d'un même
"projet" -- ou alors il faut m'expliquer ce que signifie le
terme projet dans un tel contexte.
Olivier Azeau wrote:James Kanze wrote:
[...]Mais c'est bien souvent le cas même (surtout ?) en Java ! La
partie publique dont se sert le client, c'est en général une
interface, décrite dans un fichier. Cette interface est
implémentée par une classe, décrite dans un autre fichier.
Il n'y a bien que dans un C++ "moderne" où l'on a réduit le
rôle des héritages d'interface que l'absence d'une telle
séparation se manifeste.Je me suis exprimé plus d'une fois sur cet aspect de Java,
que je considère comme un défaut assez grave, au moins si on
compte implémenter de grands projets (avec plusieurs dizaines
de développeurs).
Ce que je trouve grave c'est de considérer que l'on peut faire
cohabiter plusieurs dizaines de développeurs au sein d'un même
"projet" -- ou alors il faut m'expliquer ce que signifie le
terme projet dans un tel contexte.
Et comment fais-tu en Java instancier une interface ?
D'après mes expériences avec le Java, les interfaces (au sens du
langage Java) sont quasiment inutilisable ; il faut prèsque
toujours une classe abstraite, ne serait-ce que pour définir le
contrat, et du coup, on perd la possibilité d'héritage multiple.
Olivier Azeau wrote:
James Kanze wrote:
[...]
Mais c'est bien souvent le cas même (surtout ?) en Java ! La
partie publique dont se sert le client, c'est en général une
interface, décrite dans un fichier. Cette interface est
implémentée par une classe, décrite dans un autre fichier.
Il n'y a bien que dans un C++ "moderne" où l'on a réduit le
rôle des héritages d'interface que l'absence d'une telle
séparation se manifeste.
Je me suis exprimé plus d'une fois sur cet aspect de Java,
que je considère comme un défaut assez grave, au moins si on
compte implémenter de grands projets (avec plusieurs dizaines
de développeurs).
Ce que je trouve grave c'est de considérer que l'on peut faire
cohabiter plusieurs dizaines de développeurs au sein d'un même
"projet" -- ou alors il faut m'expliquer ce que signifie le
terme projet dans un tel contexte.
Et comment fais-tu en Java instancier une interface ?
D'après mes expériences avec le Java, les interfaces (au sens du
langage Java) sont quasiment inutilisable ; il faut prèsque
toujours une classe abstraite, ne serait-ce que pour définir le
contrat, et du coup, on perd la possibilité d'héritage multiple.
Olivier Azeau wrote:James Kanze wrote:
[...]Mais c'est bien souvent le cas même (surtout ?) en Java ! La
partie publique dont se sert le client, c'est en général une
interface, décrite dans un fichier. Cette interface est
implémentée par une classe, décrite dans un autre fichier.
Il n'y a bien que dans un C++ "moderne" où l'on a réduit le
rôle des héritages d'interface que l'absence d'une telle
séparation se manifeste.Je me suis exprimé plus d'une fois sur cet aspect de Java,
que je considère comme un défaut assez grave, au moins si on
compte implémenter de grands projets (avec plusieurs dizaines
de développeurs).
Ce que je trouve grave c'est de considérer que l'on peut faire
cohabiter plusieurs dizaines de développeurs au sein d'un même
"projet" -- ou alors il faut m'expliquer ce que signifie le
terme projet dans un tel contexte.
Et comment fais-tu en Java instancier une interface ?
D'après mes expériences avec le Java, les interfaces (au sens du
langage Java) sont quasiment inutilisable ; il faut prèsque
toujours une classe abstraite, ne serait-ce que pour définir le
contrat, et du coup, on perd la possibilité d'héritage multiple.
James Kanze wrote:
Olivier Azeau wrote:James Kanze wrote:
[...]Mais c'est bien souvent le cas même (surtout ?) en Java !
La partie publique dont se sert le client, c'est en
général une interface, décrite dans un fichier. Cette
interface est implémentée par une classe, décrite dans un
autre fichier. Il n'y a bien que dans un C++ "moderne" où
l'on a réduit le rôle des héritages d'interface que
l'absence d'une telle séparation se manifeste.
Je me suis exprimé plus d'une fois sur cet aspect de
Java, que je considère comme un défaut assez grave, au
moins si on compte implémenter de grands projets (avec
plusieurs dizaines de développeurs).
Ce que je trouve grave c'est de considérer que l'on peut
faire cohabiter plusieurs dizaines de développeurs au sein
d'un même "projet" -- ou alors il faut m'expliquer ce que
signifie le terme projet dans un tel contexte.
Et comment fais-tu en Java instancier une interface ?
Avec une interface sur une fabrique ? ;-)
D'après mes expériences avec le Java, les interfaces (au sens
du langage Java) sont quasiment inutilisable ; il faut
prèsque toujours une classe abstraite, ne serait-ce que pour
définir le contrat, et du coup, on perd la possibilité
d'héritage multiple.
Pas compris. De quel contrat parles-tu ? Garantir des
pré/post-conditions sur un membre de l'interface ?
James Kanze wrote:
Olivier Azeau wrote:
James Kanze wrote:
[...]
Mais c'est bien souvent le cas même (surtout ?) en Java !
La partie publique dont se sert le client, c'est en
général une interface, décrite dans un fichier. Cette
interface est implémentée par une classe, décrite dans un
autre fichier. Il n'y a bien que dans un C++ "moderne" où
l'on a réduit le rôle des héritages d'interface que
l'absence d'une telle séparation se manifeste.
Je me suis exprimé plus d'une fois sur cet aspect de
Java, que je considère comme un défaut assez grave, au
moins si on compte implémenter de grands projets (avec
plusieurs dizaines de développeurs).
Ce que je trouve grave c'est de considérer que l'on peut
faire cohabiter plusieurs dizaines de développeurs au sein
d'un même "projet" -- ou alors il faut m'expliquer ce que
signifie le terme projet dans un tel contexte.
Et comment fais-tu en Java instancier une interface ?
Avec une interface sur une fabrique ? ;-)
D'après mes expériences avec le Java, les interfaces (au sens
du langage Java) sont quasiment inutilisable ; il faut
prèsque toujours une classe abstraite, ne serait-ce que pour
définir le contrat, et du coup, on perd la possibilité
d'héritage multiple.
Pas compris. De quel contrat parles-tu ? Garantir des
pré/post-conditions sur un membre de l'interface ?
James Kanze wrote:
Olivier Azeau wrote:James Kanze wrote:
[...]Mais c'est bien souvent le cas même (surtout ?) en Java !
La partie publique dont se sert le client, c'est en
général une interface, décrite dans un fichier. Cette
interface est implémentée par une classe, décrite dans un
autre fichier. Il n'y a bien que dans un C++ "moderne" où
l'on a réduit le rôle des héritages d'interface que
l'absence d'une telle séparation se manifeste.
Je me suis exprimé plus d'une fois sur cet aspect de
Java, que je considère comme un défaut assez grave, au
moins si on compte implémenter de grands projets (avec
plusieurs dizaines de développeurs).
Ce que je trouve grave c'est de considérer que l'on peut
faire cohabiter plusieurs dizaines de développeurs au sein
d'un même "projet" -- ou alors il faut m'expliquer ce que
signifie le terme projet dans un tel contexte.
Et comment fais-tu en Java instancier une interface ?
Avec une interface sur une fabrique ? ;-)
D'après mes expériences avec le Java, les interfaces (au sens
du langage Java) sont quasiment inutilisable ; il faut
prèsque toujours une classe abstraite, ne serait-ce que pour
définir le contrat, et du coup, on perd la possibilité
d'héritage multiple.
Pas compris. De quel contrat parles-tu ? Garantir des
pré/post-conditions sur un membre de l'interface ?
Olivier Azeau wrote:James Kanze wrote:Et comment fais-tu en Java instancier une interface ?
Avec une interface sur une fabrique ? ;-)
C'est beaucoup de travail pour quelque chose qui marche de soi
en C++ (et en Ada). Surtout quand on pense à quel point c'est
essentiel dans la gestion des projets d'une taille importante.
D'après mes expériences avec le Java, les interfaces (au sens
du langage Java) sont quasiment inutilisable ; il faut
prèsque toujours une classe abstraite, ne serait-ce que pour
définir le contrat, et du coup, on perd la possibilité
d'héritage multiple.
Pas compris. De quel contrat parles-tu ? Garantir des
pré/post-conditions sur un membre de l'interface ?
Tout à fait. En C++, en général, quand on a besoin d'un contrat
(ce qui est assez courant pour les classes d'entité), les
fonctions publiques ne sont pas virtuelles ; elles vérifient le
contrat, en renvoyant à des fonctions privées virtuelles pour
l'exécution. En Java, déjà, les fonctions privées ne peuvent pas
être virtuelles (or qu'elles représentent environ les deux tiers
de mes fonctions virtuelles ne C++), je suis obligé à me
rabattre sur des fonctions protégées. Et des vérifications,
c'est du code ; c'est donc interdit dans une interface.
Olivier Azeau wrote:
James Kanze wrote:
Et comment fais-tu en Java instancier une interface ?
Avec une interface sur une fabrique ? ;-)
C'est beaucoup de travail pour quelque chose qui marche de soi
en C++ (et en Ada). Surtout quand on pense à quel point c'est
essentiel dans la gestion des projets d'une taille importante.
D'après mes expériences avec le Java, les interfaces (au sens
du langage Java) sont quasiment inutilisable ; il faut
prèsque toujours une classe abstraite, ne serait-ce que pour
définir le contrat, et du coup, on perd la possibilité
d'héritage multiple.
Pas compris. De quel contrat parles-tu ? Garantir des
pré/post-conditions sur un membre de l'interface ?
Tout à fait. En C++, en général, quand on a besoin d'un contrat
(ce qui est assez courant pour les classes d'entité), les
fonctions publiques ne sont pas virtuelles ; elles vérifient le
contrat, en renvoyant à des fonctions privées virtuelles pour
l'exécution. En Java, déjà, les fonctions privées ne peuvent pas
être virtuelles (or qu'elles représentent environ les deux tiers
de mes fonctions virtuelles ne C++), je suis obligé à me
rabattre sur des fonctions protégées. Et des vérifications,
c'est du code ; c'est donc interdit dans une interface.
Olivier Azeau wrote:James Kanze wrote:Et comment fais-tu en Java instancier une interface ?
Avec une interface sur une fabrique ? ;-)
C'est beaucoup de travail pour quelque chose qui marche de soi
en C++ (et en Ada). Surtout quand on pense à quel point c'est
essentiel dans la gestion des projets d'une taille importante.
D'après mes expériences avec le Java, les interfaces (au sens
du langage Java) sont quasiment inutilisable ; il faut
prèsque toujours une classe abstraite, ne serait-ce que pour
définir le contrat, et du coup, on perd la possibilité
d'héritage multiple.
Pas compris. De quel contrat parles-tu ? Garantir des
pré/post-conditions sur un membre de l'interface ?
Tout à fait. En C++, en général, quand on a besoin d'un contrat
(ce qui est assez courant pour les classes d'entité), les
fonctions publiques ne sont pas virtuelles ; elles vérifient le
contrat, en renvoyant à des fonctions privées virtuelles pour
l'exécution. En Java, déjà, les fonctions privées ne peuvent pas
être virtuelles (or qu'elles représentent environ les deux tiers
de mes fonctions virtuelles ne C++), je suis obligé à me
rabattre sur des fonctions protégées. Et des vérifications,
c'est du code ; c'est donc interdit dans une interface.