apex — συγκεντρωτικός οδηγός — DedSec Project
apex — συγκεντρωτικός οδηγός Apex Τι προσφέρει η γλώσσα Η Salesforce Apex είναι server-side αντικειμενοστραφής γλώσσα με όρια συναλλαγών και ειδικό πλαίσιο tests. Μικρό παράδειγμα προς…
Apex
Τι προσφέρει η γλώσσα
Η Salesforce Apex είναι server-side αντικειμενοστραφής γλώσσα με όρια συναλλαγών και ειδικό πλαίσιο tests.
Μικρό παράδειγμα προς μελέτη
Integer total = 0;
for (Integer n : new List<Integer>{1,2,3}) {
total += n;
}
System.debug(total);
Υπολόγισε το άθροισμα και εξήγησε γιατί SOQL query μέσα σε loop κλιμακώνεται άσχημα σε πολλές εγγραφές.
Τι να επαληθεύσεις
Κατάγραψε την πραγματική έκδοση εργαλείου, τις απαιτούμενες εξαρτήσεις και την έξοδο σε δοκιμαστικά δεδομένα για τη Apex. Πρόβλεψε το αποτέλεσμα πριν το ελέγξεις και διατήρησε την αρχική και τη διορθωμένη εκδοχή ώστε να φαίνεται η αιτιώδης διαφορά. Μην αποκαλείς ένα απόσπασμα εκτελεσμένο αν δεν έχεις το κατάλληλο περιβάλλον.
Παγίδα ειδική για το θέμα
Τα governor limits εφαρμόζονται από το Salesforce· δεν αντιστοιχούν στη συμπεριφορά Java ή C#.
Εργαστήριο εξάσκησης: Apex
Η Apex εκτελείται στην πλατφόρμα Salesforce. Μία συναλλαγή μπορεί να έχει όρια για ερωτήματα βάσης, μνήμη και χρόνο CPU. Δούλεψε μόνο σε εξουσιοδοτημένο developer sandbox και ξεκίνα από μεταβλητές στη μνήμη, όχι από αλλαγές σε πραγματικά δεδομένα πελατών.
Άσκηση 1: αθροιστής με ελεγχόμενη είσοδο
List<Integer> quantities = new List<Integer>{2, 5, 3};
Integer total = 0;
for (Integer qty : quantities) {
total += qty;
}
System.debug(total);
Η αναμενόμενη τιμή στο debug log είναι 10. Μετά από κάθε επανάληψη, το total πρέπει να ισούται με το άθροισμα των στοιχείων που έχουν ήδη επεξεργαστεί. Πρόβλεψε τι θα συμβεί σε κενή λίστα: το αρχικό μηδέν παραμένει. Δοκίμασε νοητικά τη λίστα {2, -5, 3}, που δίνει μηδέν. Ένας αρνητικός ακέραιος επιτρέπεται από τον τύπο Integer, αλλά ίσως παραβιάζει επιχειρησιακό κανόνα αποθήκης· πρόκειται για δύο διαφορετικούς ελέγχους.
Άσκηση 2: κλειδί ή θέση;
Σχεδίασε ένα Map<String, Integer> με τα κλειδιά apple και pear και τιμές 2 και 5. Έλεγξε την ύπαρξη ενός κλειδιού με containsKey πριν αποφασίσεις τι θα κάνεις όταν λείπει. Εξήγησε γιατί η θέση [1] μιας List δεν είναι το ίδιο με αναζήτηση κλειδιού σε Map και ποια δομή ταιριάζει σε έναν κατάλογο προϊόντων.
Άσκηση 3: ασφαλής σκέψη για triggers
Φαντάσου trigger που δέχεται 200 εγγραφές. Σύγκρινε ένα SOQL query για όλα τα αναγκαία IDs με την αποστολή ενός νέου query μέσα σε κάθε επανάληψη. Περιέγραψε γιατί η δεύτερη υλοποίηση κινδυνεύει να ξεπεράσει governor limits. Δεν χρειάζεται να εκτελέσεις DML σε πραγματικό οργανισμό για να αποδείξεις το επιχείρημα. Η σωστή αρχιτεκτονική είναι bulk-aware πριν εμφανιστεί μεγάλο φορτίο.
Κριτήρια ολοκλήρωσης
Κατάγραψε πλατφόρμα, έκδοση, πλαίσιο Execute Anonymous, αναμενόμενες τιμές και διαφορές ανάμεσα σε σφάλμα τύπου, λανθασμένο επιχειρησιακό κανόνα και όριο συναλλαγής. Τα παραδείγματα είναι για στατική μελέτη· δεν ισχυριζόμαστε ότι εκτελέστηκαν σε Salesforce. Πριν από οποιαδήποτε πραγματική εγγραφή χρειάζονται δικαιώματα, έλεγχος validation rules και κατανόηση του rollback.
Apex — Διαδρομή ουσιαστικής εξάσκησης
Στάδιο 1: κατανόηση εκτέλεσης
Σε Salesforce sandbox γράψε Apex class με bound variable σε SOQL αντί να βάζεις user string μέσα στο query. Εξήγησε governor limits και τη διαφορά τους από κοινά DB limits.
Στάδιο 2: απόδειξη με ελεγχόμενες δοκιμές
Γράψε Apex test με δοκιμαστικά records για authorized και unauthorized αποφάσεις. Μελέτησε with sharing/inherited sharing και έλεγξε permissions σε objects και fields.
Στάδιο 3: μικρό ολοκληρωμένο έργο
Προσομοίωσε bulk επεξεργασία 200 εγγραφών και μέτρησε SOQL/DML operations. Βγάλε queries έξω από loops και κράτησε coverage και limits. Όχι σε production customer data.
Πείραμα Apex για όρια queries και έλεγχο δικαιωμάτων
Δημιούργησε test-only trigger για batch 200 εγγραφών με επαναλαμβανόμενα ξένα κλειδιά. Μέτρησε τα SOQL queries όταν γίνονται μέσα σε βρόχο και ανασχεδίασε με συλλογή IDs σε Set<Id> και ένα query εκτός βρόχου. Η εργασία πρέπει να εξαρτάται από τα μοναδικά ξένα κλειδιά και όχι απλώς τον αριθμό εγγραφών. Επιβεβαίωσε ενημερώσεις και governor limits με Test.startTest/Test.stopTest. Πρόσθεσε απορριπτόμενη ενημέρωση χρήστη χωρίς field-level δικαίωμα. Μην κάνεις production DML και μη χρησιμοποιείς SeeAllData=true. Οι sharing rules διαφέρουν από τα δικαιώματα αντικειμένου και πεδίου· το bulkification δεν αρκεί για ασφάλεια.