[英]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.