Le plus grand "problème de traduction" sera probablement de passer d'une méthodologie Java / POO à un paradigme Clojure / programmation fonctionnelle.
En particulier, au lieu d'avoir un état mutable dans les objets, la "méthode Clojure" consiste à séparer clairement l'état mutable et à développer des fonctions pures (sans effets secondaires). Vous savez probablement déjà tout cela :-)
Quoi qu'il en soit, cette philosophie tend à conduire à un style de développement "ascendant" dans lequel vous concentrez les efforts initiaux sur la construction du bon ensemble d'outils pour résoudre votre problème, puis vous les connectez ensemble à la fin. Cela peut ressembler à quelque chose comme ceci
-
Identifiez les structures de données clés et transformez-les en définitions immuables de map ou d'enregistrement Clojure. N'ayez pas peur d'imbriquer beaucoup de maps immuables - elles sont très efficaces grâce aux structures de données persistantes de Clojure. À voir absolument cette vidéo pour en savoir plus.
-
Développez de petites bibliothèques de fonctions pures, orientées vers la logique commerciale, qui opèrent sur ces structures immuables (par exemple, "ajouter un article au panier"). Il n'est pas nécessaire de tout faire en même temps car il est facile d'en ajouter plus tard, mais il est utile d'en faire quelques-unes dès le début pour faciliter les tests et prouver que vos structures de données fonctionnent...... De toute façon, à ce stade, vous pouvez commencer à écrire des choses utiles de manière interactive dans le REPL.
-
Développez séparément des routines d'accès aux données qui peuvent faire persister ces structures vers/depuis la base de données ou le réseau ou le code Java hérité, selon les besoins. La raison de cette séparation est que vous ne voulez pas que la logique de persistance soit liée à vos fonctions de "logique commerciale". Vous pouvez envisager de ClojureQL pour cela, bien qu'il soit également très facile d'envelopper tout code de persistance Java que vous souhaitez.
-
Écrire des tests unitaires (par exemple avec clojure.test ) qui couvrent tout ce qui précède. C'est particulièrement important dans un langage dynamique comme Clojure car a) vous ne disposez pas d'un filet de sécurité aussi important que la vérification statique des types et b) il est utile de s'assurer que vos constructions de niveau inférieur fonctionnent bien avant de construire trop au-dessus d'elles.
-
Décidez de la manière dont vous souhaitez utiliser les types de référence de Clojure (vars, refs, agents et atomes) pour gérer chaque partie de l'état mutable au niveau de l'application. Ils fonctionnent tous de manière similaire mais ont une sémantique transactionnelle/de concordance différente selon ce que vous essayez de faire. Les refs seront probablement votre choix par défaut - ils vous permettent d'implémenter un comportement transactionnel STM "normal" en enveloppant tout code dans un bloc (dosync ...).
-
Choisir le bon framework web global - Clojure en possède déjà plusieurs mais je recommande fortement Ring - voir cette excellente vidéo " Un anneau pour les lier "plus soit Flotte o Enlive o Hiccup en fonction de votre philosophie de modélisation. Utilisez ensuite cette couche pour écrire votre couche de présentation (avec des fonctions telles que "traduire ce panier d'achat en un fragment HTML approprié").
-
Enfin, écrivez votre application en utilisant les outils ci-dessus. Si vous avez suivi correctement les étapes précédentes, cette étape sera en fait la plus facile, car vous serez en mesure de construire l'ensemble de l'application par la composition appropriée des différents composants avec très peu de texte passe-partout.
C'est à peu près l'ordre dans lequel j'attaquerais le problème car il représente largement l'ordre des dépendances dans votre code, et convient donc à un effort de développement "ascendant". Bien sûr, dans un bon style agile/itératif, vous vous retrouveriez probablement à avancer rapidement vers un produit final démontrable, puis à revenir assez fréquemment aux étapes précédentes pour étendre les fonctionnalités ou remanier le code si nécessaire.
p.s. Si vous suivez l'approche ci-dessus, je serais fasciné d'entendre combien de lignes de Clojure il faut pour correspondre à la fonctionnalité de 50 000 lignes de Java.
Mise à jour : Depuis que ce billet a été écrit, quelques outils/bibliothèques supplémentaires sont apparus et font partie de la catégorie " à vérifier absolument " :
-
Noir - qui s'appuie sur Ring.
-
Korma - un très beau DSL pour accéder aux bases de données SQL.
55 votes
Je veux travailler pour votre entreprise.
4 votes
Eh bien, certaines entreprises de défense en Europe ont commencé à utiliser Clojure (j'ai entendu dire). Mais je ne me souviens d'aucun nom :)
1 votes
@Zubair : 50 000 Java LOC, c'est loin d'être "énorme". Il s'agit d'un très petit projet. J'ai un projet Java de 250KLOC à 300KLOC ici et c'est un projet de taille moyenne... Au mieux.
0 votes
@Zubair : btw... Combien de lignes pensez-vous que le code Clojure serait finalement ? 75% de réduction de taille ?
5 votes
En fait, j'ai peut-être fait une erreur en mentionnant la taille de la base de code car, pour être honnête, la réduction de la taille du code n'est pas le but de la réécriture. L'objectif est double : 1) rendre le codebase plus compréhensible et donc moins coûteux à maintenir 2) permettre aux utilisateurs de l'outil d'étendre le produit en utilisant un éditeur Clojure dans le navigateur web (en utilisant eval et d'autres fonctionnalités dynamiques Clojure, ce qui est plus coûteux à faire en Java).
0 votes
300KLOC !!! Wow... Comment cet avion a-t-il pu voler ?
1 votes
Hé... je viens de voir cette ancienne question et je me demandais comment se passait la réécriture ?
0 votes
J'ai mis à jour la question avec une mise à jour
0 votes
Upvoted pour cette mise à jour. C'est assez intéressant et utile de voir la conclusion de cas comme celui-ci.
1 votes
L'histoire est si juteuse qu'elle se lit presque comme une publicité pour Clojure. S'il vous plaît, dites que c'est vrai :)
0 votes
C'était il y a longtemps, il y a 4 ans. Le projet a apporté une valeur ajoutée à l'entreprise, mais je sais que l'entreprise dans son ensemble n'a pas adopté Clojure, mais plutôt .Net. Malheureusement, le choix d'une technologie n'est pas une décision commerciale dans une grande entreprise. C'est la technologie qui n'entraîne pas le licenciement du manager en cas de problème qui est choisie.