Arnaud Debaene - :Si tu parles purement de POO, les différences les plus notables que je
vois sont :
- Garbage Collector en Java, ce qui entraine malheureusemeent qu'il
n'y a pas de vrai destructeur en Java et qu'il est donc difficile de
gérer proprement la durée de vie des ressoureces autres que la mémoire
(en C++ on utilise l'idiome RAII). Un effet de bord annexe est qu'n
Java on ne peut pas choisir de manipuler soit une valeur soit une
référence (ou pointeur) comme on peut le faire en C++.
Alors JUSTEMENT ! Je ne vois pas comment on peut concevoir de travailler
sans concepts de référence et encore moins de pointeurs (qui sont à
bannir en C++, vous me l'avez si souvent dit !)...
Comment peut-on s'en sortir avec des copies d'objets !! Je trouve ça plus
que problématique !
Exemple : <snip exemple>
Suis-en train de me fourvoyer ?
Arnaud Debaene - adebaene@club-internet.fr :
Si tu parles purement de POO, les différences les plus notables que je
vois sont :
- Garbage Collector en Java, ce qui entraine malheureusemeent qu'il
n'y a pas de vrai destructeur en Java et qu'il est donc difficile de
gérer proprement la durée de vie des ressoureces autres que la mémoire
(en C++ on utilise l'idiome RAII). Un effet de bord annexe est qu'n
Java on ne peut pas choisir de manipuler soit une valeur soit une
référence (ou pointeur) comme on peut le faire en C++.
Alors JUSTEMENT ! Je ne vois pas comment on peut concevoir de travailler
sans concepts de référence et encore moins de pointeurs (qui sont à
bannir en C++, vous me l'avez si souvent dit !)...
Comment peut-on s'en sortir avec des copies d'objets !! Je trouve ça plus
que problématique !
Exemple : <snip exemple>
Suis-en train de me fourvoyer ?
Arnaud Debaene - :Si tu parles purement de POO, les différences les plus notables que je
vois sont :
- Garbage Collector en Java, ce qui entraine malheureusemeent qu'il
n'y a pas de vrai destructeur en Java et qu'il est donc difficile de
gérer proprement la durée de vie des ressoureces autres que la mémoire
(en C++ on utilise l'idiome RAII). Un effet de bord annexe est qu'n
Java on ne peut pas choisir de manipuler soit une valeur soit une
référence (ou pointeur) comme on peut le faire en C++.
Alors JUSTEMENT ! Je ne vois pas comment on peut concevoir de travailler
sans concepts de référence et encore moins de pointeurs (qui sont à
bannir en C++, vous me l'avez si souvent dit !)...
Comment peut-on s'en sortir avec des copies d'objets !! Je trouve ça plus
que problématique !
Exemple : <snip exemple>
Suis-en train de me fourvoyer ?
3 - pas de templates en JAVA (donc pas de STL et pas de
métaprogrammation...)
3 - pas de templates en JAVA (donc pas de STL et pas de
métaprogrammation...)
3 - pas de templates en JAVA (donc pas de STL et pas de
métaprogrammation...)
Alors JUSTEMENT ! Je ne vois pas comment on peut concevoir de travailler
sans concepts de référence et encore moins de pointeurs (qui sont à
bannir en C++, vous me l'avez si souvent dit !)...
Comment peut-on s'en sortir avec des copies d'objets !! Je trouve ça plus
que problématique !
class piece_maison
{
public void addMobilier(mobObject mob)
}
Là c'est typique, l'objet mobilier une fois associé à une instance de
piece_maison en sera définitivement prisonnier ! S'il est modifié par
ailleurs ça finira aux oubliettes.
Concevoir qu'un objet (une instance) puisse avoir une vie propre, soit
totalement autonome de son container me semble indispensable (mais je
peux me tromper, c'est là que ça devient conceptuel).
Suis-en train de me fourvoyer ? J'ai quand même du mal à imaginer que le
concept de référence si important en C++ soit finalement un gadget dont
on aurait pu se passer...
Alors JUSTEMENT ! Je ne vois pas comment on peut concevoir de travailler
sans concepts de référence et encore moins de pointeurs (qui sont à
bannir en C++, vous me l'avez si souvent dit !)...
Comment peut-on s'en sortir avec des copies d'objets !! Je trouve ça plus
que problématique !
class piece_maison
{
public void addMobilier(mobObject mob)
}
Là c'est typique, l'objet mobilier une fois associé à une instance de
piece_maison en sera définitivement prisonnier ! S'il est modifié par
ailleurs ça finira aux oubliettes.
Concevoir qu'un objet (une instance) puisse avoir une vie propre, soit
totalement autonome de son container me semble indispensable (mais je
peux me tromper, c'est là que ça devient conceptuel).
Suis-en train de me fourvoyer ? J'ai quand même du mal à imaginer que le
concept de référence si important en C++ soit finalement un gadget dont
on aurait pu se passer...
Alors JUSTEMENT ! Je ne vois pas comment on peut concevoir de travailler
sans concepts de référence et encore moins de pointeurs (qui sont à
bannir en C++, vous me l'avez si souvent dit !)...
Comment peut-on s'en sortir avec des copies d'objets !! Je trouve ça plus
que problématique !
class piece_maison
{
public void addMobilier(mobObject mob)
}
Là c'est typique, l'objet mobilier une fois associé à une instance de
piece_maison en sera définitivement prisonnier ! S'il est modifié par
ailleurs ça finira aux oubliettes.
Concevoir qu'un objet (une instance) puisse avoir une vie propre, soit
totalement autonome de son container me semble indispensable (mais je
peux me tromper, c'est là que ça devient conceptuel).
Suis-en train de me fourvoyer ? J'ai quand même du mal à imaginer que le
concept de référence si important en C++ soit finalement un gadget dont
on aurait pu se passer...
L'absence des destructeurs en Java est palié par les blocs finally. Que
l'utilisateur oublie systèmatiquement à mettre:-)
1. C++ supporte une sémantique de valeur aussi pour les types définis
par l'utilisateur. Gosling a proposé un tel support en Java, mais
pour l'instant, rien ne s'est fait.
L'absence des destructeurs en Java est palié par les blocs finally. Que
l'utilisateur oublie systèmatiquement à mettre:-)
1. C++ supporte une sémantique de valeur aussi pour les types définis
par l'utilisateur. Gosling a proposé un tel support en Java, mais
pour l'instant, rien ne s'est fait.
L'absence des destructeurs en Java est palié par les blocs finally. Que
l'utilisateur oublie systèmatiquement à mettre:-)
1. C++ supporte une sémantique de valeur aussi pour les types définis
par l'utilisateur. Gosling a proposé un tel support en Java, mais
pour l'instant, rien ne s'est fait.
Bien sûr, et ca existe en Java : ca s'appelle les finaliseurs. Le gros
problème est qu'ils sont appelés par le GC quand il détriut l'objet,
ce qui signifie que tu ne sais pas quand il est appelé ni dans quel
ordre.
Bien sûr, et ca existe en Java : ca s'appelle les finaliseurs. Le gros
problème est qu'ils sont appelés par le GC quand il détriut l'objet,
ce qui signifie que tu ne sais pas quand il est appelé ni dans quel
ordre.
Bien sûr, et ca existe en Java : ca s'appelle les finaliseurs. Le gros
problème est qu'ils sont appelés par le GC quand il détriut l'objet,
ce qui signifie que tu ne sais pas quand il est appelé ni dans quel
ordre.
En java, les objets sont systématiquement passés par référence, et non
par copie, sauf les types natifs (boolean, int, ...).
En java, les objets sont systématiquement passés par référence, et non
par copie, sauf les types natifs (boolean, int, ...).
En java, les objets sont systématiquement passés par référence, et non
par copie, sauf les types natifs (boolean, int, ...).
"Alain Naigeon" wrote in message
news:<3f68d0f2$0$10431$..."Arnaud Debaene" a écrit dans le message
news: 3f68cd83$0$2787$- Garbage Collector en Java, ce qui entraine malheureusemeent
qu'il n'y a pas de vrai destructeur en Java
Ce qui entraîne..? Bon, il me semble qu'on peut imaginer de
spécifier des destructeurs pris en compte par un Garbage collector
(sans pour autant déclencher soi-même leur exécution).
Bien sûr, et ca existe en Java : ca s'appelle les finaliseurs.
Le gros problème est qu'ils sont appelés par le GC quand il détriut
l'objet, ce qui signifie que tu ne sais pas quand il est appelé ni
dans quel ordre.
Imagines par exemple un objet "o_file_stream" gérant un fichier en
écriture. Cet objet contient en interne un objet "buffer" pour des
raisons de performances. La question est : comment s'assurer que
toutes les données sont bien écrites sur le disque au moment où
l'objet o_file_stream est détruit?
Tu ne peux pas faire un "flush" du buffer dans le fichier physique
dans le finaliseur de o_file_stream car :
- tu ne sais pas quand (ni si) le finaliseur est appelé.
- tu n'as aucun moyen de savoir si le finaliseur du buffer n'a pas
déjà été appelé avant.
Conclusion : le code client doit appeler close sur le o_file_stream :
tu ne peux pas te reposer sur le finaliseur pour flusher le fichier
sur disque.
Ca rend également impossible l'écriture de classes utilisant l'idiome
RAII comme ce genre de choses en C++ :
class MutexLocker
{
private:
Mutex m_mut;
public:
MutexLocker(const Mutex& m) : m_mut(m)
{
m_mut.Lock();
}
~MutexLocker()
{
m_mut.Unlock();
}
};
"Alain Naigeon" <anaigeon@free.fr> wrote in message
news:<3f68d0f2$0$10431$626a54ce@news.free.fr>...
"Arnaud Debaene" <adebaene@club-internet.fr> a écrit dans le message
news: 3f68cd83$0$2787$626a54ce@news.free.fr...
- Garbage Collector en Java, ce qui entraine malheureusemeent
qu'il n'y a pas de vrai destructeur en Java
Ce qui entraîne..? Bon, il me semble qu'on peut imaginer de
spécifier des destructeurs pris en compte par un Garbage collector
(sans pour autant déclencher soi-même leur exécution).
Bien sûr, et ca existe en Java : ca s'appelle les finaliseurs.
Le gros problème est qu'ils sont appelés par le GC quand il détriut
l'objet, ce qui signifie que tu ne sais pas quand il est appelé ni
dans quel ordre.
Imagines par exemple un objet "o_file_stream" gérant un fichier en
écriture. Cet objet contient en interne un objet "buffer" pour des
raisons de performances. La question est : comment s'assurer que
toutes les données sont bien écrites sur le disque au moment où
l'objet o_file_stream est détruit?
Tu ne peux pas faire un "flush" du buffer dans le fichier physique
dans le finaliseur de o_file_stream car :
- tu ne sais pas quand (ni si) le finaliseur est appelé.
- tu n'as aucun moyen de savoir si le finaliseur du buffer n'a pas
déjà été appelé avant.
Conclusion : le code client doit appeler close sur le o_file_stream :
tu ne peux pas te reposer sur le finaliseur pour flusher le fichier
sur disque.
Ca rend également impossible l'écriture de classes utilisant l'idiome
RAII comme ce genre de choses en C++ :
class MutexLocker
{
private:
Mutex m_mut;
public:
MutexLocker(const Mutex& m) : m_mut(m)
{
m_mut.Lock();
}
~MutexLocker()
{
m_mut.Unlock();
}
};
"Alain Naigeon" wrote in message
news:<3f68d0f2$0$10431$..."Arnaud Debaene" a écrit dans le message
news: 3f68cd83$0$2787$- Garbage Collector en Java, ce qui entraine malheureusemeent
qu'il n'y a pas de vrai destructeur en Java
Ce qui entraîne..? Bon, il me semble qu'on peut imaginer de
spécifier des destructeurs pris en compte par un Garbage collector
(sans pour autant déclencher soi-même leur exécution).
Bien sûr, et ca existe en Java : ca s'appelle les finaliseurs.
Le gros problème est qu'ils sont appelés par le GC quand il détriut
l'objet, ce qui signifie que tu ne sais pas quand il est appelé ni
dans quel ordre.
Imagines par exemple un objet "o_file_stream" gérant un fichier en
écriture. Cet objet contient en interne un objet "buffer" pour des
raisons de performances. La question est : comment s'assurer que
toutes les données sont bien écrites sur le disque au moment où
l'objet o_file_stream est détruit?
Tu ne peux pas faire un "flush" du buffer dans le fichier physique
dans le finaliseur de o_file_stream car :
- tu ne sais pas quand (ni si) le finaliseur est appelé.
- tu n'as aucun moyen de savoir si le finaliseur du buffer n'a pas
déjà été appelé avant.
Conclusion : le code client doit appeler close sur le o_file_stream :
tu ne peux pas te reposer sur le finaliseur pour flusher le fichier
sur disque.
Ca rend également impossible l'écriture de classes utilisant l'idiome
RAII comme ce genre de choses en C++ :
class MutexLocker
{
private:
Mutex m_mut;
public:
MutexLocker(const Mutex& m) : m_mut(m)
{
m_mut.Lock();
}
~MutexLocker()
{
m_mut.Unlock();
}
};
Une ramasse-miettes serait une bonne chose en C++, il n'y a rien à dire.
Mais soyons précis : l'existance d'une ramasse-miettes est orthogonale à
la support pour l'OO (qui semblait intéresser surtout le posteur
initial), et c'est également orthogonale à l'existance des destructeurs.
Il y a eu une proposition pour une ramasse-miettes en C++ présentée au
comité de normalisation avant la dernière norme. Les auteurs l'en ont
rétiré, parce qu'ils s'éstîmaient à l'époque que c'était trop tard, et
que essayer de l'incorporer au langage aurait rétardé la norme. Je ne
l'exclurais pas d'office dans la prochaine version de la norme, même si
d'autres évolutions semblent en avoir réduit l'importance.
L'absence des destructeurs en Java est palié par les blocs finally. Que
l'utilisateur oublie systèmatiquement à mettre:-) -- dans ce cas-ci, on
pourrait dire que Java et C++ offrent les mêmes possibilités, avec des
moyens bien différents, mais que la façon C++ de faire est nettement
plus robuste.
Oui : c'est anormal qu'une classe ait à se reposer sur le code client
- Le Java propose la notion d'interface au niveau syntaxique, mais C++
permet de faire exactement la même chose (et même mieux, voir tous les
posts de James sur la programmation par contrat ou par interface) avec
des classes virtuelles pures.
On dit « des classes abstraites ». Ce sont les fonctions qui sont
virtuelle pures. :-)
Oups, au temps pour moi ;-)
- En Java, tout le monde hérite d'Object. Il y a du pour et du
contre...
Intéressant. Je n'ai pas encore trouver du pour.
Il me semble que ca simplifie la sérialisation entre autres.
Une ramasse-miettes serait une bonne chose en C++, il n'y a rien à dire.
Mais soyons précis : l'existance d'une ramasse-miettes est orthogonale à
la support pour l'OO (qui semblait intéresser surtout le posteur
initial), et c'est également orthogonale à l'existance des destructeurs.
Il y a eu une proposition pour une ramasse-miettes en C++ présentée au
comité de normalisation avant la dernière norme. Les auteurs l'en ont
rétiré, parce qu'ils s'éstîmaient à l'époque que c'était trop tard, et
que essayer de l'incorporer au langage aurait rétardé la norme. Je ne
l'exclurais pas d'office dans la prochaine version de la norme, même si
d'autres évolutions semblent en avoir réduit l'importance.
L'absence des destructeurs en Java est palié par les blocs finally. Que
l'utilisateur oublie systèmatiquement à mettre:-) -- dans ce cas-ci, on
pourrait dire que Java et C++ offrent les mêmes possibilités, avec des
moyens bien différents, mais que la façon C++ de faire est nettement
plus robuste.
Oui : c'est anormal qu'une classe ait à se reposer sur le code client
- Le Java propose la notion d'interface au niveau syntaxique, mais C++
permet de faire exactement la même chose (et même mieux, voir tous les
posts de James sur la programmation par contrat ou par interface) avec
des classes virtuelles pures.
On dit « des classes abstraites ». Ce sont les fonctions qui sont
virtuelle pures. :-)
Oups, au temps pour moi ;-)
- En Java, tout le monde hérite d'Object. Il y a du pour et du
contre...
Intéressant. Je n'ai pas encore trouver du pour.
Il me semble que ca simplifie la sérialisation entre autres.
Une ramasse-miettes serait une bonne chose en C++, il n'y a rien à dire.
Mais soyons précis : l'existance d'une ramasse-miettes est orthogonale à
la support pour l'OO (qui semblait intéresser surtout le posteur
initial), et c'est également orthogonale à l'existance des destructeurs.
Il y a eu une proposition pour une ramasse-miettes en C++ présentée au
comité de normalisation avant la dernière norme. Les auteurs l'en ont
rétiré, parce qu'ils s'éstîmaient à l'époque que c'était trop tard, et
que essayer de l'incorporer au langage aurait rétardé la norme. Je ne
l'exclurais pas d'office dans la prochaine version de la norme, même si
d'autres évolutions semblent en avoir réduit l'importance.
L'absence des destructeurs en Java est palié par les blocs finally. Que
l'utilisateur oublie systèmatiquement à mettre:-) -- dans ce cas-ci, on
pourrait dire que Java et C++ offrent les mêmes possibilités, avec des
moyens bien différents, mais que la façon C++ de faire est nettement
plus robuste.
Oui : c'est anormal qu'une classe ait à se reposer sur le code client
- Le Java propose la notion d'interface au niveau syntaxique, mais C++
permet de faire exactement la même chose (et même mieux, voir tous les
posts de James sur la programmation par contrat ou par interface) avec
des classes virtuelles pures.
On dit « des classes abstraites ». Ce sont les fonctions qui sont
virtuelle pures. :-)
Oups, au temps pour moi ;-)
- En Java, tout le monde hérite d'Object. Il y a du pour et du
contre...
Intéressant. Je n'ai pas encore trouver du pour.
Il me semble que ca simplifie la sérialisation entre autres.
wrote:L'absence des destructeurs en Java est palié par les blocs finally.
Que l'utilisateur oublie systèmatiquement à mettre:-)
L'intérêt en est quand même relatif puisqu'on n'a pas l'assurance
qu'un bloc finally sera appelé.
1. C++ supporte une sémantique de valeur aussi pour les types
définis par l'utilisateur. Gosling a proposé un tel support en
Java, mais pour l'instant, rien ne s'est fait.
Du genre de ce que fait C# ?
kanze@gabi-soft.fr wrote:
L'absence des destructeurs en Java est palié par les blocs finally.
Que l'utilisateur oublie systèmatiquement à mettre:-)
L'intérêt en est quand même relatif puisqu'on n'a pas l'assurance
qu'un bloc finally sera appelé.
1. C++ supporte une sémantique de valeur aussi pour les types
définis par l'utilisateur. Gosling a proposé un tel support en
Java, mais pour l'instant, rien ne s'est fait.
Du genre de ce que fait C# ?
wrote:L'absence des destructeurs en Java est palié par les blocs finally.
Que l'utilisateur oublie systèmatiquement à mettre:-)
L'intérêt en est quand même relatif puisqu'on n'a pas l'assurance
qu'un bloc finally sera appelé.
1. C++ supporte une sémantique de valeur aussi pour les types
définis par l'utilisateur. Gosling a proposé un tel support en
Java, mais pour l'instant, rien ne s'est fait.
Du genre de ce que fait C# ?
L'intérêt en est quand même relatif puisqu'on n'a pas l'assurance
qu'un bloc finally sera appelé.
Disons que c'est toujours mieux que ce qu'on a en C:-).
Je ne sais pas ce qu'on fait en C# --
jusqu'ici, il ne tourne pas sur mon Sparc.
Pour les propositions qui concerne les types à valeur en Java, voir
http://java.sun.com/people/jag/FP.html, surtout la partie sur "Efficient
classes". Mais l'accent est sur performance et le calcul numérique -- il
ne s'adresse pas au problème de la durée de vie (que les Javaïstes
semblent ignorer complétement).
L'intérêt en est quand même relatif puisqu'on n'a pas l'assurance
qu'un bloc finally sera appelé.
Disons que c'est toujours mieux que ce qu'on a en C:-).
Je ne sais pas ce qu'on fait en C# --
jusqu'ici, il ne tourne pas sur mon Sparc.
Pour les propositions qui concerne les types à valeur en Java, voir
http://java.sun.com/people/jag/FP.html, surtout la partie sur "Efficient
classes". Mais l'accent est sur performance et le calcul numérique -- il
ne s'adresse pas au problème de la durée de vie (que les Javaïstes
semblent ignorer complétement).
L'intérêt en est quand même relatif puisqu'on n'a pas l'assurance
qu'un bloc finally sera appelé.
Disons que c'est toujours mieux que ce qu'on a en C:-).
Je ne sais pas ce qu'on fait en C# --
jusqu'ici, il ne tourne pas sur mon Sparc.
Pour les propositions qui concerne les types à valeur en Java, voir
http://java.sun.com/people/jag/FP.html, surtout la partie sur "Efficient
classes". Mais l'accent est sur performance et le calcul numérique -- il
ne s'adresse pas au problème de la durée de vie (que les Javaïstes
semblent ignorer complétement).