Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Microsoft et Java

295 réponses
Avatar
Wykaaa
Microsoft semble reconnaître que Java permet de développer plus
rapidement que C# et qu'il y a moins de failles de sécurité dans Java
que dans .net :
http://dsi.silicon.fr/nouveautes/microsoft-java-forever%E2%80%A6-1366

10 réponses

Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 19:18, JKB a écrit :
Oui. Parce que c'est la seule façon d'avoir un truc fiable. Ton
exception est traitée en dehors de la fonction



Non, elle est traitée dans la fonction.
En tout cas si je sais faire une reprise sur erreur.
Sinon, je ne fais rien du tout et me contente de propager l'erreur,
jusqu'à ce que quelqu'un sache faire une reprise sur erreur.

pire, avec une
ribambelle et demi de fonctions appelées entre la chose qui a levé
ton exception et sa récupération.



Je ne suis pas toujours capable de prendre une décision sur comment
gérer mon erreur juste au moment où je détecte l'erreur.
Parfois, c'est seulement plusieurs couches au-dessus que je serais
capable de décider quoi faire.

Exemple tout con, une interface pour gérer des fichiers.
Localement je n'ai absolument aucune idée de comment faire une reprise
sur erreur si ma lecture échoue. Dois-je retenter ? Lire à un autre
emplacement ? Ne pas tenir compte de l'erreur ? Seule la couche du
dessus pourra et devra prendre cette décision.
Dans l'interface, toutes les méthodes vont donc lever potentiellement
une IOException, que la couche du dessus devra traiter suivant le cas
(AccessException = on peut sûrement retenter, InvalidFileException = le
chemin est mauvais, SocketClosedException = le réseau me permettant
d'accéder à mon fichier distant est mort…).
Si la couche du dessus ne sait toujours pas traiter, on remonte encore
d'un cran, est.

Au hasard :

int ma_fonction_qui_renvoie_une_erreur(paramètres d'entrée,
*paramètres de sortie).



C'est bien ce que je dis, des tricks à la con.
La signature de ta méthode ne se justifie que par des tricks pour
arriver à tes fins, en aucune manière par des préoccupations métier.

Arrête de ne pas regarder plus loin que le bout de ton nez. Je te
prends un exemple tout bête, un shell un peu spécial. S'il n'a plus
de mémoire disponible, il est de bon ton qu'il écrive sur stdout
"not enough memory" ou quelque chose du même genre en retournant une
invite (et au passage en libérant la mémoire qu'il était en train
d'utiliser pour essayer d'exécuter la dernière requête) et non en
segfaultant.



Euh, je ne vois pas la contradiction avec Java à ce niveau…
Même pire, Java est même totalement indiqué pour parvenir à tes fins :

int main(String[] args) {
try {
doBordel();
} catch (OutOfMemoryException e) {
System.err.println("Not enough memory");
} finally {
cleanDawa();
}
}

Quelque soit le bout de code qui manquera de mémoire et qui n'aura pas
été capable de se récupérer, mon programme fera ce que tu voulais =)

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/OOgAAoJEK8zQvxDY4P9MWwH/3t5B6TXoF5/1LOo+aQ98a2i
nWrvk8Vu7ohSsH89kQMYYXueA10pYigRXbzv143WDR1lQdpnNR9c+TWESMqc1Hpo
KRdrwyVPpwC1mVE/sDhyO2Akngi+RX2tk/TJ5tONAr8MlWB/rwRqGEaaejrEPdJj
PUyLrMrpAyhkSpWxYzGFmuXWBNHvcfKt4baOMcP3V7rtpX1PL8GxNBp6DjG4hfI6
kQ9AH+mzM9NG4HeRiX6k4bVoIO3ZMXkYe11c9pSyNRnsrhYAhGFopOYBnZASN0TA
e4ppz/Hsg/NVAn0t98CxropQYvcQF6zsZuQQ94AttEVq5aBMuNhHgCQP/QforJI =GY+i
-----END PGP SIGNATURE-----
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 19:19, JKB a écrit :
Il y a pourtant des choses très bien en C.

> ou du web en
> C/C⁺⁺ !


Idem.



Je n'ai jamais dis le contraire.
On peut même trouver de belles choses en brainfuck ou en whitespace…

Simplement que le coût d'intégration ne sera pas du tout le même entre
du Java et du C⁺⁺ pour ce genre de librairies.
Les services rendus par les librairies C/C⁺⁺ sont aussi extrèmement
moindres par rapport à ce qui est disponible en Java.
Les ORM ou les conteneurs d'IoC sont quasiment inexistants dans ces
langages, ou en tout cas bien moins génériques que Hibernate ou Spring.

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/ORWAAoJEK8zQvxDY4P94Z0IAMei4FOH5X11+gRpsAib9a6l
mat88w0EE0reLfktQYEt11iEIVovaxdAzU7YQthUVJYsNmCEY3Q2JEFOaYVJXlwp
r474VA4ROL02n8Wcn6cobjxzQLA1PfqcehdPy+FefPZSVVw0gZze+4tTB1JproIA
F9cN3HiMxrzSXZDtTvBGwMVKRmLuik25QEcEj0ZLu+WPEmoisH6bngKUMz3Hr7Xz
R6ph+zMIYKL5ou3aj4hwguXM0bDxeqelHxzFp0yBk86QCxtE6fzSLJFAw3iFtx3X
CBSbbd1DTtNO8yt+pzxnGRjqrzAK9ngQ/5aTFAcaUWxxlS3TpnvPGlGw60PO9SY =uYLx
-----END PGP SIGNATURE-----
Avatar
JKB
Le Sat, 18 Jun 2011 19:43:01 +0200,
Aéris écrivait :

Le 18/06/2011 19:18, JKB a écrit :
Oui. Parce que c'est la seule façon d'avoir un truc fiable. Ton
exception est traitée en dehors de la fonction



Non, elle est traitée dans la fonction.



Pas forcément.

En tout cas si je sais faire une reprise sur erreur.
Sinon, je ne fais rien du tout et me contente de propager l'erreur,
jusqu'à ce que quelqu'un sache faire une reprise sur erreur.



Et c'est idiot.

pire, avec une
ribambelle et demi de fonctions appelées entre la chose qui a levé
ton exception et sa récupération.



Je ne suis pas toujours capable de prendre une décision sur comment
gérer mon erreur juste au moment où je détecte l'erreur.



En effet, mais lorsque cette erreur arrive dans une partie qui vient
d'allouer de la mémoire mais _avant_ la libération de celle-ci, il
est de bon ton de libérer la mémoire avant de rendre la main à la
fonction appelante qui traitera intelligemment l'erreur.

Parfois, c'est seulement plusieurs couches au-dessus que je serais
capable de décider quoi faire.



Ça n'enlève rien à ce que je te dis.

Exemple tout con, une interface pour gérer des fichiers.
Localement je n'ai absolument aucune idée de comment faire une reprise
sur erreur si ma lecture échoue. Dois-je retenter ? Lire à un autre
emplacement ? Ne pas tenir compte de l'erreur ? Seule la couche du
dessus pourra et devra prendre cette décision.



Ouaips. Sauf si juste avant de lire tu as fait un
malloc(taille_du_fichier). Il est de bon ton de faire un free() du
pointeur.

Dans l'interface, toutes les méthodes vont donc lever potentiellement
une IOException, que la couche du dessus devra traiter suivant le cas
(AccessException = on peut sûrement retenter, InvalidFileException = le
chemin est mauvais, SocketClosedException = le réseau me permettant
d'accéder à mon fichier distant est mort…).
Si la couche du dessus ne sait toujours pas traiter, on remonte encore
d'un cran, est.



Et c'est idiot, au risque de me répéter. Une erreur doit commencer
par être traitée localement même si elle se propage aux fonctions
appelantes. Le fait de ne pas pouvoir traiter une erreur localement
est une aberration.

Au hasard :

int ma_fonction_qui_renvoie_une_erreur(paramètres d'entrée,
*paramètres de sortie).



C'est bien ce que je dis, des tricks à la con.
La signature de ta méthode ne se justifie que par des tricks pour
arriver à tes fins, en aucune manière par des préoccupations métier.



Parle-moi en français, je prendrais peut-être la peine de te
répondre.

Arrête de ne pas regarder plus loin que le bout de ton nez. Je te
prends un exemple tout bête, un shell un peu spécial. S'il n'a plus
de mémoire disponible, il est de bon ton qu'il écrive sur stdout
"not enough memory" ou quelque chose du même genre en retournant une
invite (et au passage en libérant la mémoire qu'il était en train
d'utiliser pour essayer d'exécuter la dernière requête) et non en
segfaultant.



Euh, je ne vois pas la contradiction avec Java à ce niveau…
Même pire, Java est même totalement indiqué pour parvenir à tes fins :

int main(String[] args) {
try {
doBordel();
} catch (OutOfMemoryException e) {
System.err.println("Not enough memory");
} finally {
cleanDawa();
}
}

Quelque soit le bout de code qui manquera de mémoire et qui n'aura pas
été capable de se récupérer, mon programme fera ce que tu voulais =)



Pas exactement. Mais si tu ne vois pas la différence, tant pis.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
JKB
Le Sat, 18 Jun 2011 19:45:58 +0200,
Aéris écrivait :

Le 18/06/2011 19:19, JKB a écrit :
Il y a pourtant des choses très bien en C.

> ou du web en
> C/C⁺⁺ !


Idem.



Je n'ai jamais dis le contraire.
On peut même trouver de belles choses en brainfuck ou en whitespace…

Simplement que le coût d'intégration ne sera pas du tout le même entre
du Java et du C⁺⁺ pour ce genre de librairies.
Les services rendus par les librairies C/C⁺⁺ sont aussi extrèmement
moindres par rapport à ce qui est disponible en Java.



Qu'est-ce qu'il ne faut pas lire...

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 19:37, Nicolas George a écrit :
C'est vraiment du wishful thinking à l'état pur, ça.



Pas dans le monde Java.

Ça prend 10s de configurer une CI (Jenkins + Maven).

C'est la grosse différence entre Java et le reste : l'intégration de
TOUS les outils de dev en un seul endroit, et pour l'intégralité du
cycle de dev du projet.
De l'enclenchement (maven-archetype), à la compilation
(maven-compiler-plugin), en passant par les tests U
(maven-surefire-plugin), la couverture de code (maven-cobertura-plugin)
ou le site du projet (maven-site-plugin), jusqu'à la release et la
publication (maven-release-plugin), la gestion de la doc
(maven-javadoc-plugin), la gestion de la gestion de conf
(maven-scm-plugin) ou la gestion des dépendances
(maven-dependencies-plugin).

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/OW6AAoJEK8zQvxDY4P947YH/ibj64x+dXehxPhm9M4GbobB
+1jCJLMkOb50/6RBC6lGpxA5VmjAAT/S+wBK31DCTZHdMymqJ5DZuUto+2dqUiQa
UQKBu27pJCYH4G16CVjsq/tdsQhw55Od8lM/x806g84w4+NB5wBkOp74bvLPdqty
YfFpiwc2zLv93j0lZwVbHXDny31EY42SY0UuRzwQH7jhmL29Xon9khWdXatMj7F5
qNOX4akQUfw1a2N4TFl3ot3YL14EsKib6GU2m1A552Gku5xxbcX4t8S40y+y9i9W
W9MDZxJ119lQ82kBCyfZ8iZF793Ya++asl0lOa/w+ixhKnTMeTHKHQ72m7Y67Q4 =rcm9
-----END PGP SIGNATURE-----
Avatar
Nicolas George
Aéris , dans le message <4dfce5ba$0$713$, a
écrit :
Pas dans le monde Java.



Spécifiquement dans le monde java, puisqu'on y garde même les brêles.

Tous les outils que tu veux ne parviendront pas à cacher cette réalité :
quand un programmeur ne comprend pas ce qu'il fait, il fait de la merde.
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 19:41, Nicolas George a écrit :
entre un projet qui utilise systématiquement
trois bibliothèques élémentaires et un projet qui peut utiliser une
ribambelle de bibliothèques optionnelles, parfois de manière incompatible
et/ou redondante, parfois pas des appels indirects, etc. (je suis justement
en train de compiler un tel projet dans une fenêtre voisine), la gestion des
dépendances est radicalement différente.



Ah ? Et en quoi donc ?
Pour moi la gestion est exactement la même?

Sans parler que Maven gère de base tous les exemples que tu donnes :
? dépendances optionnelles
? dépendances transitives (indirectes)
? dépendances transitives à versions conflictuelles
et même bien d'autres :
? dépendances à la compilation
? dépendances à l'exécution
? dépendances fournies par l'environnement d'exécution (serveur
d'application par exemple)
? dépendances dues uniquement aux tests U

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/OavAAoJEK8zQvxDY4P97TQH/1S++tmyYciDoYzzdfzPGp2o
9T1zIfuhoKwlc6/A/84xxqpYChyMRWeCiYdmd4GIZnL5zV+XagNadkTDKTiItXbq
IanK/viBOOqn+6LLhwcdLnJx9uZr+g2DTlWdyxHjucACEt+j+Z0gjLki/Q6BrHYh
Gf7528l04OIvx1eDAaqZtXyVvO5cWaP9McXL66ke65q8QbOTkNoEGwuWINjUPFpi
GzHTSBnKf0wZ+PTASigv8MFQl6ikG0wNh9joKc1thUH6YIJo86odlyGu5Q2XtPD2
n6/4T3E3GsGGIQ0QFgXSFDFl+1nSlv6TitXM/GaO3N6/KCi2yRpcr+03p7BrsJ8 =MTJN
-----END PGP SIGNATURE-----
Avatar
Nicolas George
Aéris , dans le message <4dfce6af$0$713$, a
écrit :
Ah ? Et en quoi donc ?



Pour commencer, sans compilation conditionnelle, tu n'iras pas très loin
pour certaines formes de dépendances conditionnelles.
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 19:50, JKB a écrit :
Pas exactement. Mais si tu ne vois pas la différence, tant pis.



J'ai très bien compris.
Rien ne t'empèche de traiter localement ta libération de mémoire puis de
remonter l'erreur pour faire la reprise.

void doBordel() {
int[INT_MAX] grosDawa = …
try {
trucQuiPlante();
} finally {
free(grosDawa);
}
}

propre, net, précis et sans bavure.

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/OeTAAoJEK8zQvxDY4P90PgIAKb7h5/A7Nr1xm5yWHexZT+H
dw0kLO5eRy3NvY7i3lEce33OeQ9JOJzhvztbA15VMk4lK+sBlGeNkK8qHeBeStGB
HcoFwCoatzr6+mDBDRti7nj2HZsDDFIkHKztEW7rL2Iif5l/TVabJeqm9vUG9uge
NKB6f7ozBZWXuO3Rc2N8BC/gxjDkhsvVdi1CTzQMynuv6LGU2O0inFgnpvmii/+L
+zB/MToWqpw3fvMYHUVAcJngIaslhTyStafbmt7Q6RFoJHFCafuEmwE42PrCrF9E
5Da8/w80LnIES+q63K+8CQHl1L4/tlf9xFuPqPWoh4NCoCZH/hopMv8mVXq+SsE =krCW
-----END PGP SIGNATURE-----
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 19:54, Nicolas George a écrit :
Tous les outils que tu veux ne parviendront pas à cacher cette réalité :
quand un programmeur ne comprend pas ce qu'il fait, il fait de la merde.



Là je te +1 sans soucis.
Mais mes outils Java me permettent de détecter ce genre de conneries
très rapidement.

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN/OffAAoJEK8zQvxDY4P9QRMH/ic8J9+xvbbZFJP2Czc/EtY+
pXVGiokM3n8md3pW8Cj1IvlBPQc8/EWZDfE2CqB+Lvk4La96IpQSyx9CLvsBNRXi
ZlepDH7n0UeB1ZtO4UDWnc64YDvzUQUdQGVdO7t+mbM0/Xn4DM9Br3daDnwmmOpm
3dN8C3HgDEWUGi8oJ+P5/1eww+t0PSgLKEOS5JgBrMSe4d1wIzACGR4kCNSX2CI8
wiDy30jA6nFUB4+e7mon2PeRVwhVLnGoN6tACQU9YP+0nuhWE6jvbpbndzCT5XWr
/97EOHwQFfasTu+JFoWaGsLE3NmOSkmaO5TOKXuY0KJXw+CFIBGnQENza75mKV0 =tb6K
-----END PGP SIGNATURE-----