Salesforce'i Apexi õpetus algajatele
⚡ Nutikas kokkuvõte
Apex programmeerimine annab Salesforce'i arendajatele objektorienteeritud ja tugevalt tüübitud keele kohandatud äriloogika lisamiseks CRM-i. See toetab klasse, päästikuid ja partiitöid, samas kui halduspiirangud hoiavad jagatud mitme üürniku platvormi stabiilsena.

Mis on Apex Salesforce'is?
Tipp on objektorienteeritud ja tugevalt tüübitud programmeerimiskeel, mille on välja töötanud Salesforce tarkvarateenusena (SaaS) ja kliendisuhete halduse (CRM) rakenduste loomiseks. Apex aitab arendajatel luua kolmandate osapoolte SaaS-rakendusi ja lisada süsteemisündmustele äriloogikat, pakkudes taustandmebaasi tuge ja klient-serveri liideseid.
Apex aitab arendajatel lisada äriloogikat süsteemisündmustele, nagu nupuklõpsud, seotud kirjete värskendused ja Visualforce'i lehed. Apexil on sarnane süntaks järgmisele: Java. Registreeruge Salesforce'i kasutajaks et teada saada, kuidas CRM töötab.
Apexi programmeerimiskeele omadused
Siin on Salesforce Apexi olulised funktsioonid:
- Apex on suur- ja väiketähti mittetundlik keel.
- Apexi abil saate sObjecti kirjetega teha DML-toiminguid, näiteks INSERT, UPDATE, UPSERT ja DELETE.
- Apexis saate sObjecti kirjete päringuid esitada SOQL-i (Salesforce Object Query Language) ja SOSL-i (Salesforce Object Search Language) abil.
- Võimaldab luua a ühiku test ja käivitage see, et kontrollida koodi katvus ja koodi efektiivsus Apexis.
- Apex teostab mitme rentniku keskkonnas ja Sales Force on määratlenud halduspiirangud, mis takistavad kasutajal jagatud ressursse monopoliseerimast. Iga kood, mis ületab Salesforce'i halduspiirangu, ebaõnnestub ja kuvatakse viga.
- Salesforce'i objekti saab Apexis kasutada andmetüübina. Näiteks:
Account acc = new Account();
Siin on Konto standardne Salesforce'i objekt.
- Apex uuendab automaatselt iga Salesforce'i väljalaskega.
Millal peaks arendaja valima Apexi?
Apex-koodi tuleks kirjutada ainult siis, kui äristsenaarium on Salesforce'i pakutava eelvalmistatud osuta ja klõpsa funktsiooni abil rakendamiseks liiga keeruline.
Järgnevalt on toodud mõned stsenaariumid, kus peate kirjutama Apex-koodi:
- Veebiteenuste loomiseks, mis integreerivad Salesforce'i teiste rakendustega.
- Kohandatud valideerimise rakendamiseks sObjects'idel.
- Kohandatud Apex-loogika käivitamiseks DML-toimingu tegemisel.
- Funktsionaalsuse rakendamiseks, mida ei saa luua olemasolevate deklaratiivsete automatiseerimistööriistadega, näiteks Flow.
- Üles seadma e-posti teenused mis töötlevad sissetulevate e-kirjade sisu, päiseid ja manuseid.
Kui teate, millal on Apex õige valik, on järgmine samm mõista, mis teie koodiga pärast salvestamist juhtub.
Apexi tööstruktuur
Järgnev on Apex-koodi toimingute voog:
- Arendaja tegevus: Kui arendaja salvestab koodi platvormile, kompileeritakse kogu Apexi kood juhiste komplektiks, millest Apexi käitusaja interpreter aru saab, ja need juhised salvestatakse seejärel platvormil metaandmetena.
- Lõppkasutaja toiming: Kui kasutajasündmus käivitab Apex-koodi, hangib platvormiserver metaandmetest kompileeritud juhised ja käivitab need enne tulemuse tagastamist Apex-tõlgi kaudu.
Allolev diagramm näitab, kuidas arendaja ja lõppkasutaja toimingud Lightning Platformi rakendusserveriga suhtlevad:
Apexi arenduskeskkond
Apex-koodi saab arendada kas liivakastis või Salesforce'i Developer Editioni organisatsioonis.
Parim tava on koodi arendamine liivakastikeskkonnas ja seejärel tootmiskeskkonda juurutamine, nagu allpool näidatud:
Apex-koodi arendustööriistad: Järgnevalt on toodud kolm tööriista, mis on Apex-koodi arendamiseks saadaval kõigis Salesforce'i versioonides:
- Arendajakonsool
- Visual Studio Code Salesforce'i laienduspaketiga (see asendab aegunud Force.com IDE-d)
- Code redaktor Salesforce'i seadistusliideses
Kui teie keskkond on valmis, vaatame keele enda ehitusplokke, alustades andmetüüpidest.
Andmetüübid Apexis
Apex toetab järgmisi andmetüüpe:
Primitiivne
Täisarv Double, Long, Date, Datetime, Decimal, Time, Blob, String, ID ja Boolean loetakse primitiivseteks andmetüüpideks. Kõik primitiivsed andmetüübid edastatakse väärtuse, mitte viite järgi.
Kollektsioonid
Apexis on saadaval kolme tüüpi kollektsioone:
- Nimekiri: See on järjestatud primitiivide, sObjektide, kollektsioonide või Apex-objektide kogum, mis põhineb indeksitel.
- Set: Unikaalsete elementide korrastamata kogum, mis ei sisalda duplikaate.
- Kaart: See on unikaalsete võtmete kogum, mis on seotud üksikute väärtustega, mis võivad olla primitiivid, sObjektid, kollektsioonid või Apex-objektid.
sObjekt
See on Salesforce'i spetsiaalne andmetüüp. See sarnaneb tabeliga SQL ja sisaldab välju, mis on sarnased SQL-i veergudega.
Enums
Enum on kõhulihastract-andmetüüp, mis salvestab ühe väärtuse lõplikust hulgast kindlaksmääratud identifikaatoritest.
Klassid, objektid ja liidesed
Kasutaja määratletud Apex-klasse ja liideseid saab samuti kasutada andmetüüpidena. Objekt viitab mis tahes Apexis toetatud andmetüübi eksemplarile.
Apexi süntaks
Muutuv deklaratsioon
Kuna Apex on tugevalt tüübitud keel, on Apexis kohustuslik deklareerida andmetüübiga muutuja.
Näiteks:
Contact con = new Contact();
Siin deklareeritakse muutuja con, mille andmetüüp on Contact.
SOQL päring
SOQL on lühend sõnadest Salesforce Object Query Language (Salesforce'i objektipäringukeel). SOQL-i kasutatakse sObject-kirjete toomiseks Salesforce'i andmebaasist. Näiteks:
Account acc = [SELECT Id, Name FROM Account LIMIT 1];
Ülaltoodud päring toob Salesforce'i andmebaasist kontokirje.
Loop avaldus
Loendis olevate kirjete läbimiseks kasutatakse tsüklit. Iteratsioonide arv on võrdne loendis olevate kirjete arvuga. Näiteks:
List<Account> listOfAccounts = [SELECT Id, Name FROM Account LIMIT 100];
// iteration over the list of accounts
for(Account acc : listOfAccounts){
//your logic
}
Ülaltoodud koodilõigus on listOfAccounts muutuja, mille andmetüüp on List.
Voolu juhtimise avaldus
Voolu juhtimise lause on kasulik, kui soovite teatud tingimuste alusel käivitada teatud koodiridu.
Näiteks:
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
}
Ülaltoodud koodilõik pärib andmebaasist kontokirjeid ja kontrollib loendi suurust.
DML-i avaldus
DML on lühend sõnadest Data Manipulation Language. DML-lauseid kasutatakse Salesforce'i andmebaasis andmetega manipuleerimiseks. Näiteks:
Account acc = new Account(Name = 'Test Account'); insert acc; //DML statement to create account record.
Apex Accessi spetsifikatsioonid
Järgnevalt on toodud Apexi toetatud juurdepääsuspetsifikatsioonid:
avalik
See juurdepääsuspetsifikatsioon annab juurdepääsu klassile, meetodile või muutujale, mida Apex nimeruumis kasutab.
Era-
See juurdepääsuspetsifikatsioon annab juurdepääsu klassile, meetodile või muutujale, mida saab kasutada lokaalselt või koodi osas, kus see on defineeritud. Kõik meetodid ja muutujad, millel pole juurdepääsuspetsifikatsiooni defineeritud, võtavad vaikimisi juurdepääsuspetsifikatsiooni private.
Kaitstud
See juurdepääsuspetsifikatsioon annab juurdepääsu meetodile või muutujale, mida saavad kasutada kõik määratleva Apex-klassi sisemised klassid.
Globaalne
See juurdepääsuspetsifikatsioon annab juurdepääsu klassile, meetodile või muutujale, mida Apex saab kasutada nii nimeruumis kui ka väljaspool seda. Parima tava kohaselt ei ole soovitatav kasutada märksõna „global”, kui see pole hädavajalik.
Märksõnad Apexis
Jagamisega
Kui klass on selle märksõnaga defineeritud, siis jõustatakse kõik praegusele kasutajale kehtivad jagamisreeglid. Kui see märksõna puudub, käivitatakse kood süsteemi kontekstis.
Näiteks:
public with sharing class MyApexClass{
// sharing rules enforced when code in this class executes
}
Ilma jagamiseta
Kui klass on selle märksõnaga defineeritud, siis praegusele kasutajale kehtivaid jagamisreegleid ei jõustata.
Näiteks:
public without sharing class MyApexClass{
// sharing rules are not enforced when code in this class executes
}
Staatiline
Märksõnaga „static” defineeritud muutuja või meetod initsialiseeritakse üks kord ja seostatakse klassiga. Staatilisi muutujaid ja meetodeid saab klassi nime abil otse kutsuda ilma klassi eksemplari loomata.
Lõplik
Märksõnaga „final” defineeritud konstanti või meetodit ei saa üle kirjutada. Näiteks:
public class myCls {
static final Integer INT_CONST = 10;
}
Kui proovite selle INT_CONST muutuja väärtust tühistada, saate erandi – System.FinalException: Final muutuja on juba initsialiseeritud.
tagastamine
See märksõna tagastab meetodi väärtuse. Näiteks:
public String getName() {
return 'Test';
}
NULL
See defineerib nullkonstandi ja selle saab määrata muutujale. Näiteks:
Boolean b = null;
virtuaalne
Kui klass on defineeritud märksõnaga „virtual”, saab seda laiendada ja üle kirjutada.
Abstract
Kui klass on defineeritud abs-igatracmärksõna t puhul peab see sisaldama vähemalt ühte meetodit märksõnaga abstract ja sellel meetodil peaks olema ainult signatuur.
Näiteks:
public abstract class MyAbstractClass {
abstract Integer myAbstractMethod1();
}
Apex String
String on tähemärkide kogum, millel pole tähemärkide piirangut. Näiteks:
String name = 'Test';
Salesforce'i String-klass pakub mitmeid sisseehitatud meetodeid. Järgnevalt on toodud mõned sageli kasutatavad meetodid:
lühenda (maxWidth)
See meetod kärbib stringi määratud pikkuseni ja tagastab selle, kui antud stringi pikkus on pikem kui määratud pikkus; vastasel juhul tagastab see algse stringi. Kui muutuja maxWidth väärtus on väiksem kui 4, tekitab see meetod käitusaja erandi – System.StringException: Minimaalne lühendi laius on 4.
Näiteks:
String s = 'Hello World';
String s2 = s.abbreviate(8);
System.debug('s2: ' + s2); //Hello...
suurtäht ()
See meetod teisendab stringi esimese tähe pealkirja suurtähtedeks ja tagastab selle.
Näiteks:
String s = 'hello';
String s2 = s.capitalize();
System.assertEquals('Hello', s2);
sisaldab (alamstringi)
See meetod tagastab väärtuse „true”, kui meetodit kutsuv string sisaldab määratud alamstringi.
String name1 = 'test1';
String name2 = 'test';
Boolean flag = name1.contains(name2);
System.debug('flag:: ' + flag); //true
võrdub(stringOrId)
See meetod tagastab väärtuse „true”, kui edastatud parameeter ei ole null ja esindab sama binaarmärkide jada kui string, mis meetodit kutsub.
ID-väärtuste võrdlemisel ei pruugi ID-de pikkused olla võrdsed. Näiteks kui 15-tähemärgilist ID-d esindavat stringi võrreldakse objektiga, mis esindab 18-tähemärgilist ID-d, tagastab see meetod ikkagi väärtuse „true“. Näiteks:
String stringValue15 = '001D000000Ju1zH';
Id idValue18 = '001D000000Ju1zHIAR';
Boolean result = stringValue15.equals(idValue18);
System.debug('result: ' + result); //true
Ülaltoodud näites võrdleb meetod equals 15-tähemärgilist objekti ID-d 18-tähemärgilise objekti ID-ga ja kui mõlemad ID-d esindavad sama binaarjada, tagastab see väärtuse true.
Kasutage seda meetodit tõstutundlike võrdluste tegemiseks.
escapeSingleQuotes (stringToEscape)
See meetod lisab enne iga üksikut jutumärki stringis paomärgi (\) ja tagastab tulemuse. See meetod hoiab ära SOQL-i süstimise dünaamilise SOQL-päringu loomisel. See tagab, et kõiki üksikuid jutumärke käsitletakse ümbritsevate stringidena, mitte andmebaasikäskudena.
Näiteks:
String s = 'Hello \'Tom\''; String escapedStr = String.escapeSingleQuotes(s); System.debug(escapedStr); // Outputs Hello \'Tom\'
eemalda (alamstring)
See meetod eemaldab meetodi kutsuvast stringist kõik mainitud alamstringi esinemised ja tagastab tulemuseks oleva stringi.
Näiteks:
String s1 = 'Salesforce and force.com';
String s2 = s1.remove('force');
System.debug('s2: ' + s2); // 'Sales and .com'
alamstring (algusindeks)
See meetod tagastab alamstringi, mis algab startIndexis olevast märgist ja ulatub stringi lõpuni.
Näiteks:
String s1 = 'hamburger';
String s2 = s1.substring(3);
System.debug('s2: ' + s2); //burger
tagurpidi()
See meetod pöörab kõik stringi märgid ümber ja tagastab selle. Näiteks:
String s = 'Hello';
String s2 = s.reverse();
System.debug('s2:::: ' + s2); // olleH
kärpima ()
See meetod eemaldab stringist kõik alguses ja lõpus olevad tühikud ning tagastab selle.
valueOf(konverteeritav)
See meetod tagastab edastatud objekti stringesituse.
Stringid, klassid ja märksõnad saavad kokku, kui hakkate loogikat pakkima korduvkasutatavatesse ühikutesse – just selleks Apexi klassid ongi.
Apex klass
Apex-klass on plaan või mall, mille põhjal luuakse objekte. Objekt on klassi eksemplar.
Salesforce'is on Apex-klasside loomiseks kolm võimalust:
- Arendajakonsool
- Visual Studio Code Salesforce'i laienduspaketiga
- Apex-klassi üksikasjade leht seadistuses
Apexis saate defineerida välise klassi, mida nimetatakse ka tipptaseme klassiks, ja saate defineerida ka välise klassi sees klasse, mida nimetatakse siseklassideks.
Välise klassi deklareerimisel on kohustuslik kasutada juurdepääsu modifikaatorit, näiteks global või public.
Sisemiste klasside deklareerimisel ei ole vaja juurdepääsumodifikaatorit kasutada.
Apex-klass defineeritakse märksõna „class” abil, millele järgneb klassi nimi.
Märksõna „extends” kasutatakse Apex-klassis olemasoleva klassi laiendamiseks ja märksõna „implements” kasutatakse Apex-klassis liidese rakendamiseks.
Salesforce Apex ei toeta mitmekordset pärimist; Apexi klass saab laiendada ainult ühte olemasolevat Apexi klassi, kuid saab rakendada mitut liidest.
Apex-klass võib sisaldada kasutaja määratletud konstruktorit ja kui kasutaja määratletud konstruktorit pole saadaval, kasutatakse vaikekonstruktorit. Konstruktori kood käivitatakse klassi eksemplari loomisel.
Apex-klassi süntaks:
public class myApexClass{
// variable declaration
//constructor
public myApexClass(){
}
//methods declaration
}
Märksõna „new” kasutatakse Apex-klassi eksemplari loomiseks. Allpool on Apex-klassi eksemplari loomise süntaks:
myApexClass obj = new myApexClass();
Apex Getter ja setter
Apex-i omadus sarnaneb Apex-i muutujaga. Apex-i omaduse jaoks on vajalikud getter ja setter. Neid saab kasutada koodi käivitamiseks enne omaduse väärtusele juurdepääsu või selle muutmist. get-päässor käivitatakse, kui omaduse väärtust loetakse. Set-päässor käivitatakse, kui omaduse väärtust muudetakse. Iga omadust, millel on ainult get-päässor, loetakse kirjutuskaitstuks, iga omadust, millel on ainult set-päässor, loetakse kirjutuskaitstuks ja iga omadust, millel on nii get- kui ka set-päässor, loetakse kirjutuskaitstuks. Apex-i omaduse süntaks:
public class myApexClass {
// Property declaration
access_modifier return_type property_name {
get {
//code
}
set{
//code
}
}
}
Siin on access_modifier atribuudi juurdepääsumodifikaator, return_type on atribuudi andmetüüp ja property_name on atribuudi nimi.
Allpool on näide Apexi atribuudist, millel on nii get kui ka set ligipääsufunktsioonid:
public class myApex{
public String name{
get{ return name; }
set{ name = value; }
}
}
Siin on atribuudi nimi nimi, see on avalik atribuut ja tagastab stringi andmetüübi.
Koodi olemasolu get ja set plokkides ei ole kohustuslik. Need plokid võib automaatse atribuudi määratlemiseks tühjaks jätta. Näiteks:
public double MyReadWriteProp{ get; set; }
Get ja set ligipääsufunktsioone saab defineerida ka nende endi ligipääsumodifikaatoritega. Kui ligipääsufunktsioon on defineeritud modifikaatoriga, siis see tühistab atribuudi ligipääsumodifikaatori. Näiteks:
public String name{private get; set;}// name is private for read and public for write.
Klassid defineerivad korduvkasutatavat loogikat, mida saab selgesõnaliselt välja kutsuda. Järgnevalt käsitletavad päästikud käivituvad automaatselt iga kord, kui kirjed muutuvad.
Apex Trigger
Apex-päästikud võimaldavad teil käivitada kohandatud Apex-i enne ja pärast DML-toimingu sooritamist.
Apex toetab järgmist kahte tüüpi päästikuid:
Enne päästikuid: Neid päästikuid kasutatakse välja väärtuse valideerimiseks ja värskendamiseks enne kirje salvestamist andmebaasi.
Pärast päästikuid: Neid päästikuid kasutatakse süsteemi poolt pärast kirje andmebaasi kinnitamist määratud väljaväärtustele (nt kirje ID ja väli LastMódustatudKuupäev) juurdepääsuks. Neid väljaväärtusi saab kasutada teiste kirjete muutmiseks. Pärast päästikuid käivituvad kirjed on kirjutuskaitstud.
Hulgitud päästikute kirjutamine on hea tava. Hulgitud päästik saab korraga töödelda nii ühte kirjet kui ka mitut kirjet.
Apex-päästiku süntaks:
trigger TriggerName on ObjectName (trigger_events) {
//Code_block
}
Siin on TriggerName päästiku nimi, ObjectName on objekti nimi, millele päästik on kirjutatud, ja trigger_events on komadega eraldatud sündmuste loend.
Apex-päästikute toetatud sündmused on järgmised: enne sisestamist, enne värskendamist, enne kustutamist, pärast sisestamist, pärast värskendamist, pärast kustutamist, pärast kustutamise taastamist.
Staatilisi märksõnu ei saa Apex-päästiku sees kasutada. Apex-päästiku sees saab kasutada kõiki sisemistele klassidele kehtivaid märksõnu.
Iga päästik defineerib implitsiitsed muutujad, mis tagastavad käitusaja konteksti. Need muutujad on defineeritud klassis System.Trigger ja neid nimetatakse kontekstimuutujateks. Allolevad kaks ekraanipilti loetlevad Apex-päästikute toetatud kontekstimuutujad:
Järgnevalt on toodud Apex-päästikute kontekstimuutujate kaalutlused:
- Ärge kasutage DML-toimingutes funktsioone trigger.new ja trigger.old.
- Trigger.new faili ei saa kustutada.
- Trigger.new on pärast triggerite avamist kirjutuskaitstud.
- Funktsiooni Trigger.new saab kasutada sama objekti väljade väärtuste muutmiseks ainult enne käivitajaid.
Allolevad kaks ekraanipilti loetlevad kaalutlused konkreetsete toimingute kohta erinevate käivitussündmuste korral:
Päästikud tegelevad reaalajas loogikaga, kuid mõned tööd on ühe tehingu jaoks lihtsalt liiga mahukad. Siin tulebki mängu pakk-Apex.
Partii klass Apexis
Salesforce'i partiiklassi kasutatakse suure hulga kirjete töötlemiseks, mis tavapärase töötlemise korral ületaksid Apex-i halduspiiranguid. Partiiklass käivitab koodi asünkroonselt.
Partiiklassi eelised on järgmised:
- Partiiklass töötleb andmeid tükkidena ja kui ühe tüki töötlemine ebaõnnestub, siis edukalt töödeldud tükke tagasi ei pöörata.
- Iga partiiklassi andmeosa töödeldakse uue regulaatori piirangute komplektiga, mis tagab koodi täitmise regulaatori täitmispiirangute piires.
Database.Batchable liidest saab kasutada partiiklassina, mille implementeerib Apex-klass. See pakub kolme meetodit, mille partiiklass peab implementeerima:
1. algus()
See meetod genereerib liidesemeetodi execute töödeldavate kirjete või objektide ulatuse. Seda kutsutakse partii (batch) täitmise ajal ainult üks kord. See meetod tagastab kas Database.QueryLocator objekti või itereeritava väärtuse. SOQL-päringuga saab Database.QueryLocator objekti abil hankida 50 miljonit kirjet, kuid itereeritava väärtuse kasutamisel on SOQL-päringuga hankida ainult 50 000 kirjet. Itereeritavat väärtust kasutatakse partii (batch) klassi keeruka ulatuse genereerimiseks.
Käivitusmeetodi süntaks:
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {}
2. käivita()
Seda meetodit kasutatakse iga andmeploki töötlemiseks. Meetodit execute kutsutakse välja iga kirjeteploki jaoks. Vaikimisi on partii suurus käivitamiseks 200 kirjet. Meetod execute võtab vastu kaks argumenti:
viide objektile Database.BatchableContext,
sObjektide loend, näiteks List või parameetritega tüüpide loend. Käivitusmeetodi süntaks:
global void execute(Database.BatchableContext bc, List<P> records){}
3. lõpeta()
Meetodit finish kutsutakse partii (batch) töötlemise ajal üks kord. Meetodi finish abil saab teostada järeltöötlustoiminguid. Näiteks: kinnitusmeili saatmine. Meetodit kutsutakse välja siis, kui kõik partiid (batch) on töödeldud. Meetodi finish süntaks:
global void finish(Database.BatchableContext bc){}
Andmebaas.BatchableContext objekt
Igal Database.Batchable liidese meetodil on viide Database.BatchableContext objektile.
Seda objekti kasutatakse track partiitöö edenemist.
Järgnevalt on toodud BatchableContexti pakutavad eksemplari meetodid:
- getChildJobId(): See meetod tagastab hetkel töödeldava pakktöö ID.
- getJobId(): see meetod tagastab pakktöö ID.
Allpool on partiiklassi süntaks:
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 meetod
Database.executeBatch meetodit kasutatakse partiiklassi käivitamiseks.
See meetod võtab kaks parameetrit: töödeldava partiiklassi eksemplari ja valikulise ulatusparameetri partii suuruse määramiseks. Kui seda ei määrata, kasutatakse vaikeväärtust 200.
Database.executeBatchi süntaks:
Database.executeBatch(myBatchObject, scope)
Pakkklassi nimega MyBatchClass käivitamine:
MyBatchClass myBatchObject = new MyBatchClass(); Id batchId = Database.executeBatch(myBatchObject, 100);
Andmebaas.Olekupõhine
Pakkklass on vaikimisi olekuta. Iga kord, kui kutsutakse välja execute-meetod, saadakse objektist uus koopia ja kõik klassi muutujad initsialiseeritakse.
Database.Stateful on rakendatud partiiklassi olekupõhiseks muutmiseks.
Kui teie partiiklass rakendab andmebaas.Oleklik liides, kõik eksemplari muutujad säilitavad oma väärtused, kuid staatilised muutujad lähtestatakse tehingute vahel.
Asünkroonne Apex Beyond Batch
Pakk-Apex on vaid üks mitmest viisist koodi asünkroonselt käivitamiseks. Salesforce pakub nelja asünkroonset valikut ja õige valimine sõltub sellest, kui palju andmeid te töötlete ja kas töid on vaja aheldada või ajastada.
- Tulevased meetodid: @future'iga annoteeritud need sobivad kõige paremini lihtsateks ja kergesti käivitatavateks toiminguteks, näiteks välistele veebiteenustele viitamiseks.
- Järjekorras olev tipp: Rakendab järjekorda paneva liidese, aktsepteerib keerukaid objektitüüpe, tagastab töö ID ja toetab ühe töö aheldamist teisega.
- Partii tipp: Töötleb väga suuri andmemahtusid tükkidena, nagu eespool kirjeldatud.
- Planeeritud Tipp: Rakendab ajastatava liidese, nii et klass käivitub kindlal ajal, näiteks igaõhtune puhastustöö.
| KASUTUSALA | Parim | Võtmevõime |
|---|---|---|
| Tuleviku meetod | Lihtsad viiktekstid | Tulekahju ja unusta |
| Järjekorras olev Apex | Järjestikune töötlemine | Tööde aheldamine ja jälgimine |
| Partii Apex | Miljoneid kirjeid | Tükeldatud töötlemine |
| Planeeritud Tipp | Korduvad töökohad | Croni-põhine ajastus |
Olenemata sellest, millise täitmismudeli valite, mõõdetakse iga tehingut ikkagi allpool loetletud platvormiüleste regulaatorite piirangute suhtes.
Apexi kuberneri piirangud
Apex-i regulaatori piirangud on Apex-i käitusmootori poolt kehtestatud piirangud, et tagada, et Apex-i koodi ja protsesside üleküllus ei monopoliseeriks jagatud ressursse ega häiriks teiste kasutajate töötlemist mitme üürnikuga keskkonnas. Neid piiranguid kontrollitakse iga Apex-i tehingu puhul. Järgnevalt on toodud Salesforce'i poolt iga Apex-i tehingu jaoks määratletud regulaatori piirangud:
| Kirjeldus | piir |
|---|---|
| SOQL-päringud, mida saab teha sünkroonse tehinguga | 100 |
| SOQL-päringud, mida saab teha asünkroonse tehinguga | 200 |
| Kirjed, mida saab hankida SOQL-päringuga | 50,000 |
| Kirjed, mida saab alla laadida rakendusega Database.getQueryLocator | 10,000 |
| SOSL-päringud, mida saab Apex-tehingus teha | 20 |
| Kirjed, mida saab hankida SOSL-päringuga | 2,000 |
| DML-laused, mida saab Apex-tehingus teha | 150 |
| Kirjed, mida saab töödelda DML-lause, Approval.process või database.emptyRecycleBin tulemusel | 10,000 |
| Apex-tehinguga tehtavad väljakutsed | 100 |
| Apex-tehingu käigus teostatavate väljakutsete kumulatiivne ajalõpu piirang | 120 sekundit |
| System.enqueueJob abil järjekorda lisatavate Apex-tööde arv | 50 |
| Iga Apexi tehingu teostamise tähtaeg | 10 minuti |
| Apex-klassis ja -päästikul kasutatavate märkide piirang | 1 miljonit |
| Sünkroonse tehingu protsessori ajapiirang | 10,000 millisekundid |
| Asünkroonse tehingu protsessori ajapiirang | 60,000 millisekundid |
| Kogukuhja suurus | 6 MB (sünkroonne) / 12 MB (asünkroonne) |
Kuidas kirjutada testklassi Apexis
Salesforce nõuab, et vähemalt 75 protsenti teie Apex-koodist oleks enne tootmiskeskkonda juurutamist kaetud ühiktestidega ja iga päästik peab olema mingil määral kaetud. Testiklasside kirjutamine on seega Apex-i põhioskus, mitte valikuline lisa.
Testiklass on tähistatud @isTest-iga ja iga testimismeetod on samuti tähistatud @isTest-iga. Testimismeetodid ei lisa andmeid andmebaasi ega näe enamikku olemasolevaid organisatsiooniandmeid, seega loob iga test oma kirjed. Meetodid Test.startTest() ja Test.stopTest() annavad testitavale koodile uued piirangud ning väited kontrollivad, kas loogika toimis ootuspäraselt.
Siin on lihtne konto loomise loogika testklass:
@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);
}
}
Testide kirjutamisel järgige neid juhiseid:
- Kasutage meetodit @testSetup, et luua jagatud testandmed kõigi klassi testimismeetodite jaoks korraga.
- Testi hulgi käitumist, sisestades 200 kirjet, mitte ainult ühe.
- Hõlma positiivseid, negatiivseid ja piiratud kasutajatega stsenaariume.
- Lisage alati sisukad System.assert-laused; kajastus ilma väideteta ei tõesta midagi.
Apexi parimad tavad
Algajad kirjutavad sageli Apex-koode, mis toimivad ühe kirje puhul, aga ebaõnnestuvad reaalsetes hulgitoimingutes. Alltoodud tavad hoiavad teie koodi piires ja on hõlpsamini hallatavad:
- Kõik mahuliseks muutmine: Kirjutage loogika, mis käsitleb kirjete kogumeid, sest päästikud saavad ühe partiiga vastu võtta kuni 200 kirjet.
- Hoidke SOQL ja DML tsüklitest eemal: Päring enne tsüklit, muudatuste kogumine loendisse ja ühe DML-lause sooritamine pärast tsüklit.
- Üks päästik objekti kohta: Hoidke päästikud loogikavabad ja delegeerige töö käitlejaklassidele, mis muudab täitmisjärjekorra etteaimatavaks.
- Kasuta jagamiseks: Rakenda kirjetaseme turvalisust, välja arvatud juhul, kui on dokumenteeritud põhjus selle käivitamiseks süsteemi kontekstis.
- Väldi ID-de kõvakodeerimist: Kirjete ID-d erinevad liivakastides ja tootmiskeskkonnas, seega otsige neid päringu abil või kasutage kohandatud metaandmeid.
- Koodis olevate piirangute jälgimine: Limits-klassi meetodid, näiteks Limits.getQueries(), võimaldavad teil ressursikasutust käitusajal kontrollida.
👍 Vihje: Enne juurutamist käivita oma kood liivakastis 200 kirjega. Enamik halduspiirangu tõrkeid ilmneb ainult suurte mahtude korral ja nende varajane avastamine on palju odavam kui nende vigade otsimine tootmiskeskkonnas.






