Empiece a realizar un seguimiento de su progreso
Inicio de Trailhead
Inicio de Trailhead

Información general sobre Apex

Objetivos de aprendizaje

Después de completar esta unidad, podrá:
  • Describir las funciones clave del lenguaje de programación Apex.
  • Guardar una clase de Apex y llamar a métodos mediante Apex anónimo.
  • Usar la consola de desarrollador para inspeccionar los registros de depuración.

Información general sobre Apex

Apex es un lenguaje de programación que usa una sintaxis similar a Java y funciona como los procedimientos almacenados de base de datos. Apex permite a los desarrolladores agregar lógica de negocio a los eventos de sistema, como clics en botones, actualizaciones de registros relacionados y páginas de Visualforce.

Como lenguaje, Apex se caracteriza por lo siguiente:

  • Alojamiento: Apex se guarda, compila y ejecuta en el servidor (Plataforma Lightning).
  • Orientación a objetos: Apex admite clases, interfaces y elementos heredados.
  • Tipificación consistente: Apex valida las referencias a objetos en tiempo de compilación.
  • Múltiples arrendatarios: dado que Apex se ejecuta en una plataforma de múltiples arrendatarios, protege muy bien el código no controlado mediante la aplicación de límites, lo que impide que el código monopolice los recursos compartidos.
  • Integración con la base de datos: el acceso y la manipulación de registros son sencillos. Apex permite el acceso directo a los registros y sus campos, y proporciona declaraciones y lenguajes de consulta para manipular estos registros.
  • Datos como objetivo: Apex proporciona un acceso transaccional a la base de datos, lo que permite operaciones de reversión.
  • Facilidad de uso: Apex se basa en el conocido lenguaje Java.
  • Pruebas sencillas: Apex ofrece compatibilidad integrada para la creación de pruebas de unidades, la ejecución y la cobertura de código. Salesforce garantiza que todo el código Apex personalizado funcione según lo esperado mediante la ejecución de pruebas de todas las unidades antes de cualquier actualización de la plataforma.
  • Compatibilidad con versiones: el código Apex personalizado se puede guardar en distintas versiones de la API.
Apex es un lenguaje de programación basado en la nube.

Aspectos destacados del lenguaje Apex

Como ocurre con otros lenguajes de programación orientados a objetos, estos son algunos de los elementos de lenguaje que admite Apex:

  • Clases, interfaces, propiedades y colecciones (incluidos los conjuntos).
  • Notación de objetos y conjuntos.
  • Expresiones, variables y constantes.
  • Declaraciones condicionales (si..., entonces...) y declaraciones de flujo de control (bucles for y bucles while).

A diferencia de otros lenguajes de programación orientados a objetos, Apex admite lo siguiente:

  • Desarrollo en la nube a medida que Apex se almacena, compila y ejecuta en la nube.
  • Desencadenadores, los cuales son similares a los desencadenadores de sistemas de base de datos.
  • Declaraciones de base de datos que permiten hacer llamadas directas a la base de datos y lenguajes de consulta para consultar y buscar datos.
  • Transacciones y reversiones.
  • El modificador de acceso global, que es más permisivo que el modificador public y permite el acceso a espacios de nombres y aplicaciones.
  • Control de versiones de código personalizado.

Además, no se aplica la distinción entre mayúsculas y minúsculas al lenguaje Apex.

Herramientas de desarrollo

Puede escribir Apex y acceder a la información de depuración directamente en el navegador mediante la interfaz de usuario de Salesforce. Abra Developer Console bajo Su nombre o el menú de acceso rápido (Icono de engranaje).

Además, puede escribir Apex en un cliente mediante las Extensiones de Salesforce para Visual Studio Code. Consulte Extensiones de Salesforce Visual Studio Code.

Descripción general de tipos de datos

Apex admite varios tipos de datos, incluido un tipo de datos específico para Salesforce (tipo de datos sObject).

Apex admite los siguientes tipos de datos:

  • Primitivo (por ejemplo, Integer, Double, Long, Date, Datetime, String, ID y Boolean entre otros).
  • sObject, ya sea un sObject genérico o un sObject específico, como una cuenta, un contacto o MyCustomObject__c (obtendrá más información sobre los sObjects en una unidad posterior).
  • Colección, lo que incluye lo siguiente:
    • Lista (o conjunto) de primitivos, sObjects, objetos definidos por el usuario, objetos creados a partir de clases de Apex o colecciones.
    • Conjunto de primitivos.
    • Asignación de un primitivo a un primitivo, sObject o colección.
  • Lista tipificada de valores, llamada también enumeración.
  • Clases de Apex definidas por el usuario.
  • Clases de Apex suministradas por el sistema.

Colecciones de Apex: lista

Las listas contienen una colección ordenada de objetos. Las listas en Apex son equivalentes a conjuntos y ambos elementos se pueden usar de forma intercambiable.

Las dos declaraciones siguientes son equivalentes. La variable colors se declara mediante la sintaxis de lista.

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

De forma alternativa, la variable colors se puede declarar como un conjunto, pero se asigna a una lista en lugar de a un conjunto.

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

En general, es más fácil crear una lista que un conjunto, ya que las listas no requieren que determine por anticipado cuántos elementos necesita asignar.

Puede agregar elementos a una lista en el momento de crearla o después mediante la llamada al método add(). En el primer ejemplo se muestran ambos métodos de adición de elementos a una lista.

// Create a list and add elements to it in one step
List<String> colors = new List<String> { 'red', 'green', 'blue' };

// Add elements to a list after it has been created
List<String> moreColors = new List<String>();
moreColors.add('orange');
moreColors.add('purple');

Los elementos de la lista se pueden leer mediante la especificación de un índice entre corchetes como en el caso de los elementos de un conjunto. Además, puede usar el método get() para leer un elemento de la lista. Este ejemplo se basa en las listas creadas en el ejemplo anterior y en él se muestra cómo leer los elementos de la lista mediante cualquier método. En el ejemplo se muestra además cómo iterar en los elementos del conjunto.

// Get elements from a list
String color1 = moreColors.get(0);
String color2 = moreColors[0];
System.assertEquals(color1, color2);

// Iterate over a list to read elements
for(Integer i=0;i<colors.size();i++) {
    // Write value to the debug log
    System.debug(colors[i]);
}

Más allá de lo básico

Apex admite dos tipos de colecciones: conjunto y asignación. Puede obtener más información sobre esto en la sección de colecciones de la Guía del desarrollador de Apex.

Clases de Apex

Una de las ventajas de las clases de Apex es la reutilización del código. Se puede llamar a métodos de clase mediante desencadenadores y otras clases. El siguiente tutorial es una guía para el almacenamiento de una clase de ejemplo en la organización, el uso de esta clase para el envío de emails y la inspección de registros de depuración.

Guardar una clase de Apex

Guarde la clase EmailManager en la organización:

  1. Abra Developer Console bajo Su nombre o el menú de acceso rápido (Icono de engranaje).
  2. En Developer Console, haga clic en File (Archivo) | New (Nuevo) | Apex Class (Clase de Apex), ingrese EmailManager para el nombre de la clase y haga clic en OK (Aceptar).
  3. Sustituya el cuerpo de clase predeterminado por el ejemplo de clase EmailManager.

    La clase EmailManager tiene un método público (sendMail()) que envía email y usa métodos de mensajería integrados de la biblioteca de clases de Apex. Además, esta clase tiene un método auxiliar privado (inspectResults()), al cual no se puede llamar externamente debido a que es privado, pero se usa solamente en la clase. Este método auxiliar inspecciona los resultados del envío de email y se puede llamar a él mediante sendMail().

    public class EmailManager {
    
        // Public method
        public 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;
        }
    
    }
  4. Pulse Ctrl+S para guardar la clase.

    Más allá de lo básico

    La clase que acaba de guardar usa la programación orientada a objetos (OOP). La clase encapsula los métodos relacionados con la gestión de email. Para ser un ejemplo perfecto de OOP, la clase debe contener además variables de miembro (atributos) y métodos de descriptor de acceso para acceder a estos atributos, aunque para simplificar nuestra clase no incluye estos elementos.

    Salesforce compila la clase al guardarla.

Llamar a un método para el envío de email

Vamos a invocar el método público. Usaremos la ejecución de Apex anónimo para esto. El código Apex anónimo permite ejecutar líneas de código sobre la marcha y es un método útil para invocar Apex y sobre todo para probar la funcionalidad. Se generan resultados del registro de depuración, como en el caso de cualquier otra ejecución de Apex.

Nota

Nota

Hay otros métodos para la invocación de Apex (por ejemplo, mediante desencadenadores). Obtendrá más información sobre los desencadenadores en otro módulo.

  1. En Developer Console, haga clic en Debug (Depuración) | Open Execute Anonymous Window (Abrir ventana de ejecución anónima).
  2. En la ventana que se abre, ingrese lo siguiente. Sustituya 'Your email address' por su dirección de email.
    EmailManager em = new EmailManager();
    em.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
    
  3. Haga clic en Execute (Ejecutar).

    Ahora que el método se ha ejecutado, debe recibir un email en su bandeja de entrada. Compruebe su email.

Inspeccionar registros de depuración

Los registros de depuración son útiles para depurar el código. Al ejecutar métodos de Apex, las llamadas se registran en el registro de depuración. Además, puede escribir sus propios mensajes de depuración en el registro, lo que facilita la depuración del código en caso de errores. El método auxiliar inspectResults(), al que se llama mediante sendMail(), escribe mensajes en el registro mediante el método System.debug() para indicar si la operación de envío de email es correcta o ha generado errores. Puede buscar estos mensajes en el registro de depuración generado al ejecutar el método.

  1. En Developer Console, haga clic en la ficha Logs (Registros) y haga doble clic en el registro más reciente de la lista.
  2. Seleccione Debug Only (Solo depurar) para filtrar el registro de modo que solo se muestren las líneas de registro para las declaraciones System.debug().
    Filtre el registro de depuración en Developer Console para ver los mensajes de depuración.
    Nota

    Nota

    Además, puede filtrar el registro de depuración mediante la búsqueda de cualquier palabra clave en el campo Filter (Filtrar) o la selección de cualquier otra opción. Para obtener más información, consulte la ayuda del inspector de registros.

    Verá el siguiente mensaje en la vista de registro filtrada suponiendo que el email se ha enviado sin errores.

    DEBUG|Email sent successfully.

Llamar a un método estático

Dado que el método sendMail() de nuestra clase no tiene acceso a las variables de miembro de clase, no es necesario que sea un método de instancia. Vamos a cambiarlo a un método estático mediante la adición de la palabra clave static a su declaración. Es más fácil llamar a los métodos estáticos que a los métodos de instancia, ya que no necesitan ser llamados en una instancia de la clase, sino que se llama directamente en el nombre de la clase.

  1. En Developer Console, busque la ficha abierta para la clase EmailManager y modifique la primera línea de la definición del método sendMail() del modo siguiente (el único cambio es la adición de la palabra clave static).
    public static void sendMail(String address, String subject, String body) {
  2. Pulse Ctrl+S para guardar la clase.
  3. Modifique las declaraciones de la ventana de ejecución anónima para llamar al método estático en el nombre de clase.
    EmailManager.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
    
  4. Haga clic en Execute (Ejecutar).

    Una vez ejecutado este método, puede comprobar su email y, de forma opcional, el registro de depuración como en los pasos anteriores.