加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 将OOP“装饰器”重构为自由monad结构

发布时间:2020-12-16 10:06:03 所属栏目:安全 来源:网络整理
导读:我有一些“遗留的” Scala代码(类似 Java),它可以进行一些数据访问.有一个装饰器跟踪DAO方法的使用(收集指标),如下所示: class TrackingDao(tracker: Tracker) extends Dao { def fetchById(id: UUID,source: String): Option[String] = { tracker.track("f
我有一些“遗留的” Scala代码(类似 Java),它可以进行一些数据访问.有一个装饰器跟踪DAO方法的使用(收集指标),如下所示:

class TrackingDao(tracker: Tracker) extends Dao {
    def fetchById(id: UUID,source: String): Option[String] = {
        tracker.track("fetchById",source) {
            actualFetchLogic(...)
        }
    }
    ...
}

我试图把它塑造成一个免费的monad.我为DAO操作定义了以下代数:

sealed trait DBOp[A]
case class FetchById(id: UUID) extends DBOp[Option[String]]
...

我看到两个选择:

a)我可以制作两个采用DBOp的解释器,一个执行实际的数据访问,另一个执行跟踪,并将它们组合在一起或者
b)我使跟踪成为一个显式代数,并使用Coproduct在组合OR中使用它们
c)完全不同的东西!

第一个选项看起来更像是“装饰器”方法,它与DBOp绑定,第二个选项是更通用的解决方案,但需要明确调用“跟踪”代数.

另外,请注意原始fetchById调用的source参数:它仅用于跟踪.我更愿意从API中删除它.

这是实际问题:如何建模跟踪?

解决方法

从您的问题来看,这并不完全清楚,但如果跟踪是一种环境影响,当您执行数据库访问时应该“发生”并且源只是用于跟踪目的的参数,您可能根本不必用您的免费语言提及它.您可以使用现在的ADT并解释为(Tracker,Source,OtherStuff)=>例如IO [A],所以你得到的是一个函数,它会产生一个程序来进行数据库访问,一旦你给它一个Tracker和source以及你需要的任何其他东西(例如DB连接),跟踪实现完全是私人翻译.这使您可以编写数据库程序而无需考虑跟踪.

另一方面,如果您需要谈论业务逻辑中的跟踪,那么我们可能需要更多信息来了解具有多个跟踪器和源以及它们如何被引入和使用的含义.可能需要联合产品或扩展语言或嵌套语言来处理您需要表达的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读