L’union fait la force

28 01 2008

Il est toujours intéressant de parcourir du code source créé par d’autres personnes, c’est à mes yeux une excellente formation pour devenir un bon développeur. Je peux le vérifier en ce moment puisque je travaille sur la résolutions d’incidents sur une application web ayant pour base principale Struts.

J’ai été vraiment impressionné par le nombre de classes utilisées simplement pour supporter les opérations ajout, récupération,mise à jour et suppression de données (CRUD). A la décharge de l’équipe ayant créé cette application, il faut avouer que le modèle de Struts encourage à créer une classe par action.

Personnellement, je pense que la philosophie objet est respectée si l’on décide de regrouper les opérations CRUD dans une seule et même classe. Le nombre de classes va ainsi diminuer et rendre plus de clarté à l’environnement et l’objectif de chaque classe sera toujours bien défini.

De plus pour ne rien gâcher, Struts propose lui-même cette solution! La classe DispatchAction permet en effet au développeur de regrouper plusieurs actions en une-seule. Cette classe se trouvant dans la hiérarchie de la standard Action n’ est donc pas très différente de celle-ci.

En reprenant ce qu’explique la javadoc de cette nouvelle recrue, voici comment doter davantage de fonctionnalités à une action:

  • la déclaration de la classe dans le fichier struts-config est quelque peu différente:<action
    path="/saveSubscription"
    type="org.apache.struts.actions.DispatchAction"
    name="subscriptionForm"
    scope="request"
    input="/subscription.jsp"
    parameter="method"/>
    Le type de l’action correspond à la nouvelle classe et l’attribut parameter tient également un rôle particulier dans cette situation. C’est ce paramètre qui va être utilisé afin de définir quelle action sera exécutée.
  • définir une méthode par action suivant le modèle suivant:public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
  • la dernière chose à faire est de faire passer le paramètre ‘method’ (la valeur de l’attribut parameter de la 1ère étape) avec comme valeur le nom de l’action. Pour ce faire il n’y a qu’à passer par un lien ou un champ caché dans un formulaire!

Le résultat devient tout de même beaucoup plus agréable! La productivité va également sûrement être favorisée du fait qu’il n’y aura plus à jongler entre plusieurs classes pour changer d’opération sur un certain objet… Et le développeur qui devra passer plus tard sur un code plus compact en sera très reconnaissant 😉





Amazon Web Service

12 12 2007

Les applications aujourd’hui connectées à Internet peuvent interroger des services web afin d’obtenir des données externes aux objets de l’application. Il est ainsi possible d’interroger des miliers de bases de données en ligne.

Nous avions par exemple vu l’application Delicious Library. L’appel d’un service web se fait au moment où on lance une recherche à propos d’un média. En entrant un simple mot vous obtenez une liste de livre, cd, dvd ou encore de jeux vidéos correspondant à votre recherche. L’application utilise le service web de la plateforme amazon et par cet article je vais démontrer la facilité avec laquelle il est possible d’interroger se service web en Java. C’est parti!

Lire le reste de cette entrée »





Java et le web 2.0

19 11 2007

Un article intéressante concernant java et les appels asynchrones est consultable sur developerwors.

 Il met bien à l’index les lacunes de l’architecture Servlet de Java en ce qui concerne le buzz du moment : le web 2.0. Mais ce qu’il y a d’intéressant c’est que l’article propose des pistes sur lesquelles se diriger lorsque l’on veut créer une gestion asynchrones de requêtes. Il est parlé entre autre de du projet Apache MINA , SEDA, mais également du pattern COMET. Très bon tour d’horizon et d’idées à consulter. Un benchmark est de plus utilisé afin de prouver l’apport des appels asynchrones par rapport à la démarche synchrone traditionnelle à Java. Il propose de nombreuses ressources; à aller consulter!

 Pour info l’article parle également de 2 solutions proposées par les conteneurs Tomcat et Jetty qui permettent une communication asynchrone : Apache Tomcat 6 Comet API et Jetty Continuations.





GMAIL supporte IMAP – y parrait….

24 10 2007

Plusieurs news parlent aujourd’hui du support IMAP par GMAIL (qui en est à 4 go d’espace dispo en ce moment). Malheureusement, perso je n’ai pas l’option d’activation (j’ai l’interface en anglais par défaut). Cela fait maintenant un bon bout de temps que cette fonctionnalité est réclamée… Des solutions alternatives ont été proposées et une pétition a même circulé pour que Google ajoute la fonctionnalité.


La pré-release 0.7 RC2 de Sunbird (la solution agenda de la fondation Mozilla) est sortie et la RC3 est prévue pour très prochainement (début de la semaine prochaine). Autrement dit, le projet s’active bien! Et c’est une bonne nouvelle car ce projet est un bon espoir de pouvoir synchroniser facilement votre agenda avec par exemple Google calendar et donc votre assistant personnel.

A noter qu’il est possible de l’intégrer à Thunderbird pour avoir une application tout-en-un – concurrent à Outlook. Ceci au travers du projet Lighting.


L’Adobe MAX s’est déroulé en Espagne cette semaine et voici 2 vidéos certainement très intéressantes. Adobe fait vraiment un bel effort pour rapprocher designer et développeur. C’est bien sympa!


Après la saison de F1 palpitante que l’on vient de passer, le calendrier de la saison prochaine est sorti, si ca intéresse quelqu’un et que vous ne l’avez pas encore vu, c’est par là.





Bee

10 10 2007

Bee est une application AIR (j’ai décidé de m’y plonger donc). Une fois de plus, l’intégration se fait très simplement. Une fois sur le site proposant l’application un clic et l’application est installé sur votre machine après avoir accepté la licence ainsi que l’accès à vos données.

bee

Cette application vous permet d’éditer votre blog à la manière d’ecto. Bee est moins évolué que celui-ci en fonctionnalités mais au niveau interface ca poutre comme on dit! Des effets de transparences, de fade in/out, d’animation… Tout y est et ca donne vraiment bien!

Je continue mon exploration, j’espère bientot créer ma première applic.





Adobe AIR

8 10 2007

Un article très intéressant concernant les applications desktop riches (RIA) est parru sur DevX.com

Cet article compare 3 technologies ayant pour but la création de ce genre d’application. Silverlight, Adobe AIR (anciennement connu sous le nom Apollo) et JavaFX sont mis côte à côte pour la création d’un même widget, un chronomètre.

Il est comme toujours évident qu’une technologie ne répondra pas à tous les besoins. Mais concernant le développement d’application riche je me dis que je vais peut-être bien me pencher davantage sur Adobe AIR quant on voit le résultat du chronomètre sous cette technologie et le développement y ayant mené. Ainsi le widget n’a aucune décoration et supporte la transparence. C’est la différence principale mise en avant dans l’article. Peut-être qu’il y a possibilité d’y arriver avec les autres technologies (en Java c’est possible d’ôter la décoration donc en JavaFX sûrement aussi) mais AIR le fait très simplement. Au niveau du déploiement les 3 technologies me semblent défendables; il n’est en tout cas pas difficile d’effectuer cette opération sur aucune des 3 technologies.

Technorati Tags:





Les objets de conditions

26 09 2007

La JDK 5 a apporté de nombreuses fonctionnalités au niveau du développement multi-threading. Aujourd’hui j’aimerais discuter un peu des objets de conditions.

Un objet de condition permet de définir une condition (non pas vrai?) à remplir avant de continuer le processus définit par votre programme. Imaginons que vous développiez une application de gestion de stock pour le garage Marielo du centre du patelin. Angelo, le gérant, veut pouvoir gérer son stock depuis la maison mais également que ses employés puissent le mettre à jour directement avec les clients lors d’un devis ou d’une commande spécifique. Maintenant passons par-dessus toute l’analyse, que vous avez d’ailleurs parfaitement effectuée avec Angelo lui-même, pour arriver au coeur de votre application: la méthode removePieceFromStock(Piece p, int quantity). Dans cette méthode l’utilisation d’objets de conditions devient évidente. En effet dans le cas ou plusieurs clients (de votre application donc) appellent cette méthode il vous faudra vérifier que votre stock contient bien le nombre de pièces à commander. S’il s’avère que le nombre de pièces est suffisant vous pouvez alors les retirer. Avant de vérifier le nombre de pièces en stock vous aurez obtenu un verrou sur l’objet courant du fait que cette méthode modifie l’état de votre stock. Maintenant si vous obtenez le verrou pour l’objet et que votre condition échoue… Vous devez libérer le verrou de l’objet afin que le stock puisse à nouveau être fourni en pièce(s) qu’il vous faut.

Avant la JDK 5 la seule possibilité d’utiliser un objet de condition était d’en créer soi-même et de gérer les accès depuis plusieurs threads. Autant dire que sans être un expert du genre les erreurs de conception ou du moins les performances pouvaient s’en ressentir très facilement.

Le package java.util.concurrent.lock fournit 2 classes particulièrement utiles dans notre situation. Je veux parler de Lock et de Condition. L’interface Lock définit un objet de verrou (plusieurs implémentations existent au sein du JDK). La classe Condition quant à elle représente un objet de condition. Un objet Lock comporte de nombreux avantages par rapport à une conception mettant en oeuvre uniquement des méthodes ou des blocs synchronized mais la définition de ces avantages n’est pas le but de ce post. Je vous laisse vous référer à la javadoc pour obtenir une description complète sur ces éléments de la librairie. Sommairement, il faut savoir qu’un objet Lock peut avoir plusieurs Conditions et que ces Conditions permettent de stopper le déroulement de votre programme lorsqu’une condition n’est pas remplie et de reprendre à cet endroit lorsqu’un autre thread signale que la condition peut avoir changé. Le principe est le même que celui des méthodes wait/notify de la classe Thread. Le premier avantage est pour ma part une meilleure lisibilité du code de l’application puisque l’on connaît directement l’objet de la condition à remplir.

Pour finir, voici une solution possible au développement pour Angelo:

public void removePieceFromStock(Piece p, int quantity)
{
try
{
lock.lock(); //acquiert le verrou
while(getQuantity(p) < quantity)
insuffisantCondition.await(); //libère le verrou
//retire le nombre de pièces du stock
}
finally
{
lock.unlock(); //libère le verrou
}
}
//une autre méthode permettra de rajouter des pièces au stock; dans cette méthode il faudra signaler que la condition change en appelant la méthode insuffisantCondition.signalAll() ou insuffisantCondition.signal() ce qui permettra de relancer un thread en attente sur cette condition - à noter qu'il est impératif d'obtenir le verrou qui possède la condition afin de signaler un changement d'état

Technorati Tags: ,