GUICE : un framework de DI pour Java

Je pense que la Dependency Injection est une valeur fondamentale à l’écriture d’un programme, et je l’utilise tous les jours.
Je suis un adorateur (voir expert) de Spring/Spring.Net, et j’affectionne l’écriture de la structure du programme en XML.

Mais cette technique est très largement contestée :

  • nécessite un éditeur XML “intelligent” (ce qui est le cas grâce à SpringIDE) pour la complétion de la structure mais aussi des types.
  • interprétation au Runtime, et donc erreurs potentielles découvertes qu’au dernier moment.
  • verbeux
  • mauvaises performance (lecture du XML…)

Ça a aussi ses avantages, c’est pour ça que je reste adorateur de Spring, mais ce n’est pas le sujet…

J’ai déjà souvent eu ce débat avec Romain dans le monde .Net (voir http://ninject.org).
Je connais très mal les alternatives à Spring dans le monde Java, mais je connais celle de Google : Guice.

Voici un tuto/introduction très convaincante.

Pour ceux qui ne connaissent pas Ninject ou Guice, voici un peu le principe :
Au lieu de rédiger un XML, on utilise massivement les annotations (attributs en .Net) pour spécifier les injections. Ceci est aussi possible en Spring (technique dite Autowire) mais l’utilisation du XML reste nécessaire pour personnaliser plus finement les dépendances entre instances.
Dans le cas de Guice, au lieu de rédiger un XML, on créer une classe Module qui réalise le mapping entre une interface et la classe concrète à instancier/injecter.
On peut spécifier bien plus de chose que cela, mais je vous laisse lire l’article pour découvrir par vous même.

Pour ceux qui veulent suivre le débat “Spring vs Guice” ou “XML vs Code”, voici le point de vue de la documentation officielle de Guice.

Publié dans Développement. Mots-clefs : , , , . 1 commentaire »

Encore un nouveau langage : FAN

En lisant un article d’introduction du langage FAN je trouve intéressant que ce dernier soit compatible .NET et Java.
En ce moment, .Net se voit enrichir de nombreux langages, aussi bien statiques (F# par exemple) que dynamiques (Iron Python). Les langages “standards” étant C#, VB.Net et C++/CLI.
Quand on développe sur la JVM, le langage “standard” reste Java. Mais cela ne veut pas dire qu’on a pas le choix : Scala, Jython, Groovy

aa496123net_logoen-usmsdn10java_logo = FAN ?

Lisez la suite de cette entrée »

Publié dans Développement. Mots-clefs : , . 1 commentaire »

Quel langage pour l’avenir : C#4 ou Oxygene (Delphi)

Suite au post de Romain sur l’avenir du langage C#, je voulais non seulement répondre, mais en profiter pour parler brièvement d’un autre langage .Net : Oxygene.

C#4 ?

Romain a trouvé une citation un peu abusive mais qui m’est pourtant tout de suite venu à l’esprit concernant C#4 :

The dynamic keyword is going be abused so much… C# is on its way to becoming PHP.

Pour la petite histoire, je viens de passer 2 jours à coder du Javascript… coder?? Débuguer surtout!
Je ne sais pas si suis allergique aux langages dynamiques, mais ça me frustre au plus au point de ne pas savoir quel sont les membres que possède un objet, et de devoir le vérifier au Runtime
J’ai passé 2h car j’ai fait une faute de frappe sur le nom d’un membre, ce qui ne plante pas, mais comme cela créer dynamiquement un nouveau membre avec ce nouveau nom, j’ai passé beaucoup de temps à comprendre pourquoi sa valeur était “null”.

C’est pour ça que les aspects “dynamiques” me font peur pour la maintenance des futures programmes C#4.
Ceci dit, le mot clé “var” existe déjà en C#3, et je n’ai pas vu quelqu’un en abuser (d’ailleurs, est-ce que la nouvelle version de Resharper suggère toujours de remplacer les types par des var ??!!).
Toujours pour diluer mes propos, il est vrai que dans la réalité on a besoin d’utiliser différents langages pour différents besoin, alors pourquoi ne pas tout réunir en un seul…
Mais j’aimerai éviter ça :

Pétage de cable

Parfois je me dit aussi que “C# is on its way to becoming C++“. Je n’ai pas beaucoup d’expérience en C++, et de ce fait j’ai parfois du mal à comprendre certains codes.
Mais j’ai surtout l’impression que les possibilités du langage sont tellement nombreuses, qu’on a pas 2 codes source C++ “dans la même prose”, ce qui devient vite difficile à lire. Pouvoir faire 1 chose de 10 manières différentes, n’est en mon sens pas un bon truc.

Mais en pratique, les nouvelles fonctionnalités de C# ne sont utilisées que par une “élite” qui a un besoin très précis. Dans mon travail actuel, les gens ne savent pas encore faire du Linq, et j’ai l’impression que je suis le seul a avoir VRAIMENT migrer sur C#3. Donc, avant que quelqu’un découvre les nouveautés de C#4 et en abuse….

Ah, si, il y en a 1… et c’est le genre de personne à faire une chose d’une certaine façon “juste parce que c’est possible”, si vous voyez ce que  je veux dire… et là, ça devient vraiment dangereux, et on fini par avoir du code incompréhensible car il a détourné une fonctionnalité de son but initial.

Je dois être vieux jeux, mais je préfère parfois la méthode “classique et lisible” même si elle est plus verbeuse. Pourtant, je me laisse séduire, et je deviens vite fan des méthodes d’extension et des expressions lambda. C’est comme si mes 2 personnalités entraient en conflit quand je me dit :


return toto??tata;
// ou
return toto!=null?toto:tata;
// ou
if(toto != null)
return toto;
else
return tata;

Il est clair que je préfère la première solution, mais on m’a défait fait la remarque :

euh, tu peux l’écrire avec le “if”, je trouve ça plus lisible.

Et oui, il faut aussi s’adapter au niveau de lecture de l’équipe.

Mais là, je ne parle que du langage C#, pas des possibilité de la VM ou du Framework. S’il est possible d’interagir entre .Net et Javascript, alors je suis aux anges, mais il existe sans doute d’autres moyens “peut être plus contraignant” que d’ajouter de la dynamicité dans le langage C#. (On génère bien des “stub” pour communiquer en COM !)

Mais au finale, je me laisse prendre au jeux, et finalement je suis fan des expressions lamdba, Linq, les méthodes d’extensions, juste parce que ça s’écrit plus rapidement et que je suis fainéant.

Oxygene ?

Parce que je suis bavard, je voulais en profiter pour parler non pas de C#, mais de Oxygene.

delphiprismscreenshot

Un peu d’histoire : le créateur de Delphi a aussi été le créateur de C# : Anders Hejlsberg
Petit lien car ça ne fait pas de mal : Anders qui parle du future de C# (je sais, tout le monde l’a déjà vu).

J’ai commencer à coder en Delphi au Lycée (je ne compte pas les années Basic sous AsmstradCPC6128 ;) ).
Delphi était magique à l’époque : langage Pascal Objet, IDE avec un puissant Designer pour application Windows, framework riche…

Puis le monde a évolué : Anders Hejlsberg a quitté Borland pour aller chez Microsoft.
A l’époque, Microsoft a voulu faire leur propre “Java” : J++.
Anders a commencer par travailler la dessus, mais Microsoft est entré en conflit avec Sun concernant ce J++, et c’est comme ça que .Net naquis.
Anders inventa alors C# pour l’occasion, et J++ fut porté sous .Net sous le nom de J#.

Les années noirs pour Borland ont commencé, les entreprises se tournant vers Microsoft et .Net.
Mais je suis resté à coder en Delphi 7 dans mon ancienne société, alors que .Net en était déjà à sa V2. Période de ma vie (en tant que codeur) très frustrante: pas de “foreach”, pas de “generics”, programmation par interface difficile, etc.

Pour Borland, ce fut de pire en pire : ils ont fini par migrer Delphi en .Net, et ont alors inclue le SDK de Microsoft .Net dans leur IDE… comme si Delphi en tant que langage était mort, et que “Delphi 2008″ ne servait surtout qu’à développer en C#. Sans compter les frameworks tel que VCL.Net en conflit avec ceux de .Net comme Winforms.

Je n’ai pas travaillé avec Delphi 2008, mais je l’ai un peu testé. Malgré de gros problème de performance, cet IDE était déjà 1000 fois mieux que VisualStudio : refactoring poussé, historique “à la svn” à chaque sauvegarde/innactivité d’un source, Designer plus sympa, etc.

Mais finalement, Borland a laissé son IDE à Codegear et la mort de Delphi semblait proche. C’est pour cela que mon ancienne société a choisi de passer de Delphi7 à VisualStudio/C#.

Puis, récemment en surfant, j’ai découvert Oxygene.

Et je me suis dit : “haha, la résurrection de Delphi?”
Ce langage est dérivé de Delphi (comme une nouvelle version en quelque sorte), possède toutes (?) les fonctionnalités du langage C#3 comme Linq, etc.
Mais il ajoute aussi son lot de nouveauté que j’adore :

  • éviter les tests de nullité inutile :

if(truc.parent != null && truc.parent.parent != null)
toto = truc.parent.parent;
// devient
toto = truc:parent:parent;
  • ne pas choisir entre un “for” et un “foreach” car on a besoin d’un compteur

Combien de fois ais-je du ajouter un compteur dans un foreach (et risqué d’oublier le ++) et au final me résigner à utiliser le bon vieux “for”. En Oxygene, le foreach peut gérer l’index :


for each u in Users index i do begin
// et on se sert de i

Maintenant, Oxygene fait du buzz sur le net… enfin surtout “Delphi Prism“.

Finalement, l’IDE de Codegear est abandonné, et Delphi Prism s’intègre à VisualStudio (utilisé comme une application Eclipse RCP).
On retrouve le langage Oxygene, mais aussi un certains nombre de framework pour pouvoir faire des applications multi-plateform à l’aide de Mono.
Et pour faire plaisir aux ex-Delphi-istes, le package inclue une API d’interoperabilité entre .Net et les applications pure Delphi Win32.
Pour plus d’infos : http://www.delphi.org/2008/10/delphi-prism/

Il ne me reste plus qu’à tester tout ça :) Est-ce que ça veut dire que je vais abandonné C# pour revenir flirter avec Delphi?

Publié dans Blabla, Développement. Mots-clefs : , , , . 2 Commentaires »

Mono : nouveau standard ?

Pour ce qui ne sont pas au courant ou qui n’aurai pas vu la vidéo de la PDC, voici l’article d’InfoQ sur Mono.Simd.
J’aime bien le titre “Mono: Going Beyond the Standard”, et c’est de ça que je vais parler…

J’ai posé la question lors de la soirée ALT.Net en présence de Jean-Baptiste Evain, à savoir si on ne va pas se retrouver avec 2 standards : .Net et Mono.
ATTENTION, je ne parle pas des spécifications de la VM ou du langage C#, mais des assembly fournies en standard avec le SDK.

Lisez la suite de cette entrée »

Publié dans Développement, linux. Mots-clefs : , , . Laisser un commentaire »

Petite astuce Tortoise

Vous connaissez sans doute tous les properties de svn ?
J’adore Tortoise, et ce dernier offre des fonctionnalités “supplémentaires” à l’aide de properties custom.
On cherche souvent à empêcher les autres membres de l’équipe à commiter sans commentaires. C’est possible à l’aide des properties, à condition d’utiliser Tortoise :)


Lisez la suite de cette entrée »

Les Settings en .Net

La plateforme .Net fournit un mécanisme pour gérer les paramétrages. Il en existe 2 types : ceux de l’application et ceux de l’utilisateur. Au début de l’existance, il y avait la bonne vielle méthode du fichier *.ini, mais aujourd’hui le XML et devenu LE standard pour écrire des données dans un fichier “lisible” et structuré.

Il existe un autre standard : les applications .Net possède un fichier “mon_application.exe.config” qui n’est autre qu’un XML contenant le paramétrage de l’appliation. Ce fichier est structuré en 2 grosses parties: l’entête avec la section “configSections” qui décrit les sections du XML et les “parser” qui vont lire ces dernières. Puis il y a les sections proprement dites.
Lisez la suite de cette entrée »

Publié dans Développement. Mots-clefs : , , , . 5 Commentaires »

Winforms sous Linux

Après 4 ans de développement, la communauté Mono est enfin parvenu à l’implémentation complète des Winforms : http://tirania.org/blog/archive/2008/May-13.html

On peux se demander “oui, mais pourquoi faire?” et je ne trouve pas de réponse à la question. En effet, il arrive souvent qu’une application .Net possède du Legacy et donc des dépendances COM ou P/Invoke. Dans ce cas, on ne peut pas la migrer (pour tester si une migration est possible: http://www.mono-project.com/Moma)

Mais comme je suis exigent en terme d’interface, je n’aime pas avoir une application “alien” qui ne ressemble pas à mon environnement Linux (GTK/QT). Certes, il est prévu d’avoir un meilleur support du moteur de thème lors du prochain GSoC, donc wait and see.

Rappelons que les Winforms sont une sur-couche .Net de l’API WIN32. Cette dernière n’existant pas sous Linux et MacOS, j’en profite alors pour féliciter les équipes de Mono pour leur implémentation “from scratch”.

D’un autre coté, l’implémentation WPF chez Mono avance plutôt vite. D’ailleurs, la première release de Moonlight vient de sortir. Il n’y a pas de dépendance WIN32 dans ce cas, et je vois plus l’avenir des applications .Net dans ce sens. Mais l’approche WPF est d’avoir un thème propre à l’application, comme c’est le cas pour les sites Web, on obtient la même interface sous Linux et Windows (et MacOS). Mais finalement je trouve que ces interfaces ne s’intègrent à aucun des 3 environnements.

Lisez la suite de cette entrée »

Publié dans Blabla, linux. Mots-clefs : , , , , , , . 3 Commentaires »

Appeler du Java depuis .Net

Deux mondes s’affrontent: Java et .Net. Chacun choisi son camp, ou choisi les deux… moi j’ai la double nationalité :) Mais quand les deux mondes doivent alors communiquer? Je fais l’interprète. Voila le topo:
J’ai une application .Net qui a besoin de manipuler des classes Java, et pour se faire je passe par C++/CLI: comment avoir un pied dans du .Net et un autre dans du natif C++.
Lisez la suite de cette entrée »

Publié dans Développement. Mots-clefs : , , , , . 4 Commentaires »

A la conquête du Web 3.0

J’ai eu une discutions intéressante ce midi au sujet du buzz en ce moment: Adobe open-source Flash! Je vois ça comme un premier pas vers la conquête du Web 3.0. Une guerre déjà entamé entre Adobe, Microsoft et le monde libre.
Lisez la suite de cette entrée »

Publié dans Développement. Mots-clefs : , , , , , , . 6 Commentaires »

Timeout WCF au bout d’un certain nombre d’appels

Rien de plus stressant que de passer une journée entière sur un bug. Surtout si on n’a aucune idée du problème (pas d’exceptions, ni d’erreurs dans les logs) et que les recherches sur Internet sont infructueuses.
Contexte : une application Web Asp.Net communique avec un service WCF.
Problème : au bout d’un certain nombre d’appels (invariant) l’application Web n’arrive plus à joindre le serveur (Timeout).

Lisez la suite de cette entrée »

Publié dans Développement. Mots-clefs : , , , , . 1 commentaire »