Les bénéfices du développement logiciel “Model-First”

Livre blanc CodeFluent Entities – Version 4.0 – Avril 2013

SoftFluent-ModelFirst-WhitePaper_FR

L’objectif de ce livre blanc est de décrire le défi que représente le développement logiciel, clarifier les causes.

 

La première partie du document explique les grands enjeux de ce marché et pourquoi c’est un problème économique difficile. Cette partie est largement applicable par toute personne intéressée par le développement logiciel indépendamment de notre offre.

 

La seconde partie de ce document expose la solution que nous avons élaborée pour répondre structurellement à ce défi à l’aide l’approche ‘Model-First’ de CodeFluent Entities.

Lire le livre blanc CodeFluent Entities

En savoir plus sur CodeFluent Entities

La génération de code : un bien ou un mal ?

Combien de fois ai-je entendu des débats sans fin sur les avantages ou les risques de la génération de code. Les développeurs débattent en toute bonne foi sur ses vertus et ses dangers avec un niveau de passion qui frôle parfois le niveau des guerres de religion.

La vraie question

Après avoir passé 20 ans dans le logiciel, je peux affirmer avec détermination que cette question est mal posée. La question n’est pas ‘devriez-vous’ ou ‘ne devriez-vous pas’ générer du code ? La question serait plutôt de savoir quand et comment ?

Consciemment ou pas, en tant que développeur, vous utilisez certainement les mécanismes de génération de code à différents niveaux avec vos outils.

Voici quelques exemples dans le monde .NET :

  • ASP.NET est lui-même un générateur de code. Des classes intermédiaires sont générées et compilées à la volée.
  • Le concepteur de Windows Forms est un générateur de code. Il crée des classes C# ou VB.NET à partir de l’éditeur de formulaires graphiques.
  • Le concepteur XAML designer est un générateur de code. Il crée des fichiers .G cachés de l’éditeur graphique XAML.
  • La class XmlSerializer, utilisée massivement pour la sérialisation XML, est un générateur de code implicite. Elle crée du code et le compile pour améliorer la performance de la sérialisation.
  • Certains fichiers de Visual Studio comme les .RESX (fichiers de ressources) ou .SETTINGS (fichiers de configuration) sont utilisés par l’environnement de développement pour générer des classes utilitaires.
  • Les fichiers .EDMX d’Entity Framework (Entity Data Model) sont utilisés pour générer des classes ObjectContext d’Entity Framework.

En réalité, la génération de code n’est jamais un problème tant que :

  • Soit elle est transparente (vous ne savez même pas que vous l’utilisez),
  • Soit vous faites confiance au générateur (et vous n’avez pas besoin de vérifier ce qu’il génère).

Les avantages de la génération de code

Pour comprendre quand vous devez l’utiliser, commençons par souligner les bénéfices qu’elle peut vous apporter. Correctement utilisée, la génération de code vous permettra d’automatiser des tâches de programmation qui devraient être faites à la main. Ce n’est pas très différent de n’importe quel processus d’automatisation de tâches répétitives.

Par conséquent, quand la programmation devient-elle répétitive ? Surtout lorsque vous avez besoin de suivre une structure et d’implémenter des motifs ("patterns") de la même manière pour un nombre significatif d’éléments.

En règle générale, quand vous implémentez une application métier, vous avez plusieurs entités métiers et avez besoin de structurer votre application en couches. En faisant cela vous aurez besoin de mettre en œuvre l’accès aux données et la manipulation des méthodes, la structure du modèle objet métier, les couches services et aussi des éléments de l’interface utilisateur ou des rapports qui reproduiront les mêmes schémas d’implémentation et les mêmes principes.

Coder cela à la main, cela prend non seulement plus de temps mais c’est une source d’erreurs induisant un risque de qualité hétérogène et une dette applicative plus élevée.

image

En observant le schéma ci-dessus, on comprend aisément qu’il est moins lourd de maintenir les éléments à la source de la génération que de maintenir l’équivalent écrit manuellement.

Si cela est si évident, comment se fait-il que des développeurs chevronnés puissent le contester ?

Quand la génération de code ne fonctionne-t-elle pas ?

Le vrai problème réside dans le fait que générer du code approprié avec un niveau de flexibilité suffisant et une réelle capacité d’évolution est complexe, et la plupart du temps, ce point est sous-estimé par les développeurs, même les plus intelligents. Par conséquent certains développeurs ont souvent eu des mauvaises expériences et en sont arrivés à la conclusion que la génération de code était une mauvaise idée.

Sur le terrain, on observe 2 scénarios principaux d’échecs.

Dans le 1er cas, le développeur a essayé de développer son propre générateur. Cela commence généralement lorsque le développeur remarque qu’il effectue une tâche répétitive et qu’il essaie de l’automatiser, ce qui semble intelligent à premier vue. Mais quand la complexité augmente, ajuster le générateur avec des besoins plus riches devient plus chronophage que de coder à la main.

Si nous devions ajouter la maintenance du générateur de code dans le schéma des coûts, ils seraient sans doute bien plus élevés qu’avec le code manuel sur le long terme surtout si vous voulez un ensemble de fonctionnalités significatif et supporter les technologies dès leur disponibilité.

Ensuite, le développeur est généralement pris au piège avec comme alternative soit d’investir plus de temps dans le générateur, soit de considérer ce qu’il a fait comme une action ‘one-shot’ et essayer de maintenir directement le code généré. Pas de chance ! Les 2 approches sont des impasses.

L’investissement dans un générateur puissant et flexible croit de façon exponentielle et le développeur n’a aucune chance de maintenir le rythme de l’innovation technologique à moins que cela ne devienne son unique objectif de développement.

Maintenir le code généré à la main est également une mauvaise idée. Une base de code généré est toujours plus importante qu’une base créée manuellement, donc il est contre-productif d’utiliser un générateur si vous devez maintenir le code généré. Votre dette de maintenance sera accrue.

Le 2nd scénario est l’utilisation d’un générateur de code limité. Qu’est-ce qu’un générateur de code limité ?

Il y a différentes façons pour un générateur de montrer ses limites. La plus classique est le manque d’ouverture de beaucoup de générateurs de code. La majorité relève le défi de la complexité en réduisant vos options en tant que développeur jusqu’à limiter les possibilités pour le développeur. C’est pourquoi les capacités d’extension et de personnalisation doivent être étudiées en détail lorsque vous évaluez ce type d’outil.

De l’autre côté du spectre, il y a l’approche opposée basée sur des ‘templates’. La génération de code basée sur les templates est un mécanisme très simple et puissant pour mixer du code et du contenu. C’est typiquement ce qui a été utilisé pour la technologie “Active Server Pages”, en utilisant la syntaxe <% … %>, quand Microsoft a proposé sa 1ère approche dynamique pour le web.

Cela est très séduisant à première vue, car très ouvert puisque vous pouvez faire évoluer vos tempIates pour ajouter des fonctionnalités. Cependant, bien qu’utile dans certains scénarios, ce procédé pose des problèmes de complexité s’il est appliqué au cœur d’applications fonctionnellement riches. Ces générateurs de code apportent intrinsèquement une faible valeur dans la mesure où ils transfèrent la complexité dans les templates. Lorsque le code entre parenthèses pèse plus que les éléments de contenu, c’est un signe que vous êtes allé trop loin.

Une couche sérieuse de “Business Object Model” pour les applications professionnelles ne peut être générée avec des templates sans que ceux-ci ne deviennent très complexes. Au mieux, ces templates sont maintenables par un développeur ‘superman‘ qui les conçoit. Au pire, ils ne peuvent plus évoluer.

C’est exactement pour cette même raison que Microsoft a abandonné ASP qui fonctionnait pour des sites web simples et peu dynamiques et a développé la Plateforme ASP .NET. Cette nouvelle approche était rendue nécessaire pour une plateforme d’applications web plus riches et un niveau de maintenabilité approprié.

Les attributs d’une génération de code qui fonctionne

Avec toutes ces manières d’échouer dans la génération de code, comment donc réussir ?

De notre point de vue, les attributs clé d’une génération de code efficace pour les applications métiers sont les suivants :

  • Le générateur de code est fourni pour une équipe responsable et distincte de l’équipe qui développe l’application métier,
  • Idéalement, le générateur de code est maintenu par une société extérieure qui en a fait son métier et ses affaires,
  • Le générateur est suffisamment fiable pour que vous puissiez concentrer vos efforts de maintenance uniquement sur les éléments sources de la génération,
  • Le code généré reste lisible et suffisamment simple pour ne pas introduire un niveau de complexité supérieur au code manuel,
  • La génération de code des parties centrales et back-end (base de données et modèle métier) permet de maitriser la complexité à travers une modélisation puissante des concepts,
  • La génération de code basée sur les templates est uniquement utilisée sur les composants qui implémentent plus d’éléments visuels et de contenu que de logique métier, typiquement les composants frontaux tels que les interfaces utilisateur et les rapports.

Comme à l’accoutumée, n’hésitez pas à commenter de vos propres expériences.

Daniel COHEN-ZARDI

Les bénéfices du développement logiciel “Model-First”

Livre blanc CodeFluent Entities

Model-First_FR

L’objectif de ce livre blanc est de décrire l’enjeu du développement logiciel et clarifier les causes principales de cette difficulté intrinsèque.

La première partie du document explique l’enjeu du marché et pourquoi ce problème est si difficile. Cette partie concerne quiconque s’intéresse au développement logiciel et est indépendante de notre offre.

Dans la deuxième moitié du document, nous expliquons comment SoftFluent répond à cet enjeu au travers de sa fabrique logicielle “Model-First” CodeFluent Entities et la méthodologie associée.

Lire le livre blanc CodeFluent Entities

En savoir plus sur CodeFluent Entities

Générer des services web JSON à partir d’une base existante avec CodeFluent Entities

Cet article publié sur CodeProject (US) vous montre comment générer une couche de service web basée sur JSON à partir d’une base de données existante à l’aide de CodeFluent Entities. Nous générerons également un “back-office” Web à l’aide de “l’assistant d’import”.

Un scénario courant

Imaginons que nous devons faire face au scénario suivant :

  • Nous disposons d’une base de données que nous voulons exposer à l’aide d’une couche de service web basée sur JSON, fournissant des opérations CRUD (Create, Read, Update and Delete).
  • Nous devons construire un back office pour gérer et administrer les données de notre base.
  • Nous aurions probablement besoin dans le future d’accéder de différentes façons à notre base, par exemple depuis un client intelligent ou en exposant une couche de service web SOAP (de nouveaux besoins se font jour régulièrement).
  • Nous devons déployer ce système au plus vite.

Commençons donc, et nous devons alors:

  • Construire une couche d’accès pour charger les données, créer de nouvelles données, mettre à jour ou supprimer les données existantes (et nous assurer du bon fonctionnement).
  • Gérer la validation des données (et nous assurer du bon fonctionnement).
  • Construire la couche de service web JSON :
    • Construire chaque contrat de service et opération.
    • Configurer nos contrats de service pour supporter JSON.
    • Héberger nos services.
    • Nous assurer du bon fonctionnement
  • Construire un client web (et nous assurer du bon fonctionnement).
  • Disposer les fondations pour que les évolutions futures et les architectures à venir puissent être supportées, incluant l’accès mobiles par différents types d’appareils et téléphones.
  • Et tout ce que nous avons pu oublier.

Ou… Nous pouvons utiliser CodeFluent Entities pour faire la plomberie et être sûr que cela fonctionne.

Dans l’assistant de démarrage, nous voyons quelques-unes des architectures prédéfinies que l’on peut générer à l’aide de CodeFluent Entities, et bien sûr vous pouvez imaginer votre propre architecture en créant un projet spécifique CodeFluent Entities projet avec le jeu de producteurs qui vous convient.

clip_image002

Le scénario que nous mentionnons ici est détaillé "étape par étape" dans l’article complet en anglais sur CodeProject.

CodeFluent Entities : mise à jour de la documentation

Une nouvelle version (R17) de la documentation CodeFluent Entities a été publiée !
Elle inclut :

Les nouveaux articles suivants :
• A propos des producteurs
• Producteur de traces automatique
• Producteur site web ASP.NET V2

Les mises à jour suivantes :
• Un chapitre entier ‘Génération’ a été mis à jour avec l’appellation des producteurs et leur organisation dans le Modeleur
• Des liens ‘Voir aussi’ ont été ajoutés sur la plupart des pages sur les producteurs

Ainsi que des corrections diverses et variées image
N’hésitez pas à nous faire part des sujets que vous souhaitez voir publier

CodeFluent Entities : Mise à jour de la documentation

Une nouvelle version (R16) de la documentation CodeFluent Entities a été publiée !
Elle inclut :

Les nouveaux articles suivants :
•    Producteur MySQL
•    Producteur PostgreSQL
•    Importeur : paramètres de configuration
•    Import depuis MySQL
•    Import depuis PostgreSQL
•    Import depuis SQLite
•    Travailler avec une base de données existantes

Les mises à jour suivantes :
•    CodeFluent Entities
•    Introduction à CodeFluent Entities
•    Migration et interopérabilité
•    Import d’une base de données ou d’un modèle existant
•    Import depuis Microsoft SQL Server
•    Import depuis Microsoft SQL Server CE
•    Import depuis Microsoft Access
•    Import depuis Oracle Database
•    Import depuis OLEDB
•    Import depuis ADO.NET Entity Framework
•    Import depuis Enterprise Architect
•    Import depuis UML (XMI)

Ainsi que des corrections diverses et variées  image
N’hésitez pas à nous faire part des sujets que vous souhaitez voir publier !

Interfaces utilisateurs générées par CodeFluent Entities

Lors de précédents articles publiés sur le blog http://blog.codefluententities.com, nous vous avons montré comment utiliser certains producteurs d’interface utilisateur fournis par défaut avec CodeFluent Entities :

Dans cet article, nous allons mettre l’accent sur le fait que CodeFluent Entities est totalement indépendant de l’interface utilisateur. Afin d’illustrer ce propos nous allons vous montrer toutes les interfaces utilisateurs que CodeFluent Entities est capable de générer depuis le même modèle grace à ses différents producteurs. En effet, depuis un même et unique modèle, vous pouvez générer des écrans qui seront exécutés sur la plateforme de votre choix.

Notez que les applications générées dans cette exemple ne sont pas seulement un ensemble d’interfaces utilisateurs mais des applications complètement interactives partageant le même modèle, la même base de données et  qu’elles sont 100% fonctionnelles.

Pour cet article, nous avons utilisé le modèle « ContactManager Sample Model » fournit par CodeFluent Entities.

ContactManagerModel

Voici le modèle « ContactManager » en question :

ContactManagerSurface

Etant donné que nous avons déjà vu comment utiliser les producteurs fournis par CodeFluent Entities dans de précédents articles, nous allons directement présenter les interfaces utilisateurs générées sans s’attarder sur leurs configurations.

 

Interface utilisateur générée en utilisant le Windows 8 Store Producer :

La page d’accueil générée par défaut, liste tous les espaces de noms et les entités qu’ils contiennent :

Windows Store (1)

Cliquer sur une entité vous emmène sur la page de l’entité en question.

Sur cette page vous trouverez une capture de l’entité depuis laquelle cette page a été générée.

En faisant un clic droit ou en utilisant le raccourci « Ctrl+Z » un menu contenant la liste des actions disponibles pour cette entité apparait en bas de l’écran. Ces actions correspondent aux méthodes métier fournies par l’entité.

Windows Store (2)

L’écran suivant est l’écran affiché pour l’entité « Contact » lorsque l’on clique sur le bouton « LoadAll » puis en sélectionnant un des contacts de la liste se trouvant sur la gauche.

Windows Store (3)

Clic droit ou « Ctrl+Z » fera de nouveau apparaitre un menu en bas de l’écran qui permettra de créer, modifier ou supprimer une entrée.
Windows Store (4)

Voici par exemple l’écran d’édition qui apparait après avoir cliqué sur le bouton « Edit » :

Windows Store (5)

 

Interface utilisateur générée en utilisant l’ASP.NET MVC Producer :

La page d’accueil générée par défaut, liste tous les espaces de noms et les entités qu’ils contiennent :

ASP NET WebApp (1)

Cliquer sur une entité vous emmène sur la page de l’entité en question.

Sur cette page vous trouverez une capture de l’entité depuis laquelle cette page a été générée.

Sur la partie gauche de la page se trouve un menu contenant la liste des actions disponibles pour cette entité. Ces actions correspondent aux méthodes métier fournies par l’entité :

ASP NET WebApp (2)

L’écran suivant est l’écran affiché pour l’entité « Contact » lorsque l’on clique sur le bouton « LoadAll ». Cet écran liste tous les contacts grâce à une table HTML et permet de les trier. Depuis cette page vous pouvez détailler, éditer ou supprimer un contact.

ASP NET WebApp (3)

Cliquer sur le lien « Details » permet d’afficher l’écran suivant :

ASP NET WebApp (4)

Cliquer sur le lien « Edit » permet d’éditer le contact choisit :

ASP NET WebApp (5)

 

Interface utilisateur générée en utilisant l’ASP.NET AJAX Producer :

La page d’accueil générée par défaut, liste tous les espaces de noms et les entités qu’ils contiennent :

ASP NET AJAX-JSON (1)

Cliquer sur une entité vous emmène sur la page de l’entité en question.

Sur cette page vous trouverez une capture de l’entité depuis laquelle cette page a été générée.

Sur la partie gauche de la page se trouve un menu contenant la liste des actions disponibles pour cette entité. Ces actions correspondent aux méthodes métier fournies par l’entité :

ASP NET AJAX-JSON (2)

L’écran suivant est l’écran affiché pour l’entité « Contact » lorsque l’on clique sur le bouton « LoadAll ».

Cet écran liste tous les contacts grâce à une grille Ajax supportant le tri et la pagination. Depuis cette page vous pouvez détailler, éditer ou supprimer un contact.

ASP NET AJAX-JSON (3)

Cliquer sur le bouton « Edit » permet d’éditer le contact choisit :

ASP NET AJAX-JSON (4)

 

Interface utilisateur générée en utilisant l’ASP.NET WebForms Producer :

La page d’accueil générée par défaut, liste tous les espaces de noms et les entités qu’ils contiennent :

ASP NET WebForms (1)

Cliquer sur une entité vous emmène sur la page de l’entité en question.

Sur cette page vous trouverez une capture de l’entité depuis laquelle cette page a été générée.

Sur la partie gauche de la page se trouve un menu contenant la liste des actions disponibles pour cette entité. Ces actions correspondent aux méthodes métier fournies par l’entité :

ASP NET WebForms (2)

L’écran suivant est l’écran affiché pour l’entité « Contact » lorsque l’on clique sur le bouton « LoadAll ». Cet écran liste tous les contacts grâce à une table HTML et permet de les trier. Depuis cette page vous pouvez éditer ou supprimer un contact.

ASP NET WebForms (3)

Cliquer sur le bouton « Edit » permet d’éditer le contact choisit :

ASP NET WebForms (4)

 

Interface utilisateur générée en utilisant le Smart Client (WPF) Producer :

Le premier écran généré par défaut liste tous les espaces de noms et les entités qu’ils contiennent :

SmartClient (1)

Cliquer sur une entité charge toute les données correspondantes, ici l’entité « Contact ». Depuis cet écran, vous pouvez créer éditer ou supprimer un contact.

SmartClient (2)

Cliquer sur un contact permet d’ouvrir une nouvelle fenêtre permettant de l’éditer.

SmartClient (3)

Interface utilisateur générée en utilisant le SharePoint WebParts Producer :

La page d’accueil générée par défaut, liste tous les espaces de noms :

SharePoint (1)

Cliquer sur un espace de nom liste toutes ses entités :

SharePoint (2)

Cliquer sur une entité charge la page d’entité, ici l’entité « Contact ». Cet écran liste tous les contacts grâce à une WebPart. Depuis cette page vous pouvez créer, détailler, éditer ou supprimer un contact.

SharePoint (3)

Cliquer sur un contact permet d’en afficher le détail :

SharePoint (4)

Cliquer sur le bouton « Edit » permet d’afficher l’éditeur :

SharePoint (5)

 

Comme vous pouvez le voir, à partir d’un seul et même modèle nous avons pu généré des interfaces utilisateurs à la fois différentes et consistantes.

Ajoutons que grâce au Platform Independent Form Editor il est aussi possible de définir directement un formulaire basé sur une entité. Celui ci sera ensuite transformés en écrans par les producteurs d’interfaces utilisateurs. Vous trouverez plus d’information dans cette article (Anglais).

Enfin, dans le cas où vous ne trouveriez pas le producteur répondant à vos besoins, souvenez vous que vous pouvez créer votre propre template et l’utiliser avec le Template Producer ou même créer votre propre producteur.

Pour résumer, CodeFluent Entities est capable de générer des application 100% fonctionnelles avec les interfaces utilisateurs de votre choix grace à sa logique de “producteurs”.

Réalisation d’étudiants : Projet d’innovation industrielle ESILV

Pour leur projet d’innovation industrielle, des étudiants de l’ESILV (Ecole Supérieur d’Ingénieurs Léonard de Vinci) ont fait confiance à CodeFluent Entities pour leur projet.

Ils ont réalisés dans ce cadre une application de sondage sur Windows Phone 7 consommant des données stockées dans une base SQL Azure, données qui sont exposées par des services web JSON.

Vous trouverez en cliquant sur les liens ci-dessous différents documents qui composaient leur rendu :

Nous félicitons ces étudiants pour la réussite de leur projet et vous invitons à découvrir une mise en oeuvre concrète des technologies SQL Azure, Windows Phone et JSON avec CodeFluent Entities.

L’équipe SoftFluent

CodeFluent Entities mis en avant par CyberForum.de

              RVB de base                  SF_Main[1]

Grâce à notre partenaire local, Mykola Dobrochynskyy et sa société Software Factories, CodeFluent Entities et SoftFluent font parler d’eux en Allemagne sur CyberForum.de.

Mykola Dobrochynskyy est intervenu lors du CyberForum en tant que speaker avec une session technique expliquant la valeur ajoutée de CodeFluent Entities et explicitant le partenariat entre SoftFluent et Software Factories.

Software Factories avait déjà fait parler de CodeFluent Entities outre-Rhin au travers de deux articles parus dans le mensuel DotNetPro.

La session a passionné les participants avec de nombreuses questions et un intérêt vif pour la solution.

Vous souhaitez devenir partenaire avec SoftFluent ? N’hésitez pas à nous contacter par email à info@softfluent.com !

Envie de tester CodeFluent Entities ? Téléchargez la version personnelle gratuite et complète !
(gratuite pour les usages non commerciaux et version professionnelle à partir de seulement 479 Euros)

Cyberforum_Talk1[1]Cyberforum_Talk2[1] CybeforumInfomarkt[1]

CodeFluent Entities pour les applications Windows 8

windows-8-logo
CodeFluentEntities_400
SoftFluent annonce le lancement de CodeFluent Entities pour les applications Windows 8. CodeFluent Entities et son éditeur graphique intégré à Visual Studio inclut désormais un générateur Windows 8 prêt à l’emploi. Vous pouvez générer des web services pour mobile tout comme des applications Windows 8 complètes en quelques minutes !
En utilisant CodeFluent Entities, les développeurs peuvent s’affranchir du poids des habituelles montées de version technologiques et se concentrer sur le développement des nouvelles fonctionnalités nécessaires à leurs applications.

Lire le communiqué

Suivre

Recevez les nouvelles publications par mail.

Joignez-vous à 30 followers