Salesforce 开发整理代码开发最佳实践
Posted 鲁清华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Salesforce 开发整理代码开发最佳实践相关的知识,希望对你有一定的参考价值。
在Salesforce项目实施过程中,对项目代码的维护可以说占据极大的精力,无论是因为项目的迭代,还是需求的变更,甚至是项目组成员的变动,都不可避免的需要维护之前的老代码,而事实上,几乎没有任何一个项目的整个周期中,维护人员都是最初的开发人员,所以,合适的编码规范能极大的改善代码的可读性,方便其他开发者,甚至你自己在一段时间之后来阅读,维护你的代码
首先最重要的是包括对象,字段,进程生成器,工作流,class类,触发器,函数,变量在内的所有API的命名应该是“望文生义”的,也即是说,通过你的API就能推测你的函数功能
类型 |
规范 |
示例 |
对象API |
对象名称单词用下划线连接 |
WeChat_Account__c |
字段API |
字段名称单词用下划线连接 |
WeChat_Account_ID__c |
Class |
单词连写,首字母大写 |
OrderItem |
Trigger |
Trigger名称=对象名+Trigger |
AccountTrigger |
Handler |
Trigger的实现类 = Trigger名+Handler |
AccountTriggerHandler |
Visualforce页面 |
页面功能描述 |
OrderTracking |
Vf页面控制类 |
VF页面的名+Controller |
OrderTrackingController |
WebService Class |
类功能描述+WS |
CalculationPriceWS |
Batch Class |
功能描述+Batch |
AutoUpdateAccountStatusBatch |
Schedule Class |
功能描述+Sch |
AutoUpdateAccountStatusSch |
测试类 |
Test_+Class名或Trigger名 |
Test_OrderItem |
常量 |
全大写,单词与单词之间下划线隔开 |
PAGE_SIZE |
变量 |
驼峰命名法,尽可能避免单字符 |
userName |
方法名 |
每个方法前必须加说明包括:参数说明、返回值说明、异常说明。如果方法名实在是太长可以对变量名缩写,但是必须添加相应的说明 |
checkStatus |
上表是一些推荐的命名规范,仅供参考.
在开发的过称中,需要尽可能的减少if,for循环的嵌套,下面是一个嵌套很深的示例
1 for(Anyue_CollectionManager_c acm : isReadyKou){ 2 //选择包含指定记录类型的订单 3 if(list_A.contains(acm.Anyue_Order_r.RecordType.DevelopeName)){ 4 //如果以上映的电影电影数量存在 5 if(list_ao.size() > 0){ 6 //拼接显示的信息 7 if(map_ao.containskey(acm.Anyue_Order_c)){ 8 result += ‘【‘+ acm.Name + ‘】这里嵌套这么深,在阅读代码的时候看的太难受了‘; 9 } 10 } 11 } 12 }
这段代码可以通过筛选不符合条件的数据,用continue减少if的嵌套层次
1 for(Anyue_CollectionManager_c acm : isReadyKou){ 2 //剔除不符合记录类型的数据 3 if(!list_A.contains(acm.Anyue_Order_r.RecordType.DevelopeName)){ 4 continue; 5 } 6 //剔除未上映的电影 7 if(list_ao.size() == 0){ 8 continue; 9 } 10 //拼接显示信息 11 if(map_ao.containskey(acm.Anyue_Order_c)){ 12 result += ‘【‘+ acm.Name + ‘】这里就能有效的减少嵌套层级‘; 13 } 14 }
同样需要注意的一点是,避免在循环中使用SOQL查询语句以及DML操作。
Salesforce系统限制一次请求不允许超过100个SOQL查询语句,150个DML操作。下面是一个将查询和更新语句放在for循环中的操作
1 trigger ContactTrigger on Contact(after insert){ 2 for(Contact c:trigger.new){ 3 Account acc = [select id,Name from Account where id=:c.AccountId]; 4 acc.Name = c.FirstName; 5 update acc; 6 } 7 }
如果一次执行的数据超过200条,那么就超出了Salesforce的限制,所以我们修改为批量的方法
1 trigger ContactTrigger on Contact(after insert){ 2 //联系人关联客户id 3 Set<Id> accIds = new Set<Id>(); 4 for(Contact c : trigger.new){ 5 if(c.AccountId != null){ 6 accIds.add(c.AccountId); 7 } 8 } 9 10 if(accids.size() > 0){ 11 map<Id,Account> accountMap = new map<Id,Account>([select name from Account where id IN:accids]); 12 for(Contact c : trigger.new){ 13 if(!accountMap.containskey(c.AccountId)){ 14 continue; 15 } 16 accountMap.get(c.AccountId).Name = c.LastName; 17 } 18 } 19 20 if(accountMap.size() > 0) update accountMap.values(); 21 }
同样的,在使用SOQL语句查询时,需要那些字段就查询那些字段,以提高性能。
最后是代码的注释部分
在类和Trigger的头部添加作者、创建时间、功能描述,如果此类需要修改,那么要记录修改时间,修改人,修改内容简介
/******** * * 作者:Ricardo * 创建时间:2018-05-31 * 功能描述: * function1() ... * function2() ... * 修改人:updatePerson
* 修改时间:updateTime
* 修改内容:description * ***** public class PrintQuote{
////// code.... }
方法注释应该有适当的说明,位于方法声明之前,包括:说明,参数说明、异常说明、返回值说明和特别说明等
1 /******* 2 * 3 * 描述:单个发送邮件 4 * 参数:address:邮件地址 5 * 参数:text:邮件正文 6 * 返回值:发送结果 7 * 8 ****/ 9 public String SendChatter(String address,String text){ 10 // code.... 11 }
针对一些关键的代码逻辑,特殊的变量都应该标记上代码注释,但是需要避免的是写太多无用的代码注释,否则跟不写注释的效果不没有太大的差异
最后是关于在开发中使用RecordTypeId,UserId,记录ID以及角色名称,用户名称等硬码,如果确定有特殊需要,可以使用自定义设置进行配置
开发时适当的遵循编码规范,可以写出简洁,易读,扩展性强,结构好的代码,既有助于自己编码习惯的养成,也能有效降低开发维护的难度,可以说是很有必要的。
以上如有错漏,欢迎指正,如有疑问,欢迎评论区留言探讨
推荐一些Salesforce编码最佳实践的网站
Force.com Apex Code Best Practices
SOQL(Salesforce Object Query Language)查询
SOOSL(Salesforce Object Search Language)查询
以上是关于Salesforce 开发整理代码开发最佳实践的主要内容,如果未能解决你的问题,请参考以下文章