Apex Academy
Módulo 5·01·24 min

Clases y objetos

Una clase es la definición de un objeto en Object Manager; un objeto es un registro. Ahora vas a crear tus propias definiciones, con sus campos y sus acciones.

En Admin esDefinir un objeto personalizado (campos + acciones) y crear registros con él

✓ En esta sub-lección

  1. 01Escribir una clase con atributos y un método que devuelve un valor.
  2. 02Crear instancias con new y leer o cambiar sus atributos con el punto.
  3. 03Explicar por qué cada instancia tiene sus propios valores.

La nutria: ¿Te acuerdas? · Repaso del Módulo 4

¿Qué hace Database.update(escalated, false) si uno de 200 casos no se puede actualizar?

Hasta ahora has usado objetos que Salesforce ya había definido: Account, Opportunity, Case. En el Módulo 1 viste que Account es un molde y que new Account() fabrica una fila nueva. Esta lección da el paso siguiente: escribir tus propios moldes. Eso es una , y es la base de todo el código Apex que existe en una org.

La nutria: El paralelo de Admin

Así lo entendí yo: cuando creas un objeto personalizado en Object Manager, defines sus campos y, con botones y acciones, lo que se puede hacer con él. Todavía no existe ningún registro: solo la definición. Después, cada registro que alguien crea tiene sus propios valores en esos campos. Clase = la definición. Objeto o = un registro.

LA CLASE · el molde, una vez

  • Stringsubject
  • DecimalhoursSpent
  • BooleanisBillable
  • Decimalcost(rate)

migration · objeto

  • subject'Migración de datos'
  • hoursSpent6
  • isBillabletrue

Cada new fabrica un objeto nuevo con los mismos campos y sus propios valores, como cada registro de un objeto de Object Manager. Fabrica dos o tres y luego llama al método.

Una clase, muchas instancias. Todas tienen los mismos campos; cada una, sus propios valores.

Anatomía de una clase

Apex
public class ServiceTicket {

    // Atributos: los «campos» de la clase
    public String subject;
    public Decimal hoursSpent;
    public Boolean isBillable;

    // Método: una «acción» que usa los atributos
    public Decimal cost(Decimal hourlyRate) {
        if (isBillable != true || hoursSpent == null) {
            return 0;
        }
        return hoursSpent * hourlyRate;
    }
}
public delante de cada pieza permite usarla desde fuera de la clase. Qué significa exactamente, y cuándo no ponerlo, lo verás en Access Modifiers.
  • public class ServiceTicket { … } declara la clase. Su nombre empieza por mayúscula, como Account: es un tipo.
  • Los atributos se declaran como las variables del Módulo 1, pero dentro de la clase. Todavía no tienen valor: cada instancia pondrá el suyo.
  • Un método tiene tipo de retorno (Decimal), nombre (cost), parámetros entre paréntesis (Decimal hourlyRate) y un bloque. return devuelve el valor y termina el método.
  • Si un método no devuelve nada, su tipo de retorno es void, como el de System.debug.

Fabricar y usar objetos

Apex
ServiceTicket migration = new ServiceTicket();
migration.subject = 'Migración de datos';
migration.hoursSpent = 6;
migration.isBillable = true;

ServiceTicket training = new ServiceTicket();
training.subject = 'Formación interna';
training.hoursSpent = 3;
training.isBillable = false;

System.debug(migration.cost(80));   // 480
System.debug(training.cost(80));    // 0
new ServiceTicket() fabrica una instancia. El punto entra en ella: migration.subject es el campo de esa instancia; migration.cost(80) ejecuta su acción.

El mismo método da resultados distintos porque cada instancia tiene sus propios valores: cuando cost() lee hoursSpent, lee el de la instancia sobre la que lo llamaste. Es lo mismo que un campo fórmula: una única definición, un resultado distinto en cada registro.

Una clase no es un objeto personalizado

Es la confusión número uno de un Admin que empieza con Apex. Un objeto personalizado crea una tabla: sus registros se guardan y salen en vistas de lista e informes. Una clase no crea nada de eso: es un molde que vive en el código, y sus objetos existen en memoria mientras dura la transacción. Si quieres que algo quede guardado, pasas los datos a un sObject y haces DML, como en el Módulo 4.

En Object ManagerEn una clase de ApexLa diferencia
CamposAtributosLos atributos no se guardan solos en la base de datos.
Campo fórmulaMétodo que calcula y devuelveEl método puede hacer mucho más que una fórmula: bucles, consultas, otros objetos.
RegistroObjeto (instancia)La instancia vive en memoria; el registro, en la base de datos.
Vista de lista, informe, layoutSin equivalenteEl usuario no ve tus objetos hasta que los muestras en una pantalla o los guardas.

La nutria: Entonces, ¿para qué sirve una clase?

Yo me lo pregunté también. Sirve para todo lo que no merece una tabla: un cálculo que se repite en varios sitios, un resultado intermedio que junta datos de tres objetos, una regla de negocio con nombre propio. Piensa en las veces que creaste un campo fórmula o un campo oculto solo para que un flow pudiera hacer una cuenta: con Apex, eso vive en una clase y no ensucia el modelo de datos que ven los usuarios.

El encargo de este módulo

La nutria: Las doce piezas, en el orden en que se construyen

Salgo de la reunión con Northwind con la lista de su motor comercial, en el orden en que lo vamos a construir: el coste de las horas de implantación · la renovación preparada desde la oportunidad de este año · el plan de soporte que nace completo · ese mismo plan, limpio · los precios calculados igual en todas partes · el presupuesto de campaña que nadie se salta · los avisos · los descuentos · el formato de las cifras para Finanzas · la puntuación de leads nuevos · el reparto de casos por nivel · y las comisiones del trimestre. Es como diseñar una app en Object Manager: primero los objetos sencillos, luego los que se apoyan en ellos.

La nutria: ¿Y por qué no un Flow? Porque en Flow no hay clases

Con franqueza: este módulo es de fundamentos, como el 1 y el 2. Flow no tiene clases, herencia ni interfaces; lo más parecido son los subflows, y cada uno vive por su cuenta. Lo aprendes porque todo lo que viene está hecho de clases: el handler de un trigger, un proceso nocturno, un test. Donde el motor sí choca con Flow (reglas que cambian cada trimestre) te lo señalo en su lección.