[英]Functional programming interfaces js
我在互联网上看到有函数式编程的接口。
有一些其他语言的示例,但我的问题是我可以使用 javascript 制作接口。
我不需要一切都非常严格。
例如从数据库中获取行的接口:
在面向对象中:
interface DBGet {
public function getResults($filters){}
}
和实施:
class MySQLDb implements DBGet {
public function getResults($filters){
......
}
}
我可以使用函数式编程转换 JavaScript 中的代码吗?
谢谢
JavaScript 没有接口的概念。
有关更多详细信息,请参阅此其他 SO 答案。 它本质上是这样说的:
没有“这个类必须具有这些功能”的概念(即,本身没有接口),因为:
- JavaScript 继承基于对象,而不是类。 这没什么大不了的,直到你意识到:
- JavaScript 是一种非常动态的类型语言——您可以使用适当的方法创建一个对象,这将使其符合接口,然后取消定义所有使其符合的内容。 颠覆类型系统是如此容易——即使是偶然的! -- 首先尝试创建类型系统是不值得的。
但是,您可以使用 TypeScript。TypeScript为更传统的 OO 类型系统实现引入了接口,但是,使用它们有一些注意事项,无论如何,当它转换为 vanilla JavaScript 时,它们只会从代码中剥离出来。
以下是您可以使用 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.