什么是门面以及如何在 ruby​​ 上使用它

要了解Facades在实际项目中的用法,让我们想象一下,我们将实现与 Stripe 等第三方 SDK 的集成,以允许在我们的系统上进行支付。很酷,对吧?

好的,但是...这有什么问题?

既然我们要实现这个SDK,那么我们首先想到的就是安装gem,然后在我们的控制器方法上使用它,对吧?假设这个 gem 提供了以下类:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">AwesomeStripeSDK</span>
  <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">identify_user</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-declaration-color)">end</span>
  <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">register_card_for_user</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-declaration-color)">end</span>
  <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">pay</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-declaration-color)">end</span>
  <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">refund</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-declaration-color)">end</span>
  <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">apply_discount</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-declaration-color)">end</span>
  <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">cancel_payment</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-declaration-color)">end</span>
  <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">call_the_cops</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-declaration-color)">end</span>
  <span style="color:var(--syntax-error-color)">...</span><span style="color:var(--syntax-text-color)">.</span>
<span style="color:var(--syntax-name-color)">end</span>
</code></span></span>

我们可以同意这是一个参数数量未知的大类,对吗?

虽然阅读文档并在我们的控制器上使用正确的参数实现正确的方法很容易,但它很容易变成一个小怪物,仅仅是因为我们对整个类没有太多控制权AwesomeStripeSDK

这个 gem 可以提供多个类,这些类需要一起用于单个操作,或者甚至提供一组非常混乱和混乱的方法名称、参数结构等。

解决方案 ?立面!

现在我们了解了问题,提出解决方案就很简单了:只需创建另一个类!

外观背后的想法是简化库或框架的实现,并控制该服务类的一般结构。

例如,给定示例AwesomeStripeSDK第三方类,我们可以定义如下外观:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">PaymentFacade</span>
  <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">self</span><span style="color:var(--syntax-error-color)">.</span><span style="color:var(--syntax-name-color)">pay</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">price</span><span style="color:var(--syntax-text-color)">:,</span> <span style="color:var(--syntax-text-color)">card</span><span style="color:var(--syntax-text-color)">:,</span> <span style="color:var(--syntax-text-color)">user</span><span style="color:var(--syntax-text-color)">:)</span>
    <span style="color:var(--syntax-comment-color)"># identify our user</span>
    <span style="color:var(--syntax-declaration-color)">AwesomeStripeSDK</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">identify</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">user</span><span style="color:var(--syntax-text-color)">)</span>

    <span style="color:var(--syntax-comment-color)"># register the payment method</span>
    <span style="color:var(--syntax-declaration-color)">AwesomeStripeSDK</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">register_card_for_user</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">user</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">card</span><span style="color:var(--syntax-text-color)">)</span>

    <span style="color:var(--syntax-comment-color)"># apply a fixed discount</span>
    <span style="color:var(--syntax-declaration-color)">AwesomeStripeSDK</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">apply_discount</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">40</span><span style="color:var(--syntax-text-color)">)</span>

    <span style="color:var(--syntax-comment-color)"># pay the bill</span>
    <span style="color:var(--syntax-declaration-color)">AwesomeStripeSDK</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">pay</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">price</span><span style="color:var(--syntax-text-color)">)</span>
  <span style="color:var(--syntax-declaration-color)">end</span>
<span style="color:var(--syntax-declaration-color)">end</span>
</code></span></span>

现在在我们的控制器上,我们只需要调用传递PaymentFacade.pay正确的参数,我们就可以确保支付正确进行,而不用担心具体的SDK API。

这样做的另一个明显优势是我们可以在不同上下文中的多个类上使用相同的外观,并且由于范围是隔离的,因此还可以编写出色的测试。很酷,对吧?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值