FFLIB 是一个免费的框架,对 Apex 进行了扩展。它的结构实现了 Salesforce 推荐的Apex 企业设计模式

在学习如何使用 FFLIB 框架之前,我们先来了解一下 Apex 企业设计模式的结构。

Apex 企业设计模式

Apex 企业设计模式的结构遵循了“关注点分离”的概念。

维基百科上对于“关注点分离”的定义是:

关注点分离(Separation of concerns,SOC)是对只与“特定概念、目标”(关注点)相关联的软件组成部分进行“标识、封装和操纵”的能力,即标识、封装和操纵关注点的能力。是处理复杂性的一个原则。由于关注点混杂在一起会导致复杂性大大增加,所以能够把不同的关注点分离开来,分别处理就是处理复杂性的一个原则,一种方法。

关注点分离是面向对象的程序设计的核心概念。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用(将针对特定领域问题代码抽象化成较少的程式码,例如将代码封装成function或是class),业务逻辑同特定领域问题的关系通过侧面来封装、维护,这样原本分散在整个应用程序中的变动就可以很好的管理起来。

企业设计模式的实现分为以下四个部分:

  • 服务层(Service Layer)
  • 模型层(Domain Layer)
  • 选择逻辑层(Selector Layer)
  • 工作单元(Unit of Work)

以上四个部分的详细定义可以参考 Martin Fowler 的网站

服务层

服务层的作用是提供一组函数,将可重用的逻辑封装起来,供外部调用。

这里的“外部”包括了外部的应用程序和 Salesforce 本身的一些功能,比如 Visualforce 页面的控制器、Salesforce 的 API 服务等。

代码示例

用 Apex 建立一个服务类:

public with sharing class AccountService {
public static Account createAccount(String name) {
// 建立 Account 对象的逻辑
Account a = new Account(Name = name); SavePoint sp = Database.setSavePoint();
try {
insert a;
} catch (Exception e) {
Database.rollback(sp); throw e;
}
}
}

然后在其他代码中(比如 Visualforce 页面的控制器)就可以使用了:

Account a = AccountService.createAccount('HelloWorld Company');

模型层

每个模型层的类都是针对某个对象而创建。模型层的类中封装了针对相关对象的一系列逻辑,比如对象被增删修改之后需要自动执行的操作等。

和服务层不同的是,模型层中的逻辑是不会被外部调用的(但是可以被服务层调用)。

在 Apex 中,触发器类是典型的模型层的类。

选择逻辑层

选择逻辑层的作用是封装了查询相关对象的逻辑,从而将数据库操作与其他的层分离。

代码示例

用 Apex 建立一个选择逻辑类:

public with sharing class AccountSelector {
public static Account selectById(Id id) {
// 通过 Id 查询 Account 对象的逻辑
// ...
}
}

然后在其他代码中(比如服务层或外部代码)就可以使用了:

Account a = AccountSelector.selectById('XXXXXXXXXXXXXXXXXX');

工作单元

工作单元是一种设计模式,它负责保存在各个逻辑中被增删修改的数据,并负责将这些数据的变化写入数据库。

对于 Apex 的开发,使用工作单元可以实现以下几个方面:

  • 记录一系列被增删修改的数据
  • 记录数据之间的关系
  • 在将数据的变化保存到数据库时,一次性写入,提高系统性能
  • 在将数据的变化保存到数据库时,自动定义 SavePoint,在出现错误时自动回滚。这样就减轻了开发者的工作

比如在 .NET 的 Entity Framework中,ObjectContext 和 DbContext 的设计就体现了工作单元的模式。

Apex 企业设计模式的更多相关文章

  1. 用 FFLIB 实现 Apex 企业设计模式

    Apex 企业设计模式将应用分为服务层.模型层.选择逻辑层.工作单元几个部分.FFLIB 是一个开源的 Apex 框架,可以帮助开发者快速建立相关的功能. FFLIB 的安装 FFLIB 可以直接部署 ...

  2. Java设计模式学习资源汇总

    本文记录了Java设计模式学习书籍.教程资源.此分享会持续更新: 1. 设计模式书籍 在豆瓣上搜索了一把,发现设计模式贯穿了人类生活的方方面面.还是回到Java与程序设计来吧. 打算先归类,再浏览,从 ...

  3. ASP.NET 设计模式(转)

    Professional ASP.NET Design Patterns 为什么学习设计模式? 运用到ASP.NET应用程序中的设计模式.原则和最佳实践.设计模式和原则支持松散耦合.高内聚的代码,而这 ...

  4. 【设计模式系列】之OO面向对象设计七大原则

    1  概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2  七大OO面向对象设计 2.1 单一 ...

  5. Head First设计模式分析学习

    永不放弃的毅力,和对欲望的控制. 注意:要能够理解相类似的设计模式之间的区别和不同.可以把类比列举出来,加深记忆. 是否加入Spring容器中的标准是是否要用到Spring框架的方法或者功能特性,如事 ...

  6. asp.net资料! (.NET) (ASP.NET)

    使用SqlBulkCopy类加载其他源数据到SQL表 在数据回发时,维护ASP.NET Tree控件的位置 vagerent的vs2005网站开发技巧 ASP.NET2.0小技巧--内部控件权限的实现 ...

  7. 身为java程序员你需要知道的网站(包含书籍,面试题,架构...)

    推荐几本书<高级java程序员值得拥有的10本书>,     首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 Web ...

  8. Java编程之路相关书籍(三个维度)

    一.关于Java的技术学习.能够依照以下分三个维度进行学习 : (1)向下发展,也就是底层的方向 建议看<深入Java虚拟机>.<Java虚拟机规范>.<Thinking ...

  9. Systemweaver — 电子电气协同设计研发平台

            当前电子电气系统随着功能安全.AutoSAR.车联网.智能驾驶等新要求,导致其复杂性.关联性日益上升.当前,传统基于文档的设计由于其低复用性.无关联性.无协同性等缺点,已经无法适应日益 ...

随机推荐

  1. LEETCODE 1254 统计封闭岛屿的数目 Number of Closed Islands

    地址 https://leetcode-cn.com/contest/weekly-contest-162/problems/number-of-closed-islands/ 有一个二维矩阵 gri ...

  2. Zookeeper搭建集群及协同

    Zookeeper搭建集群及协同 协同的实现 首先启动一个zkCli客户端(zkCLi-1),创建一个workers节点. create /workers 使用ls监控当前节点. ls -w /wor ...

  3. springboot+lucene实现公众号关键词回复智能问答

    一.场景简介 最近在做公众号关键词回复方面的智能问答相关功能,发现用户输入提问内容和我们运营配置的关键词匹配回复率极低,原因是我们采用的是数据库的Like匹配. 这种模糊匹配首先不是很智能,而且也没有 ...

  4. Java反射方法总结

    1.得到构造器的方法 Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数, Constructor[] getConstr ...

  5. 2019_JAVA面试题_真实总结

    来自刚被某互联网公司录取的朋友的分享. 整理的面试题1: 1.Java里面有哪几种基础数据类型, 2.Char为何是两个字节, 3.Object有哪些方法 4.final修饰变量,函数,类的作用, 5 ...

  6. Netty—TCP的粘包和拆包问题

    一.前言 虽然TCP协议是可靠性传输协议,但是对于TCP长连接而言,对于消息发送仍然可能会发生粘贴的情形.主要是因为TCP是一种二进制流的传输协议,它会根据TCP缓冲对包进行划分.有可能将一个大数据包 ...

  7. Python 3 行代码 5 秒抠图的 AI 神器,根本无需 PS

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 苏克1900 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  8. Hystrix失败处理逻辑解析

    在上篇文章Hystrix工作流程解析中,我们整体介绍了Hystrix的工作流程,知道了Hystrix会在下面四种情况下发生降级: 熔断器打开 线程池/信号量跑满 调用超时 调用失败 本篇文章则介绍一下 ...

  9. JS中new操作符源码实现

    首先我们来看一下实例化一个对象做了浏览器做了什么事情 new的四步操作: 1. 创建一个空对象 2. 设置空对象的__proto__属性继承构造函数的prototype属性,也就是继承构造函数的原型对 ...

  10. h5本地存储登录页面实现记住密码功能

    <!DOCTYPE html> <html> <head> <title></title> </head> <style ...