fflib – چارچوب قدیمی اما طلایی که هر توسعه دهنده Salesforce باید بداند

مقدمه
توسعه Salesforce طی سالها تکامل یافته است ، اما یک چارچوب در آزمون زمان ایستاده است: FFLIB (Apex مشترک). علی رغم مدتی در اطراف ، ابزاری قدرتمند است ، به خصوص برای شرکتهای در مقیاس بزرگ که با منطق پیچیده تجارت سر و کار دارند.
با رشد برنامه های Salesforce ، مدیریت مقیاس پذیری ، آزمایش و مدولار سخت می شود. fflib (Apex مشترک) این کار را با اجرای الگوهای سازمانی APEX ، ساخت ساختار یافته و حفظ کد ساده می کند. این وبلاگ به بررسی FFLIB ، اهمیت آن و چگونگی بهره مندی از صنایع در مقیاس بزرگ که ساختار پیچیده ای دارند ، می پردازد.
fflib چیست؟
FFLIB (کتابخانه Financial Force) یک چارچوب Apex است که برای اجرای جدایی نگرانی ها در برنامه های Salesforce طراحی شده است. برای اطمینان از کد تمیز ، قابل نگهداری و قابل استفاده مجدد ، در اطراف طراحی دامنه محور (DDD) و الگوهای سازمانی ساخته شده است. این امر به ویژه در سناریوهایی که سازمانها با طرح های پیچیده ، محاسبات تجاری و معاملات با حجم بالا با استفاده از ویژگی هایی مانند جریان ، محرک ها ، دسته ها ، صفحات و فراخوان ها سروکار دارند ، سودمند است.
اجزای کلیدی fflib
- Domain Layer – منطق تجارت مربوط به sobjects را محصور می کند.
- Layer Service – به عنوان رابط بین لایه دامنه و سیستم های خارجی عمل می کند.
- Selector Layer – نمایش داده های SOQL را بهینه کرده و پردازش فله را اعمال می کند.
- واحد کار (UOW) – عملیات DML کارآمد را با دسته بندی درج ها ، به روزرسانی ها و حذف ها ، کاهش تأثیر محدودیت های فرماندار و بهبود کنترل معامله تضمین می کند.
- خدمات تشخیص – ارزیاب قانون تجارت.
چرا از FFLIB در صنایع در مقیاس بزرگ استفاده می کنید؟
1. تفکیک نگرانی ها برای حفظ
- شرکت های بزرگ اغلب تیم های مختلفی دارند که روی همان سیستم کار می کنند. FFLIB جدایی واضح بین لایه ها ، کاهش درگیری ها و آسانتر کردن اشکال زدایی را انجام می دهد.
- به عنوان مثال ، محرک ها نباید شامل منطق تجارت باشند. در عوض ، منطق باید در لایه های دامنه و سرویس قرار گیرد و اصلاح کد را بدون شکستن اتوماسیون موجود آسانتر می کند.
2. فله و بهینه سازی عملکرد
- برنامه های سازمانی میلیون ها سوابق را اداره می کنند. FFLIB تضمین می کند که نمایش داده ها و عملیات DML مطابق با محدودیت های فرمانداری است.
- مثال: به جای ایجاد چندین تماس SOQL در یک حلقه ، لایه انتخاب کننده FFLIB نمایش داده ها را بهینه می کند تا فقط زمینه های مورد نیاز را واکشی کند.
3. رسیدگی به یکپارچه پردازش ناهمزمان
- سیستم های پیچیده شامل دسته ها ، صفحات و روش های آینده برای پردازش با حجم بالا هستند.
- FFLIB با متمرکز کردن منطق در لایه سرویس ، اطمینان از مکانیسم های آزمایشگاهی قابل اعتماد و رسیدگی به خطا ، امکان دستیابی به این موارد را فراهم می کند.
4. تماس و ادغام سیستم خارجی
- هنگام انجام تماس های خارجی API ، توسعه دهندگان اغلب با مدیریت پاسخ ها و خطاها مبارزه می کنند.
- FFLIB کار ساختاری را از طریق لایه های سرویس فراهم می کند ، و باعث می شود که تماس تلفنی ها در کلاس های آزمایشی را آسان تر کنید و از پردازش مناسب پاسخ API اطمینان حاصل کنید.
5. واحد کار برای مدیریت کارآمد DML
- الگوی واحد کار (UOW) در FFLIB به دسته بندی چندین عملیات DML در یک تعهد واحد ، بهبود کارآیی و کاهش خطرات محدود کننده فرماندار کمک می کند.
- به جای انجام عملیات DML جداگانه ، FFLIB_UNITOFWORK FFLIB تمام درج ها ، به روزرسانی ها را جمع می کند و آنها را به صورت کنترل شده حذف و اجرا می کند.
مثال: استفاده از واحد کار برای پردازش ترتیب
public class OrderService {
public void createOrderWithItems(Order__c order, List items) {
fflib_UnitOfWork uow = new fflib_UnitOfWork(new Schema.SObjectType[]{Order__c.SObjectType, Order_Item__c.SObjectType});
uow.registerNew(order);
for (Order_Item__c item : items) {
uow.registerNew(item);
}
uow.commitWork();
}
}
- این تضمین می کند که همه سوابق در کنار هم متعهد شده اند ، از درج های جزئی یا برگشتی های غیر ضروری جلوگیری می کنند.
6. افزایش تست و تزریق وابستگی
- در برنامه های در مقیاس بزرگ ، آزمایش بسیار مهم است. FFLIB از تزریق وابستگی استفاده می کند و به توسعه دهندگان این امکان را می دهد تا وابستگی ها را مسخره کنند و آزمایشات واحد را بدون هدف قرار دادن به پایگاه داده اجرا کنند.
مورد استفاده پیچیده: پردازش سفارش چند مرحله ای با FFLIB
سناریو: یک شرکت بزرگ تجارت الکترونیکی باید سفارشات مشتری را که شامل می شود پردازش کند:
- اعتبار سنجی سفارش (محرک و لایه دامنه)
- بررسی و رزرو موجودی (لایه سرویس و صفحات)
- پردازش پرداخت از طریق API خارجی (Callout & Future Method)
- پردازش دسته ای برای تحقق سفارش (دسته Apex)
اجرای
1. سفارش را به صورت منطق دامنه فراخوانی سفارش دهید
trigger OrderTrigger on Order__c (before insert, before update) {
fflib_SObjectDomain.triggerHandler(OrderDomain.class);
}
2. لایه دامنه – منطق تجارت
public class OrderDomain extends fflib_SObjectDomain {
public OrderDomain(List records) {
super(records);
}
public override void onValidate() {
for (Order__c order : Records) {
if (order.Total_Amount__c <= 0) {
throw new fflib_SObjectDomainException('Order total must be greater than zero');
}
}
}
}
3. لایه خدمات – بررسی موجودی و پردازش پرداخت
public class OrderService {
public void processOrder(Id orderId) {
Order__c order = new OrderSelector().selectById(orderId);
// Check Inventory (Queueable)
System.enqueueJob(new InventoryCheckQueueable(order));
// Process Payment (Callout)
PaymentProcessor.processPayment(order);
}
}
4. Queeable – بررسی موجودی
public class InventoryCheckQueueable implements Queueable {
private Id orderId;
public InventoryCheckQueueable(Order__c order) {
this.orderId = order.Id;
}
public void execute(QueueableContext context) {
// Check and reserve inventory
System.debug('Checking inventory for Order: ' + orderId);
}
}
5. فراخوان – پردازش پرداخت
public class PaymentProcessor {
@future(callout=true)
public static void processPayment(Order__c order) {
HttpRequest req = new HttpRequest();
req.setEndpoint('https://payment-gateway.com/api/pay');
req.setMethod('POST');
req.setBody('{"orderId":"' + order.Id + '", "amount": ' + order.Total_Amount__c + '}');
new Http().send(req);
}
}
6. دسته – پردازش تحقق سفارش
public class OrderFulfillmentBatch implements Database.Batchable {
public Database.QueryLocator start(Database.BatchableContext context) {
return Database.getQueryLocator('SELECT Id, Status__c FROM Order__c WHERE Status__c="Pending");
}
public void execute(Database.BatchableContext context, List scope) {
for (Order__c order : (List)scope) {
order.Status__c="Shipped";
}
update scope;
}
public void finish(Database.BatchableContext context) {
System.debug('Order fulfillment completed.');
}
}
جریان اجرا
- Trigger برای اعتبار دادن به جزئیات سفارش ، از لایه دامنه استفاده می کند.
- Layer Service سفارش را پردازش می کند ، چک های موجودی را انجام می دهد و پردازش پرداخت را آغاز می کند.
- بررسی موجودی Queueable تضمین می کند که سهام قبل از پردازش پرداخت در دسترس است.
- فرآیند فراخوان آینده پرداخت ، اطمینان از محدودیت های Salesforce را رعایت می کند.
- Batch Apex با به روزرسانی وضعیت پس از پردازش ، سفارش را برآورده می کند.
منابع یادگیری اضافی
پایان
FFLIB روشی ساختاری و مقیاس پذیر برای اجرای الگوهای شرکت Apex در Salesforce فراهم می کند. با اتخاذ این چارچوب ، توسعه دهندگان می توانند برنامه هایی را ایجاد کنند که دارای مدولار ، قابل نگهداری و قابل آزمایش باشند و از موفقیت طولانی مدت اطمینان حاصل کنند.
چرا شرکتهای بزرگ باید از fflib استفاده کنند
- منطق کسب و کار پیچیده (جریان ، دسته ، صفحات ، فراخوان)
- بهینه سازی عملکرد را تضمین می کند (انتخاب کنندگان SOQL ، فله DML ، UOW)
- معماری مقیاس پذیر (طراحی دامنه محور) را اجرا می کند
- قابلیت آزمایش و آمادگی CI/CD را بهبود می بخشد (مسخره و تزریق وابستگی)
این که آیا شما در حال کار بر روی یک پروژه کوچک هستید یا یک برنامه بزرگ در مقیاس بزرگ ، FFLIB می تواند به ساده سازی توسعه APEX شما کمک کند.
برنامه نویسی مبارک!