当前位置: 首页 > 知识库问答 >
问题:

函数规划与解耦

轩辕实
2023-03-14
public record Category(string Name);

public interface ICategoryService
{
    Task<IEnumerable<Category>> GetAllAsync();
}

// With a definition for the service that specifies WooCommerce
public class WcCategoryService : ICategoryService
{
    private readonly WCRestEndpoint wcRest;

    // WooCommerce specific dependencies
    public WcCategoryService(WCRestEndpoint wcRest)
    {
        this.wcRest = wcRest;
    }

    public Task<IEnumerable<Category>> GetAllAsync()
    {
        // Call woocommerce REST and map the category to our domain category
    }
}
type Category = { Name: string }
type GetCategories =
    WCRestEndpoint
    -> Category list
type Category = { Name: string }

// No longer directly dependent on WCRestEndpoint
type GetCategories = unit -> Category list

// But the definition would require scoped inclusion of the dependency
// Also how does the configuration get passed in without having the core library be dependent on the Environment or a config in the assembly?
let rest = WCRestEndpoint(/* Config... */)

type getCategories: GetCategories = 
    fun () ->
        let wcCategories = rest.GetCategories()
        // Convert the result into a Category type

我环顾四周,还没有找到任何关于如何用纯粹的功能性方法来处理变更的解释,这让我相信我误解了一些基本的东西。

如何在不将函数类型签名绑定在实现特定类型中的情况下公开函数API?我是不是想错了?

共有1个答案

洪弘毅
2023-03-14

我在这个问题上挣扎了多年,才意识到我对这个问题的看法是错误的。来自面向对象开发和依赖注入,我一直在寻找依赖注入的功能性替代方案。我终于意识到,依赖注入使一切变得不纯,这意味着如果您想应用功能架构,就不能使用这种方法(即使是部分应用程序)。

转移注意力是关注依赖关系。相反,专注于编写纯函数。您仍然可以使用依赖关系反转原则,但是不关注操作和交互,而是关注数据。如果函数需要某些数据,则将其作为参数传递。如果函数必须做出决定,则将其作为数据结构返回。

您没有提供任何示例说明要在何处使用类别值列表,但是依赖于此类数据的函数将具有如下类型:

Category list -> 'a
let Main () =
    let categories = getCategories ()
    let result = myFunction categories
    result
 类似资料:
  • 动态规划 建议观看MIT算法导论-动态规划中的课程。

  • 斐波那契数列 1. 爬楼梯 2. 强盗抢劫 3. 强盗在环形街区抢劫 4. 信件错排 5. 母牛生产 矩阵路径 1. 矩阵的最小路径和 2. 矩阵的总路径数 数组区间 1. 数组区间和 2. 数组中等差递增子区间的个数 分割整数 1. 分割整数的最大乘积 2. 按平方数来分割整数 3. 分割整数构成字母字符串 最长递增子序列 1. 最长递增子序列 2. 一组整数对能够构成的最长链 3. 最长摆动子

  • 本文向大家介绍JavaScript中的常规函数​​与箭头函数?,包括了JavaScript中的常规函数​​与箭头函数?的使用技巧和注意事项,需要的朋友参考一下 常规函数与箭头函数 一个箭头函数来简洁编写代码。常规 函数和箭头 函数的工作方式相似,但是它们之间存在一些差异。让我们简要地讨论一下这些差异。 箭头函数的语法 正则函数的语法 “ this”关键字的用法 它不能在箭头功能中使用“ this”

  • 定义 动态规划(Dynamic Programming)是一种将一个问题分解成多个子问题,从而简化问题,提升效率的算法思想。它可以应用于各种算法领域,如最短路径问题、背包问题、字符串匹配问题等。在JavaScript中,动态规划可以用于优化算法性能,提高程序效率。 动态规划的核心思想是将大问题分解成小问题,通过解决子问题来解决大问题。这种思想有时被称为“分治法”。 动态规划有两个核心特征:重叠子问

  • 在制定时间表时,你必须遵守法律(硬性要求),该法律规定,作为一名员工,你每七天只能工作一定的时间。它没有说日历周的原因是在创建时间表时为雇主提供一些回旋空间(通常是提前4-16周)。一旦设置了此计划期的开始日期,在您想要进行完整的重新规划之前,该日期无法更改,但您需要通知员工。所以它可以被视为一个变量,直到你接受了时间表,然后它就变成了一个常数。当然,这是每个员工的个人情况。该开始日期将由您的第一

  • 一定要设置最大内存maxmemory参数,否则物理内存用爆了就会大量使用Swap,写RDB文件时的速度很慢。注意这个参数指的是info中的used_memory,在一些不利于jmalloc的时候,内存碎片会很大。 多留55%内存是最安全的。重写AOF文件和RDB文件的进程(即使不做持久化,复制到Slave的时候也要写RDB)会fork出一条新进程来,采用了操作系统的Copy-On-Write策略(