30-22 之 Remote Facade

接下来这篇文章我们将要谈谈《 Patterns of Enterprise Application Architecture - Martin Fowler 》这本书中的 DISTRIBUTION PATTERNS 中的 『 Remote Facade 』。

什麽是 Remote Facade 呢 ?

Provides a coarse-grained facade on fine-grained objects to improve efficiency over a network.

然後下面这句是从另一篇文章看到的,我觉得也不错,就在这记录一下。

Remote facade is intended for minimizing the number of remote calls in an application

在 《 Patterns of Enterprise Application Architecture - Martin Fowler 》这本书中有一个最简单的例子,如下图,基本上就是一个 facade 来让外部使用简单化,

而在 nodejs 我个人觉得也有这种用法 :

// 假设这三个方法都是非同步的 i/o 操作
moduel.exports = {
  getCity,
  getState,
  getZip
}

// Remote Facade
async function getAddressRemoteFacade(){
   const [city, state, zip] = await Promise.all([
       getCity,getState,getZip
   ]);
   return { city, state, zip }
}

// Application
const address = await getAddressRemoteFacade()

这里我们有假设一件事情,那就是取得到 address 的相关方法,就只有提供 getCity、getState、getZip,如果 remote 本身就有提到取得完整的 getAddress 那就当然不需要,别忘了 facade 的目的 :

facade 的设计是为了让外部使用简单化,而不是为了简单化内部系统。

https://ithelp.ithome.com.tw/upload/images/20211007/20089358o6kIXRc0Im.png

然後根据书中,有几个重要事项需要注意 :

  • remote facade 不包含 domain logic。
  • facade 的设计是为了让外部使用简单化,而不是为了简单化内部系统。
  • 可以提供安全检查。
  • 也可以提供事务。
  • 这个最常用在 presentation layer 与 domain layer 之间。

范例

这个范例中事实上有多提到两个东西 :

  • DTO ( Data Transfer Object ) : 这个可以想成有些情况下,外面要的东西并不是 domain 所提供的栏位与值,而这时 DTO 就外面要的形状。
  • Assembler : 基本上就是将 domain 转成外面要的形状处理的地方。
// Domain
class PersonAddressDomain{
    userId: string
    city: string
    country: string
}

class PersonDomain{
    id: string
    name: string
    age: number
}

// Remote Facade
class PersonDTO{
    id: string
    name: string
    age: number
    address: PersonAddressDomain
}

class PersonAssembler{
    writeDTO(person: PersonDomain, address: PersonAddressDomain): PersonDTO{
        const result = new PersonDTO()
        result.id = person.id
        result.name = person.name
        result.age = person.age
        result.address = address
        return result
    }
}

// Service
class PersonService{
    assembler: PersonAssembler
    constructor(personAssembler: PersonAssembler){
        this.assembler = personAssembler
    }
    getPerson(id: string): PersonDTO{
        const person: PersonDomain = personRepository.getById(id)
        const address: PersonAddressDomain = personAddressRepository.getByUserId(id)

        const result: PersonDTO = this.assembler.writeDTO(person, address)
        return result
    }
}

小总结

这个知识点可以用来解释什麽现象

在实务上事实上有很多时後的输出,与 domain 事实上不相同,你也可以想成画面要的东西事实上和 domain 不太一样,而这时 remote facade 会处理两件事情 :

  • 转成 DTO
  • 尽可能让外部使用简单化

基本上这东西可以解释 Presentation Layer 与 Domain Layer 之间形状不一致的方法。

这个知识点可以和以前的什麽知识连结呢 ?

设计模式中的『 Facade 』。

PHP Laravel 的 Facade 的理解 - marklin

remote facade 与 facade 本身是否相同我还不确定,但至少我觉得 Martin 所提的 remote facade 本质上是以分层来思考的,而它将它放的位置就在於 presentation layer 与 domain layer 之间。

我要如何运用这个知识点 ?

  • 未来在开发时,如果要让外部使用更简单,可以使用 facade。
  • DTO 这个概念我觉得应该可以用在不同层级间的沟通对象,应该是不限於 presentation layer 与 domain layer。
  • assembler 这个概念可以当成不包含业务逻辑的资料转换处理地。

参考资料


<<:  Re: 新手让网页 act 起来: Day22 - React Hooks 之 useCallback

>>:  创建App-Google sign in my App

Gamma校正

在Day21时,尝试讲解内建Skybox Shader是怎麽写的,後来踩到了一些坑,里面就碰到几个我...

应用系统的防护基准-开发过程的程序与记录(SSDLC)

从源头降低风险(X),可归究责任(O) 适用人员: 技术人员(开发人员)。 适用法规: 资通安全责任...

[Day 28] Final Project (4/5) — 部署模型到 Google AI Platform

前情提要 昨天我们成功的让 App 在本机端运作,但按下 开始预测! 後却出现了错误: 这意味着虽然...

Day18-Session 管理(二)

前言 昨天讲了在产生 session ID 时有什麽应该要注意的地方,但除了 session 之外,...

Day 13 : Maximum Subarray

今天的题目是要我们在一个整数阵列中找到子阵列(subarray),也就是撷取阵列中相连的一部分,求出...