Vodič za Salesforce Apex za početnike
⚡ Pametni sažetak
Apex programiranje pruža Salesforce programerima objektno orijentirani, snažno tipizirani jezik za dodavanje prilagođene poslovne logike u CRM. Pokreće klase, okidače i batch poslove, dok ograničenja regulatora održavaju stabilnost dijeljene platforme s više zakupaca.

Što je Apex u Salesforceu?
Vrh je objektno orijentirani i snažno tipizirani programski jezik koji je razvio Salesforce za izgradnju SaaS (Software as a Service) i CRM (Customer Relationship Management) aplikacija. Apex pomaže programerima u stvaranju SaaS aplikacija trećih strana i dodavanju poslovne logike sistemskim događajima pružajući podršku za pozadinske baze podataka i klijentsko-poslužiteljska sučelja.
Apex pomaže programerima da dodaju poslovnu logiku sistemskim događajima poput klikova na gumbe, ažuriranja povezanih zapisa i Visualforce stranica. Apex ima sintaksu sličnu Java. Registrirajte se za Salesforce kako bi naučili kako CRM funkcionira.
Značajke programskog jezika Apex
Evo važnih značajki Salesforce Apexa:
- Apex je jezik koji ne razlikuje velika i mala slova.
- Pomoću Apexa možete izvoditi DML operacije poput INSERT, UPDATE, UPSERT i DELETE na sObject zapisima.
- Zapise sObject možete pretraživati pomoću SOQL-a (Salesforce Object Query Language) i SOSL-a (Salesforce Object Search Language) u Apexu.
- Omogućuje vam stvaranje a jedinični test i izvršite ga kako biste provjerili pokrivenost koda i učinkovitost koda u Apexu.
- Apex se izvršava u okruženju s više stanara i Salesforce ima definirana ograničenja regulatora koja sprječavaju korisnika da monopolizira dijeljene resurse. Svaki kod koji prijeđe ograničenje regulatora Salesforcea ne uspijeva i pojavljuje se greška.
- Objekt Salesforce može se koristiti kao tip podataka u Apexu. Na primjer:
Account acc = new Account();
Ovdje je Account standardni Salesforce objekt.
- Apex se automatski nadograđuje sa svakim Salesforce izdanjem.
Kada bi programer trebao odabrati Apex?
Apex kod treba pisati samo ako je poslovni scenarij previše složen za implementaciju korištenjem unaprijed izgrađene funkcionalnosti "pokaži i klikni" koju pruža Salesforce.
Slijede neki scenariji u kojima trebate napisati Apex kod:
- Za izradu web usluga koje integriraju Salesforce s drugim aplikacijama.
- Za implementaciju prilagođene validacije na sObjects.
- Za izvršavanje prilagođene Apex logike kada se izvodi DML operacija.
- Za implementaciju funkcionalnosti koje se ne mogu izgraditi postojećim deklarativnim alatima za automatizaciju kao što je Flow.
- Postaviti usluge e -pošte koji obrađuju sadržaj, zaglavlja i privitke dolazne e-pošte.
Nakon što znate kada je Apex pravi izbor, sljedeći korak je razumijevanje što se događa s vašim kodom nakon što ga spremite.
Radna struktura Apexa
Slijedeći je tijek radnji za Apex kod:
- Radnja razvojnog programera: Kada programer spremi kod na platformu, sav Apex kod se kompilira u skup instrukcija koje Apex runtime interpreter može razumjeti, a te se instrukcije zatim spremaju kao metapodaci na platformi.
- Radnja krajnjeg korisnika: Kada korisnički događaj izvrši Apex kod, poslužitelj platforme dohvaća kompilirane instrukcije iz metapodataka i pokreće ih kroz Apex interpreter prije vraćanja rezultata.
Donji dijagram prikazuje kako radnje programera i krajnjeg korisnika komuniciraju s aplikacijskim poslužiteljem Lightning Platforme:
Razvojno okruženje Apex
Apex kod može se razvijati ili u sandboxu ili u organizaciji Salesforcea Developer Edition.
Najbolja je praksa razviti kod u sandbox okruženju, a zatim ga implementirati u produkcijsko okruženje, kao što je prikazano u nastavku:
Alati za razvoj Apex koda: Slijede tri alata dostupna za razvoj Apex koda u svim izdanjima Salesforcea:
- Konzola za razvojne programere
- Visual Studio Code s paketom Salesforce Extension Pack (ovo zamjenjuje umirovljeno Force.com IDE)
- Code uređivač u korisničkom sučelju Salesforce Setup
Nakon što je vaše okruženje spremno, pogledajmo temeljne elemente samog jezika, počevši s tipovima podataka.
Vrste podataka u Apexu
Apex podržava sljedeće tipove podataka:
primitivan
Cijeli broj, Double, Long, Date, Datetime, Decimal, Time, Blob, String, ID i Boolean smatraju se primitivnim tipovima podataka. Svi primitivni tipovi podataka prenose se po vrijednosti, a ne po referenci.
Kolekcije
U Apexu su dostupne tri vrste kolekcija:
- Popis: To je uređena kolekcija primitiva, sObjekata, kolekcija ili Apex objekata temeljena na indeksima.
- Set: Neuređena kolekcija jedinstvenih elemenata koja ne sadrži duplikate.
- Karta: To je kolekcija jedinstvenih ključeva koji se mapiraju na pojedinačne vrijednosti, koje mogu biti primitivi, sObjects, kolekcije ili Apex objekti.
sObject
Ovo je posebna vrsta podataka u Salesforceu. Slično je stolu u SQL i sadrži polja koja su slična stupcima u SQL-u.
Enum
Enum je abstract tip podataka koji pohranjuje jednu vrijednost konačnog skupa određenih identifikatora.
Klase, objekti i sučelja
Korisnički definirane Apex klase i sučelja također se mogu koristiti kao tipovi podataka. Objekt se odnosi na instancu bilo kojeg tipa podataka koji je podržan u Apexu.
Apex sintaksa
Izjava varijable
Budući da je Apex jezik snažnog tipa, obavezno je deklarirati varijablu s tipom podataka u Apexu.
Na primjer:
Contact con = new Contact();
Ovdje je varijabla con deklarirana s tipom podataka Contact.
SOQL upit
SOQL je kratica za Salesforce Object Query Language. SOQL se koristi za dohvaćanje sObject zapisa iz Salesforce baze podataka. Na primjer:
Account acc = [SELECT Id, Name FROM Account LIMIT 1];
Gornji upit dohvaća zapis računa iz baze podataka Salesforcea.
Naredba petlje
Za iteraciju kroz zapise u popisu koristi se naredba petlje. Broj iteracija jednak je broju zapisa u popisu. Na primjer:
List<Account> listOfAccounts = [SELECT Id, Name FROM Account LIMIT 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
//your logic
}
U gornjem isječku koda, listOfAccounts je varijabla tipa podataka List.
Izjava o kontroli toka
Naredba za kontrolu toka korisna je kada želite izvršiti neke retke koda na temelju određenih uvjeta.
Na primjer:
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
}
Gornji isječak koda ispituje zapise računa iz baze podataka i provjerava veličinu popisa.
DML izjava
DML je kratica za Data Manipulation Language (Jezik za manipulaciju podacima). DML naredbe se koriste za manipuliranje podacima u Salesforce bazi podataka. Na primjer:
Account acc = new Account(Name = 'Test Account'); insert acc; //DML statement to create account record.
Apex specifikacije pristupa
Slijede specifikatori pristupa koje Apex podržava:
javnost
Ovaj specifikator pristupa daje pristup klasi, metodi ili varijabli koju će Apex koristiti unutar imenskog prostora.
Privatni
Ovaj specifikator pristupa daje pristup klasi, metodi ili varijabli koja se koristi lokalno ili unutar dijela koda gdje je definirana. Sve metode i varijable koje nemaju definirani specifikator pristupa preuzimaju zadani specifikator pristupa private.
zaštićen
Ovaj specifikator pristupa daje pristup metodi ili varijabli koju će koristiti bilo koja unutarnja klasa unutar definirajuće Apex klase.
Globalan
Ovaj specifikator pristupa daje pristup klasi, metodi ili varijabli koju Apex koristi unutar imenskog prostora, kao i izvan njega. Najbolja je praksa ne koristiti ključnu riječ global osim ako nije potrebno.
Ključne riječi u Apexu
Uz dijeljenje
Ako je klasa definirana ovom ključnom riječi, tada se provode sva pravila dijeljenja koja se primjenjuju na trenutnog korisnika. Ako ova ključna riječ nije prisutna, kôd se izvršava u kontekstu sustava.
Na primjer:
public with sharing class MyApexClass{
// sharing rules enforced when code in this class executes
}
Bez dijeljenja
Ako je klasa definirana ovom ključnom riječi, tada se pravila dijeljenja koja se primjenjuju na trenutnog korisnika ne primjenjuju.
Na primjer:
public without sharing class MyApexClass{
// sharing rules are not enforced when code in this class executes
}
statički
Varijabla ili metoda definirana ključnom riječi static inicijalizira se jednom i povezuje s klasom. Statičke varijable i metode mogu se pozvati izravno imenom klase bez stvaranja instance klase.
Final
Konstanta ili metoda definirana ključnom riječi final ne može se nadjačati. Na primjer:
public class myCls {
static final Integer INT_CONST = 10;
}
Ako pokušate poništiti vrijednost ove varijable INT_CONST, dobit ćete iznimku – System.FinalException: Konačna varijabla je već inicijalizirana.
Povratak
Ova ključna riječ vraća vrijednost iz metode. Na primjer:
public String getName() {
return 'Test';
}
nula
Definira null konstantu i može se dodijeliti varijabli. Na primjer:
Boolean b = null;
virtualan
Ako je klasa definirana ključnom riječi virtual, može se proširiti i nadjačati.
Kormilartract
Ako je klasa definirana s abstract ključna riječ, mora sadržavati barem jednu metodu s ključnom riječi abstract, i ta metoda bi trebala imati samo potpis.
Na primjer:
public abstract class MyAbstractClass {
abstract Integer myAbstractMethod1();
}
Apex žica
Niz znakova je skup znakova bez ograničenja broja znakova. Na primjer:
String name = 'Test';
Klasa String u Salesforceu nudi nekoliko ugrađenih metoda. Slijede neke od često korištenih metoda:
skrati (maxWidth)
Ova metoda skraćuje niz na zadanu duljinu i vraća ga ako je duljina zadanog niza dulja od zadane duljine; u suprotnom vraća izvorni niz. Ako je vrijednost varijable maxWidth manja od 4, ova metoda izbacuje iznimku tijekom izvođenja – System.StringException: Minimalna širina kratice je 4.
Na primjer:
String s = 'Hello World';
String s2 = s.abbreviate(8);
System.debug('s2: ' + s2); //Hello...
kapitalizirati ()
Ova metoda pretvara prvo slovo niza u velika i mala slova i vraća ga.
Na primjer:
String s = 'hello';
String s2 = s.capitalize();
System.assertEquals('Hello', s2);
sadrži (podniz)
Ova metoda vraća vrijednost true ako niz znakova koji poziva metodu sadrži navedeni podniz.
String name1 = 'test1';
String name2 = 'test';
Boolean flag = name1.contains(name2);
System.debug('flag:: ' + flag); //true
jednako (stringOrId)
Ova metoda vraća vrijednost true ako proslijeđeni parametar nije null i predstavlja isti binarni niz znakova kao i niz znakova koji poziva metodu.
Prilikom usporedbe vrijednosti ID-ova, duljine ID-ova možda neće biti jednake. Na primjer, ako se niz koji predstavlja ID od 15 znakova uspoređuje s objektom koji predstavlja ID od 18 znakova, ova metoda i dalje vraća vrijednost true. Na primjer:
String stringValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result = stringValue15.equals(idValue18);
System.debug('result: ' + result); //true
U gornjem primjeru, metoda equals uspoređuje ID objekta od 15 znakova s ID-om objekta od 18 znakova, i ako oba ID-a predstavljaju isti binarni niz, vraća vrijednost true.
Koristite ovu metodu za usporedbu koja razlikuje velika i mala slova.
escapeSingleQuotes(stringToEscape)
Ova metoda dodaje znak za izlaz (\) prije bilo kojeg jednostrukog navodnika u nizu i vraća rezultat. Ova metoda sprječava SOQL injekciju prilikom stvaranja dinamičkog SOQL upita. Osigurava da se svi jednostruki navodnici tretiraju kao zatvoreni nizovi, a ne kao naredbe baze podataka.
Na primjer:
String s = 'Hello \'Tom\''; String escapedStr = String.escapeSingleQuotes(s); System.debug(escapedStr); // Outputs Hello \'Tom\'
ukloniti (podniz)
Ova metoda uklanja sva pojavljivanja spomenutog podniza iz niza koji poziva metodu i vraća rezultirajući niz.
Na primjer:
String s1 = 'Salesforce and force.com';
String s2 = s1.remove('force');
System.debug('s2: ' + s2); // 'Sales and .com'
podniz(početniindeks)
Ova metoda vraća podniz koji počinje od znaka na startIndex i proteže se do kraja niza.
Na primjer:
String s1 = 'hamburger';
String s2 = s1.substring(3);
System.debug('s2: ' + s2); //burger
obrnuti ()
Ova metoda invertira sve znakove niza i vraća ga. Na primjer:
String s = 'Hello';
String s2 = s.reverse();
System.debug('s2:::: ' + s2); // olleH
obloge ()
Ova metoda uklanja sve početne i završne razmake iz niza i vraća ga.
valueOf(toConvert)
Ova metoda vraća niz znakova predanog objekta.
Nizovi znakova, klase i ključne riječi spajaju se kada počnete pakirati logiku u jedinice za višekratnu upotrebu, što je upravo ono čemu služe Apex klase.
Apex klasa
Apex klasa je nacrt ili predložak iz kojeg se stvaraju objekti. Objekt je instanca klase.
Postoje tri načina za stvaranje Apex klasa u Salesforceu:
- Konzola za razvojne programere
- Visual Studio Code s paketom proširenja Salesforce
- Stranica s detaljima Apex klase u postavkama
U Apexu možete definirati vanjsku klasu, koja se naziva i klasa najviše razine, a možete definirati i klase unutar vanjske klase, koje se nazivaju unutarnje klase.
Obavezno je koristiti modifikator pristupa poput global ili public u deklaraciji vanjske klase.
Nije potrebno koristiti modifikator pristupa u deklaraciji unutarnjih klasa.
Apex klasa se definira pomoću ključne riječi class nakon koje slijedi naziv klase.
Ključna riječ extends koristi se za proširenje postojeće klase u Apex klasi, a ključna riječ implements koristi se za implementaciju sučelja u Apex klasi.
Salesforce Apex ne podržava višestruko nasljeđivanje; Apex klasa može proširiti samo jednu postojeću Apex klasu, ali može implementirati više sučelja.
Apex klasa može sadržavati korisnički definirani konstruktor, a ako korisnički definirani konstruktor nije dostupan, koristi se zadani konstruktor. Kod u konstruktoru izvršava se kada se stvori instanca klase.
Sintaksa Apex klase:
public class myApexClass{
// variable declaration
//constructor
public myApexClass(){
}
//methods declaration
}
Ključna riječ new koristi se za stvaranje instance Apex klase. U nastavku je sintaksa za stvaranje instance Apex klase:
myApexClass obj = new myApexClass();
Apex Getter i Setter
Apex svojstvo slično je Apex varijabli. Za Apex svojstvo potrebni su getter i setter. Mogu se koristiti za izvršavanje koda prije nego što se pristupi vrijednosti svojstva ili je promijeni. Kod u get pristupniku izvršava se kada se pročita vrijednost svojstva. Kod u set pristupniku izvršava se kada se promijeni vrijednost svojstva. Bilo koje svojstvo koje ima samo get pristupnik smatra se samo za čitanje, bilo koje svojstvo koje ima samo set pristupnik smatra se samo za pisanje, a bilo koje svojstvo koje ima i get i set pristupnike smatra se čitanjem i pisanjem. Sintaksa Apex svojstva:
public class myApexClass {
// Property declaration
access_modifier return_type property_name {
get {
//code
}
set{
//code
}
}
}
Ovdje je access_modifier modifikator pristupa svojstvu, return_type je tip podataka svojstva, a property_name je naziv svojstva.
U nastavku je primjer Apex svojstva koje ima i get i set pristupnike:
public class myApex{
public String name{
get{ return name; }
set{ name = value; }
}
}
Ovdje je naziv svojstva name, javno je svojstvo i vraća tip podataka String.
Nije obavezno imati kod u blokovima get i set. Ovi blokovi mogu ostati prazni kako bi se definiralo automatsko svojstvo. Na primjer:
public double MyReadWriteProp{ get; set; }
Pristupnici Get i Set također se mogu definirati s vlastitim modifikatorima pristupa. Ako je pristupnik definiran s modifikatorom, on nadjačava modifikator pristupa svojstva. Na primjer:
public String name{private get; set;}// name is private for read and public for write.
Klase definiraju logiku za višekratnu upotrebu koju pozivate eksplicitno. Okidači, o kojima će biti riječi u nastavku, pokreću se automatski kad god se zapisi promijene.
Apex okidač
Apex okidači vam omogućuju izvršavanje prilagođenog Apexa prije i nakon izvođenja DML operacije.
Apex podržava sljedeće dvije vrste okidača:
Prije okidača: Ovi okidači se koriste za provjeru valjanosti i ažuriranje vrijednosti polja prije nego što se zapis spremi u bazu podataka.
Nakon okidača: Ovi okidači se koriste za pristup vrijednostima polja (kao što su ID zapisa i polje LastModifiedDate) koje sustav postavlja nakon što je zapis poslan u bazu podataka. Ove vrijednosti polja mogu se koristiti za izmjenu drugih zapisa. Zapisi koji se aktiviraju nakon okidača samo su za čitanje.
Najbolja je praksa pisati skupne okidače. Skupni okidač može obraditi jedan zapis kao i više zapisa istovremeno.
Sintaksa Apex okidača:
trigger TriggerName on ObjectName (trigger_events) {
//Code_block
}
Ovdje je TriggerName naziv okidača, ObjectName naziv objekta na kojem je okidač zapisan, a trigger_events je popis događaja odvojen zarezima.
Slijede događaji koje podržavaju Apex okidači: prije umetanja, prije ažuriranja, prije brisanja, nakon umetanja, nakon ažuriranja, nakon brisanja, nakon poništavanja brisanja.
Statičke ključne riječi ne mogu se koristiti u Apex okidaču. Sve ključne riječi primjenjive na unutarnje klase mogu se koristiti u Apex okidaču.
Svaki okidač definira implicitne varijable koje vraćaju kontekst izvođenja. Ove varijable definirane su u klasi System.Trigger i nazivaju se kontekstne varijable. Dvije snimke zaslona u nastavku navode kontekstne varijable koje podržavaju Apex okidači:
U nastavku su navedena razmatranja za kontekstualne varijable u Apex okidačima:
- Ne koristite trigger.new i trigger.old u DML operacijama.
- Trigger.new se ne može izbrisati.
- Trigger.new je samo za čitanje u after triggerima.
- Trigger.new se može koristiti za promjenu vrijednosti polja na istom objektu samo u prethodnim okidačima.
Dvije snimke zaslona u nastavku navode razmatranja o specifičnim radnjama u različitim okidačkim događajima:
Okidači obrađuju logiku u stvarnom vremenu, ali neki poslovi su jednostavno preveliki za jednu transakciju. Tu nastupa batch Apex.
Skupna klasa u Apexu
Klasa batch u Salesforceu koristi se za obradu velikog broja zapisa koji bi premašili ograničenja Apex governora ako bi se normalno obradili. Klasa batch izvršava kod asinkrono.
Slijede prednosti batch klase:
- Batch klasa obrađuje podatke u dijelovima, i ako se jedan dio ne uspije uspješno obraditi, uspješno obrađeni dijelovi se ne vraćaju unatrag.
- Svaki blok podataka u batch klasi obrađuje se s novim skupom ograničenja regulatora, što osigurava da se kod izvršava unutar ograničenja izvršavanja regulatora.
Sučelje Database.Batchable mora biti implementirano od strane Apex klase da bi se koristilo kao batch klasa. Pruža tri metode koje batch klasa mora implementirati:
1. početak()
Ova metoda generira opseg zapisa ili objekata koji će se obraditi metodom sučelja execute. Poziva se samo jednom tijekom izvršavanja batch naredbe. Ova metoda vraća ili objekt Database.QueryLocator ili Iterable. Broj zapisa koji se mogu dohvatiti SOQL upitom pomoću objekta Database.QueryLocator je 50 milijuna, ali korištenjem Iterable-a, ukupan broj zapisa koji se mogu dohvatiti SOQL upitom je samo 50 000. Iterable se koristi za generiranje složenog opsega za klasu batch.
Sintaksa metode start:
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {}
2. izvrši()
Ova se metoda koristi za obradu svakog dijela podataka. Metoda execute poziva se za svaki dio zapisa. Zadana veličina serije za izvršavanje je 200 zapisa. Metoda execute prima dva argumenta:
Referenca na objekt Database.BatchableContext,
Popis sObjekata, kao što je Lista ili popis parametriziranih tipova. Sintaksa metode execute:
global void execute(Database.BatchableContext bc, List<P> records){}
3. završi()
Metoda finish poziva se jednom tijekom izvršavanja klase batch. U metodi finish mogu se izvršiti operacije naknadne obrade. Na primjer: slanje e-pošte s potvrdom. Ova metoda poziva se kada se obrade sve serije. Sintaksa metode finish:
global void finish(Database.BatchableContext bc){}
Objekt Database.BatchableContext
Svaka metoda sučelja Database.Batchable ima referencu na objekt Database.BatchableContext.
Ovaj objekt se koristi za track napredak serijskog posla.
Slijede metode instance koje pruža BatchableContext:
- getChildJobId(): Ova metoda vraća ID batch zadatka koji se trenutno obrađuje.
- getJobId(): Ova metoda vraća ID skupnog posla.
Ispod je sintaksa batch klase:
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 Metoda
Metoda Database.executeBatch koristi se za izvršavanje batch klase.
Ova metoda uzima dva parametra: instancu klase serije koja se obrađuje i opcionalni parametar opsega za određivanje veličine serije. Ako nije naveden, koristi se zadana veličina od 200.
Sintaksa Database.executeBatch:
Database.executeBatch(myBatchObject, scope)
Izvršavanje batch klase pod nazivom MyBatchClass:
MyBatchClass myBatchObject = new MyBatchClass(); Id batchId = Database.executeBatch(myBatchObject, 100);
Database.Stateful
Klasa batch je prema zadanim postavkama bez stanja. Svaki put kada se pozove metoda execute, prima se nova kopija objekta i inicijaliziraju se sve varijable klase.
Database.Stateful je implementiran kako bi se klasa batch učinila stateful.
Ako vaša batch klasa implementira Baza podataka.Stateful sučelje, sve varijable instance zadržavaju svoje vrijednosti, ali statičke varijable se resetiraju između transakcija.
Asinkroni Apex Beyond Batch
Batch Apex je samo jedan od nekoliko načina za asinkrono izvršavanje koda. Salesforce nudi četiri asinkrone opcije, a odabir prave ovisi o tome koliko podataka obrađujete i treba li poslove povezati u lanac ili zakazati.
- Buduće metode: Označeni s @future, oni su najbolji za jednostavne operacije tipa "ispali i zaboravi", poput pozivanja vanjskih web servisa.
- Apex koji se može staviti u red čekanja: Implementira sučelje Queueable, prihvaća složene tipove objekata, vraća ID posla i podržava ulančavanje jednog posla s drugim.
- Vrh serije: Obrađuje vrlo velike količine podataka u blokovima, kao što je gore opisano.
- Planirani Apex: Implementira Schedulable sučelje tako da se klasa pokreće u određeno vrijeme, kao što je noćni posao čišćenja.
| Tip | Najbolje za | Ključna sposobnost |
|---|---|---|
| Buduća metoda | Jednostavni oblačići | Pucaj i zaboravi |
| Apex koji se može staviti u red čekanja | Sekvencijalna obrada | Ulančavanje i praćenje poslova |
| Batch Apex | Milijuni zapisa | Obrada po blokovima |
| Planirani Apex | Ponavljajući poslovi | Vremensko određivanje temeljeno na cronu |
Bez obzira na odabrani model izvršenja, svaka se transakcija i dalje mjeri u odnosu na ograničenja regulatora za cijelu platformu navedena u nastavku.
Apex Guverner Limits
Ograničenja Apex regulatora su ograničenja koja provodi Apex runtime engine kako bi se osiguralo da bilo koji nekontrolirani Apex kod i procesi ne monopoliziraju dijeljene resurse i ne ometaju obradu drugih korisnika u okruženju s više zakupaca. Ta se ograničenja provjeravaju za svaku Apex transakciju. Slijede ograničenja regulatora koja je Salesforce definirao za svaku Apex transakciju:
| Description | Ograničiti |
|---|---|
| SOQL upiti koji se mogu izvršiti u sinkronoj transakciji | 100 |
| SOQL upiti koji se mogu izvršiti u asinhronoj transakciji | 200 |
| Zapisi koji se mogu dohvatiti pomoću SOQL upita | 50,000 |
| Zapisi koje može dohvatiti Database.getQueryLocator | 10,000 |
| SOSL upiti koji se mogu izvršiti u Apex transakciji | 20 |
| Zapisi koji se mogu dohvatiti pomoću SOSL upita | 2,000 |
| DML naredbe koje se mogu izvršiti u Apex transakciji | 150 |
| Zapisi koji se mogu obraditi kao rezultat DML izjave, Approval.process ili database.emptyRecycleBin | 10,000 |
| Pozivi koji se mogu izvršiti u Apex transakciji | 100 |
| Kumulativno ograničenje vremenskog ograničenja za sve pozive koji se izvršavaju u Apex transakciji | 120 sekundi |
| Ograničenje Apex poslova koji se mogu dodati u red čekanja pomoću System.enqueueJob | 50 |
| Vremensko ograničenje izvršenja za svaku Apex transakciju | 10 minuta |
| Ograničenje znakova koji se mogu koristiti u Apex klasi i okidaču | 1 milijuna |
| Vremensko ograničenje CPU-a za sinkronu transakciju | 10,000 milisekundi |
| Vremensko ograničenje CPU-a za asinhronu transakciju | 60,000 milisekundi |
| Ukupna veličina hrpe | 6 MB (sinkrono) / 12 MB (asinkrono) |
Kako napisati testnu klasu u Apexu
Salesforce zahtijeva da barem 75 posto vašeg Apex koda bude pokriveno jediničnim testovima prije nego što ga možete implementirati u produkciju, a svaki okidač mora imati određenu pokrivenost. Pisanje testnih klasa stoga je ključna Apex vještina, a ne opcionalni dodatak.
Testna klasa je označena s @isTest, a svaka testna metoda je također označena s @isTest. Testne metode ne pohranjuju podatke u bazu podataka i ne vide većinu postojećih organizacijskih podataka, pa svaki test stvara vlastite zapise. Metode Test.startTest() i Test.stopTest() daju kodu koji se testira novi skup ograničenja regulatora, a tvrdnje provjeravaju je li se logika ponašala kako se očekivalo.
Evo jednostavne testne klase za logiku kreiranja računa:
@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);
}
}
Prilikom pisanja testova slijedite ove smjernice:
- Pomoću metode @testSetup možete stvoriti zajedničke testne podatke jednom za sve testne metode u klasi.
- Testirajte ponašanje skupnog unosa umetanjem 200 zapisa, ne samo jednog.
- Obuhvatite pozitivne, negativne i scenarije s ograničenim korisnicima.
- Uvijek uključite smislene System.assert izjave; pokrivenost bez tvrdnji ne dokazuje ništa.
Najbolje prakse Apexa
Početnici često pišu Apex koji radi za jedan zapis, ali ne uspijeva u stvarnim skupnim operacijama. Sljedeće prakse održavaju vaš kod unutar ograničenja regulatora i olakšavaju održavanje:
- Grupno pretvori sve: Napišite logiku koja obrađuje kolekcije zapisa, jer okidači mogu primiti do 200 zapisa u jednoj seriji.
- Izostavite SOQL i DML iz petlji: Upit prije petlje, prikupi promjene u listi i izvrši jednu DML naredbu nakon petlje.
- Jedan okidač po objektu: Okidače neka budu bez logike i delegirajte posao klasama rukovatelja, što redoslijed izvršavanja čini predvidljivim.
- Koristi se s dijeljenjem: Provedite sigurnost na razini zapisa osim ako ne postoji dokumentirani razlog za izvođenje u kontekstu sustava.
- Izbjegavajte fiksno kodiranje ID-ova: ID-ovi zapisa razlikuju se između sandbox okruženja i produkcije, stoga ih pretražite ili umjesto toga koristite prilagođene metapodatke.
- Pratite ograničenja u kodu: Metode klase Limits, kao što je Limits.getQueries(), omogućuju vam provjeru potrošnje resursa tijekom izvođenja.
💡 Savjet: Pokrenite svoj kod na 200 zapisa u sandboxu prije implementacije. Većina kvarova ograničenja regulatora pojavljuje se samo pri velikim količinama podataka, a njihovo rano otkrivanje je daleko jeftinije od otklanjanja pogrešaka u produkciji.






