用“ with”语句重构案例语句

按位

我有一个三重嵌套的case语句。在此控制器操作中,这是完全可憎的事情。

但是,我很高兴自己处在这种情况下,因为IMO最好的学习方法之一就是看到代码以许多不同的方式做同样的事情。这使我想到了这个问题。

如何重构这部分代码以使用with语句代替case我在网上找到的所有示例都比这个示例更为琐碎。

码:

   case Nba.get_todays_games do
      {:ok, games} ->
        game_id = Map.get(games, "games")
          |> Enum.random
          |> Map.get("id")
          :timer.sleep(1000)

      case Nba.get_game_summary(game_id) do
        {:ok, game} ->
          team_id = Map.take(game, ["away", "home"])
            |> Enum.random
            |> elem(1)
            |> Map.get("id")
            :timer.sleep(1000)

        case Nba.get_team_roster(team_id) do
          {:ok, team} ->
            player_id   = Map.get(team, "players")
              |> Enum.random
              |> Map.get("id")

            player_name = Map.get(team, "players")
              |> Enum.find(fn %{"id" => id} -> player_id == id end)
              |> Map.get("full_name")
        end
      end
    end 

我注意到我根本无法像这样重构:

with {:ok, games} <- Nba.get_todays_games,  
     {:ok, game}  <- Nba.get_todays_games(game_id),
     {:ok, team}  <- Nba.get_team_roster(team_id)

我显然需要做之间的逻辑才能获得game_id和team_id。谢谢您的帮助!

阿列克谢·马蒂什金(Alexei Matiushkin)

只需在with子句中插入需要评估的内容,就可以完成所有工作:

with {:ok, games} <- Nba.get_todays_games,
     game_id <- evaluate_game_id(),
     {:ok, game}  <- Nba.get_todays_games(game_id),
     team_id <- evaluate_team_id(),
     {:ok, team}  <- Nba.get_team_roster(team_id)

我的建议是在单独的私有函数中提取评估结果,以提高可读性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章