关键词:
在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开发整理自定义放大镜查找效果(代码片段)
有时候在自定义的visualforce页面上,需要实现系统标准的查找样式,当不能使用标准的style的时候,我们只能选择自定义实现,下面分享一个demo,预览效果如下:实现代码,Visualforce页面1<!--自定义放大镜查找效果-->2<apex:pa... 查看详情
markdown用python开发的“最佳实践最佳”(bobp)指南。(代码片段)
markdown用python开发的“最佳实践最佳”(bobp)指南。(代码片段)
markdown用python开发的“最佳实践最佳”(bobp)指南。(代码片段)
markdown用python开发的“最佳实践最佳”(bobp)指南。(代码片段)
markdown用python开发的“最佳实践最佳”(bobp)指南。(代码片段)
markdown用python开发的“最佳实践最佳”(bobp)指南。(代码片段)
markdown用python开发的“最佳实践最佳”(bobp)指南。(代码片段)
typescript开发环境的最佳实践(代码片段)
Typescript开发环境的最佳实践0??gitinit(略)1????初始化:$yarnadd-Dts-nodetypescript2??生成tsconfig.json:$yarntsc-init3??配置TSLint:$yarnaddtslint-D4??生成tslint.json:$yarntslint--init5??创建src/index.ts:$mkdirsrc&&e 查看详情
vue开发实战生态篇#18:vuex最佳实践(代码片段)
说明【Vue开发实战】学习笔记。核心概念State一this.$store.state.xxx取值——mapState取值Getter一this.$store.getters.xxx取值——mapGetters取值Mutation一this.$store.commit("xxx")赋值——mapMutations赋值Action一this.$store.dispatch(" 查看详情
从零开始使用codeart实践最佳领域驱动开发
本章内容还在整理上传中,你可以等全部更新完毕后再查阅也可以先预览已上传的内容。。。。。。7.应用层的命令模式 在上个章节里我们设计并编码了领域对象Permission,但是目前Permission并没有任何行为上的设计。这是因... 查看详情
eos智能合约开发最佳实践(代码片段)
安全问题1.可能的错误智能合约终止限制转账限额限制速率有效途径来进行bug修复和提升2.谨慎发布智能合约对智能合约进行彻底的测试并在任何新的攻击手法被发现后及时制止赏金计划和审计合约3.合约的简介确保智能合约逻辑... 查看详情
转codereview最佳实践
...y/p/11216430.html 我一直认为CodeReview(代码审查)是软件开发中的最佳实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题。包括像Google、微软这些公司,CodeReview都是基本要求,代码合并之前必须要有人审... 查看详情
数据仓库统计开发最佳实践(代码片段)
统计功能常见实现方法:(1)直接连表查询后展示(无需建表,直接查询单据的数据进行展示)优点:a.实现简单缺点:a.不适合大量数据的场景,不适合复杂查询的场景,不适合对性能要求较高的场景b.满足不了统计需求改变... 查看详情
.netcore开发实战(定义api的最佳实践)sourcegenerators版(代码片段)
前言极客时间上的《.NETCore开发实战》是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601-201165)介绍了定义API的最佳实践。大意如下:Controller这一层负责与前端用户的交互,它... 查看详情
一文看懂现代android开发最佳实践(代码片段)
...一系列技术栈和工具链的集合,涵盖了从编程语言到开发框架等各个环节。Android自08年诞生之后的多年间SDK变化一直不大,开发方式较为固定。13年起技术更新逐渐加速,特别是17年之后,随着Kotlin及Jetpack等新技... 查看详情
使用 ML Studio API 开发 CD/CI 的最佳实践是啥?
】使用MLStudioAPI开发CD/CI的最佳实践是啥?【英文标题】:WhatisthebestpracticetodevelopCD/CIwhenyouuseMLstudioAPIs?使用MLStudioAPI开发CD/CI的最佳实践是什么?【发布时间】:2019-01-2703:15:48【问题描述】:在我们的后端开发过程中,我们有两个... 查看详情
lwc知识整理
目录LWC知识整理(一)工具SalesforceCLIVisualStudioCode(VSCode)DeveloperHub(DevHub)开启DevHub相关资料茶余饭后的总结LWC知识整理(一)最近Salesforce那群闲不住的研究员又推出了一款针基于Web的开发组件-LightingWebComponent(简称LWC),这个组... 查看详情