簡體   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