Crear clases y objetos
Objetivos de aprendizaje
Después de completar esta unidad, podrá:
- Describir la diferencia entre una clase y un objeto.
- Definir un parámetro.
- Explicar las diferencias entre valores devueltos.
Si esta es su primera parada en la ruta Construir habilidades de programación de Apex, se pasó de parada. Dé un paso atrás y vaya al módulo Fundamentos de Apex para administradores. Si ya ganó la insignia de Fundamentos de Apex para administradores, está en el lugar adecuado.
En Fundamentos de Apex para administradores aprendió sobre la sintaxis, las variables, las recopilaciones y las instrucciones condicionales de Apex. También ejecutó algo de código de ejemplo en Developer Console. En este módulo nos centraremos sobre esos conceptos. Empecemos.
¿Qué significa orientado a objetos?
Si leyó algo sobre desarrollo o programación de software, es posible que haya visto el término orientado a objetos: clases orientadas a objetos, conceptos orientados a objetos, programación orientada a objetos. ¿Qué significa orientado a objetos?
En lo referente a lenguajes de programación, orientado a objetos significa que el código se centra en la descripción de objetos. Un objeto puede ser cualquier cosa que tenga características exclusivas, como una persona, una cuenta o incluso una flor. Antes de que puede comprender realmente qué significa orientado a objetos, hay dos cosas que tiene que comprender: las clases y los objetos.
Siga el proceso con Trail Together
¿Desea seguir el proceso con un experto a medida que realiza este paso? Eche un vistazo a este video, parte de la serie Trail Together en Trailhead Live. Encontrará un vínculo a la sesión completa en la sección Recursos.
Clases
Una clase es un plano. Los objetos están basados en clases. Una clase define un conjunto de características y comportamientos que son comunes para todos los objetos de esa clase.
Piense en una flor. Tiene características, como el color y la altura, y tiene comportamientos, como el crecimiento y la marchitez. En una clase de Apex, las características se denominan variables y los comportamientos se llaman métodos.
Características (Variables) |
Comportamientos (Métodos) |
color |
Crecimiento |
height |
Polinización |
maxHeight |
Marchitez |
numberOfPetals |
|
Imagen de un jardín. Aunque las rosas, las lilas y las margaritas tienen colores y alturas diferentes, todas son flores y tienen colores y alturas.
Declaración de una clase
Este código declara (crea) una clase:
Las clases se declaran empleando cuatro partes: el modificador de acceso, la clase de palabra clave, el nombre de la clase y el cuerpo de la clase. El cuerpo (dentro de las llaves { }
), es donde se definen los métodos y las variables de la clase.
Modificador de acceso
Un modificador de acceso es una palabra clave en una declaración de clase o método. El modificador de acceso determina qué otro código de Apex puede ver y utilizar la clase o método. Aunque hay otros modificadores de acceso, public
es el más común. Las clases públicas están disponibles para el resto de las clases de Apex dentro de su organización.
Métodos
Los métodos se definen dentro de una clase. Un método describe los comportamientos heredados por los objetos de esa clase. Una clase puede tener uno o más métodos. La clase Flor tiene tres métodos (comportamientos): grow
(crecimiento), pollinate
(polinización) y wilt
(marchitez).
Un método se declara (se crea) de esta forma:
Parámetros
Cuando se crean métodos, no siempre sabe todos los valores necesarios para ejecutar el código. Muchas veces escribe un método que realiza una tarea, y luego escribe un segundo método para hacer una tarea similar, y así sucesivamente. Al mirar atrás se da cuenta que todos sus métodos hacen casi la misma cosa. Son duplicados con pequeñas variaciones.
Si solo hubiera una forma de proporcionar ingresos variados a un único método. ¡Espere! ¡Podemos utilizar parámetros! Un parámetro es una variable que sirve como marcador de posición, esperando recibir un valor. Los parámetros se declaran de forma parecida a una variable, con un tipo de datos seguido por el nombre del parámetro. En la siguiente declaración, el método wilt
(marchitez) tiene un parámetro denominado numberOfPetals
. (Aunque puede utilizar los nombres de parámetros que guste, es una buena práctica utilizar nombres que describan el valor que alberga el parámetro). El parámetro numberOfPetals
espera recibir un valor cuyo tipo de datos sea un entero.
¿Cómo podemos llamar (utilizar) el método wilt
(marchitez)? En este ejemplo de código, la primera línea llama (utiliza) el método y pasa (envía) el valor 4
. El valor que pasa se denomina argumento. El argumento (4
, en este caso) se encierra entre paréntesis después del nombre del método.
wilt(4); public static void wilt(Integer numberOfPetals){ system.debug(numberOfPetals); }
Después de que se pase un valor a un método que incluye un parámetro, el valor del argumento se convierte en el valor del parámetro. El parámetro funciona como una variable, de modo que puede manipularlo como cualquier otra variable.
Veamos la clase Flor.
public class Flower { public static void wilt(Integer numberOfPetals){ if(numberOfPetals >= 1){ numberOfPetals--; } } }
En las líneas 2-6 de la clase Flower
(Flor), el método wilt
(marchitez) comprueba el valor de numberOfPetals
. Si ese número es mayor o igual a 1
, entonces el método wilt
(marchitez) decrementa (reduce) numberOfPetals
en uno.
Tipos de valores devueltos
Imagine que está en un restaurante y desea saber si tienen un plato de temporada. Pregunta al mesero “¿Tienen ensalada de verano?” Espera un tipo de respuesta en particular, no un número o una frase completa, sino “sí” o “no”.
Una declaración de método debe especificar explícitamente su tipo de valor devuelto esperado. Del mismo modo que un argumento debe coincidir con el tipo de datos especificado por el parámetro, una variable devuelta debe coincidir con el tipo de valor devuelto especificado por la declaración del método. El tipo de valor devuelto es un tipo de datos específico, como booleano, cadena o cuenta, o puede ser void (nada), como esto:
public static void wilt(Integer numberOfPetals){ system.debug(numberOfPetals); }
Cuando el tipo de valor devuelto es void
, el método no devuelve un valor. Para devolver un valor, sustituya void
tipo de valor devuelto diferente.
Por ejemplo, aquí, el método wilt
(marchitez) espera un valor return
(respuesta) que sea un número entero.
public static Integer wilt(Integer numberOfPetals){ if(numberOfPetals >= 1){ numberOfPetals--; } return numberOfPetals; }
En la línea 1, el tipo de devolución Integer
(inmediatamente después de public static
) indica que el método devuelve un valor que es un número entero. La línea 6 utiliza la declaración return
, seguida del nombre de variable numberOfPetals
, para devolver el valor de numberOfPetals
resultante. Cuando un método devuelve un valor de variable, el tipo de datos de la variable debe coincidir con el tipo de valor devuelto que declaró el método. En este caso, el método wilt
(marchitez) se espera que devuelva un valor entero y la variable numberOfPetals
es un entero.
Probemos los métodos marchitez
, crecimiento
y polinización
. En primer lugar, terminamos de codificar los métodos.
Escribir los métodos
- En Developer Console, haga clic en File (Archivo) | New (Nuevo) | Apex Class (Clase de Apex).
- Ingrese
Flower
(Flor) para el nombre de la clase. - Haga clic en Aceptar.
- En Flor.apxc class, sustituya el código existente por este código:
public class Flower { // class variables: public String color; public Integer height; public Integer maxHeight; public Integer numberOfPetals; public static Integer wilt(Integer numberOfPetals){ if(numberOfPetals >= 1){ numberOfPetals--; } return numberOfPetals; } public static void grow(Integer height, Integer maxHeight){ height = height + 2; if(height >= maxHeight){ pollinate(); } } public static void pollinate(){ System.debug('Pollinating...'); } }
- Haga clic en File (Archivo) | Save (Guardar).
Ahora que tiene una clase completamente definida, está listo para probarla. Todo lo que necesita es el nombre de la clase (Flower
(Flor)), los métodos que desea probar (wilt
(marchitez) y grow
(crecimiento)) y los argumentos requeridos del método. Debido a que el método crecimiento llama (utiliza) al método polinización, no necesita llamar al método polinización directamente. El método wilt
(marchitez) espera un valor entero (para el parámetro numberOfPetals
) y devolverá un valor entero. Los métodos grow
(crecimiento) y pollinate
(polinización) no devuelven nada.
Ejecutar los métodos
- Haga clic en Debug (Depurar) | Open Execute Anonymous Window (Abrir ventana de ejecución anónima).
- En la ventana Enter Apex Code (Ingresar código de Apex), pegue este código:
Flower.wilt(4); Flower.grow(5, 7);
- Seleccione Open Log (Abrir registro) y, a continuación, haga clic en Execute (Ejecutar). Se abre Execution Log (Registro de ejecución), mostrando el resultado de la ejecución de su código.
- Seleccione Debug Only (Solo depurar).
El método pollinate
(crecimiento) incluye dos parámetros, height
y maxHeight
.
Flower.grow(5, 7);
pasa los argumentos 5
(altura es 5 pulgadas) y 7
(altura máxima es 7 pulgadas) al método grow
(crecimiento). El método grow
(crecimiento) agrega 2 a la variable height
(línea 9) y luego comprueba el valor de la variable height
. Si el valor de la variable height es mayor o igual al valor de la variable maxHeight, el método crecimiento llama al método polinización.
El método polinización no devuelve nada porque su tipo de valor devuelto es nulo.
¿Qué ocurrió?
Debería ver una entrada en el registro de depuración.
¿Qué espera que ocurra si utiliza 2 y 6 para los parámetros de crecimiento? Pruébelo.
¿Qué ocurre?
Mirando los registros de depuración parece que nada. Lo que está ocurriendo es que al establecer height en 2 y maxHeight en 6 hace que la condición de la instrucción if sea falsa, provocando que el método pollinate
(polinización) no se ejecute.
Objetos
Recuerde que la clase Flower
(Flor) es un plano para crear flores. Tiene las variables color
, height
, maxHeight
y numberOfPetals
. Estas variables son iguales a null (sin valor), pero pueden tener valores predeterminados.
Un objeto es una instancia de una clase. Del mismo modo que los niños heredan rasgos genéticos, como el color de los ojos y la altura de sus padres, los objetos heredan variables y métodos de sus clases.
color = null;
height = null;
maxHeight = null;
numberOfPetals = null;
|
Clase Flor
|
crecimiento()
polinización()
marchitez()
|
|
|
|
color = 'amarillo'; |
color ='rojo'; |
color = 'amarillo'; |
height = 3; |
height = 6; |
height = 9; |
maxHeight = 6; |
maxHeight = 8; |
maxHeight = 9; |
numberOfPetals = 4; |
numberOfPetals = 6; |
numberOfPetals = 10; |
Flower tulip = new Flower(); |
Flower rose = new Flower(); |
Flower peony = new Flower(); |
El objeto tulip
(tulipán) es una instancia de la clase Flower
(Flor). Cada uno de los tres objetos de flores es una flor específica basada en la clase Flower
(Flor). Para crear una instancia denominada tulipán
, basada en la clase Flower
(Flor), utilice esta sintaxis:
Flower tulip = new Flower();
Puede utilizar la notación de puntos para llamar los métodos de un objeto. Solo tiene que agregar .method();
después del nombre del objeto. Por ejemplo:
tulip.grow();
Ahora sabe que los objetos son instancias de clases. Dentro de una clase, las variables describen el objeto y los métodos definen las acciones que el objeto puede realizar. También trabajó con los parámetros para recibir valores pasados en una variable y los tipos de valores devueltos, que envían algo (o nada, dependiendo del tipo de datos) de vuelta a un método.
Recursos
-
Trailhead Live: Trail Together: Programación orientada a objetos para administradores
- Guía del desarrollador de Apex: Apex List Methods
- Apex Developer Guide: Apex Boolean Methods
- Vínculo externo Understand Object-Oriented Programming
- Guía del desarrollador de Apex: Definición de clases de Apex
- Guía del desarrollador de Apex: Variables de clases
- Guía del desarrollador de Apex: Métodos de clases
- Guía del desarrollador de Apex: Métodos estáticos y de instancia, variables y código de inicialización