Εκμάθηση Salesforce Apex για αρχάριους
⚡ Έξυπνη Σύνοψη
Ο προγραμματισμός Apex παρέχει στους προγραμματιστές της Salesforce μια αντικειμενοστρεφή, έντονα τυπογραφική γλώσσα για την προσθήκη προσαρμοσμένης επιχειρηματικής λογικής στο CRM. Υποστηρίζει κλάσεις, ενεργοποιητές και εργασίες δέσμης, ενώ τα όρια governor διατηρούν σταθερή την κοινόχρηστη πλατφόρμα πολλαπλών μισθωτών.

Τι είναι το Apex στο Salesforce;
Κορυφή είναι μια αντικειμενοστρεφής και έντονα τυποποιημένη γλώσσα προγραμματισμού που αναπτύχθηκε από την Salesforce για την ανάπτυξη εφαρμογών Λογισμικού ως Υπηρεσίας (SaaS) και Διαχείρισης Σχέσεων Πελατών (CRM). Η Apex βοηθά τους προγραμματιστές να δημιουργούν εφαρμογές SaaS τρίτων και να προσθέτουν επιχειρηματική λογική σε συμβάντα συστήματος παρέχοντας υποστήριξη βάσης δεδομένων back-end και διεπαφές πελάτη-διακομιστή.
Το Apex βοηθά τους προγραμματιστές να προσθέτουν επιχειρηματική λογική σε συμβάντα συστήματος, όπως κλικ σε κουμπιά, σχετικές ενημερώσεις εγγραφών και σελίδες Visualforce. Το Apex έχει μια σύνταξη παρόμοια με Java. Εγγραφείτε στο Salesforce για να μάθετε πώς λειτουργεί το CRM.
Χαρακτηριστικά της γλώσσας προγραμματισμού Apex
Ακολουθούν τα σημαντικά χαρακτηριστικά του Salesforce Apex:
- Η Apex είναι μια γλώσσα που δεν διακρίνει πεζά-κεφαλαία.
- Μπορείτε να εκτελέσετε λειτουργίες DML όπως INSERT, UPDATE, UPSERT και DELETE σε εγγραφές sObject χρησιμοποιώντας το Apex.
- Μπορείτε να υποβάλετε ερωτήματα σε εγγραφές sObject χρησιμοποιώντας SOQL (Salesforce Object Query Language) και SOSL (Salesforce Object Search Language) στο Apex.
- Σας επιτρέπει να δημιουργήσετε ένα δοκιμή μονάδας και εκτελέστε το για να επαληθεύσετε το κάλυψη κώδικα και την αποτελεσματικότητα του κώδικα στο Apex.
- Το Apex εκτελεί σε περιβάλλον πολλαπλών ενοικιαστών και Salesforce έχει ορίσει όρια ρυθμιστή που εμποδίζουν έναν χρήστη να μονοπωλεί τους κοινόχρηστους πόρους. Οποιοσδήποτε κώδικας που υπερβαίνει ένα όριο ρυθμιστή Salesforce αποτυγχάνει και εμφανίζεται ένα σφάλμα.
- Ένα αντικείμενο Salesforce μπορεί να χρησιμοποιηθεί ως τύπος δεδομένων στο Apex. Για παράδειγμα:
Account acc = new Account();
Εδώ, το Account είναι ένα τυπικό αντικείμενο Salesforce.
- Το Apex αναβαθμίζεται αυτόματα με κάθε κυκλοφορία του Salesforce.
Πότε πρέπει ένας προγραμματιστής να επιλέξει το Apex;
Ο κώδικας Apex θα πρέπει να γράφεται μόνο εάν ένα επιχειρηματικό σενάριο είναι πολύ περίπλοκο για να υλοποιηθεί χρησιμοποιώντας την προκατασκευασμένη λειτουργικότητα point-and-click που παρέχεται από το Salesforce.
Ακολουθούν μερικά σενάρια όπου πρέπει να γράψετε κώδικα Apex:
- Για να δημιουργήσετε υπηρεσίες web που ενσωματώνουν το Salesforce με άλλες εφαρμογές.
- Για την εφαρμογή προσαρμοσμένης επικύρωσης σε sObjects.
- Για την εκτέλεση προσαρμοσμένης λογικής Apex όταν εκτελείται μια λειτουργία DML.
- Για την υλοποίηση λειτουργικότητας που δεν μπορεί να δημιουργηθεί με υπάρχοντα δηλωτικά εργαλεία αυτοματισμού, όπως το Flow.
- Για να ρυθμίσετε υπηρεσίες ηλεκτρονικού ταχυδρομείου που επεξεργάζονται το περιεχόμενο, τις κεφαλίδες και τα συνημμένα των εισερχόμενων μηνυμάτων ηλεκτρονικού ταχυδρομείου.
Μόλις καταλάβετε πότε το Apex είναι η σωστή επιλογή, το επόμενο βήμα είναι να κατανοήσετε τι συμβαίνει στον κώδικά σας αφού τον αποθηκεύσετε.
Δομή εργασίας του Apex
Ακολουθεί η ροή των ενεργειών για τον κώδικα Apex:
- Ενέργεια Προγραμματιστή: Όταν ο προγραμματιστής αποθηκεύει κώδικα στην πλατφόρμα, όλος ο κώδικας του Apex μεταγλωττίζεται σε ένα σύνολο οδηγιών που μπορεί να κατανοήσει ο διερμηνέας χρόνου εκτέλεσης του Apex και αυτές οι οδηγίες αποθηκεύονται στη συνέχεια ως μεταδεδομένα στην πλατφόρμα.
- Ενέργεια Τελικού Χρήστη: Όταν ένα συμβάν χρήστη εκτελεί κώδικα Apex, ο διακομιστής πλατφόρμας ανακτά τις μεταγλωττισμένες οδηγίες από τα μεταδεδομένα και τις εκτελεί μέσω του διερμηνέα Apex πριν επιστρέψει το αποτέλεσμα.
Το παρακάτω διάγραμμα δείχνει πώς οι ενέργειες του προγραμματιστή και του τελικού χρήστη αλληλεπιδρούν με τον διακομιστή εφαρμογών της πλατφόρμας Lightning:
Περιβάλλον Ανάπτυξης Apex
Ο κώδικας Apex μπορεί να αναπτυχθεί είτε σε ένα sandbox είτε σε έναν οργανισμό έκδοσης προγραμματιστών του Salesforce.
Είναι βέλτιστη πρακτική η ανάπτυξη του κώδικα σε περιβάλλον sandbox και στη συνέχεια η ανάπτυξή του στο περιβάλλον παραγωγής, όπως φαίνεται παρακάτω:
Εργαλεία ανάπτυξης κώδικα Apex: Ακολουθούν τα τρία εργαλεία που είναι διαθέσιμα για την ανάπτυξη κώδικα Apex σε όλες τις εκδόσεις του Salesforce:
- Κονσόλα προγραμματιστή
- Visual Studio Code με το Salesforce Extension Pack (αυτό αντικαθιστά το αποσυρθέν Force.com IDE)
- Code πρόγραμμα επεξεργασίας στο περιβάλλον χρήστη του Salesforce Setup
Έχοντας έτοιμο το περιβάλλον σας, ας δούμε τα δομικά στοιχεία της ίδιας της γλώσσας, ξεκινώντας με τους τύπους δεδομένων.
Τύποι δεδομένων στο Apex
Ακολουθούν οι τύποι δεδομένων που υποστηρίζονται από το Apex:
Πρωτόγονος
Ακέραιος αριθμός, Double, Long, Date, Datetime, Decimal, Time, Blob, String, ID και Boolean θεωρούνται πρωτόγονοι τύποι δεδομένων. Όλοι οι πρωτόγονοι τύποι δεδομένων διαβιβάζονται κατά τιμή, όχι κατά αναφορά.
Συλλογές
Τρεις τύποι συλλογών είναι διαθέσιμοι στο Apex:
- Λίστα: Είναι μια ταξινομημένη συλλογή από primitives, sObjects, συλλογές ή αντικείμενα Apex που βασίζονται σε δείκτες.
- Σειρά: Μια μη ταξινομημένη συλλογή μοναδικών στοιχείων που δεν περιέχει διπλότυπα.
- Χάρτης: Είναι μια συλλογή από μοναδικά κλειδιά που αντιστοιχίζονται σε μεμονωμένες τιμές, οι οποίες μπορεί να είναι primitives, sObjects, συλλογές ή αντικείμενα Apex.
sΑντικείμενο
Αυτός είναι ένας ειδικός τύπος δεδομένων στο Salesforce. Είναι παρόμοιο με ένα τραπέζι σε SQL και περιέχει πεδία που είναι παρόμοια με τις στήλες στην SQL.
Τα ποσά
Ένα Enum είναι ένας κοιλιακόςtracΤύπος δεδομένων t που αποθηκεύει μία τιμή από ένα πεπερασμένο σύνολο καθορισμένων αναγνωριστικών.
Κλάσεις, Αντικείμενα και Διεπαφές
Οι κλάσεις και οι διεπαφές Apex που ορίζονται από τον χρήστη μπορούν επίσης να χρησιμοποιηθούν ως τύποι δεδομένων. Ένα αντικείμενο αναφέρεται σε μια παρουσία οποιουδήποτε τύπου δεδομένων που υποστηρίζεται στο Apex.
Σύνταξη Apex
Μεταβλητή δήλωση
Καθώς η Apex είναι μια γλώσσα με ισχυρούς τύπους, είναι υποχρεωτικό να δηλώσετε μια μεταβλητή με τύπο δεδομένων στην Apex.
Για παράδειγμα:
Contact con = new Contact();
Εδώ η μεταβλητή con δηλώνεται με τύπο δεδομένων Contact.
Ερώτημα SOQL
Το SOQL σημαίνει Salesforce Object Query Language. Το SOQL χρησιμοποιείται για την ανάκτηση εγγραφών sObject από τη βάση δεδομένων Salesforce. Για παράδειγμα:
Account acc = [SELECT Id, Name FROM Account LIMIT 1];
Το παραπάνω ερώτημα ανακτά μια εγγραφή λογαριασμού από τη βάση δεδομένων Salesforce.
Δήλωση βρόχου
Μια εντολή βρόχου χρησιμοποιείται για την επανάληψη των εγγραφών σε μια λίστα. Ο αριθμός των επαναλήψεων είναι ίσος με τον αριθμό των εγγραφών στη λίστα. Για παράδειγμα:
List<Account> listOfAccounts = [SELECT Id, Name FROM Account LIMIT 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
//your logic
}
Στο παραπάνω τμήμα κώδικα, η listOfAccounts είναι μια μεταβλητή του τύπου δεδομένων List.
Δήλωση ελέγχου ροής
Μια εντολή ελέγχου ροής είναι χρήσιμη όταν θέλετε να εκτελέσετε ορισμένες γραμμές κώδικα με βάση ορισμένες συνθήκες.
Για παράδειγμα:
List<Account> listOfAccounts = [SELECT Id, Name FROM Account LIMIT 100];
// execute the logic if the size of the account list is greater than zero
if(listOfAccounts.size() > 0){
//your logic
}
Το παραπάνω απόσπασμα κώδικα υποβάλλει ερωτήματα σε εγγραφές λογαριασμών από τη βάση δεδομένων και ελέγχει το μέγεθος της λίστας.
Δήλωση DML
Το DML σημαίνει Data Manipulation Language (Γλώσσα Χειρισμού Δεδομένων). Οι εντολές DML χρησιμοποιούνται για τον χειρισμό δεδομένων στη βάση δεδομένων Salesforce. Για παράδειγμα:
Account acc = new Account(Name = 'Test Account'); insert acc; //DML statement to create account record.
Προδιαγραφές πρόσβασης Apex
Ακολουθούν οι προσδιοριστές πρόσβασης που υποστηρίζονται από το Apex:
Δημόσιο
Αυτός ο προσδιοριστής πρόσβασης παρέχει πρόσβαση σε μια κλάση, μέθοδο ή μεταβλητή που θα χρησιμοποιηθεί από το Apex μέσα σε έναν χώρο ονομάτων.
Private
Αυτός ο προσδιοριστής πρόσβασης παρέχει πρόσβαση σε μια κλάση, μέθοδο ή μεταβλητή που θα χρησιμοποιηθεί τοπικά ή εντός της ενότητας κώδικα όπου έχει οριστεί. Όλες οι μέθοδοι και οι μεταβλητές που δεν έχουν ορισμένο προσδιοριστή πρόσβασης λαμβάνουν τον προεπιλεγμένο προσδιοριστή πρόσβασης, private.
Προστατευόμενη
Αυτός ο προσδιοριστής πρόσβασης δίνει πρόσβαση σε μια μέθοδο ή μεταβλητή που θα χρησιμοποιηθεί από οποιεσδήποτε εσωτερικές κλάσεις εντός της καθοριστικής κλάσης Apex.
Παγκόσμιο
Αυτός ο προσδιοριστής πρόσβασης παρέχει πρόσβαση σε μια κλάση, μέθοδο ή μεταβλητή που θα χρησιμοποιηθεί από το Apex εντός ενός χώρου ονομάτων, καθώς και εκτός του χώρου ονομάτων. Είναι βέλτιστη πρακτική να μην χρησιμοποιείτε την καθολική λέξη-κλειδί, εκτός εάν είναι απαραίτητο.
Λέξεις-κλειδιά στο Apex
Με κοινή χρήση
Εάν μια κλάση οριστεί με αυτήν τη λέξη-κλειδί, τότε επιβάλλονται όλοι οι κανόνες κοινής χρήσης που ισχύουν για τον τρέχοντα χρήστη. Εάν αυτή η λέξη-κλειδί απουσιάζει, ο κώδικας εκτελείται σε περιβάλλον συστήματος.
Για παράδειγμα:
public with sharing class MyApexClass{
// sharing rules enforced when code in this class executes
}
Χωρίς κοινή χρήση
Εάν μια κλάση οριστεί με αυτήν τη λέξη-κλειδί, τότε οι κανόνες κοινής χρήσης που ισχύουν για τον τρέχοντα χρήστη δεν επιβάλλονται.
Για παράδειγμα:
public without sharing class MyApexClass{
// sharing rules are not enforced when code in this class executes
}
Στατικός
Μια μεταβλητή ή μέθοδος που ορίζεται με τη λέξη-κλειδί static αρχικοποιείται μία φορά και συσχετίζεται με την κλάση. Οι στατικές μεταβλητές και οι μέθοδοι μπορούν να κληθούν απευθείας με το όνομα της κλάσης χωρίς να δημιουργηθεί μια παρουσία της κλάσης.
τέλος
Μια σταθερά ή μια μέθοδος που ορίζεται με την τελική λέξη-κλειδί δεν μπορεί να παρακαμφθεί. Για παράδειγμα:
public class myCls {
static final Integer INT_CONST = 10;
}
Εάν προσπαθήσετε να παρακάμψετε την τιμή αυτής της μεταβλητής INT_CONST, θα εμφανιστεί η εξαίρεση – System.FinalException: Η μεταβλητή Final έχει ήδη αρχικοποιηθεί.
απόδοση
Αυτή η λέξη-κλειδί επιστρέφει μια τιμή από μια μέθοδο. Για παράδειγμα:
public String getName() {
return 'Test';
}
Null
Ορίζει μια μηδενική σταθερά και μπορεί να αντιστοιχιστεί σε μια μεταβλητή. Για παράδειγμα:
Boolean b = null;
Πραγματικός
Εάν μια κλάση ορίζεται με την εικονική λέξη-κλειδί, μπορεί να επεκταθεί και να παρακαμφθεί.
Abstract
Αν μια κλάση ορίζεται με το abstracλέξη-κλειδί t, πρέπει να περιέχει τουλάχιστον μία μέθοδο με τη λέξη-κλειδί abstract, και αυτή η μέθοδος θα πρέπει να έχει μόνο μια υπογραφή.
Για παράδειγμα:
public abstract class MyAbstractClass {
abstract Integer myAbstractMethod1();
}
Apex String
Μια συμβολοσειρά είναι ένα σύνολο χαρακτήρων χωρίς όριο χαρακτήρων. Για παράδειγμα:
String name = 'Test';
Υπάρχουν αρκετές ενσωματωμένες μέθοδοι που παρέχονται από την κλάση String στο Salesforce. Ακολουθούν μερικές μέθοδοι που χρησιμοποιούνται συχνά:
συντομογραφία (maxWidth)
Αυτή η μέθοδος περικόπτει μια συμβολοσειρά στο καθορισμένο μήκος και την επιστρέφει εάν το μήκος της δεδομένης συμβολοσειράς είναι μεγαλύτερο από το καθορισμένο μήκος. Διαφορετικά, επιστρέφει την αρχική συμβολοσειρά. Εάν η τιμή της μεταβλητής maxWidth είναι μικρότερη από 4, αυτή η μέθοδος δημιουργεί μια εξαίρεση χρόνου εκτέλεσης – System.StringException: Το ελάχιστο πλάτος συντομογραφίας είναι 4.
Για παράδειγμα:
String s = 'Hello World';
String s2 = s.abbreviate(8);
System.debug('s2: ' + s2); //Hello...
κεφαλοποιώ()
Αυτή η μέθοδος μετατρέπει το πρώτο γράμμα μιας συμβολοσειράς σε περίπτωση τίτλου και το επιστρέφει.
Για παράδειγμα:
String s = 'hello';
String s2 = s.capitalize();
System.assertEquals('Hello', s2);
περιέχει (υποσυμβολοσειρά)
Αυτή η μέθοδος επιστρέφει true εάν η συμβολοσειρά που καλεί τη μέθοδο περιέχει την καθορισμένη δευτερεύουσα συμβολοσειρά.
String name1 = 'test1';
String name2 = 'test';
Boolean flag = name1.contains(name2);
System.debug('flag:: ' + flag); //true
ισοδυναμεί (stringOrId)
Αυτή η μέθοδος επιστρέφει true εάν η παράμετρος που περνάει δεν είναι null και αντιπροσωπεύει την ίδια δυαδική ακολουθία χαρακτήρων με τη συμβολοσειρά που καλεί τη μέθοδο.
Κατά τη σύγκριση τιμών Id, τα μήκη των ID ενδέχεται να μην είναι ίσα. Για παράδειγμα, εάν μια συμβολοσειρά που αντιπροσωπεύει ένα ID 15 χαρακτήρων συγκριθεί με ένα αντικείμενο που αντιπροσωπεύει ένα ID 18 χαρακτήρων, αυτή η μέθοδος εξακολουθεί να επιστρέφει την τιμή true. Για παράδειγμα:
String stringValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result = stringValue15.equals(idValue18);
System.debug('result: ' + result); //true
Στο παραπάνω παράδειγμα, η μέθοδος equals συγκρίνει ένα αναγνωριστικό αντικειμένου 15 χαρακτήρων με ένα αναγνωριστικό αντικειμένου 18 χαρακτήρων και, εάν και τα δύο αναγνωριστικά αντιπροσωπεύουν την ίδια δυαδική ακολουθία, επιστρέφει την τιμή true.
Χρησιμοποιήστε αυτή τη μέθοδο για να κάνετε συγκρίσεις με διάκριση πεζών-κεφαλαίων.
escapeSingleQuotes(stringToEscape)
Αυτή η μέθοδος προσθέτει έναν χαρακτήρα διαφυγής (\) πριν από οποιοδήποτε μονό εισαγωγικό σε μια συμβολοσειρά και επιστρέφει το αποτέλεσμα. Αυτή η μέθοδος αποτρέπει την εισαγωγή SOQL κατά τη δημιουργία ενός δυναμικού ερωτήματος SOQL. Διασφαλίζει ότι όλα τα μονά εισαγωγικά αντιμετωπίζονται ως περικλείουσες συμβολοσειρές αντί για εντολές βάσης δεδομένων.
Για παράδειγμα:
String s = 'Hello \'Tom\''; String escapedStr = String.escapeSingleQuotes(s); System.debug(escapedStr); // Outputs Hello \'Tom\'
αφαίρεση (υποσυμβολοσειρά)
Αυτή η μέθοδος αφαιρεί όλες τις εμφανίσεις της αναφερόμενης υποσυμβολοσειράς από τη συμβολοσειρά που καλεί τη μέθοδο και επιστρέφει τη συμβολοσειρά που προκύπτει.
Για παράδειγμα:
String s1 = 'Salesforce and force.com';
String s2 = s1.remove('force');
System.debug('s2: ' + s2); // 'Sales and .com'
υποσυμβολοσειρά (startIndex)
Αυτή η μέθοδος επιστρέφει μια δευτερεύουσα συμβολοσειρά που ξεκινά από τον χαρακτήρα στο startIndex και εκτείνεται μέχρι το τέλος της συμβολοσειράς.
Για παράδειγμα:
String s1 = 'hamburger';
String s2 = s1.substring(3);
System.debug('s2: ' + s2); //burger
ΑΝΤΙΣΤΡΟΦΗ()
Αυτή η μέθοδος αντιστρέφει όλους τους χαρακτήρες μιας συμβολοσειράς και την επιστρέφει. Για παράδειγμα:
String s = 'Hello';
String s2 = s.reverse();
System.debug('s2:::: ' + s2); // olleH
τακτοποίηση()
Αυτή η μέθοδος αφαιρεί όλα τα αρχικά και τα τελικά κενά διαστήματα από μια συμβολοσειρά και την επιστρέφει.
valueOf(toConvert)
Αυτή η μέθοδος επιστρέφει την αναπαράσταση συμβολοσειράς του αντικειμένου που διαβιβάστηκε.
Οι συμβολοσειρές, οι κλάσεις και οι λέξεις-κλειδιά συνδυάζονται όταν ξεκινάτε τη συσκευασία της λογικής σε επαναχρησιμοποιήσιμες μονάδες, κάτι που ακριβώς χρησιμεύει στις κλάσεις Apex.
Apex Class
Μια κλάση Apex είναι ένα σχέδιο ή πρότυπο από το οποίο δημιουργούνται αντικείμενα. Ένα αντικείμενο είναι μια παρουσία μιας κλάσης.
Υπάρχουν τρεις τρόποι δημιουργίας κλάσεων Apex στο Salesforce:
- Κονσόλα προγραμματιστή
- Visual Studio Code με το πακέτο επέκτασης Salesforce
- Σελίδα λεπτομερειών κλάσης Apex στο Setup
Στο Apex, μπορείτε να ορίσετε μια εξωτερική κλάση, η οποία ονομάζεται επίσης κλάση ανώτατου επιπέδου, και μπορείτε επίσης να ορίσετε κλάσεις μέσα σε μια εξωτερική κλάση, οι οποίες ονομάζονται εσωτερικές κλάσεις.
Είναι υποχρεωτικό να χρησιμοποιήσετε έναν τροποποιητή πρόσβασης όπως global ή public στη δήλωση μιας εξωτερικής κλάσης.
Δεν είναι απαραίτητο να χρησιμοποιήσετε τροποποιητή πρόσβασης στη δήλωση των εσωτερικών κλάσεων.
Μια κλάση Apex ορίζεται χρησιμοποιώντας τη λέξη-κλειδί κλάσης ακολουθούμενη από το όνομα της κλάσης.
Η λέξη-κλειδί extends χρησιμοποιείται για την επέκταση μιας υπάρχουσας κλάσης σε μια κλάση Apex και η λέξη-κλειδί implements χρησιμοποιείται για την υλοποίηση μιας διεπαφής σε μια κλάση Apex.
Το Salesforce Apex δεν υποστηρίζει πολλαπλή κληρονομικότητα. Μια κλάση Apex μπορεί να επεκτείνει μόνο μία υπάρχουσα κλάση Apex, αλλά μπορεί να υλοποιήσει πολλαπλές διεπαφές.
Μια κλάση Apex μπορεί να περιέχει έναν κατασκευαστή που ορίζεται από τον χρήστη και, εάν δεν είναι διαθέσιμος ένας κατασκευαστής που ορίζεται από τον χρήστη, χρησιμοποιείται ένας προεπιλεγμένος κατασκευαστής. Ο κώδικας σε έναν κατασκευαστή εκτελείται όταν δημιουργείται μια παρουσία μιας κλάσης.
Σύνταξη μιας κλάσης Apex:
public class myApexClass{
// variable declaration
//constructor
public myApexClass(){
}
//methods declaration
}
Η λέξη-κλειδί new χρησιμοποιείται για τη δημιουργία μιας παρουσίας μιας κλάσης Apex. Παρακάτω είναι η σύνταξη για τη δημιουργία μιας παρουσίας μιας κλάσης Apex:
myApexClass obj = new myApexClass();
Apex Getter και Setter
Μια ιδιότητα Apex είναι παρόμοια με μια μεταβλητή Apex. Ένας getter και ένας setter είναι απαραίτητοι για μια ιδιότητα Apex. Μπορούν να χρησιμοποιηθούν για την εκτέλεση κώδικα πριν από την πρόσβαση ή την αλλαγή της τιμής της ιδιότητας. Ο κώδικας στο accessor get εκτελείται όταν διαβάζεται μια τιμή ιδιότητας. Ο κώδικας στο accessor set εκτελείται όταν αλλάζει μια τιμή ιδιότητας. Οποιαδήποτε ιδιότητα που έχει μόνο ένα accessor get θεωρείται μόνο για ανάγνωση, οποιαδήποτε ιδιότητα που έχει μόνο ένα accessor set θεωρείται μόνο για εγγραφή και οποιαδήποτε ιδιότητα που έχει και τα δύο accessors get και set θεωρείται ανάγνωση-εγγραφή. Σύνταξη μιας ιδιότητας Apex:
public class myApexClass {
// Property declaration
access_modifier return_type property_name {
get {
//code
}
set{
//code
}
}
}
Εδώ, το access_modifier είναι ο τροποποιητής πρόσβασης της ιδιότητας, το return_type είναι ο τύπος δεδομένων της ιδιότητας και το property_name είναι το όνομα της ιδιότητας.
Παρακάτω είναι ένα παράδειγμα μιας ιδιότητας Apex που έχει και τα δύο accessories:
public class myApex{
public String name{
get{ return name; }
set{ name = value; }
}
}
Εδώ, η ιδιότητα name είναι name, είναι μια δημόσια ιδιότητα και επιστρέφει έναν τύπο δεδομένων String.
Δεν είναι υποχρεωτικό να υπάρχει κώδικας στα μπλοκ get και set. Αυτά τα μπλοκ μπορούν να αφεθούν κενά για να οριστεί μια αυτόματη ιδιότητα. Για παράδειγμα:
public double MyReadWriteProp{ get; set; }
Οι παράμετροι "λήψη" και "ορισμός" των accessories μπορούν επίσης να οριστούν με τους δικούς τους τροποποιητές πρόσβασης. Εάν ένας accessory οριστεί με έναν τροποποιητή, αυτός παρακάμπτει τον τροποποιητή πρόσβασης της ιδιότητας. Για παράδειγμα:
public String name{private get; set;}// name is private for read and public for write.
Οι κλάσεις ορίζουν επαναχρησιμοποιήσιμη λογική την οποία καλείτε ρητά. Οι εναύσματα, που θα καλυφθούν στη συνέχεια, εκτελούνται αυτόματα κάθε φορά που αλλάζουν οι εγγραφές.
Apex Trigger
Τα εναύσματα Apex σάς επιτρέπουν να εκτελέσετε προσαρμοσμένο Apex πριν και μετά την εκτέλεση μιας λειτουργίας DML.
Το Apex υποστηρίζει τους ακόλουθους δύο τύπους εναυσμάτων:
Πριν από τις ενεργοποιήσεις: Αυτά τα εναύσματα χρησιμοποιούνται για την επικύρωση και την ενημέρωση της τιμής ενός πεδίου πριν από την αποθήκευση της εγγραφής στη βάση δεδομένων.
Μετά τις ενεργοποιήσεις: Αυτά τα εναύσματα χρησιμοποιούνται για την πρόσβαση σε τιμές πεδίων (όπως το αναγνωριστικό εγγραφής και το πεδίο LastModifiedDate) που ορίζονται από το σύστημα μετά την καταχώριση μιας εγγραφής στη βάση δεδομένων. Αυτές οι τιμές πεδίων μπορούν να χρησιμοποιηθούν για την τροποποίηση άλλων εγγραφών. Οι εγγραφές που ενεργοποιούνται μετά από εναύσματα είναι μόνο για ανάγνωση.
Η βέλτιστη πρακτική είναι η σύνταξη μαζικών εναυσμάτων. Ένα μαζικό εναύσμα μπορεί να επεξεργάζεται μία μόνο εγγραφή καθώς και πολλαπλές εγγραφές ταυτόχρονα.
Σύνταξη ενός Apex trigger:
trigger TriggerName on ObjectName (trigger_events) {
//Code_block
}
Εδώ, το TriggerName είναι το όνομα του trigger, το ObjectName είναι το όνομα του αντικειμένου στο οποίο είναι γραμμένο το trigger και το trigger_events είναι μια λίστα συμβάντων διαχωρισμένη με κόμμα.
Τα ακόλουθα είναι τα συμβάντα που υποστηρίζονται από τους ενεργοποιητές Apex: πριν από την εισαγωγή, πριν από την ενημέρωση, πριν από τη διαγραφή, μετά την εισαγωγή, μετά την ενημέρωση, μετά τη διαγραφή, μετά την αναίρεση διαγραφής.
Δεν είναι δυνατή η χρήση στατικών λέξεων-κλειδιών σε ένα Apex trigger. Όλες οι λέξεις-κλειδιά που ισχύουν για τις εσωτερικές κλάσεις μπορούν να χρησιμοποιηθούν σε ένα Apex trigger.
Υπάρχουν έμμεσες μεταβλητές που ορίζονται από κάθε ενεργοποίηση (trigger) και επιστρέφουν το περιβάλλον χρόνου εκτέλεσης. Αυτές οι μεταβλητές ορίζονται στην κλάση System.Trigger και ονομάζονται μεταβλητές περιβάλλοντος. Τα δύο στιγμιότυπα οθόνης παρακάτω παραθέτουν τις μεταβλητές περιβάλλοντος που υποστηρίζονται από τις ενεργοποίησης (triggers) του Apex:
Ακολουθούν οι σκέψεις που πρέπει να ληφθούν υπόψη για τις μεταβλητές περιβάλλοντος σε εναύσματα Apex:
- Μην χρησιμοποιείτε trigger.new και trigger.old σε λειτουργίες DML.
- Το Trigger.new δεν μπορεί να διαγραφεί.
- Το Trigger.new είναι μόνο για ανάγνωση μετά από εναύσματα.
- Το Trigger.new μπορεί να χρησιμοποιηθεί για να αλλάξει τις τιμές των πεδίων στο ίδιο αντικείμενο μόνο πριν από τις ενεργοποιήσεις.
Τα δύο στιγμιότυπα οθόνης παρακάτω παραθέτουν τις σκέψεις σχετικά με συγκεκριμένες ενέργειες σε διαφορετικά συμβάντα ενεργοποίησης:
Τα triggers χειρίζονται λογική σε πραγματικό χρόνο, αλλά ορισμένες εργασίες είναι απλώς πολύ μεγάλες για μία μόνο συναλλαγή. Εδώ ακριβώς έρχεται στο προσκήνιο το batch Apex.
Κατηγορία παρτίδας στο Apex
Μια κλάση δέσμης στο Salesforce χρησιμοποιείται για την επεξεργασία ενός μεγάλου αριθμού εγγραφών που θα υπερέβαιναν τα όρια του ρυθμιστή Apex εάν η επεξεργασία τους γινόταν κανονικά. Μια κλάση δέσμης εκτελεί τον κώδικα ασύγχρονα.
Τα πλεονεκτήματα μιας ομαδικής κλάσης είναι τα εξής:
- Μια κλάση δέσμης επεξεργάζεται τα δεδομένα σε κομμάτια (chunks) και εάν ένα κομμάτι αποτύχει να επεξεργαστεί με επιτυχία, τα κομμάτια που έχουν υποστεί επιτυχή επεξεργασία δεν αναιρούνται.
- Κάθε κομμάτι δεδομένων σε μια κλάση δέσμης υποβάλλεται σε επεξεργασία με ένα νέο σύνολο ορίων ρυθμιστή, το οποίο διασφαλίζει ότι ο κώδικας εκτελείται εντός των ορίων εκτέλεσης του ρυθμιστή.
Η διεπαφή Database.Batchable πρέπει να υλοποιηθεί από μια κλάση Apex για να χρησιμοποιηθεί ως κλάση batch. Παρέχει τρεις μεθόδους που πρέπει να υλοποιηθούν από την κλάση batch:
1. έναρξη()
Αυτή η μέθοδος δημιουργεί το εύρος των εγγραφών ή των αντικειμένων που θα υποβληθούν σε επεξεργασία από τη μέθοδο διεπαφής execute. Καλείται μόνο μία φορά κατά την εκτέλεση της παρτίδας. Αυτή η μέθοδος επιστρέφει είτε ένα αντικείμενο Database.QueryLocator είτε ένα Iterable. Ο αριθμός των εγγραφών που μπορούν να ανακτηθούν από ένα ερώτημα SOQL χρησιμοποιώντας το αντικείμενο Database.QueryLocator είναι 50 εκατομμύρια, αλλά χρησιμοποιώντας ένα Iterable, ο συνολικός αριθμός εγγραφών που μπορούν να ανακτηθούν από το ερώτημα SOQL είναι μόνο 50,000. Ένα Iterable χρησιμοποιείται για τη δημιουργία ενός σύνθετου πεδίου εφαρμογής για την κλάση παρτίδας.
Σύνταξη της μεθόδου έναρξης:
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {}
2. εκτέλεση()
Αυτή η μέθοδος χρησιμοποιείται για την επεξεργασία κάθε τμήματος δεδομένων. Η μέθοδος execute καλείται για κάθε τμήμα εγγραφών. Το προεπιλεγμένο μέγεθος παρτίδας για εκτέλεση είναι 200 εγγραφές. Η μέθοδος execute δέχεται δύο ορίσματα:
Μια αναφορά στο αντικείμενο Database.BatchableContext,
Μια λίστα από sObjects, όπως List ή μια λίστα παραμετροποιημένων τύπων. Σύνταξη της μεθόδου execute:
global void execute(Database.BatchableContext bc, List<P> records){}
3. φινίρισμα()
Η μέθοδος finish καλείται μία φορά κατά την εκτέλεση της κλάσης batch. Οι λειτουργίες μετεπεξεργασίας μπορούν να εκτελεστούν στη μέθοδο finish. Για παράδειγμα: αποστολή email επιβεβαίωσης. Αυτή η μέθοδος καλείται όταν όλες οι batch έχουν υποστεί επεξεργασία. Σύνταξη της μεθόδου finish:
global void finish(Database.BatchableContext bc){}
Αντικείμενο Database.BatchableContext
Κάθε μέθοδος της διεπαφής Database.Batchable έχει μια αναφορά σε ένα αντικείμενο Database.BatchableContext.
Αυτό το αντικείμενο χρησιμοποιείται για να track την πρόοδο της ομαδικής εργασίας.
Ακολουθούν οι μέθοδοι στιγμιότυπων που παρέχονται από το BatchableContext:
- getChildJobId(): Αυτή η μέθοδος επιστρέφει το ID της μαζικής εργασίας που βρίσκεται υπό επεξεργασία.
- getJobId(): Αυτή η μέθοδος επιστρέφει το αναγνωριστικό της δέσμης εργασίας.
Παρακάτω είναι η σύνταξη μιας κλάσης batch:
global class MyBatchClass implements Database.Batchable<sObject> {
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {
// collect the batches of records or objects to be passed to execute
}
global void execute(Database.BatchableContext bc, List<P> records){
// process each batch of records
}
global void finish(Database.BatchableContext bc){
// execute any post-processing operations
}
}
Μέθοδος Database.executeBatch
Η μέθοδος Database.executeBatch χρησιμοποιείται για την εκτέλεση μιας κλάσης batch.
Αυτή η μέθοδος λαμβάνει δύο παραμέτρους: μια παρουσία της κλάσης batch που θα υποβληθεί σε επεξεργασία και μια προαιρετική παράμετρο scope για να καθορίσει το μέγεθος της batch. Εάν δεν καθοριστεί, χρησιμοποιείται το προεπιλεγμένο μέγεθος 200.
Σύνταξη του Database.executeBatch:
Database.executeBatch(myBatchObject, scope)
Εκτέλεση μιας κλάσης δέσμης με το όνομα MyBatchClass:
MyBatchClass myBatchObject = new MyBatchClass(); Id batchId = Database.executeBatch(myBatchObject, 100);
Database.Stateful
Μια κλάση δέσμης είναι από προεπιλογή χωρίς κατάσταση. Κάθε φορά που καλείται η μέθοδος εκτέλεσης, λαμβάνεται ένα νέο αντίγραφο του αντικειμένου και αρχικοποιούνται όλες οι μεταβλητές της κλάσης.
Το Database.Stateful υλοποιείται για να δημιουργήσει μια κλάση batch stateful.
Εάν η κλάση παρτίδας σας υλοποιεί το βάση δεδομένων.Stateful διεπαφή, όλες οι μεταβλητές στιγμιότυπου διατηρούν τις τιμές τους, αλλά οι στατικές μεταβλητές επαναφέρονται μεταξύ των συναλλαγών.
Ασύγχρονο Apex Beyond Batch
Το Batch Apex είναι μόνο ένας από τους πολλούς τρόπους για να εκτελέσετε κώδικα ασύγχρονα. Το Salesforce παρέχει τέσσερις ασύγχρονες επιλογές και η επιλογή της σωστής εξαρτάται από το πόσα δεδομένα επεξεργάζεστε και από το αν οι εργασίες πρέπει να είναι αλυσιδωτές ή προγραμματισμένες.
- Μελλοντικές μέθοδοι: Με σχολιασμό @future, αυτά είναι ιδανικά για απλές λειτουργίες που ξεχνιούνται αμέσως, όπως κλήσεις σε εξωτερικές υπηρεσίες ιστού.
- Κορυφή με δυνατότητα αναμονής: Υλοποιεί τη διεπαφή Queueable, δέχεται σύνθετους τύπους αντικειμένων, επιστρέφει ένα αναγνωριστικό εργασίας και υποστηρίζει την αλυσιδωτή σύνδεση μιας εργασίας με μια άλλη.
- Κορυφή παρτίδας: Επεξεργάζεται πολύ μεγάλους όγκους δεδομένων σε τμήματα, όπως περιγράφεται παραπάνω.
- Προγραμματισμένη Κορυφή: Υλοποιεί τη διεπαφή Schedulable έτσι ώστε μια κλάση να εκτελείται σε μια συγκεκριμένη ώρα, όπως μια νυχτερινή εργασία καθαρισμού.
| Χαρακτηριστικά | καλυτερα For | Βασική Δυνατότητα |
|---|---|---|
| Μελλοντική μέθοδος | Απλές επεξηγήσεις | Φωτιά και ξέχασε |
| Apex με δυνατότητα αναμονής | Διαδοχική επεξεργασία | Αλυσιδωτή σύνδεση και παρακολούθηση θέσεων εργασίας |
| Παρτίδα Apex | Εκατομμύρια αρχεία | Τμηματική επεξεργασία |
| Προγραμματισμένη Κορυφή | Επαναλαμβανόμενες εργασίες | Χρονισμός βάσει Cron |
Όποιο μοντέλο εκτέλεσης κι αν επιλέξετε, κάθε συναλλαγή εξακολουθεί να μετριέται σε σχέση με τα όρια ρυθμιστή σε ολόκληρη την πλατφόρμα που αναφέρονται παρακάτω.
Apex Governor Limits
Τα όρια του ρυθμιστή Apex είναι τα όρια που επιβάλλονται από τη μηχανή εκτέλεσης Apex για να διασφαλιστεί ότι οποιοσδήποτε κώδικας και διεργασίες Apex που δεν λειτουργούν κανονικά δεν μονοπωλούν τους κοινόχρηστους πόρους και δεν διαταράσσουν την επεξεργασία άλλων χρηστών στο περιβάλλον πολλαπλών μισθωτών. Αυτά τα όρια επαληθεύονται σε σχέση με κάθε συναλλαγή Apex. Ακολουθούν τα όρια ρυθμιστή που ορίζονται από το Salesforce σε κάθε συναλλαγή Apex:
| Περιγραφή | Όριο |
|---|---|
| Ερωτήματα SOQL που μπορούν να γίνουν σε μια σύγχρονη συναλλαγή | 100 |
| Ερωτήματα SOQL που μπορούν να γίνουν σε μια ασύγχρονη συναλλαγή | 200 |
| Εγγραφές που μπορούν να ανακτηθούν με ένα ερώτημα SOQL | 50,000 |
| Εγγραφές που μπορούν να ανακτηθούν από το Database.getQueryLocator | 10,000 |
| Ερωτήματα SOSL που μπορούν να γίνουν σε μια συναλλαγή Apex | 20 |
| Εγγραφές που μπορούν να ανακτηθούν με ένα ερώτημα SOSL | 2,000 |
| Δηλώσεις DML που μπορούν να γίνουν σε μια συναλλαγή Apex | 150 |
| Εγγραφές που μπορούν να υποβληθούν σε επεξεργασία ως αποτέλεσμα δήλωσης DML, Approval.process ή database.emptyRecycleBin | 10,000 |
| Επεξηγήσεις που μπορούν να γίνουν σε μια συναλλαγή Apex | 100 |
| Σωρευτικό όριο χρονικού ορίου σε όλες τις κλήσεις που εκτελούνται σε μια συναλλαγή Apex | 120 δευτερόλεπτα |
| Όριο στις εργασίες Apex που μπορούν να προστεθούν στην ουρά με το System.enqueueJob | 50 |
| Χρονικό όριο εκτέλεσης για κάθε συναλλαγή Apex | 10 λεπτά |
| Όριο χαρακτήρων που μπορούν να χρησιμοποιηθούν σε μια κλάση Apex και έναυσμα | 1 εκατομμύρια |
| Χρονικό όριο CPU για μια σύγχρονη συναλλαγή | 10,000 χιλιοστά του δευτερολέπτου |
| Χρονικό όριο CPU για μια ασύγχρονη συναλλαγή | 60,000 χιλιοστά του δευτερολέπτου |
| Συνολικό μέγεθος σωρού | 6 MB (σύγχρονο) / 12 MB (ασύγχρονο) |
Πώς να γράψετε μια δοκιμαστική τάξη στο Apex
Το Salesforce απαιτεί τουλάχιστον το 75% του κώδικα Apex σας να καλύπτεται από δοκιμές μονάδας πριν μπορέσετε να τον αναπτύξετε στην παραγωγή και κάθε ενεργοποίηση πρέπει να έχει κάποια κάλυψη. Η σύνταξη κλάσεων δοκιμών είναι επομένως μια βασική δεξιότητα του Apex και όχι ένα προαιρετικό επιπλέον.
Μια κλάση δοκιμής σχολιάζεται με @isTest και κάθε μέθοδος δοκιμής σημειώνεται επίσης με @isTest. Οι μέθοδοι δοκιμής δεν δεσμεύουν δεδομένα στη βάση δεδομένων και δεν βλέπουν τα περισσότερα υπάρχοντα δεδομένα οργανισμού, επομένως κάθε δοκιμή δημιουργεί τις δικές της εγγραφές. Οι μέθοδοι Test.startTest() και Test.stopTest() δίνουν στον υπό δοκιμή κώδικα ένα νέο σύνολο ορίων ρυθμιστή και οι ισχυρισμοί επαληθεύουν ότι η λογική συμπεριφέρθηκε όπως αναμενόταν.
Ακολουθεί μια απλή δοκιμαστική κλάση για τη λογική δημιουργίας λογαριασμού:
@isTest
private class AccountHandlerTest {
@isTest
static void testCreateAccount() {
Account acc = new Account(Name = 'Test Account');
Test.startTest();
insert acc;
Test.stopTest();
Account result = [SELECT Id, Name FROM Account WHERE Id = :acc.Id];
System.assertEquals('Test Account', result.Name);
}
}
Ακολουθήστε αυτές τις οδηγίες όταν γράφετε τεστ:
- Χρησιμοποιήστε τη μέθοδο @testSetup για να δημιουργήσετε κοινόχρηστα δεδομένα δοκιμής μία φορά για όλες τις μεθόδους δοκιμής στην κλάση.
- Δοκιμάστε τη μαζική συμπεριφορά εισάγοντας 200 εγγραφές, όχι μόνο μία.
- Καλύπτει θετικά, αρνητικά και σενάρια περιορισμένων χρηστών.
- Να συμπεριλαμβάνετε πάντα ουσιαστικές δηλώσεις System.assert. Η κάλυψη χωρίς ισχυρισμούς δεν αποδεικνύει τίποτα.
Apex καλυτερα Practices
Οι αρχάριοι συχνά γράφουν Apex που λειτουργεί για μία εγγραφή, αλλά αποτυγχάνει σε μαζικές λειτουργίες στον πραγματικό κόσμο. Οι παρακάτω πρακτικές διατηρούν τον κώδικά σας εντός των ορίων του ρυθμιστή και είναι πιο εύκολο να συντηρηθεί:
- Ομαδοποιήστε τα πάντα: Γράψτε λογική που χειρίζεται συλλογές εγγραφών, επειδή οι ενεργοποιητές μπορούν να λάβουν έως και 200 εγγραφές σε μία μόνο παρτίδα.
- Κρατήστε το SOQL και το DML εκτός βρόχων: Υποβολή ερωτήματος πριν από τον βρόχο, συλλογή αλλαγών σε μια λίστα και εκτέλεση μίας πρότασης DML μετά τον βρόχο.
- Μία ενεργοποίηση ανά αντικείμενο: Διατηρήστε τις εναύσματα χωρίς λογική και αναθέστε την εργασία σε κλάσεις χειριστών, γεγονός που καθιστά προβλέψιμη τη σειρά εκτέλεσης.
- Χρήση με κοινή χρήση: Επιβολή ασφάλειας σε επίπεδο εγγραφής, εκτός εάν υπάρχει τεκμηριωμένος λόγος εκτέλεσης σε περιβάλλον συστήματος.
- Αποφύγετε την κωδικοποίηση αναγνωριστικών με σκληρό κώδικα: Τα αναγνωριστικά εγγραφών διαφέρουν μεταξύ των sandbox και της παραγωγής, επομένως υποβάλετε ερώτημα για αυτά ή χρησιμοποιήστε προσαρμοσμένα μεταδεδομένα.
- Όρια παρακολούθησης στον κώδικα: Οι μέθοδοι κλάσης Limits, όπως η Limits.getQueries(), σας επιτρέπουν να ελέγχετε την κατανάλωση πόρων κατά τον χρόνο εκτέλεσης.
💡 Συμβουλή: Εκτελέστε τον κώδικά σας σε 200 εγγραφές σε ένα sandbox πριν από την ανάπτυξη. Οι περισσότερες αποτυχίες ορίων ρυθμιστή εμφανίζονται μόνο σε μαζικό όγκο και η έγκαιρη εντόπισή τους είναι πολύ φθηνότερη από την εκσφαλμάτωση τους στην παραγωγή.






