请查看以下salesforce触发器代码
trigger BrandTrigger on Brand__c (before update) {
for(Brand__c brand: Trigger.new){
Brand__c oldBrand = Trigger.oldMap.get(brand.Id);
if (oldBrand.Name != brand.Name) {
if(String.isBlank(oldBrand.Old_Name__c)){
brand.Old_Name__c = oldBrand.Name;
}else{
brand.Old_Name__c = split(oldBrand.Name + ', ' + brand.Old_Name__c );
}
}
}
private String split(String s) {
Integer index = 0;
for (Integer i = 0; i < 3; i++)
index = s.indexOf(', ', index + 1);
if(index > 2)
return s.substring(0, index);
else
return s;
}
}触发器设置至少三个值。
在“旧价值”领域。这些都是历史价值。
Brand_c.Name的
发布于 2018-01-22 10:20:18
首先,我将讨论一些小的、不太重要的事情,以便最终得到更重要的东西。
使用三元操作符来减少你要写的行的数量。您编写的if/else子句可以在一行中完成:
brand.Old_Name__c = String.isBlank(oldBrand.Old_Name__c) ? oldBrand.Name : split(oldBrand.Name + ', ' + brand.Old_Name__c );这同样适用于您编写的拆分函数中的返回语句:
return index > 2 ? s.substring(0, index) : s;此外,在语句中始终放置括号是一种很好的做法,因为它可以是bug隐藏的地方,而且并不是很明显:
for (Integer i = 0; i < 3; i++){
index = s.indexOf(', ', index + 1);
}此外,不要直接访问触发数据。将它们复制到变量中是一种很好的做法,因此您以后可以访问它们。
最后,正如@brezotom所说,您需要将逻辑排除在触发器之外。最佳实践是使用一个简单的触发器框架,这样每个对象最多有一个触发器,而实际的框架决定何时运行什么。这是一些医生。
看起来会是这样的:
trigger BrandTrigger on Brand__c (before insert, before update, before delete, after insert, after update, after delete, after undelete) {
new BrandTriggerHandler().runHandler();
}我不会用框架实现您的代码,因为您可以在web中找到大量的示例,但这就是要点--一个带有几行调用处理程序的触发器,然后处理程序管理不同的事件(插入、更新等)。
此外,尝试在遵循面向对象范式的业务逻辑类中隔离业务逻辑。我不确定这种实现是否有意义,因为我不知道您的用例,但如下所示:
public class with sharing BrandSplitter {
private Map<String, Brand__c> newBrands;
private Map<String, Brand__c> oldBrands;
public BrandSplitter(Map<String, Brand__c> newBrands, Map<String, Brand__c> oldBrands){
this.newBrands = newBrands;
this.oldBrands = oldBrands;
}
public List<Brand__c> splitBrands(){
for(Brand__c newBrand: newBrands.values()){
Brand__c oldBrand = oldBrands.get(brand.Id);
if (oldBrand.Name != newBrand.Name) {
newBrand.Old_Name__c = String.isBlank(oldBrand.Old_Name__c)
? oldBrand.Name
: split(oldBrand.Name + ', ' + newBrand.Old_Name__c );
}
}
}发布于 2017-05-02 01:40:25
https://codereview.stackexchange.com/questions/161671
复制相似问题