首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最后三个值sfdc触发功能

最后三个值sfdc触发功能
EN

Code Review用户
提问于 2017-04-24 15:09:07
回答 2查看 110关注 0票数 1

请查看以下salesforce触发器代码

代码语言:javascript
复制
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的

EN

回答 2

Code Review用户

回答已采纳

发布于 2018-01-22 10:20:18

首先,我将讨论一些小的、不太重要的事情,以便最终得到更重要的东西。

使用三元操作符来减少你要写的行的数量。您编写的if/else子句可以在一行中完成:

代码语言:javascript
复制
brand.Old_Name__c = String.isBlank(oldBrand.Old_Name__c) ? oldBrand.Name : split(oldBrand.Name + ', ' + brand.Old_Name__c );

这同样适用于您编写的拆分函数中的返回语句:

代码语言:javascript
复制
return index > 2 ? s.substring(0, index) : s;

此外,在语句中始终放置括号是一种很好的做法,因为它可以是bug隐藏的地方,而且并不是很明显:

代码语言:javascript
复制
for (Integer i = 0; i < 3; i++){
    index = s.indexOf(', ', index + 1);
}

此外,不要直接访问触发数据。将它们复制到变量中是一种很好的做法,因此您以后可以访问它们。

最后,正如@brezotom所说,您需要将逻辑排除在触发器之外。最佳实践是使用一个简单的触发器框架,这样每个对象最多有一个触发器,而实际的框架决定何时运行什么。这是一些医生

看起来会是这样的:

触发器

代码语言:javascript
复制
trigger BrandTrigger on Brand__c (before insert, before update, before delete, after insert, after update, after delete, after undelete) {
    new BrandTriggerHandler().runHandler();
}

我不会用框架实现您的代码,因为您可以在web中找到大量的示例,但这就是要点--一个带有几行调用处理程序的触发器,然后处理程序管理不同的事件(插入、更新等)。

此外,尝试在遵循面向对象范式的业务逻辑类中隔离业务逻辑。我不确定这种实现是否有意义,因为我不知道您的用例,但如下所示:

代码语言:javascript
复制
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 );
            }
    }
}
票数 1
EN

Code Review用户

发布于 2017-05-02 01:40:25

  1. 您应该尝试将逻辑排除在触发器本身之外,并尝试将其放入处理程序类中。这与每个对象模式的一个触发器相同。如果需要在更新后或插入之前在执行逻辑的同一对象上添加另一个触发器,会发生什么情况?
  2. 看起来,您可能是在用分裂函数复制标准功能。确保标准的拆分方法不会满足您的需要。
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/161671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档