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的解释器,一个执行实际的数据访问,另一个执行跟踪,并将它们组合在一起或者 第一个选项看起来更像是“装饰器”方法,它与DBOp绑定,第二个选项是更通用的解决方案,但需要明确调用“跟踪”代数. 另外,请注意原始fetchById调用的source参数:它仅用于跟踪.我更愿意从API中删除它. 这是实际问题:如何建模跟踪? 解决方法
从您的问题来看,这并不完全清楚,但如果跟踪是一种环境影响,当您执行数据库访问时应该“发生”并且源只是用于跟踪目的的参数,您可能根本不必用您的免费语言提及它.您可以使用现在的ADT并解释为(Tracker,Source,OtherStuff)=>例如IO [A],所以你得到的是一个函数,它会产生一个程序来进行数据库访问,一旦你给它一个Tracker和source以及你需要的任何其他东西(例如DB连接),跟踪实现完全是私人翻译.这使您可以编写数据库程序而无需考虑跟踪.
另一方面,如果您需要谈论业务逻辑中的跟踪,那么我们可能需要更多信息来了解具有多个跟踪器和源以及它们如何被引入和使用的含义.可能需要联合产品或扩展语言或嵌套语言来处理您需要表达的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 我有什么选择来集中Unix用户管理
- 你能定义可选的docker-compose服务吗?
- Bootstrap 图像
- POJ 2763 Housewife Wind [树链剖分(边权)+树状数组]【数据
- 理解$watch、$apply和$digest---理解数据绑定过程
- scala – Spark SQL嵌套withColumn
- 如何使用Scala DataFrameReader选项方法
- WebService之WSDL和SOAP实例(基于JAVA)
- bash – 如何使用sed / awk替换以逗号分隔的字符串中的第n列
- AngularJS $Http CORS与Spring Rest&Security中的后端