代码之家  ›  专栏  ›  技术社区  ›  bob9123

将不纯函数转换为纯函数的改进-Scala

  •  0
  • bob9123  · 技术社区  · 7 年前
    object IO {
    
      def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String = {
        Http(link)
          .param("access_token", apiKey)
          .asString
          .body
      }
    }
    
    class SongService {
      private def retrieveSongId(songName: String): Option[JsValue] = {
        val formattedSongName = songName.replace(" ", "%20")
        val searchLink = "https://api.genius.com/search?q=" + formattedSongName
    
        //impure call
        val geniusStringResponse = IO.getHtmlFromWebsiteViaHttp(searchLink, apiKey)
    
       //Extra processing on geniusStringResponse
      }
    }
    

    我目前的设计是,我会有一个服务类,负责通过外部API获取一些信息现在我明白了不可能有100%的纯函数。

    我的问题是:在scala/fp中,处理需要连接到外部api的情况的最佳方法是什么?。其目的是通过最小化不纯净的函数来获得最充分的“函数编程风格”

    目前,我正在IO对象中封装所有的API调用。这个够合适吗?我看到单子的例子。在这种情况下我应该采用单子风格吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Lasf    7 年前

    这并不是一个fp问题,因为我看不出您的代码在fp方面有任何问题,但是在我看来,您应该做的是使用依赖注入,这样,对于测试,您可以用一个测试类替换 IO 肯定会有反应的。像这样的:

    abstract class IO {
      def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String
    }
    
    class IOImpl extends IO {
      def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String = {
        Http(link)
          .param("access_token", apiKey)
          .asString
          .body
      }
    }
    
    class IOTestImpl extends IO {
      def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String = ??? //some test HTML
    }
    

    然后在你的服务中:

    class SongService(io: IO) {
      private def retrieveSongId(songName: String): Option[JsValue] = {
        val formattedSongName = songName.replace(" ", "%20")
        val searchLink = "https://api.genius.com/search?q=" + formattedSongName
        val geniusStringResponse = io.getHtmlFromWebsiteViaHttp(searchLink, apiKey)
       //Extra processing on geniusStringResponse
      }
    }
    

    然后当你实例化 SongService ,通过它 IOTestImpl 在测试和 IOImpl 否则。你可能会发现一些相关的信息 dependency injection database access objects 是的。

    推荐文章