繁体   English   中英

函数式编程接口js

[英]Functional programming interfaces js

我在互联网上看到有函数式编程的接口。

有一些其他语言的示例,但我的问题是我可以使用 javascript 制作接口。

我不需要一切都非常严格。

例如从数据库中获取行的接口:

在面向对象中:

interface DBGet {
 public function getResults($filters){}
}

和实施:

class MySQLDb implements DBGet {
  public function getResults($filters){
    ......
  }
}

我可以使用函数式编程转换 JavaScript 中的代码吗?

谢谢

JavaScript 没有接口的概念。

有关更多详细信息,请参阅此其他 SO 答案 它本质上是这样说的:

没有“这个类必须具有这些功能”的概念(即,本身没有接口),因为:

  1. JavaScript 继承基于对象,而不是类。 这没什么大不了的,直到你意识到:
  2. JavaScript 是一种非常动态的类型语言——您可以使用适当的方法创建一个对象,这将使其符合接口,然后取消定义所有使其符合的内容。 颠覆类型系统是如此容易——即使是偶然的! -- 首先尝试创建类型系统是不值得的。

编辑

但是,您可以使用 TypeScript。TypeScript为更传统的 OO 类型系统实现引入了接口,但是,使用它们有一些注意事项,无论如何,当它转换为 vanilla JavaScript 时,它们只会从代码中剥离出来。

编辑 2

以下是您可以使用 JavaScript 实现目标的一些方法:

注意:在ES6 中引入的 Lambda 箭头语法。

1 - 使用两个类(将 lambda 函数定义为属性)

class MySqlDbGet {
    getResults = (filters) => {
        // MySQL implementation of "getResults"
    };
}

class PostgreSqlDbGet {
    getResults = (filters) => {
        // PostgreSQL implementation of "getResults"
    };
}

methodThatTakesAFunction(new MySqlDbGet().getResults);
methodThatTakesAFunction(new PostgreSqlDbGet().getResults);

2 - 使用两个对象(将 lambda 函数定义为属性)

const mySqlDbGet = {
    getResults: () => {
        // MySQL implementation of "getResults"
    }
};

const postgreSqlDbGet = {
    getResults: () => {
        // PostgreSQL implementation of "getResults"
    }
};

methodThatTakesAFunction(mySqlDbGet.getResults);
methodThatTakesAFunction(postgreSqlDbGet.getResults);

3 - 使用两个变量来保存您的 lambda 函数

const mySqlGetResults = () => {
    // MySQL implementation of "getResults"
};

const postgreSqlGetResults = () => {
    // PostgreSQL implementation of "getResults"
};

methodThatTakesAFunction(mySqlGetResults);
methodThatTakesAFunction(postgreSqlGetResults);

然而,要点仍然存在:JavaScript 不会让您的对象遵守某种契约。 因此,在程序运行期间的任何时候,您都可以将mySqlGetResults重新分配为"som string"并将其传递到您喜欢的任何位置,而不会在运行之前收到任何错误消息。 由您来检查可能与您认为的不同的变量,并处理您可能不确定对象是否按您的想法定义的任何情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM