Concepts de la plate-forme Lightning correspondants aux concepts .NET
Objectifs de formation
Une fois cette unité terminée, vous pourrez :
- Comprendre les principales fonctionnalités qui composent la plate-forme Lightning et le langage de programmation Apex
- Identifier les similitudes et les différences entre .NET et la plate-forme Lightning
- Utiliser la Developer Console pour créer votre première classe Apex
- Utiliser un code Apex anonyme pour invoquer une méthode à partir d'une classe Apex
Vidéo de démonstration Trail Together
Vous souhaitez être guidé pas à pas par un expert pendant que vous travaillez sur cette étape ? Regardez cette vidéo qui fait partie de la série Trail Together.
Présentation de la plate-forme Lightning
Plus sérieusement, en découvrant la plate-forme Lightning, vous allez être séduit(e). Dans ce module, nous allons examiner comment associer à la plate-forme Lightning les concepts .NET que vous connaissez déjà.
Concepts de base de la plate-forme
Pour commencer, examinons rapidement le contenu de la plate-forme Lightning. L'un des aspects qui distinguent la plate-forme et des autres offres de logiciel en tant que service (SaaS) est l'architecture pilotée par des métadonnées sur laquelle elle s'appuie. Tous les éléments, y compris le code, la configuration et les applications, sont spécifiés en tant que métadonnées.
En tant que développeur .NET, vous connaissez probablement les applications Cloud exécutées sur Microsoft Azure. La plate-forme Lightning fonctionne différemment. Elle est étroitement intégrée à la base de données. De nombreux éléments sont directement intégrés à la plate-forme, notamment une interface utilisateur, la sécurité et la génération de rapports. Cette intégration permet d'élaborer des applications beaucoup plus rapidement.
Cependant, en tant que développeur, vous allez devoir abandonner une partie de votre contrôle pour obtenir cette productivité, un aspect qui risque de vous sembler étrange au premier abord. Sur la plate-forme Lightning, vous n'avez pas à vous soucier de la configuration des nœuds ni des tâches de gestion. Vous n'avez pas à vous soucier de la mise à niveau, de l'ajustement ou de la mise à l'échelle. Pour être honnête, cette complexité ajoutée et ces responsabilités vont probablement vous manquer, car votre seule tâche sera d'élaborer rapidement des applications de pointe.
Nous avons évoqué les principaux éléments qu'offre la plate-forme. Si vous souhaitez en savoir plus sur l’architecture, suivez le module Concepts de base de la plate-forme.
Concepts de base d'Apex
La plate-forme Lightning est étroitement intégrée et repose sur une architecture de métadonnées. Par conséquent, elle offre d'innombrables possibilités avec un développement déclaratif, ou en créant des applications dites par « pointer-cliquer ». Si vous découvrez la plate-forme Lightning, nous recommandons vivement de lire l'article consacré au développement par pointer-cliquer, répertorié dans les Ressources.
En tant que développeur .NET, nous savons que vous aimez coder, mais vous devez comprendre que sur la plate-forme Lightning, le code n'est pas toujours nécessaire. Il est toutefois important de comprendre quand un code est nécessaire et quand il ne l’est pas. Pour mieux saisir cette distinction, reportez-vous à cet article pour déterminer quand vous devez cliquer et quand vous devez écrire un code.
Nous en avons terminé avec ce point. Vous voulez maintenant apprendre comment programmer sur la plate-forme. C'est ici que le langage Apex entre en jeu.
Similitudes
Le langage de programmation Apex est semblable au langage C# que vous connaissez et appréciez probablement. L'Apex est enregistré, compilé et exécuté directement sur la plate-forme Lightning. De la même façon que C#, il est orienté objet. Dans cette section, nous allons examiner ce concept et les similitudes avec les langages .NET.
Conception orientée objet
Nous supposons que vous connaissez déjà la conception orientée objet. Par conséquent, nous n'allons pas entrer dans les détails. Sachez seulement que le langage Apex prend en charge de nombreux principes de conception orientée objet que vous avez probablement déjà utilisés, notamment l'encapsulation, l'abstraction, l'héritage et même le polymorphisme. En définitive, le langage Apex comprend de nombreuses constructions que vous connaissez déjà, en particulier les classes, les interfaces, les propriétés et les collections.
Par exemple, voici comment se présente une classe Apex nommée HelloWorld.
public with sharing class HelloWorld { public void printMessage() { String msg = 'Hello World'; System.debug(msg); } }
Cette simple classe HelloWorld comprend une méthode nommée printMessage qui est utilisée simplement pour générer le message « Hello World » dans le journal de débogage du système. Évidemment cet exemple est extrêmement simple, mais il permet de constater combien Apex ressemble à C#.
La syntaxe de base de définition de classes est la suivante :
private | public | global [virtual | abstract][with sharing | without sharing | inherited sharing] class ClassName [implements InterfaceNameList] [extends ClassName] { // The body of the class }
Pour plus d’informations sur le fonctionnement des classes, des objets et des interfaces, consultez Understanding Classes.
Types de données.
Apex prend en charge les types de données habituels. Des types de données primitifs sont utilisés, tels que Integer, Double, Long, Date, Datetime, String et Boolean. Un type de données ID est également utilisé pour tous les identificateurs d'enregistrement de 18 caractères valides que le système attribue.
Les types de valeur et de référence fonctionnent de la même façon, mais en Apex, toutes les variables sont initialisées par défaut sur null. Sachez que bien qu'elles se comportent comme des types de valeur, les chaînes .NET sont en réalité des références, car elles sont immuables. Cependant en Apex, les chaînes sont toujours traitées comme un type de valeur primitif.
En plus des primitifs, les types de données sObjects sont pris en charge, que ce soit tant que sObject générique ou spécifique, tel que Compte ou Contact. Notez qu'un sObject est un simple objet Salesforce. Il est comparable à un tableau dans une base de données. Le sObject peut être standard, fourni par Salesforce, ou personnalisé, que vous définissez.
De plus, un type de données peut être un type de valeur typé, également appelé énumération. Attention, ces énumérations sont différentes de celles que vous avez utilisées en .NET. En Apex, vous pouvez utiliser des énumérations avec des chiffres, mais vous ne pouvez pas définir les valeurs de ces chiffres. De plus, l'attribution ordinale commence à zéro. Prenons par exemple l'énumération ci-dessous.
public enum myEnums { Enum1, Enum2, Enum3 }
Si vous essayez d'accéder à la valeur ordinale de la troisième énumération, la valeur de la variable enumOrd est 2.
Integer enumOrd = myEnums.Enum3.ordinal();
Utilisation de collections
.NET prend en charge une vaste bibliothèque de collections avec de nombreux types et méthodes d'extension. Voici une bonne nouvelle : Apex inclut uniquement les trois collections ci-dessous. La simplicité même, n'est-ce pas ?
List
Une liste est une collection ordonnée d’éléments qui fonctionne de la même façon qu’un tableau traditionnel. Cependant, Apex ne prend pas en charge les tableaux en tant que collections, mais uniquement les listes. Vous pouvez cependant utiliser ce que l’on appelle la « notation de tableau » pour référencer des éléments spécifiques dans une liste à l’aide de crochets []. Par exemple, le code ci-dessous est une méthode de déclaration d’une variable en tant que liste de chaînes :
List<String> myStrings = new List<String>();
Vous pouvez également déclarer la variable de liste myStrings à l’aide de crochets, comme suit :
String[] myStrings = new List<String>();
Vous pouvez également déclarer la liste et initialiser ses valeurs, le tout en une seule étape, comme dans le code ci-dessous.
List<String> myStrings = new List<String> {'String1', 'String2', 'String3' };
Vous pouvez également ajouter des valeurs à la liste après sa création, par exemple :
List<String> myStrings = new List<String>(); myStrings.add('String1'); myStrings.add('String2'); myStrings.add('String3');
Vous avez probablement créé de nombreuses variables de liste dans votre développement Apex, car la sortie de chaque requête SOQL est une liste. Vous pouvez par exemple créer une liste de comptes en utilisant un code semblable au suivant :
List<Account> myAccounts = [SELECT Id, Name FROM Account];
Notez que l’index de la liste commence toujours à zéro. L’accès au nom du premier compte de la liste ressemblerait à ceci :
String firstAccount = myAccounts.get(0).Name;
Les éléments suivants fonctionneront de la même manière :
String firstAccount = myAccounts[0].Name; // Uses Array Notation []
Set
Un set (ensemble) est une collection ordonnée d'éléments qui ne contient aucun doublon. Un ensemble est généralement utilisé pour stocker des valeurs d'ID, qui sont uniques. Vous pouvez ensuite l'utiliser en tant que clause WHERE dans une requête SOQL. Par exemple, nous créons ici un ensemble qui contient deux ID uniques pour des comptes. Nous l'utilisons ensuite dans la requête SOQL pour envoyer uniquement les comptes qui correspondent à ces ID.
Set<ID> accountIds = new Set<ID>{'001d000000BOaHSAA1','001d000000BOaHTAA1'}; List<Account> accounts = [SELECT Name FROM Account WHERE Id IN :accountIds];
Map
Une map (un mappage) est une collection de paires clé-valeur. Chaque clé est mappée avec une valeur unique. Un mappage est pratique pour retrouver rapidement un élément par une clé. Les valeurs des clés doivent être uniques. Ainsi, un mappage peut contenir la valeur ID d'une clé qui est mappée avec un sObject. Par exemple, vous pouvez utiliser le code suivant pour déclarer une variable map nommée accountMap qui contient tous les comptes mappés avec leur ID.
Map<Id, Account> accountMap = new Map<Id, Account>([SELECT Id, Name FROM Account]);
Vous pouvez accéder à un enregistrement de compte spécifique en utilisant la méthode get et un code semblable au suivant :
Id accId = '001d000000BOaHSAA1'; Account acc = accountMap.get(accId);
Pour plus d’informations sur les types de données qui prennent en charge Apex, consultez les documents officiels.
ASP.NET et Visualforce
Si vous êtes développeur de formulaires Web ASP.NET, Visualforce vous sera familier. Les deux partagent de nombreux éléments, notamment une séparation nette entre le balisage et le code. Vous pouvez également utiliser des champs de formulaire pour mapper un code avec des propriétés définies dans le contrôleur.
La mauvaise nouvelle est que viewstate n'est pas plus pratique avec Visualforce qu'avec ASP.NET en raison de la passivité du HTTP. La bonne nouvelle est qu'il existe des solutions pour contourner les limitations de viewstate. Pour en savoir plus, suivez le lien de la section Ressources.
Visualforce est une infrastructure de restitution de pages HTML à l'aide d'un paradigme MVC. Avant de vous réjouir en pensant « Super, Visualforce ressemble à ASP.NET MVC. J'aime MVC », sachez que comparer les deux revient à comparer des pommes et des citrouilles. Vous pouvez les utiliser pour restituer des pages Web, les deux séparent la logique d'application du balisage et du modèle de base de données, mais en procédant différemment.
Pour des informations complètes sur Visualforce, suivez le module Concepts de base de Visualforce. Ici, nous souhaitons seulement vous montrer un aperçu du fonctionnement avec un exemple. Vous pouvez utiliser le code de balisage ci-dessous pour restituer une page simple utilisée pour saisir des données de Contact.
<apex:page standardController="Contact"> <apex:form> <apex:pageBlock title="Edit Contact" mode="Edit"> <apex:pageBlockButtons > <apex:commandButton action="{!edit}" id="editButton" value="Edit"/> <apex:commandButton action="{!save}" id="saveButton" value="Save"/> <apex:commandButton action="{!cancel}" id="cancelButton" value="Cancel"/> </apex:pageBlockButtons> <apex:pageBlockSection > <apex:inputField value="{!contact.lastname}" /> <apex:inputField value="{!contact.accountId}"/> <apex:inputField value="{!contact.phone}"/> </apex:pageBlockSection> </apex:pageBlock> </apex:form> </apex:page>
L'exemple utilise un élément appelé contrôleur standard, qui fait partie de la plate-forme Lightning. Il s'agit essentiellement d'un code généré par le système qui permet d'incorporer rapidement une fonctionnalité CRUD (créer, lire, mettre à jour, supprimer) de base à vos pages Visualforce. Ne vous inquiétez pas, sachez seulement que vous pouvez créer vos propres contrôleurs personnalisés pour ajouter des fonctionnalités plus complexes. Vous trouverez des informations complètes sur le fonctionnement des contrôleurs standard et personnalisés dans le module Concepts de base de Visualforce. La version restituée de cette page se présente comme suit :
Différences
Nous avons vu ce qui rapproche Apex et .NET. Examinons maintenant les différences. Pour les débutants, contrairement à C#, Apex n'est pas sensible à la casse.
Association étroite entre Apex et la base de données
Le code Apex et la base de données de la plate-forme Lightning sont étroitement associés, à tel point qu'ils sont parfois difficiles à distinguer. Chaque objet standard ou personnalisé dans la base de données a une représentation « mystique » dans une classe Apex qui fournit toutes sortes de fonctionnalités pour faciliter les interactions avec la base de données. La classe et son objet sous-jacent sont essentiellement des images miroirs l'une de l'autre, qui sont constamment synchronisées. Par exemple, lorsque vous créez un champ dans un objet, un membre de classe est automatiquement généré pour référencer les valeurs dans la base de données. Il est en outre impossible d'ajouter dans votre code Apex une référence à un champ qui n'existe pas. Le compilateur renvoie une erreur et n'enregistre pas votre code. La plate-forme s’efforce de garantir ces dépendances, tout en gardant synchronisés le schéma de la base de données et votre code. Ainsi, si vous tentez de supprimer un objet personnalisé ou un champ qui est référencé par un code Apex, la plate-forme génère une erreur et interdit l'action.
Différents modèles de conception
En tant que développeur .NET, vous connaissez probablement les modèles de conception. Cependant, la plupart de ces modèles ne fonctionnent pas sur la plate-forme Lightning. Nous reviendrons sur ce point dans les unités suivantes en examinant le contexte d'exécution et la conception de déclencheurs. Vous pouvez également suivre les liens de la section Ressources relatifs aux modèles de conception Apex.
Il est important de comprendre que si vous essayez d'appliquer à la plate-forme Lightning les stratégies de conception que vous utilisez en .NET, vous risquez de rencontrer des problèmes pour tester et déployer vos solutions. Avant de commencer à coder, nous suggérons de prendre le temps de découvrir les modèles de conception qui fonctionnent le mieux dans l'univers de la plate-forme Lightning.
Tests unitaires obligatoires
Vous savez écrire des tests unitaires pour vos applications .NET et vous en connaissez probablement les avantages. Sur la plate-forme Lightning, la différence est que votre couverture de test doit être de 75 % pour pouvoir déployer votre code Apex dans une organisation de production.
Non seulement les tests unitaires favorisent le développement d'un code robuste et sans erreur, mais ils sont essentiels pour la stabilité de la plate-forme, car ils sont tous exécutés avant la publication de chaque version majeure. Pour en savoir plus sur les tests unitaires, reportez-vous à An Introduction to Apex Code Test Methods.
Pas de fichier de solution, de projet ou de configuration
La plate-forme Lightning ne contient aucun fichier de solution ou de projet. Vous pouvez créer une application, mais cela ne revient pas à créer une application ou un assemblage .NET.
Sur la plate-forme Lightning, une application n'est qu'une collection libre de composants, notamment des onglets, des rapports, des tableaux de bord et des pages. Plusieurs composants sont fournis avec votre organisation Salesforce et vous pouvez créer vos propres composants en quelques secondes en suivant l’assistant pointer-cliquer. Vous pouvez même acheter des applications créées par des tiers sur AppExchange.
Tout votre code réside et est exécuté dans le Cloud. Dans l'univers de la plate-forme Lightning, il n'existe aucun fichier de configuration. Puisque la base de données est intégrée, aucune chaîne de connexion n'est nécessaire. Contrairement à ASP.NET MVC, aucun chemin de configuration n'est requis. Vous pouvez créer des paramètres personnalisés dans Salesforce, mais ils sont ajoutés et gérés par déclaration.
Bibliothèque de classes beaucoup plus petite
La bibliothèque de classes Apex est beaucoup plus petite que la bibliothèque de classes .NET Framework. Par conséquent, elle facilite et accélère la prise en main d'Apex. Honnêtement, rechercher une fonctionnalité comparative qui n'existe pas dans Apex peut s'avérer frustrant.
Notez que la plate-forme Lightning a été créée dans le but de permettre un développement d'applications rapide. Elle est différente de la plate-forme .NET. Vous risquez de rechercher une fonctionnalité à laquelle vous êtes habitué, mais qui n’existe pas avec la plate-forme Lightning. Cependant, si vous souhaitez créer des applications parfaites avec un code personnalisé, notre plate-forme Heroku Enterprise offre la puissance et toutes les fonctionnalités dont vous avez besoin.
Outils de développement
Vous êtes probablement déjà inscrit(e) pour obtenir une organisation gratuite Developer Edition (DE). Peut-être avez-vous déjà ouvert et utilisé l'application en ligne Developer Console.
Vous pouvez utiliser la Developer Console pour modifier et parcourir le code source. Elle est également pratique pour les opérations de débogage et de dépannage. Nous examinerons ces points plus loin. Si vous avez déjà suivi le premier module consacré aux concepts de base de données, vous savez que vous pouvez utiliser la Developer Console pour exécuter des requêtes SOQL et SOSL, et afficher des plans de requête. Si vous n'avez pas encore utilisé la Developer Console, ne vous inquiétez pas, nous allons bientôt la découvrir en créant une classe Apex.
En tant que développeur .NET, Visual Studio Code ne vous est sans doute pas inconnu. Vous serez ravi d’apprendre l’existence des Extensions Salesforce pour VS Code qui vous permettent de faire un développement personnalisé sur votre machine locale. Cette extension est étroitement liée à Salesforce DX, qui offre une expérience de développement moderne et fondée sur les sources. Vous pouvez en savoir plus sur Salesforce DX en suivant le parcours Premiers pas avec Salesforce DX.
Enfin, nous avons également pensé que vous pourriez être intéressé par une puissante interface de ligne de commande (CLI) de source vers la plate-forme Lightning. Si vous êtes l’un de ces développeurs qui adorent la ligne de commande, la CLI Salesforce est faite pour vous.
Pour vous tenir au courant de l’évolution de Salesforce et de la prise en charge intégrée de DevOps, veillez à consulter Générateur de code et Centre DevOps.
Gestion de la sécurité
Avec la plate-forme Lightning, vous n'avez pas à vous soucier de l'authentification ou du stockage des mots de passe et des chaînes de connexion à la base de données. L'identité est gérée par la plate-forme. Vous pouvez contrôler l’accès aux données à de nombreux niveaux, notamment au niveau de l’objet, au niveau de l’enregistrement et au niveau du champ. La sécurité est également gérée par déclaration. Dans de nombreux cas, la sécurité est définie et configurée par un administrateur Salesforce. En tant que développeur, il est important de connaître son fonctionnement. Pour en savoir plus, suivez le module Data Security.
Qu'en est-il de l'intégration ?
Plusieurs méthodes permettent d'intégrer à la plate-forme. Cependant, vous allez probablement souvent utiliser SOAP et REST. Vous pouvez les utiliser dans les deux directions.
Vous pouvez créer et exposer des services Web en utilisant le langage de programmation Apex, et invoquer des services Web externes depuis Apex. Vous pouvez également réagir aux e-mails entrants et envoyer des messages sortants automatisés lorsque des événements se produisent.
Si vous souhaitez aller plus loin, Salesforce offre les API SOAP et REST qui permettent d'accéder directement aux données de votre organisation. Plusieurs kits de ressources qui utilisent des API sont également disponibles. Vous pouvez ainsi utiliser votre langage préféré : .NET, Java, PHP, Objective C, Ruby et JavaScript.
Plusieurs applications d'intégration tierces sont également disponibles sur AppExchange. Véritablement, tout est possible. Pour en savoir plus sur les points d’intégration, suivez le module Apex Integration.
Création d'une classe Apex
Vous connaissez maintenant les liens entre la plate-forme Lightning et la plate-forme .NET. Explorons la création d'une classe Apex en utilisant la Developer Console. La classe que nous allons créer inclut la méthode publique sendMail. Elle comprend une méthode privée helper appelée inspectResults qui inspecte les résultats de l'appel d'envoi d'e-mail.
- Dans Configuration, dans votre organisation Developer, sélectionnez Votre nom > Developer Console pour ouvrir la Developer Console.
- Dans la Developer Console, sélectionnez Fichier > Nouveau > Classe Apex.
- Saisissez le nom de classe EmailManager, puis cliquez sur OK.
- Supprimez le code existant, puis insérez l’extrait suivant :
public with sharing class EmailManager { // Public method public static void sendMail(String address, String subject, String body) { // Create an email message object Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); String[] toAddresses = new String[] {address}; mail.setToAddresses(toAddresses); mail.setSubject(subject); mail.setPlainTextBody(body); // Pass this email message to the built-in sendEmail method // of the Messaging class Messaging.SendEmailResult[] results = Messaging.sendEmail( new Messaging.SingleEmailMessage[] { mail }); // Call a helper method to inspect the returned results. inspectResults(results); } // Helper method private static Boolean inspectResults(Messaging.SendEmailResult[] results) { Boolean sendResult = true; // sendEmail returns an array of result objects. // Iterate through the list to inspect results. // In this class, the methods send only one email, // so we should have only one result. for (Messaging.SendEmailResult res : results) { if (res.isSuccess()) { System.debug('Email sent successfully'); } else { sendResult = false; System.debug('The following errors occurred: ' + res.getErrors()); } } return sendResult; } }
- Appuyez sur Ctrl + S pour enregistrer votre classe.
Invocation d'une méthode
Puisque avons déclaré la méthode publique sendMail comme statique, nous pouvons y accéder sans créer une instance à la classe. L’accès est également aisé avec un Apex anonyme dans la Developer Console.
- Dans Configuration, sélectionnez Votre nom > Developer Console pour ouvrir la Developer Console.
- Sélectionnez Débogage > Ouvrir la fenêtre d’exécution anonyme.
- Supprimez le code existant et insérez l’extrait suivant, en remplaçant le premier paramètre par votre propre adresse e-mail :
EmailManager.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
- Assurez-vous que l’option Ouvrir le journal est sélectionnée, puis cliquez sur Exécuter. Un nouvel onglet affiche le journal d'exécution.
- Sélectionnez l’option Debug Only pour afficher uniquement les instructions de débogage du journal. Un message doit indiquer que l'e-mail a été envoyé avec succès. Vous devriez également recevoir un e-mail, si vous avez saisi une adresse valide.
Imaginez exécuter la même tâche en .NET. La création d'une application .NET qui envoie des e-mails serait-elle aussi simple ? Allez, honnêtement...
Ressources
- Compréhension de l’architecture Salesforce
- Développement visuel : dans quels cas faut-il cliquer au lieu d’écrire du code ?
- Présentation d’Apex dans le Guide du développeur de code Apex
- Présentation de l’état de vue
- Modèles de conception Apex
- Modèles et pratiques d’intégration