Saltar al contenido

Mejores prácticas con clases grandes Apex

Solución:

Hay un par de consideraciones de no legibilidad. los primario Sin embargo, las razones son para la legibilidad. Una vez que se acerca a las 100 líneas de código, eso significa que debe realizar un seguimiento de 4 páginas de código. en tu cabeza. Esto no es particularmente práctico, ya que nuestro cerebro simplemente no funciona de esa manera. Normalmente limito mis métodos a 1-2 páginas (25-50 líneas de código).

Una limitación poco común que probablemente nunca haya visto es que los métodos están limitados a 65.536 bytes de código de bytes compilado. En la práctica, cualquier método que se acerque a este límite probablemente será imposible de depurar con precisión y probablemente corra el riesgo de arrojar límites de CPU o de gobernador de pila. Dicho esto, todavía hay un límite estricto en el tamaño de cada método. Una limitación relacionada es que la pila está limitada a 1000 entradas de método. Esto es bastante difícil de alcanzar en casos normales, pero tenga en cuenta el uso de métodos basados ​​en recursividad. Por ejemplo, si escribió el siguiente método:

public Integer sumDivergent(Integer total) {
    return total > 0? sumDivergent(total-1) + total: total;
}

subDivergent (5) sería 15, pero sumDivergent (1000) sería una excepción. En este caso, tendrías que escribirlo como un bucle:

public Integer subDivergent(Integer total) {
    Integer result = 0;
    while(total-->0) {
        result += total;
    }
    return result;
}

En segundo lugar, todo su código se compila con frecuencia, ya que se invalida a partir de los dos sistemas de caché que existen. Esta invalidación ocurre, por ejemplo, cuando se cambia una clase relacionada o se modifican ciertos tipos de metadatos. Una vez invalidado, el sistema espera hasta la próxima vez que la clase deba ejecutarse antes de volver a compilar el código, lo que significa, por ejemplo, que una página de Visualforce tomará una carga inusualmente larga o que un registro podría tardar más en guardarse. Hacer que su código sea lo más conciso posible reducirá estos problemas periódicos de inicio.

Las clases con grandes cantidades de código o lógica empresarial son lo que los arquitectos y desarrolladores denominan clases de Dios. Este es un anti-patrón. También hace que su código use más memoria cuando se carga. La complejidad hace que sea difícil de mantener, probar y, con frecuencia, crea dependencias innecesarias.

Al dividir la lógica en las clases de Dios en clases más pequeñas:

  • La clase de Dios usa menos memoria (montón) cuando se carga

  • Todo el código es más fácil de mantener

  • Las pruebas se simplifican

Preferiblemente, su código debe factorizarse en “fragmentos” funcionales más pequeños relacionados con un objeto específico o como código que realiza un servicio / propósito específico. Esto hace que su código sea más reutilizable al permitirle llamarlo desde otras clases que necesitan la misma funcionalidad.

Queremos adoptar este enfoque por muchas razones, una de las cuales es aprovechar los patrones de diseño. Otro es la separación de preocupaciones. Estas son algunas de las ventajas de este enfoque:

  • Las clases pequeñas se pueden referenciar fácilmente desde clases de “Fábrica” ​​o “Plantillas” en patrones de creación.

  • Las clases pequeñas son mucho más fáciles de probar.

  • Si se escribe correctamente, las clases pequeñas se pueden desvincular de otras clases.

  • Si está desacoplado, cuando se revisan los métodos, no habrá dependencias que requieran que realice cambios en otras clases (use abstracciones e interfaces cuando sea apropiado).

  • El código se vuelve más reutilizable y se almacena en caché por plataforma si se accede con frecuencia.

    1. Como ejemplo simple, no es necesario incluir una clase contenedora en una clase grande cuando puede tener una clase que puede ser reutilizada por muchas clases del tipo “contenedor (Id, sObject)”. En su lugar, puede llamar al mismo contenedor genérico sin repetir ese código en numerosas clases.

    2. Del mismo modo, no es necesario repetir ciertos tipos de consultas u operaciones CRUD que se pueden factorizar en clases de servicio, selector o dominio.

Le animo a que revise los módulos de Trailhead más nuevos en Apex Enterprise Patterns que cubren las capas de dominios y selectores y la capa de servicios. Si realmente desea comprender estos principios, le recomiendo que lea Force.com Enterprise Architecture de @andrefawcett y también Apex Design Patterns de Jitendra Zaa.

Esta pregunta es extremadamente amplia y basada en opiniones, y probablemente debería cerrarse. Pero aquí están mis dos centavos.

Separación de intereses

El punto básico aquí es que es casi seguro que no separando tus preocupaciones cuando las definiciones de clases y métodos crecen. Sus dos mayores logros al aplicar una filosofía de Separation Of Concerns (Así que cuidado testabilidad y mantenibilidad.

Cuando sus clases y métodos se vuelven monolíticos, es cada vez más probable que estén haciendo demasiado de una vez. Considere el término Unit Test. Lo que me enseñaron durante la revisión del código fue que debemos esforzarnos por mantener nuestras pruebas atómico. Estos términos refuerzan el paradigma SOC. Una vez me dijeron:

Una sola unidad debe ser un cómo o muchos qué.

Puede ser una simplificación excesiva, pero nuevamente SOC se trata de reforzar un paradigma. Casi nunca debería tomar 100 líneas para diseñar una sola cómo. Y a menos que tengas muchos qué, los límites que han establecido deberían cubrir la gran mayoría de escenarios de código.

Algunos ejemplos comunes de combinación de demasiado código en un método:

  • Lógica compleja dentro de un bucle
    • Mueva el procesamiento a su propia función y pase al estado necesario
    • Si hay una gran cantidad de datos relevantes en el alcance, adoptar un enfoque más orientado a objetos puede ayudar a mantener el estado
  • Filtros mezclados con acciones
    • A menudo, con los desencadenantes, por ejemplo, verá un método de acción escrito para realizar también los filtros necesarios. Esta combinación hace que los datos sean mucho más complicados de configurar y verificar.
  • Largo if/else cadenas
    • La mayor parte del tiempo, tal lógica se puede mover a un Map.

Eficiencia

Tenga en cuenta que si bien es probable que el uso Process Builder funcionará lentamente en comparación con los bien afinados y perfectamente optimizados Apex código, no todo Apex se crea igual, y puede haber alguna correlación entre el tamaño de sus métodos y clases, y el rendimiento que obtienen.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *