Skip to main content

Emparejar conceptos de .NET con la plataforma Lightning

Objetivos de aprendizaje

Después de completar esta unidad, podrá:

  • Comprender qué funciones clave conforman la plataforma Lightning y el lenguaje de programación Apex
  • Identificar las similitudes y diferencias entre .NET y la plataforma Lightning
  • Utilizar la Developer Console para crear su primera clase de Apex
  • Utilizar Apex anónimo para invocar un método desde una clase de Apex
Nota

Nota

El reto práctico para esta insignia está localizado al japonés, español (LATAM) y portugués (Brasil). Para cambiar el idioma de su Trailhead Playground, siga estas instrucciones. Puede que la localización esté desactualizada. Si no aprueba el reto con las instrucciones localizadas, cambie el idioma a inglés y la configuración local a Estados Unidos, y vuelva a intentarlo.

Consulte la insignia Trailhead en su idioma para obtener más información sobre cómo aprovechar la experiencia de Trailhead en otros idiomas.

Siga el proceso con Trail Together

¿Desea seguir el proceso con un experto a medida que realiza este paso? Mire este video que forma parte de la serie Trail Together.

Le presentamos la plataforma Lightning

Ya en serio, después de que conozca más sobre la plataforma Lightning, la apreciará como lo hacemos nosotros. En este módulo, estudiaremos cómo puede relacionar los conceptos de .NET con los que está familiarizado y la plataforma Lightning.

Fundamentos de la plataforma

En primer lugar, pasemos brevemente sobre lo que conforma exactamente la plataforma Lightning. Una de las cosas que separa la plataforma de otras ofertas de software como servicio (SaaS) es que se basa en una arquitectura dirigida por metadatos. Todo, incluyendo el código, la configuración y las aplicaciones, se especifica como metadatos.

Como desarrollador de .NET, probablemente ya esté familiarizado con las aplicaciones de nube que se ejecutan sobre Microsoft Azure. Bien, la plataforma Lightning funciona de forma diferente. La plataforma Lightning está integrada estrechamente con la base de datos. También obtiene gran variedad de cosas, como la interfaz de usuario, la seguridad y la creación de informes integradas directamente con la plataforma. Esta integración es lo que le permite construir aplicaciones de forma ultrarrápida.

Pero... y aquí viene la parte que puede hacerle sentir un poco raro al principio, usted, como desarrollador, tiene que ceder parte del control para obtener esa productividad de desarrollador. En la plataforma Lightning no tiene que preocuparse de establecer nodos o realizar tareas de gestión. No tiene que preocuparse sobre actualizar, afinar o ampliar nada. Para ser honestos, probablemente no echará de menos toda esa complejidad y responsabilidad agregadas, porque en su lugar solo tiene que centrarse en crear excelentes aplicaciones con rapidez.

Hasta ahora solo arañamos la superficie de lo que la plataforma ofrece. Si desea profundizar un poco en la arquitectura, consulte el módulo Fundamentos de la plataforma.

Fundamentos de Apex

Debido a que la plataforma Lightning está tan integrada y también se basa en una arquitectura de metadatos, puede realizar muchísimas cosas empleando un desarrollo declarativo, o lo que se conoce como construcción de aplicaciones con “apuntar y hacer clic”. Si es nuevo en la plataforma Lightning, le recomendamos encarecidamente que consulte el artículo sobre el desarrollo con apuntar y hacer clic enumerado en Recursos.

Como desarrollador de .NET, sabemos que le gusta programar, pero queremos que se dé cuenta que en la plataforma Lightning el código de computación no es siempre necesario. Pero es importante comprender cuándo se necesita programar y cuándo no. Puede aprender más sobre esta distinción consultando este artículo sobre cuándo hacer clic y cuándo programar.

Bueno, ya tuvimos suficiente. Sabemos que desea aprender cómo puede programar en la plataforma, y aquí es donde entra Apex.

¿Cuáles son las similitudes?

El lenguaje de programación Apex es similar a uno que probablemente ya conozca y con el que se encuentre cómodo: C#. Apex se guarda, compila y ejecuta directamente en la plataforma Lightning. Del mismo modo que C#, está orientado a objetos. En esta sección trataremos este tema y las demás cosas que lo hacen similar a los lenguajes .NET.

Diseño orientado a objetos

Nos imaginamos que ya comprende el concepto del diseño orientado a objetos, de modo que no vamos a hacerle perder el tiempo describiendo moldes. Solo tiene que saber que Apex admite muchos de los principios orientados a objetos a los que probablemente ya esté acostumbrado, como la encapsulación, la abstracción, la herencia e incluso el polimorfismo. De hecho, el lenguaje Apex incluye muchas construcciones de lenguaje con los que ya está familiarizado, incluyendo clases, interfaces, propiedades y recopilaciones.

Por ejemplo, aquí tenemos la apariencia que tendría una clase de Apex denominada HelloWorld.

public with sharing class HelloWorld {
    public void printMessage() {
        String msg = 'Hello World';
        System.debug(msg);   
    }
}

Esta sencilla clase HelloWorld incluye un método denominado printMessage que se utiliza para mostrar el mensaje “Hello World” en el registro de depuración del sistema. Por supuesto, este ejemplo es bastante sencillo, pero queríamos que viera lo parecido que es Apex con C#.

La sintaxis básica para definir clases es:

private | public | global
[virtual | abstract | with sharing | without sharing]
class ClassName [implements InterfaceNameList] [extends ClassName]
{
    // The body of the class
}

Cuando tenga tiempo, consulte Concepto de clases para aprender más sobre cómo funcionan las clases, los objetos y las interfaces.

Tipos de datos

Apex admite las clases de tipos de datos que podría esperar. Existen tipos primitivos, como Integer, Double, Long, Date, Datetime, String y Boolean. También hay un tipo de dato ID que se utiliza para cualquier identificador de registro de la plataforma Lightning de 18 caracteres asignado por el sistema.

Los tipos de valores y de referencia funcionan del mismo modo, pero en Apex, todas las variables se inicializan como nulas de forma predeterminada. Una cosa que hay que tener en cuenta es que las cadenas en .NET son realmente referencias aunque se comporten como tipos de valores, porque son inalterables. Pero en Apex, las cadenas siempre se tratan como un tipo de valor primitivo.

Aparte de los primitivos, los tipos de datos admitidos incluyen sObject, ya sea como un sObject genérico o uno específico, como Cuenta o Contacto. Recuerde, un sObject es simplemente un objeto de Salesforce. Puede pensar en ello como una tabla en una base de datos. El sObject puede ser uno estándar que viene incorporado con Salesforce o uno personalizado que haya definido usted mismo.

De forma adiciona, un tipo de datos puede ser una lista tipificada de valores, llamada también enumeración. Pero tenga cuidado, ya que estas enumeraciones no son las mismas a las que está acostumbrado al trabajar en .NET. En Apex, puede utilizar las enumeraciones con números, pero no puede definir cuáles son estos valores numéricos. Del mismo modo, la asignación ordinal comienza en cero. Por ejemplo, si tuviera una enumeración como la siguiente.

public enum myEnums {
            Enum1,
            Enum2,
            Enum3
 }

Si intentara acceder al valor ordinal de la tercera enumeración, el valor de la variable enumOrd sería 2.

Integer enumOrd = myEnums.Enum3.ordinal();

Trabajar con recopilaciones

.NET admite una extensa biblioteca de recopilaciones con numerosos tipos y métodos de extensión. Y aquí llegan buenas noticias. Apex solo tiene las tres recopilaciones siguientes. Tiene una pinta sencilla, ¿verdad?

Lista

Una lista es una recopilación ordenada de elementos que funciona casi del mismo modo que una matriz tradicional. De hecho, las matrices en Apex son sinónimos de listas, y puede utilizarlas indistintamente. Por ejemplo, lo siguiente es una forma de declarar una variable como una lista de cadenas.

List<String> myStrings =  new List<String>();

De forma alternativa, puede declarar la variable myStrings como una matriz, pero se asigna a una lista en lugar de a una matriz.

String[] myStrings = new List<String>();

Otra cosa que puede hacer es declarar la lista e inicializar sus valores, todo en un paso, como lo siguiente.

List<String> myStrings =  new List<String> {'String1', 'String2', 'String3' };

También puede agregar valores a la lista después de crearse, de este modo:

List<String> myStrings = new List<String>();
myStrings.add('String1');
myStrings.add('String2');
myStrings.add('String3');

Probablemente creará gran cantidad de variables de lista en su desarrollo de Apex, ya que el resultado de todas las consultas SOQL es una lista. Por ejemplo, podría crear una lista de cuentas empleando código de la manera siguiente:

List<Account> myAccounts = [SELECT Id, Name FROM Account];

Del mismo modo que las matrices, las listas tienen índices que comienzan en cero. De este modo podría acceder al nombre de la primera cuenta de la lista con código como este.

List<Account> myAccounts = [SELECT Id, Name FROM Account];
String firstAccount = myAccounts[0].Name;

Conjunto

Un conjunto es una recopilación de elementos sin ordenar que no contiene duplicados. Un conjunto se utiliza comúnmente para almacenar valores de Id. porque los valores son siempre únicos. Luego podría utilizar el conjunto como parte de una cláusula WHERE en una consulta SOQL. Por ejemplo, aquí estamos creando un conjunto que contiene dos Id. exclusivos para Cuentas. Luego utilizamos el conjunto en la consulta SOQL para devolver Cuentas únicamente para esos Id.

Set<ID> accountIds = new
  Set<ID>{'001d000000BOaHSAA1','001d000000BOaHTAA1'};  
List<Account> accounts = [SELECT Name
  FROM Account WHERE Id IN :accountIds];    

Asignación

Una asignación es un recopilación de pares clave-valor. Cada clave se asigna a un único valor. Una asignación resulta útil cuando necesita encontrar rápidamente algo por una clave. Los valores de claves deben ser exclusivos, de modo que podría tener una asignación que contuviera valores de Id. para la clave y luego asignarse a un sObject. Por ejemplo, podría utilizar el siguiente código para declarar una variable de asignación denominada accountMap que contenga todas las cuentas asignadas a sus Id.

Map<Id, Account> accountMap = new Map<Id, Account>([SELECT Id, Name FROM Account]);

Luego podría acceder a un registro Cuenta específico empleando el método get y programar de forma parecida a la siguiente.

Id accId = '001d000000BOaHSAA1';
Account account = accountMap.get(accId);

Consulte los documentos oficiales para aprender más sobre los tipos de datos que admite Apex.

ASP.NET a Visualforce

Si usted es un desarrollador de formularios web de ASP.NET, probablemente se encontrará como en casa con Visualforce. Existen muchas similitudes entre los dos. La más aparente es una clara separación entre la marca y el código. También puede utilizar campos de formulario para asignar código a propiedades definidas en el controlador.

La mala noticia es que viewstate es tan problemático con Visualforce que con ASP.NET debido al hecho de que HTTP no tiene estado. La buena noticia es que hay formas de circunvenir las limitaciones de viewstate. Conozca más detalles consultando los vínculos en Recursos.

Visualforce es un marco de trabajo para representar páginas HTML empleando un paradigma MVC. Antes de que se entusiasme y empiece a pensar “Genial, Visualforce es como MVC de ASP.NET. Me encanta MVC.”, tenga en cuenta que comparar los dos es como comparar uvas con peras. Puede utilizar cualquiera de los dos para representar páginas web, y ambos separan la lógica de la aplicación de la marca y el modelo de la base de datos, pero lo hacen de formas diferentes.

Para conocer todos los detalles sobre Visualforce, consulte el módulo Fundamentos de Visualforce. Por ahora solo queremos darle una idea básica de cómo funciona mostrándole un ejemplo. Puede utilizar el siguiente código de marca para representar una página sencilla empleada para introducir datos de contactos.

<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>

Este ejemplo utiliza lo que se conoce como controlador estándar, que forma parte de la plataforma Lightning. Es básicamente código generado por el sistema que le permite incorporar rápidamente funciones CRUD básicas en sus páginas de Visualforce. Pero antes de que empiece a preocuparse, simplemente sepa que puede crear sus propios controladores personalizados para agregar más funciones complejas. Conozca todos los detalles sobre el funcionamiento de los controladores estándar y personalizados en el módulo Fundamentos de Visualforce. La versión representada de esta página tiene la siguiente apariencia:

Captura de pantalla de una página de Visualforce personalizada utilizada para modificar información de contacto

Nota

Nota

Probablemente conozca un poco sobre los componentes Lightning, y podría pensar: "¿Es Lightning como ASP.NET MVC?". La respuesta es no. Lightning es una manera más ligera de ofrecer aplicaciones web ultrarrápidas y con capacidad de respuesta, pero Lightning es un marco basado en componentes. Visite el módulo Fundamentos de los componentes web Lightning para conocer todos los detalles.

¿Qué es diferente?

Ahora que sabe un poco sobre las similitudes de Apex con .NET, pasemos por algunas diferencias. Para empezar, a diferencia de C#, Apex no distingue entre mayúsculas y minúsculas.

Apex y la base de datos estrechamente interrelacionados

El código Apex y la base de datos de la plataforma Lightning están estrechamente interrelacionados hasta el punto en que a veces no se puede distinguir entre ellos. Cada objeto estándar o personalizado de la base de datos tiene una representación “mística” a través de una clase de Apex que proporciona todo tipo de funciones para facilitar la interacción con la base de datos. La clase y su objeto subyacente son esencialmente un reflejo de ambos que está constantemente en sincronía. Por ejemplo, siempre que crea un nuevo campo en un objeto, un miembro de clase aflora automáticamente para hacer referencia a los valores de la base de datos. También es imposible agregar una referencia en su código Apex a un campo que no existe; el compilador devolverá un error y simplemente no guardará su código. La plataforma trabaja intensamente para garantizar estas dependencias y no permitirá que el esquema de la base de datos y su código queden sin sincronización. Por lo tanto, si intenta eliminar un objeto personalizado o un campo al que se haga referencia en código Apex, la plataforma generará un error y desaprobará la acción.

Patrones de diseño diferentes

Como desarrollador de .NET, probablemente ya estará familiarizado con los patrones de diseño. No obstante, la mayoría de estos patrones no se trasladan a la plataforma Lightning. Aprenderá más sobre esto en las siguientes unidades cuando tratemos el contexto de ejecución y el diseño de desencadenadores, pero considere también consultar los vínculos enumerados en Recursos referentes a los patrones de diseño de Apex.

Lo que es importante comprender es que si intenta aplicar las mismas estrategias de diseño que utiliza en .NET a la plataforma Lightning, es muy probable que se presenten problemas cuando pruebe e implemente sus soluciones. Sugerimos que se tome un tiempo para aprender sobre los patrones de diseño que funcionan mejor en el mundo de la plataforma Lightning antes de empezar a desarrollar el código.

Las pruebas de unidades son necesarias

Sabemos que está habituado a escribir pruebas de unidades para sus aplicaciones .NET y probablemente comprende los beneficios de utilizarlas. La diferencia en la plataforma Lightning es que debe tener el 75% de cobertura de prueba para implementar su código Apex en una organización de producción.

Las unidades de prueba no solo promueven el desarrollo de código sólido y libre de errores, también son vitales para la estabilidad de la plataforma, ya que todas las pruebas se ejecutan antes del lanzamiento de cada versión principal. Para aprender más sobre las pruebas de unidades, consulte Una introducción a los métodos de prueba de código Apex.

Sin archivos de solución, proyecto o configuración

La plataforma Lightning no tiene nada parecido a un archivo de solución o proyecto. Puede crear una aplicación, pero no es lo mismo que crear una aplicación o ensamblado .NET.

Una aplicación en la plataforma Lightning es solo una recopilación libre de componentes, como fichas, reportes, tableros y páginas. Algunas vienen incorporadas con su organización de Salesforce, y en unos segundos, puede crear su propia aplicación pasando por un asistente de apuntar y hacer clic. Incluso puede adquirir aplicaciones creadas por terceros en lo que se conoce como AppExchange.

Todo su código reside y se ejecuta en la nube. Tampoco hay nada parecido a un archivo de configuración en el mundo de la plataforma Lightning. Debido a que la base de datos está incorporada, no necesita cadenas de conexión. Y a diferencia de MVC de ASP.NET, no tiene que configurar rutas. Puede crear configuraciones personalizadas en Salesforce, pero estas se agregan y se gestionan de forma declarativa.

Una biblioteca de clases mucho más pequeña

La biblioteca de clases de Apex es considerablemente más pequeña que la biblioteca de clases de .NET Framework, de modo que es más sencillo y rápido entrar en modo productivo con Apex. Pero honestamente, es posible que sea algo frustrante buscar una función comparable que simplemente no existe en Apex.

Tenga en cuenta que la plataforma Lightning está construida con la idea de proporcionar un desarrollo rápido de aplicaciones. Es también diferente a la plataforma .NET, de modo que puede que busque funciones con las que está acostumbrado a trabajar que sencillamente no existen en la plataforma Lightning. No obstante, si está buscando crear aplicaciones con código de computación personalizado perfectas hasta el último píxel, nuestra plataforma Heroku Enterprise proporciona toda la potencia y las funciones que necesita.

Herramientas de desarrollo

Es muy probable que ya haya suscrito una organización de Developer Edition (DE) gratuita. Quizá también abrió y utilizó la aplicación online Developer Console.

Puede utilizar la Developer Console para modificar y navegar por el código fuente, y también es útil para depurar y solucionar problemas. Trataremos esto en una unidad posterior, así que siga con nosotros. Si ya pasó por el primer módulo sobre los fundamentos de la base de datos, sabrá que también puede utilizar la Developer Console para ejecutar consultas SOQL y SOSL y ver planes de consulta. Si no ha utilizado aún la Developer Console, no se preocupe, porque lo haremos en breve cuando creemos una clase de Apex.

Como desarrollador de .NET, probablemente está familiarizado con Visual Studio Code. Estará contento de saber que tenemos Extensiones de Salesforce para VS Code que le permiten realizar desarrollo personalizado en su equipo local. La extensión está estrechamente vinculada a Salesforce DX, que proporciona una moderna experiencia de desarrollo dirigido por fuentes. Podrá aprender más sobre Salesforce DX en la ruta Información general sobre Salesforce DX.

Y finalmente, pensamos que estará interesado en conocer una potente interfaz de línea de comandos para la plataforma Lightning. Si usted es uno de esos desarrolladores a los que les encanta la línea de comandos, la CLI de Salesforce está en sintonía con usted.

Control de la seguridad

La buena noticia es que en la plataforma Lightning no tiene que preocuparse por la autenticación o el almacenamiento de contraseñas y cadenas de conexión de bases de datos. La identidad está controlada por la plataforma. Puede controlar el acceso a los datos en muchos niveles diferentes, incluyendo el nivel de objetos, el nivel de registros y el nivel de campos. La seguridad también se controla de forma declarativa. En muchos casos, la seguridad se define y se configura a través de un administrador de Salesforce. Como desarrollador, es importante estar al tanto de cómo funciona. Conozca más detalles consultando el módulo Seguridad de datos.

¿Qué pasa con la integración?

Puede integrar con la plataforma de diversas maneras, pero probablemente utilizará SOAP y REST la mayoría de las veces. Puede utilizarlos en cualquier dirección.

Puede crear y exponer servicios web utilizando el lenguaje de programación Apex, así como invocar servicios web externos desde Apex. También puede reaccionar a mensajes de email entrantes y enviar mensajes salientes automatizados cuando ocurren ciertos eventos.

Si realmente quiere ponerse manos a la obra, Salesforce ofrece las API de SOAP y REST que proporcionan acceso directo a los datos de su organización. Los kits de herramientas que se aplican a las API están disponibles, de modo que puede utilizar el lenguaje que prefiera: .NET, Java, PHP, Objective C, Ruby y JavaScript.

Existen numerosas aplicaciones de integración externas en AppExchange. Realmente, casi todo es posible. Puede aprender más sobre los puntos de integración completando el módulo Integración de Apex.

Crear una clase de Apex

Ahora que conoce más sobre cómo la plataforma Lightning se relaciona con la plataforma .NET, demos el salto y creemos una clase de Apex utilizando la Developer Console. La clase que crearemos incluye el método público sendMail. También incluye un método auxiliar privado denominado inspectResults para inspeccionar los resultados de la llamada de envío de email.

  1. En Configuración en su organización de Developer, seleccione Su nombre > Developer Console para abrir Developer Console.
  2. En Developer Console, seleccione File (Archivo) > New (Nuevo) > Apex Class (Clase de Apex).
  3. Ingrese EmailManager como nombre de la clase y haga clic en OK (Aceptar).
  4. Elimine el código existente e inserte el siguiente fragmento de código:
    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;
        }
    }   
    
  5. Pulse Ctrl+S para guardar la clase.
Nota

Nota

Este sencillo ejemplo no implementa la seguridad a nivel de objeto o de campo requerida. Consulte este miniprograma de código para empezar rápidamente.

Invocar un método

Debido a que declaramos el método público sendMail como estático, podemos acceder a él sin crear una instancia de la clase. Podemos hacerlo fácilmente utilizando Apex anónimo en Developer Console.

  1. En Configuración, seleccione Su nombre > Developer Console para abrir Developer Console.
  2. Seleccione Debug (Depurar) > Open Execute Anonymous Window (Abrir ventana de ejecución anónima).
  3. Elimine el código existente e inserte el siguiente fragmento de código:
    EmailManager.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
    
  4. Asegúrese de que la opción Open Log (Abrir registro) está seleccionada y haga clic en Execute (Ejecutar). Una nueva ficha le muestra el registro de ejecución.
  5. Seleccione la opción Debug Only (Solo depurar) de modo que vea únicamente las declaraciones de depuración mostradas en el registro. Debería ver un mensaje indicándole que el Email se envió correctamente. Debería recibir un mensaje de email si ingresó una dirección de email válida.

Imagínese si hubiera intentado realizar la misma tarea en .NET. ¿Hubiera sido tan fácil crear una aplicación .NET que enviara mensajes de email? Venga, diga la verdad.

Recursos

¡Siga aprendiendo gratis!
Regístrese para obtener una cuenta y continuar.
¿Qué hay para usted?
  • Consiga recomendaciones personalizadas para sus objetivos profesionales
  • Practique sus aptitudes con retos prácticos y pruebas
  • Siga y comparta su progreso con empleadores
  • Póngase en contacto para recibir asesoramiento y oportunidades laborales